From b818aa8ea7a1f0f526940945d7bc556fe120ccd3 Mon Sep 17 00:00:00 2001 From: Bruno Mateus Date: Tue, 2 Apr 2024 14:32:07 +0100 Subject: [PATCH] refactor(cc-tx-visualization): capture transactional data with RxJS The plugin now utilizes RxJS instead of RabbitMQ in transaction monitoring. ReplaySubjects store and emit observed transactional data to subscribers. fix(cc-tx-visualization): rebase latest version Signed-off-by: Rafael Belchior squash! - migrate a test case to Fabric v2.5.6 LTS AIO This is just a snippet of a change from the pair programming call with Bruno, it can be safely squashed, no worries. Signed-off-by: Peter Somogyvari Signed-off-by: Bruno Mateus feat(cc-tx-visualization): ccmodel serialization with PM4PY The plugin now creates the ccmodel for conformance checking with PM4PY. Signed-off-by: Bruno Mateus --- .cspell.json | 4 +- CODEOWNERS | 1 + .../src/main/typescript/index.web.ts | 0 jest.config.js | 8 - package.json | 16 - .../src/main/json/openapi.json | 1 + .../openapitools/client/models/LedgerType.kt | 5 +- .../generated/openapi/typescript-axios/api.ts | 1 + .../README.md | 3 - .../typescript/models/transaction-receipt.ts | 68 - .../typescript/plugin-cc-tx-visualization.ts | 416 -- .../plugin-factory-cc-tx-visualization.ts | 20 - .../src/main/typescript/public-api.ts | 17 - .../src/test/csv/dummy-use-case-6-events.csv | 7 - .../src/test/csv/dummy-use-case-60-events.csv | 61 - .../src/test/csv/dummy-use-case-invalid.csv | 7 - .../src/test/csv/example-dummy-use-case.csv | 9 - .../csv/use-case-besu-fabric-6-events.csv | 7 - .../csv/use-case-besu-fabric-60-events.csv | 61 - .../test/fixtures/python/process mining.ipynb | 423 -- .../fixtures/python/process_conformance.ipynb | 147 - .../integration/api-surface.test.ts | 8 - ...ate-use-case-dummy-baseline-events.test.ts | 207 - ...iz-generate-use-case-dummy-invalid.test.ts | 200 - .../cctxviz-persist-cross-chain-log.test.ts | 120 - ...txviz-usecase-fabric-besu-6-events.test.ts | 583 --- .../integration/initialize-rabbitmq.test.ts | 39 - .../.gitignore | 2 +- .../README.md | 149 + .../package.json | 115 +- .../src/main/typescript/index.ts | 0 .../src/main/typescript/index.web.ts | 0 .../typescript/models/carbon-footprint.ts | 27 +- .../typescript/models/cross-chain-event.ts | 4 +- .../typescript/models/crosschain-model.ts | 15 +- .../typescript/models/transaction-receipt.ts | 33 + .../src/main/typescript/models/utils.ts | 7 + .../typescript/plugin-ccmodel-hephaestus.ts | 973 +++++ .../plugin-factory-ccmodel-hephaestus.ts | 20 + .../pm4py-adapter/ccmodel-adapter.ts | 97 + .../pm4py-adapter/check_conformance.py | 188 + .../typescript/pm4py-adapter/convert_model.py | 123 + .../typescript/pm4py-adapter/create_model.py | 84 + .../src/main/typescript/public-api.ts | 16 + .../src/test/csv/example-dummy-basic-test.csv | 2 + .../test/csv/example-dummy-besu-4-events.csv | 5 + ...my-besu-ethereum-fabric-events-3-cases.csv | 28 + ...mple-dummy-besu-ethereum-fabric-events.csv | 28 + ...mple-dummy-ethereum-3-unmodeled-events.csv | 4 + .../csv/example-dummy-ethereum-4-events.csv | 5 + .../csv/example-dummy-fabric-4-events.csv | 5 + .../csv/example-dummy-periodic-update.csv | 29 + .../process mining-checkpoint.ipynb | 286 ++ .../process_conformance-checkpoint.ipynb | 186 + .../test/fixtures/python/process mining.ipynb | 286 ++ .../fixtures/python/process_conformance.ipynb | 186 + .../test/json/example-dummy-basic-test.json | 18 + .../json/example-dummy-besu-4-events.json | 63 + ...y-besu-ethereum-fabric-events-3-cases.json | 425 ++ ...ple-dummy-besu-ethereum-fabric-events.json | 425 ++ ...ple-dummy-ethereum-3-unmodeled-events.json | 48 + .../json/example-dummy-ethereum-4-events.json | 65 + .../json/example-dummy-fabric-4-events.json | 66 + .../json/example-dummy-periodic-update.json | 432 ++ .../lock-asset-contract}/LockAsset.json | 1585 ++++--- .../lock-asset-contract/lock-asset.sol | 70 + .../chaincode-typescript/.gitignore | 16 + .../chaincode-typescript/package.json | 62 + .../chaincode-typescript/src/asset.ts | 23 + .../chaincode-typescript/src/assetTransfer.ts | 201 + .../chaincode-typescript/src/index.ts | 9 + .../chaincode-typescript/tsconfig.json | 18 + .../integration/basic-mock-test.test.ts | 125 + ...s-chain-model-conformance-checking.test.ts | 467 ++ .../cross-chain-model-periodic-update.test.ts | 282 ++ .../cross-chain-model-serialization.test.ts | 288 ++ .../integration/monitor-4-besu-events.test.ts | 244 ++ .../monitor-4-ethereum-events.test.ts | 293 ++ .../monitor-4-fabric-events.test.ts | 364 ++ ...onitor-besu-ethereum-fabric-events.test.ts | 705 ++++ .../tsconfig.json | 7 +- .../src/main/json/openapi.json | 12 - .../generated/openapi/typescript-axios/api.ts | 18 - .../plugin-ledger-connector-besu.ts | 117 +- .../src/main/typescript/public-api.ts | 1 + .../plugin-ledger-connector-ethereum.ts | 24 + .../src/main/typescript/public-api.ts | 1 + .../package.json | 1 - .../src/main/json/openapi.json | 12 - .../generated/openapi/typescript-axios/api.ts | 18 - .../plugin-ledger-connector-fabric.ts | 177 +- .../src/main/typescript/public-api.ts | 1 + .../run-transaction-endpoint-v1.test.ts | 21 + .../src/main/typescript/public-api.ts | 2 - .../rabbit-mq-test-server.ts | 251 -- .../socketio-test-setup-helpers.ts | 2 +- tsconfig.json | 8 +- yarn.lock | 3737 +++++++++++------ 98 files changed, 11248 insertions(+), 4798 deletions(-) mode change 100755 => 100644 examples/cactus-example-carbon-accounting-backend/src/main/typescript/index.web.ts delete mode 100644 packages/cactus-plugin-cc-tx-visualization/README.md delete mode 100644 packages/cactus-plugin-cc-tx-visualization/src/main/typescript/models/transaction-receipt.ts delete mode 100644 packages/cactus-plugin-cc-tx-visualization/src/main/typescript/plugin-cc-tx-visualization.ts delete mode 100644 packages/cactus-plugin-cc-tx-visualization/src/main/typescript/plugin-factory-cc-tx-visualization.ts delete mode 100755 packages/cactus-plugin-cc-tx-visualization/src/main/typescript/public-api.ts delete mode 100644 packages/cactus-plugin-cc-tx-visualization/src/test/csv/dummy-use-case-6-events.csv delete mode 100644 packages/cactus-plugin-cc-tx-visualization/src/test/csv/dummy-use-case-60-events.csv delete mode 100644 packages/cactus-plugin-cc-tx-visualization/src/test/csv/dummy-use-case-invalid.csv delete mode 100644 packages/cactus-plugin-cc-tx-visualization/src/test/csv/example-dummy-use-case.csv delete mode 100644 packages/cactus-plugin-cc-tx-visualization/src/test/csv/use-case-besu-fabric-6-events.csv delete mode 100644 packages/cactus-plugin-cc-tx-visualization/src/test/csv/use-case-besu-fabric-60-events.csv delete mode 100644 packages/cactus-plugin-cc-tx-visualization/src/test/fixtures/python/process mining.ipynb delete mode 100644 packages/cactus-plugin-cc-tx-visualization/src/test/fixtures/python/process_conformance.ipynb delete mode 100644 packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/api-surface.test.ts delete mode 100644 packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/cctxviz-generate-use-case-dummy-baseline-events.test.ts delete mode 100644 packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/cctxviz-generate-use-case-dummy-invalid.test.ts delete mode 100644 packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/cctxviz-persist-cross-chain-log.test.ts delete mode 100644 packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/initialize-cctxviz-usecase-fabric-besu-6-events.test.ts delete mode 100644 packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/initialize-rabbitmq.test.ts rename packages/{cactus-plugin-cc-tx-visualization => cactus-plugin-ccmodel-hephaestus}/.gitignore (82%) create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/README.md rename packages/{cactus-plugin-cc-tx-visualization => cactus-plugin-ccmodel-hephaestus}/package.json (63%) rename packages/{cactus-plugin-cc-tx-visualization => cactus-plugin-ccmodel-hephaestus}/src/main/typescript/index.ts (100%) rename packages/{cactus-plugin-cc-tx-visualization => cactus-plugin-ccmodel-hephaestus}/src/main/typescript/index.web.ts (100%) rename packages/{cactus-plugin-cc-tx-visualization => cactus-plugin-ccmodel-hephaestus}/src/main/typescript/models/carbon-footprint.ts (58%) rename packages/{cactus-plugin-cc-tx-visualization => cactus-plugin-ccmodel-hephaestus}/src/main/typescript/models/cross-chain-event.ts (96%) rename packages/{cactus-plugin-cc-tx-visualization => cactus-plugin-ccmodel-hephaestus}/src/main/typescript/models/crosschain-model.ts (87%) create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/models/transaction-receipt.ts create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/models/utils.ts create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/plugin-ccmodel-hephaestus.ts create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/plugin-factory-ccmodel-hephaestus.ts create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/pm4py-adapter/ccmodel-adapter.ts create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/pm4py-adapter/check_conformance.py create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/pm4py-adapter/convert_model.py create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/pm4py-adapter/create_model.py create mode 100755 packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/public-api.ts create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-basic-test.csv create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-besu-4-events.csv create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-besu-ethereum-fabric-events-3-cases.csv create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-besu-ethereum-fabric-events.csv create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-ethereum-3-unmodeled-events.csv create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-ethereum-4-events.csv create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-fabric-4-events.csv create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-periodic-update.csv create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/fixtures/python/.ipynb_checkpoints/process mining-checkpoint.ipynb create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/fixtures/python/.ipynb_checkpoints/process_conformance-checkpoint.ipynb create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/fixtures/python/process mining.ipynb create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/fixtures/python/process_conformance.ipynb create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-basic-test.json create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-besu-4-events.json create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-besu-ethereum-fabric-events-3-cases.json create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-besu-ethereum-fabric-events.json create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-ethereum-3-unmodeled-events.json create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-ethereum-4-events.json create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-fabric-4-events.json create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-periodic-update.json rename packages/{cactus-plugin-cc-tx-visualization/src/test/solidity => cactus-plugin-ccmodel-hephaestus/src/test/solidity/lock-asset-contract}/LockAsset.json (58%) create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/solidity/lock-asset-contract/lock-asset.sol create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/fabric-contracts/lock-asset/chaincode-typescript/.gitignore create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/fabric-contracts/lock-asset/chaincode-typescript/package.json create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/fabric-contracts/lock-asset/chaincode-typescript/src/asset.ts create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/fabric-contracts/lock-asset/chaincode-typescript/src/assetTransfer.ts create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/fabric-contracts/lock-asset/chaincode-typescript/src/index.ts create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/fabric-contracts/lock-asset/chaincode-typescript/tsconfig.json create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/basic-mock-test.test.ts create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/cross-chain-model-conformance-checking.test.ts create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/cross-chain-model-periodic-update.test.ts create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/cross-chain-model-serialization.test.ts create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/monitor-4-besu-events.test.ts create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/monitor-4-ethereum-events.test.ts create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/monitor-4-fabric-events.test.ts create mode 100644 packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/monitor-besu-ethereum-fabric-events.test.ts rename packages/{cactus-plugin-cc-tx-visualization => cactus-plugin-ccmodel-hephaestus}/tsconfig.json (62%) delete mode 100644 packages/cactus-test-tooling/src/main/typescript/rabbitmq-test-server/rabbit-mq-test-server.ts diff --git a/.cspell.json b/.cspell.json index d462625422..53ca605653 100644 --- a/.cspell.json +++ b/.cspell.json @@ -34,7 +34,6 @@ "ccep", "ccid", "cctx", - "cctxviz", "celo", "cids", "clsx", @@ -83,6 +82,7 @@ "hada", "hashicorp", "Healthcheck", + "hephaestus", "htlc", "Htlc", "HTLC", @@ -156,7 +156,6 @@ "qscc", "recoverupdateackmessage", "rogpeppe", - "rabbitmq", "RUSTC", "Rwset", "satp", @@ -187,7 +186,6 @@ "unixfs", "Unmarshal", "uuidv", - "Visualizable", "vscc", "vuln", "wasm", diff --git a/CODEOWNERS b/CODEOWNERS index b561fc8bde..9c00abc80d 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,5 +1,6 @@ * @petermetz @takeutak @izuru0 @jagpreetsinghsasan @vramakrishna @sandeepnRES @outSH +packages/cactus-plugin-ccmodel-hephaestus @RafaelAPB packages/cactus-plugin-satp-hermes @RafaelAPB packages/cactus-plugin-bungee-hermes @RafaelAPB examples/cactus-example-cbdc-bridging @RafaelAPB diff --git a/examples/cactus-example-carbon-accounting-backend/src/main/typescript/index.web.ts b/examples/cactus-example-carbon-accounting-backend/src/main/typescript/index.web.ts old mode 100755 new mode 100644 diff --git a/jest.config.js b/jest.config.js index a4cbfc708f..da5187c515 100644 --- a/jest.config.js +++ b/jest.config.js @@ -121,13 +121,5 @@ module.exports = { `./examples/cactus-example-carbon-accounting-backend/src/test/typescript/integration/admin-enroll-v1-endpoint.test.ts`, `./examples/cactus-example-supply-chain-backend/src/test/typescript/integration/supply-chain-backend-api-calls.test.ts`, `./examples/cactus-example-supply-chain-backend/src/test/typescript/integration/supply-chain-cli-via-npm-script.test.ts`, - `./examples/cactus-check-connection-ethereum-validator/src/test/typescript/integration/check-connection-to-ledger.test.ts`, - `./examples/cactus-check-connection-ethereum-validator/src/test/typescript/integration/check-config-files.test.ts`, - `./packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/initialize-rabbitmq.test.ts`, - `./packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/cctxviz-generate-use-case-dummy-baseline-events.test.ts`, - `./packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/cctxviz-generate-use-case-dummy-invalid.test.ts`, - `./packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/cctxviz-persist-cross-chain-log.test.ts`, - `./packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/initialize-cctxviz-usecase-fabric-besu-6-events.test.ts`, - `./packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/initialize-rabbitmq.test.ts`, ], }; diff --git a/package.json b/package.json index b3effdefd3..b0dbd2f8ee 100644 --- a/package.json +++ b/package.json @@ -70,22 +70,6 @@ "build:dev:frontend": "lerna run build:dev:frontend --scope='@hyperledger/cactus-example-*-frontend' --scope='@hyperledger/cacti-ledger-browser'", "build:dev:common": "lerna exec --stream --scope '*/*common' -- 'del-cli dist/** && tsc --project ./tsconfig.json && webpack --env=dev --target=node --config ../../webpack.config.js'", "build:dev:backend:postbuild": "lerna run build:dev:backend:postbuild", - "test:cmd-api-server": "tap --ts --timeout=600 \"packages/cactus-*cmd-api-server/src/test/typescript/{unit,integration}/\"", - "test:plugin-ledger-connector-besu": "tap --ts --jobs=1 --timeout=60 \"packages/cactus-*-besu/src/test/typescript/{unit,integration}/\"", - "test:plugin-htlc-besu-erc20": "tap --jobs=1 --timeout=600 \"packages/*htlc-eth-besu-erc20/src/test/typescript/{unit,integration}/\"", - "test:plugin": "tap --jobs=1 --timeout=600 \"packages/*test-plugin-htlc-eth-besu/src/test/typescript/{unit,integration}/\"", - "test:plugin-ledger-connector-quorum": "tap --ts --jobs=1 --timeout=60 \"packages/cactus-*-quorum/src/test/typescript/{unit,integration}/\"", - "test:cctxviz": "tap --jobs=1 --timeout=600 \"packages/cactus-plugin-cc-tx-visualization/src/test/typescript/{unit,integration}/\"", - - "test:plugin-ledger-connector-iroha": "tap --ts --jobs=1 --timeout=600 \"packages/cactus-*-iroha/src/test/typescript/{unit,integration}/\"", - "test:plugin-htlc-besu": "tap --jobs=1 --timeout=600 \"packages/*htlc-eth-besu/src/test/typescript/{integration}/\"", - "build:dev:plugin-consortium-manual": "lerna exec --stream --scope '*/*manual-consortium' -- 'del-cli dist/** && tsc --project ./tsconfig.json && webpack --env=dev --target=node --config ../../webpack.config.js'", - "build:dev:plugin-cc-tx-visualization": "lerna exec --stream --scope '*/*cc-tx-visualization' -- 'del-cli dist/** && tsc --project ./tsconfig.json && webpack --env=dev --target=node --config ../../webpack.config.js'", - "build:dev:example-supply-chain-backend": "lerna exec --stream --scope '*/*example-supply-chain-b*' -- 'del-cli dist/** && tsc --project ./tsconfig.json && webpack --display-modules --env=dev --target=node --config ../../webpack.config.js'", - "build:dev:example-carbon-accounting-backend": "lerna exec --stream --scope '*/*carbon-accounting-b*' -- 'del-cli dist/** && tsc --project ./tsconfig.json && webpack --display-modules --env=dev --target=node --config ../../webpack.config.js' && cp -r examples/cactus-example-carbon-accounting-backend/src/utility-emissions-channel/ examples/cactus-example-carbon-accounting-backend/dist/lib/", - "build:dev:sdk": "lerna exec --stream --scope '*/*sdk' -- 'del-cli dist/** && tsc --project ./tsconfig.json && webpack --env=dev --target=node --config ../../webpack.config.js'", - "build:dev:plugin-ledger-connector-corda": "lerna exec --stream --scope '*/*connector-corda' -- 'del-cli dist/** && npm run tsc && webpack --env=dev --target=node --config ../../webpack.config.js'", - "test:plugin-ledger-connector-corda": "tap --ts --jobs=1 --timeout=600 \"packages/cactus-*-corda/src/test/typescript/{unit,integration}/\"", "webpack": "lerna run webpack:dev", "webpack:dev:web": "lerna run webpack:dev:web", "webpack:dev:node": "lerna run webpack:dev:node", diff --git a/packages/cactus-core-api/src/main/json/openapi.json b/packages/cactus-core-api/src/main/json/openapi.json index dc1e45be8f..c2c399492c 100644 --- a/packages/cactus-core-api/src/main/json/openapi.json +++ b/packages/cactus-core-api/src/main/json/openapi.json @@ -186,6 +186,7 @@ "BESU_2X", "BURROW_0X", "CORDA_4X", + "ETHEREUM", "FABRIC_14X", "FABRIC_2", "QUORUM_2X", diff --git a/packages/cactus-core-api/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/models/LedgerType.kt b/packages/cactus-core-api/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/models/LedgerType.kt index c52055dea9..7b1d1422ae 100644 --- a/packages/cactus-core-api/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/models/LedgerType.kt +++ b/packages/cactus-core-api/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/models/LedgerType.kt @@ -22,7 +22,7 @@ import com.squareup.moshi.JsonClass /** * Enumerates the different ledger vendors and their major versions encoded within the name of the LedgerType. For example \"BESU_1X\" involves all of the [1.0.0;2.0.0) where 1.0.0 is included and anything up until, but not 2.0.0. See: https://stackoverflow.com/a/4396303/698470 for further explanation. * - * Values: bESU1X,bESU2X,bURROW0X,cORDA4X,fABRIC14X,fABRIC2,qUORUM2X,sAWTOOTH1X + * Values: bESU1X,bESU2X,bURROW0X,cORDA4X,eTHEREUM,fABRIC14X,fABRIC2,qUORUM2X,sAWTOOTH1X */ @JsonClass(generateAdapter = false) @@ -40,6 +40,9 @@ enum class LedgerType(val value: kotlin.String) { @Json(name = "CORDA_4X") cORDA4X("CORDA_4X"), + @Json(name = "ETHEREUM") + eTHEREUM("ETHEREUM"), + @Json(name = "FABRIC_14X") fABRIC14X("FABRIC_14X"), diff --git a/packages/cactus-core-api/src/main/typescript/generated/openapi/typescript-axios/api.ts b/packages/cactus-core-api/src/main/typescript/generated/openapi/typescript-axios/api.ts index 34ce3b3146..da5815e045 100644 --- a/packages/cactus-core-api/src/main/typescript/generated/openapi/typescript-axios/api.ts +++ b/packages/cactus-core-api/src/main/typescript/generated/openapi/typescript-axios/api.ts @@ -524,6 +524,7 @@ export const LedgerType = { Besu2X: 'BESU_2X', Burrow0X: 'BURROW_0X', Corda4X: 'CORDA_4X', + Ethereum: 'ETHEREUM', Fabric14X: 'FABRIC_14X', Fabric2: 'FABRIC_2', Quorum2X: 'QUORUM_2X', diff --git a/packages/cactus-plugin-cc-tx-visualization/README.md b/packages/cactus-plugin-cc-tx-visualization/README.md deleted file mode 100644 index 20f5ba92cd..0000000000 --- a/packages/cactus-plugin-cc-tx-visualization/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# `@hyperledger/cactus-plugin-cctxviz` - -The proposed plugin allows generating process models from arbitrary cross-chain use cases. Currently supports Fabric and Besu. More documentation to come soon. diff --git a/packages/cactus-plugin-cc-tx-visualization/src/main/typescript/models/transaction-receipt.ts b/packages/cactus-plugin-cc-tx-visualization/src/main/typescript/models/transaction-receipt.ts deleted file mode 100644 index 0b6b173359..0000000000 --- a/packages/cactus-plugin-cc-tx-visualization/src/main/typescript/models/transaction-receipt.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { LedgerType } from "@hyperledger/cactus-core-api"; -import { Web3SigningCredential } from "@hyperledger/cactus-plugin-ledger-connector-besu/src/main/typescript/public-api"; -import { - FabricSigningCredential, - GatewayOptions, - TransactReceiptBlockMetaData, - TransactReceiptTransactionCreator, -} from "@hyperledger/cactus-plugin-ledger-connector-fabric/src/main/typescript/generated/openapi/typescript-axios/api"; - -export interface TransactionReceipt { - caseID: string; - blockchainID: LedgerType; - invocationType: string; - methodName: string; - parameters: string[]; - timestamp: Date; -} - -export interface IsVisualizable { - // list of transaction receipts, that will be sent to cc-tx-viz - collectTransactionReceipts: boolean; -} - -// TODO define Tx Receipt for Fabric -export interface FabricV2TxReceipt extends TransactionReceipt { - channelName: string; - transactionID: string | undefined; - contractName: string; - endorsingPeers?: string[]; - endorsingParties?: string[]; - transientData?: any | null; - gatewayOptions?: GatewayOptions; - signingCredentials: FabricSigningCredential; - blockNumber?: string; - transactionCreator?: TransactReceiptTransactionCreator; - blockMetaData?: TransactReceiptBlockMetaData; - chainCodeName?: string; - chainCodeVersion?: string; - responseStatus?: string; -} -export interface BesuV2TxReceipt extends TransactionReceipt { - status: boolean; - transactionHash: string; - transactionIndex: number; - blockNumber: number; - blockHash: string; - contractName: string; - contractAddress?: string; - contractAbi?: string[]; - value?: number | string; - gas?: number | string; - gasPrice?: number | string; - gasUsed?: number | string; - cumulativeGasUsed?: number | string; - from: string; - to: string; - signingCredentials?: Web3SigningCredential; - keychainID?: string; - privateTransactionConfig?: string[]; - timeoutMs?: number | string; -} - -export function toSeconds(date: number): number { - return Math.floor(date / 1000); -} -export function millisecondsLatency(date: Date): number { - return new Date().getTime() - date.getTime(); -} diff --git a/packages/cactus-plugin-cc-tx-visualization/src/main/typescript/plugin-cc-tx-visualization.ts b/packages/cactus-plugin-cc-tx-visualization/src/main/typescript/plugin-cc-tx-visualization.ts deleted file mode 100644 index e16888aec1..0000000000 --- a/packages/cactus-plugin-cc-tx-visualization/src/main/typescript/plugin-cc-tx-visualization.ts +++ /dev/null @@ -1,416 +0,0 @@ -/* eslint-disable prettier/prettier */ -import { Server } from "http"; -import { Server as SecureServer } from "https"; -import { Optional } from "typescript-optional"; -import { promisify } from "util"; -import { - IPluginWebService, - IWebServiceEndpoint, - ICactusPlugin, - ICactusPluginOptions, - LedgerType, -} from "@hyperledger/cactus-core-api"; -//import { BesuApiClient} from "@hyperledger/cactus-plugin-ledger-connector-besu/src/main/typescript/public-api"; -import { stringify } from 'csv-stringify'; - -import fs from 'fs'; -import path from 'path'; - -import { PluginRegistry } from "@hyperledger/cactus-core"; -import { Express } from "express"; - -import { - Checks, - Logger, - LoggerProvider, - LogLevelDesc, -} from "@hyperledger/cactus-common"; -import { calculateGasPriceBesu, CarbonFootPrintConstants, gweiToDollar } from "./models/carbon-footprint"; -import { CrossChainEvent, CrossChainEventLog } from "./models/cross-chain-event"; - -export interface IWebAppOptions { - port: number; - hostname: string; -} -import * as Amqp from "amqp-ts"; -import { CrossChainModel, CrossChainModelType, CrossChainTransactionSchema } from "./models/crosschain-model"; -import { BesuV2TxReceipt, FabricV2TxReceipt, millisecondsLatency } from "./models/transaction-receipt"; -import { randomUUID } from "crypto"; - -export interface IChannelOptions { - queueId: string, - dltTechnology: LedgerType | null, - persistMessages: boolean -} - -export type APIConfig = { - type:LedgerType, - basePath: string -} - -export interface IPluginCcTxVisualizationOptions extends ICactusPluginOptions { - connectorRegistry?: PluginRegistry; - logLevel?: LogLevelDesc; - webAppOptions?: IWebAppOptions; - eventProvider: string; - channelOptions: IChannelOptions; - instanceId: string; -} - -// TODO - for extensability, modularity, and flexibility, -// this plugin could have a list of connections and list of queues -export class CcTxVisualization - implements ICactusPlugin, IPluginWebService { - private readonly log: Logger; - private readonly instanceId: string; - private endpoints: IWebServiceEndpoint[] | undefined; - private httpServer: Server | SecureServer | null = null; - private crossChainLog: CrossChainEventLog; - private crossChainModel: CrossChainModel; - private readonly eventProvider: string; - private amqpConnection: Amqp.Connection; - private amqpQueue: Amqp.Queue; - private amqpExchange: Amqp.Exchange; - public readonly className = "plugin-cc-tx-visualization"; - private readonly queueId: string; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - private txReceipts: any[]; - private readonly persistMessages: boolean; - - constructor(public readonly options: IPluginCcTxVisualizationOptions) { - const startTime = new Date(); - const fnTag = `PluginCcTxVisualization#constructor()`; - if (!options) { - throw new Error(`${fnTag} options falsy.`); - } - Checks.truthy(options.instanceId, `${fnTag} options.instanceId`); - const level = this.options.logLevel || "INFO"; - const label = this.className; - this.queueId = options.channelOptions.queueId || "cc-tx-viz-queue"; - this.log = LoggerProvider.getOrCreate({ - label: label, - level: level, - }); - this.instanceId = this.options.instanceId; - this.crossChainLog = new CrossChainEventLog({name:"CC-TX-VIZ_EVENT_LOGS"}); - //todo should allow different models to be instantiated - this.crossChainModel = new CrossChainModel(); - this.txReceipts = []; - this.persistMessages = options.channelOptions.persistMessages || false; - this.eventProvider = options.eventProvider; - this.log.debug("Initializing connection to RabbitMQ"); - this.amqpConnection = new Amqp.Connection(this.eventProvider); - this.log.info("Connection to RabbitMQ server initialized"); - this.amqpExchange = this.amqpConnection.declareExchange(`cc-tx-viz-exchange`, "direct", {durable: this.persistMessages}); - this.amqpQueue = this.amqpConnection.declareQueue(this.queueId, {durable: this.persistMessages}); - this.amqpQueue.bind(this.amqpExchange); - - const finalTime = new Date(); - this.log.debug(`EVAL-${this.className}-SETUP-CONSTRUCTOR:${finalTime.getTime()-startTime.getTime()}`); - - } - getOpenApiSpec(): unknown { - throw new Error("Method not implemented."); - } - - get numberEventsLog(): number { - return this.crossChainLog.numberEvents(); - } - - get numberUnprocessedReceipts(): number { - return this.txReceipts.length; - } - - public purgeCrossChainEvents(): void { - this.crossChainLog.purgeLogs(); - } - - // todo connection closing is problematic, tests are left hanging - public async closeConnection(): Promise { - this.log.debug("Closing Amqp connection"); - try { - this.amqpConnection.close(); - this.log.debug(" Amqp connection closed"); - - } catch (error) { - this.log.error(error); - } - - } - - public getInstanceId(): string { - return this.instanceId; - } - - public async onPluginInit(): Promise { - return; - } - - public async shutdown(): Promise { - this.log.info(`Shutting down...`); - const serverMaybe = this.getHttpServer(); - if (serverMaybe.isPresent()) { - this.log.info(`Awaiting server.close() ...`); - const server = serverMaybe.get(); - await promisify(server.close.bind(server))(); - this.log.info(`server.close() OK`); - } else { - this.log.info(`No HTTP server found, skipping...`); - } - } - - - async registerWebServices(app: Express): Promise { - const webServices = await this.getOrCreateWebServices(); - await Promise.all(webServices.map((ws) => ws.registerExpress(app))); - return webServices; - } - - public async getOrCreateWebServices(): Promise { - if (Array.isArray(this.endpoints)) { - return this.endpoints; - } - - const { log } = this; - - log.info(`Installing web services for plugin ${this.getPackageName()}...`); - - const endpoints: IWebServiceEndpoint[] = []; - - // TODO implement endpoints - - const pkg = this.getPackageName(); - log.info(`Installed web services for plugin ${pkg} OK`, { endpoints }); - - return endpoints; - } - - public getHttpServer(): Optional { - return Optional.ofNullable(this.httpServer); - } - - public getPackageName(): string { - return `@hyperledger/cactus-plugin-cc-tx-visualization`; - } - - public pollTxReceipts(): Promise { - const fnTag = `${this.className}#pollTxReceipts()`; - this.log.debug(fnTag); - return this.amqpQueue.activateConsumer( (message) => { - const messageContent = message.getContent(); - this.log.debug(`Received message from ${this.queueId}: ${message.content.toString()}`); - this.txReceipts.push(messageContent); - message.ack(); - }, { noAck: false }); - } - - // Precion minimum is 4ms by convention - public async hasProcessedXMessages(numberMessages: number, precision: number): Promise { - while (this.txReceipts.length < numberMessages) { - await new Promise((resolve) => setTimeout(resolve, precision)); - } - return; - - } - - public async txReceiptToCrossChainEventLogEntry(): Promise { - const startTime = new Date(); - const fnTag = `${this.className}#pollTxReceipts()`; - this.log.debug(fnTag); - // We are processing receipts to update the CrossChainLog. - // At the end of the processing, we need to clear the transaction receipts that have been processed - // Therefore, we need a listen method that cctxviz is always running, doing polls every X seconds, followed by receipt processing (this method) - try { - this.txReceipts.forEach(receipt => { - switch(receipt.blockchainID) { - case LedgerType.Besu2X: - const besuReceipt: BesuV2TxReceipt = receipt; - const ccEventFromBesu:CrossChainEvent = { - caseID: besuReceipt.caseID, - receiptID: besuReceipt.transactionHash, - blockchainID:besuReceipt.blockchainID, - invocationType: besuReceipt.invocationType, - methodName:besuReceipt.methodName, - parameters:besuReceipt.parameters, - timestamp: besuReceipt.timestamp, - identity: besuReceipt.from, - cost: gweiToDollar(calculateGasPriceBesu(besuReceipt.gasUsed as number)), - carbonFootprint: CarbonFootPrintConstants(LedgerType.Besu2X), - latency: millisecondsLatency(new Date(receipt.timestamp)), - revenue: receipt.revenue || 0, - }; - this.crossChainLog.addCrossChainEvent(ccEventFromBesu); - this.log.info("Added Cross Chain event from BESU"); - this.log.debug(`Cross-chain log: ${JSON.stringify(ccEventFromBesu)}`); - break; - case LedgerType.Fabric2: - const fabricReceipt: FabricV2TxReceipt = receipt; - const ccEventFromFabric:CrossChainEvent = { - caseID: fabricReceipt.caseID, - receiptID: fabricReceipt.transactionID || `FABRIC-CALL-${randomUUID()}`, - blockchainID: fabricReceipt.blockchainID, - invocationType: fabricReceipt.invocationType, - methodName: fabricReceipt.methodName, - parameters: fabricReceipt.parameters, - timestamp: fabricReceipt.timestamp, - identity: fabricReceipt.signingCredentials.keychainRef, - cost: receipt.cost || 0, - carbonFootprint: CarbonFootPrintConstants(LedgerType.Fabric2), - latency: millisecondsLatency(new Date(receipt.timestamp)), - revenue: receipt.revenue || 0, - }; - this.crossChainLog.addCrossChainEvent(ccEventFromFabric); - this.log.info("Added Cross Chain event from FABRIC"); - this.log.debug(`Cross-chain log: ${JSON.stringify(ccEventFromFabric)}`); - break; - // used to test cctxviz - case "TEST": - const ccEventTest:CrossChainEvent = { - caseID: receipt.caseID, - receiptID: receipt.receiptID || randomUUID(), - blockchainID: receipt.blockchainID, - invocationType: receipt.invocationType, - methodName: receipt.methodName, - parameters: receipt.parameters, - timestamp: receipt.timestamp, - identity: receipt.identity, - cost: receipt.cost || 0, - carbonFootprint: receipt.carbonFootprint || 0, - latency: receipt.latency || millisecondsLatency(new Date(receipt.timestamp)), - revenue: receipt.revenue, - }; - this.crossChainLog.addCrossChainEvent(ccEventTest); - this.log.info("Added Cross Chain event TEST"); - this.log.debug(`Cross-chain log: ${JSON.stringify(ccEventTest)}`); - break; - default: - this.log.warn(`Tx Receipt with case ID ${receipt.caseID} is not supported`); - break; - } - - }); - // Clear receipt array - this.txReceipts = []; - const finalTime = new Date(); - this.log.debug(`EVAL-${this.className}-RECEIPT2EVENT:${finalTime.getTime()-startTime.getTime()}`); - return; - } catch (error) { - this.log.error(error); - } - - } - - // Parses the cross chain event log and updates the cross chain model - // This is part of the cc model; have a set that maps case id to data structure; this data structure are the consolidated metrics for a cctx, stores each txid - // run over cc log; if case id is unique create new entry, otherwise add tx to cctx, update metrics, update last update; this is an updatable model - public async aggregateCcTx(): Promise { - const startTime = new Date(); - const lastAggregated = this.crossChainModel.lastAggregation; - const newAggregationDate = new Date(); - const ccTxSet = this.crossChainModel.getCCTxs(); - const logEntries = this.crossChainLog.logEntries; - // If entries are more recent than aggregation - let metrics: CrossChainTransactionSchema = { - ccTxID: "", - processedCrossChainEvents: [], - latency: 0, - carbonFootprint: 0, - cost: 0, - throughput: 0, - latestUpdate: newAggregationDate, - revenue: 0, - }; - const logsToAggregate = logEntries.filter(log => new Date(log.timestamp).getTime() > new Date(lastAggregated).getTime()); - if (logsToAggregate.length === 0) { - const finalTime = new Date(); - - this.log.debug(`EVAL-${this.className}-AGGREGATE-CCTX-NO_NEW_LOGS:${finalTime.getTime()-startTime.getTime()}`); - return;} - logsToAggregate.forEach(eventEntry => { - const key = eventEntry.caseID; - const eventID = eventEntry.receiptID; - let latency = eventEntry.latency as number; - let carbonFootprint = eventEntry.carbonFootprint as number; - let cost = eventEntry.cost as number; - const revenue = eventEntry.revenue as number; - - if (!latency) {latency = 0;} - if (!carbonFootprint) {carbonFootprint = 0;} - if (!cost) {cost = 0;} - if (ccTxSet?.has(key)) { - const existingCCTx = ccTxSet.get(key); - const previousEvents = existingCCTx?.processedCrossChainEvents || []; - const numberOfCurrentEvents = previousEvents.length + 1; - const previousLatency = existingCCTx?.latency || 0; - const previousCarbonFootprint = existingCCTx?.carbonFootprint || 0; - const previousCost = existingCCTx?.cost || 0; - const currentCost = (cost + previousCost) / numberOfCurrentEvents; - const previousRevenue = existingCCTx?.revenue || 0; - const currentRevenue = (revenue + previousRevenue) / numberOfCurrentEvents; - - const updatedMetrics = { - ccTxID: key, - processedCrossChainEvents: [...previousEvents , eventID], - latency: (latency + previousLatency) / numberOfCurrentEvents, - carbonFootprint: (carbonFootprint + previousCarbonFootprint) / numberOfCurrentEvents, - cost: currentCost, - throughput: Number(latency != 0 ? (1 / ((latency + previousLatency) / numberOfCurrentEvents)).toFixed(3) as unknown as number : 0), - latestUpdate: lastAggregated, - revenue: currentRevenue, - }; - this.crossChainModel.setCCTxs(key,updatedMetrics); - } else { - metrics = { - ccTxID: key, - processedCrossChainEvents: [eventID], - latency: latency, - carbonFootprint: carbonFootprint, - cost: cost, - throughput: Number((latency != 0 ? 1 / latency : 0).toFixed(3) as unknown as number), - latestUpdate: lastAggregated, - revenue: revenue, - }; - this.crossChainModel.setCCTxs(key,metrics); - } - }); - this.crossChainModel.setLastAggregationDate(newAggregationDate); - const finalTime = new Date(); - this.log.debug(`${this.className}-AGGREGATE-CCTX-SUCCESS:${finalTime.getTime()-startTime.getTime()}`); - return; - } - - public async persistCrossChainLogCsv (name?: string): Promise { - const startTime = new Date(); - const columns = this.crossChainLog.getCrossChainLogAttributes(); - const logName = name? `${name}.csv` : `cctxviz_log_${new Date().getTime()}.csv`; - const csvFolder = path.join(__dirname, "../" , "../", "test", "csv"); - const logPath = path.join(csvFolder , logName); - - stringify( - this.crossChainLog.logEntries - , { - header: true, - columns: columns, - delimiter: ";", - }, (err, data) =>{ - if (err) { - this.log.error(err); - throw new Error("failed to stringify log"); - } - this.log.debug(data); - fs.writeFileSync(logPath, data); - }); - const finalTime = new Date(); - this.log.debug(`EVAL-${this.className}-PERSIST-LOG:${finalTime.getTime()-startTime.getTime()}`); - return logName; - } - - // Receives a serialized model - public async saveModel (modelType: CrossChainModelType, model :string): Promise { - this.crossChainModel.saveModel(modelType, model); - } - - public async getModel (modelType: CrossChainModelType): Promise { - return this.crossChainModel.getModel(modelType); - } -} \ No newline at end of file diff --git a/packages/cactus-plugin-cc-tx-visualization/src/main/typescript/plugin-factory-cc-tx-visualization.ts b/packages/cactus-plugin-cc-tx-visualization/src/main/typescript/plugin-factory-cc-tx-visualization.ts deleted file mode 100644 index 7d18d6d1c1..0000000000 --- a/packages/cactus-plugin-cc-tx-visualization/src/main/typescript/plugin-factory-cc-tx-visualization.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { - IPluginFactoryOptions, - PluginFactory, -} from "@hyperledger/cactus-core-api"; -import { - IPluginCcTxVisualizationOptions, - CcTxVisualization, -} from "./plugin-cc-tx-visualization"; - -export class PluginFactoryWebService extends PluginFactory< - CcTxVisualization, - IPluginCcTxVisualizationOptions, - IPluginFactoryOptions -> { - async create( - pluginOptions: IPluginCcTxVisualizationOptions, - ): Promise { - return new CcTxVisualization(pluginOptions); - } -} diff --git a/packages/cactus-plugin-cc-tx-visualization/src/main/typescript/public-api.ts b/packages/cactus-plugin-cc-tx-visualization/src/main/typescript/public-api.ts deleted file mode 100755 index 7da664906e..0000000000 --- a/packages/cactus-plugin-cc-tx-visualization/src/main/typescript/public-api.ts +++ /dev/null @@ -1,17 +0,0 @@ -export { - CcTxVisualization, - IPluginCcTxVisualizationOptions, - IWebAppOptions, -} from "./plugin-cc-tx-visualization"; - -export { IsVisualizable } from "./models/transaction-receipt"; -export { PluginFactoryWebService } from "./plugin-factory-cc-tx-visualization"; - -import { IPluginFactoryOptions } from "@hyperledger/cactus-core-api"; -import { PluginFactoryWebService } from "./plugin-factory-cc-tx-visualization"; - -export async function createPluginFactory( - pluginFactoryOptions: IPluginFactoryOptions, -): Promise { - return new PluginFactoryWebService(pluginFactoryOptions); -} diff --git a/packages/cactus-plugin-cc-tx-visualization/src/test/csv/dummy-use-case-6-events.csv b/packages/cactus-plugin-cc-tx-visualization/src/test/csv/dummy-use-case-6-events.csv deleted file mode 100644 index 0b0ec28b6c..0000000000 --- a/packages/cactus-plugin-cc-tx-visualization/src/test/csv/dummy-use-case-6-events.csv +++ /dev/null @@ -1,7 +0,0 @@ -caseID;receiptID;timestamp;blockchainID;invocationType;methodName;parameters;identity;cost;carbonFootprint;latency;revenue -1;515ca87f-fbac-49f0-a4cf-d3bf5eb62860;2022-08-03T14:04:52.844Z;TEST;send;initialize asset;"[""1,100""]";A;0;0;7621; -1;2a5ca7a6-344c-4dfd-a005-98811fc889ce;2022-08-03T14:04:52.846Z;TEST;send;lock asset;"[""1,100""]";A;0;0;7620; -1;4b3a5b7f-9bb2-413e-b2f4-74822db34c07;2022-08-03T14:04:52.847Z;TEST;send;mint asset;"[""1,100""]";A;0;0;7619; -1;ee00b057-2f8e-4d57-89b0-ec9390a53e9b;2022-08-03T14:04:52.848Z;TEST;send;transfer asset;"[""A""]";A;0;0;7618; -1;d31efa25-097b-4496-9c75-bc8daca1cf51;2022-08-03T14:04:52.849Z;TEST;send;transfer asset;"[""""]";A;0;0;7617; -1;020c5f54-006f-4f49-b675-7cf85fb3cd80;2022-08-03T14:04:52.850Z;TEST;send;burn asset;"[""""]";A;0;0;7617; diff --git a/packages/cactus-plugin-cc-tx-visualization/src/test/csv/dummy-use-case-60-events.csv b/packages/cactus-plugin-cc-tx-visualization/src/test/csv/dummy-use-case-60-events.csv deleted file mode 100644 index 378c12bc6d..0000000000 --- a/packages/cactus-plugin-cc-tx-visualization/src/test/csv/dummy-use-case-60-events.csv +++ /dev/null @@ -1,61 +0,0 @@ -caseID;receiptID;timestamp;blockchainID;invocationType;methodName;parameters;identity;cost;carbonFootprint;latency;revenue -10;672c7375-b463-4602-882a-5b50ca93af39;2022-07-07T16:03:18.375Z;TEST;send;initialize asset;"[""1,100""]";A;0;0;7646; -10;3095c26a-d2db-4f25-823e-0de1e829e11d;2022-07-07T16:03:18.377Z;TEST;send;lock asset;"[""1,100""]";A;0;0;7644; -10;5c2c87f0-0f27-4e86-85b2-8b0816b10c24;2022-07-07T16:03:18.378Z;TEST;send;mint asset;"[""1,100""]";A;0;0;7643; -10;022e0884-4b78-4784-8929-caa2d1ed7234;2022-07-07T16:03:18.379Z;TEST;send;transfer asset;"[""A""]";A;0;0;7642; -10;af311552-9ff1-421c-a4f1-d12e5ec20347;2022-07-07T16:03:18.380Z;TEST;send;transfer asset;"[""""]";A;0;0;7642; -10;7af1d933-da3c-4835-bc96-4dbbac913ddf;2022-07-07T16:03:18.381Z;TEST;send;burn asset;"[""""]";A;0;0;7641; -9;ddcaff66-949e-49cb-9250-508598fc4408;2022-07-07T16:03:18.375Z;TEST;send;initialize asset;"[""1,100""]";A;0;0;7647; -9;9f0eb346-4bfc-4687-8ca6-2fc181260eb0;2022-07-07T16:03:18.377Z;TEST;send;lock asset;"[""1,100""]";A;0;0;7645; -9;33ed7788-50e1-44a4-8d5a-62656dd84cf7;2022-07-07T16:03:18.378Z;TEST;send;mint asset;"[""1,100""]";A;0;0;7644; -9;564c7787-eae0-4dbe-82c7-4a2f07a65286;2022-07-07T16:03:18.379Z;TEST;send;transfer asset;"[""A""]";A;0;0;7644; -9;66d2cd2c-b5ee-417c-a09f-4910a42468ed;2022-07-07T16:03:18.380Z;TEST;send;transfer asset;"[""""]";A;0;0;7643; -9;24a76769-c283-4ed3-a6c1-f495a068a94f;2022-07-07T16:03:18.381Z;TEST;send;burn asset;"[""""]";A;0;0;7642; -8;96b7c76f-7f2a-444f-a263-331292842dd3;2022-07-07T16:03:18.375Z;TEST;send;initialize asset;"[""1,100""]";A;0;0;7648; -8;06830bf5-d41c-4dce-aea3-237f0ba7ed71;2022-07-07T16:03:18.377Z;TEST;send;lock asset;"[""1,100""]";A;0;0;7647; -8;5429fead-c8f7-4906-a15b-1d0ff84885d1;2022-07-07T16:03:18.378Z;TEST;send;mint asset;"[""1,100""]";A;0;0;7646; -8;d4316180-80af-4eb0-91bc-e3a7c302b3f2;2022-07-07T16:03:18.379Z;TEST;send;transfer asset;"[""A""]";A;0;0;7645; -8;552525b6-8ec6-4b65-a8ce-0afc245dadf4;2022-07-07T16:03:18.380Z;TEST;send;transfer asset;"[""""]";A;0;0;7644; -8;df8de589-e4c1-4323-b283-088dd60368a6;2022-07-07T16:03:18.381Z;TEST;send;burn asset;"[""""]";A;0;0;7643; -7;5974b1e7-5db3-4139-ab8a-d9e255ea72a4;2022-07-07T16:03:18.375Z;TEST;send;initialize asset;"[""1,100""]";A;0;0;7649; -7;39d7a374-4725-48cf-a600-4d0935b7e249;2022-07-07T16:03:18.377Z;TEST;send;lock asset;"[""1,100""]";A;0;0;7648; -7;0fbff6f5-c1a4-470f-a957-d98086e51cbf;2022-07-07T16:03:18.378Z;TEST;send;mint asset;"[""1,100""]";A;0;0;7647; -7;054cbc90-06cd-4461-8509-903fca7fc963;2022-07-07T16:03:18.379Z;TEST;send;transfer asset;"[""A""]";A;0;0;7646; -7;abbd93cf-9ea2-431d-b688-4f85d0befa1d;2022-07-07T16:03:18.380Z;TEST;send;transfer asset;"[""""]";A;0;0;7645; -7;432d3e06-9624-438f-99c3-173452359762;2022-07-07T16:03:18.381Z;TEST;send;burn asset;"[""""]";A;0;0;7645; -6;d022a95a-bf69-4585-8d2c-c1d09c8d2ab7;2022-07-07T16:03:18.375Z;TEST;send;initialize asset;"[""1,100""]";A;0;0;7651; -6;40be8287-6f8c-4719-a24d-3270d07682e4;2022-07-07T16:03:18.377Z;TEST;send;lock asset;"[""1,100""]";A;0;0;7649; -6;0c9e2c65-e2ac-4d47-8fab-35029aaf86d7;2022-07-07T16:03:18.378Z;TEST;send;mint asset;"[""1,100""]";A;0;0;7648; -6;125cccb6-56cb-4653-8114-609d29bfced0;2022-07-07T16:03:18.379Z;TEST;send;transfer asset;"[""A""]";A;0;0;7647; -6;adf7b151-d318-4ddd-9c31-8a0e9319eb88;2022-07-07T16:03:18.380Z;TEST;send;transfer asset;"[""""]";A;0;0;7646; -6;29c7f1a7-c812-4c4c-bb55-90ae0c78eaed;2022-07-07T16:03:18.381Z;TEST;send;burn asset;"[""""]";A;0;0;7646; -5;09dfa0a0-1107-4453-8cb4-dcca500b102e;2022-07-07T16:03:18.375Z;TEST;send;initialize asset;"[""1,100""]";A;0;0;7652; -5;c81ffbcd-7bdf-44c3-bc9b-a3d664464094;2022-07-07T16:03:18.377Z;TEST;send;lock asset;"[""1,100""]";A;0;0;7650; -5;7e78e8ea-912e-471b-b412-2b2a71c2bdc7;2022-07-07T16:03:18.378Z;TEST;send;mint asset;"[""1,100""]";A;0;0;7649; -5;71587b9e-78d8-4f8f-a3df-568d26dded51;2022-07-07T16:03:18.379Z;TEST;send;transfer asset;"[""A""]";A;0;0;7648; -5;127b0e58-cf75-4dbe-9767-8053335f90d2;2022-07-07T16:03:18.380Z;TEST;send;transfer asset;"[""""]";A;0;0;7648; -5;4173755f-6012-4e14-9b5c-52f628888846;2022-07-07T16:03:18.381Z;TEST;send;burn asset;"[""""]";A;0;0;7647; -4;2be88040-b17d-4e71-854e-7b815778713e;2022-07-07T16:03:18.375Z;TEST;send;initialize asset;"[""1,100""]";A;0;0;7653; -4;550643ce-7e2c-4f6a-bed7-6400fa8ba5be;2022-07-07T16:03:18.377Z;TEST;send;lock asset;"[""1,100""]";A;0;0;7651; -4;85b72b5e-c6f0-4d53-8527-8283e0b198a0;2022-07-07T16:03:18.378Z;TEST;send;mint asset;"[""1,100""]";A;0;0;7650; -4;7fb7df34-c7c0-4077-bffa-577dbd11e9ea;2022-07-07T16:03:18.379Z;TEST;send;transfer asset;"[""A""]";A;0;0;7649; -4;bb1b5e57-bfa9-407b-8797-b64f0e99ec81;2022-07-07T16:03:18.380Z;TEST;send;transfer asset;"[""""]";A;0;0;7649; -4;1583ef47-dff0-4897-a9a2-1fddb02817ab;2022-07-07T16:03:18.381Z;TEST;send;burn asset;"[""""]";A;0;0;7648; -3;07803bdd-6f8b-460b-9e4e-378befce11e2;2022-07-07T16:03:18.375Z;TEST;send;initialize asset;"[""1,100""]";A;0;0;7654; -3;fb1d93d3-9e98-4213-bf3d-e219d0201fd3;2022-07-07T16:03:18.377Z;TEST;send;lock asset;"[""1,100""]";A;0;0;7652; -3;6ec5ed7d-fad5-41c1-96b7-834370dfddd5;2022-07-07T16:03:18.378Z;TEST;send;mint asset;"[""1,100""]";A;0;0;7651; -3;aa32d8bf-9a17-479b-be99-098931378896;2022-07-07T16:03:18.379Z;TEST;send;transfer asset;"[""A""]";A;0;0;7651; -3;961f131b-9632-4909-ad73-a30c97d689c8;2022-07-07T16:03:18.380Z;TEST;send;transfer asset;"[""""]";A;0;0;7650; -3;e7d9e88c-5a8b-4ae5-aeb3-16bc7fe10d99;2022-07-07T16:03:18.381Z;TEST;send;burn asset;"[""""]";A;0;0;7649; -2;2cdc5e7c-1ce0-43f2-a6a5-cac754beba08;2022-07-07T16:03:18.375Z;TEST;send;initialize asset;"[""1,100""]";A;0;0;7655; -2;f48ff1d5-5f9d-4769-93dc-7435f516d3e3;2022-07-07T16:03:18.377Z;TEST;send;lock asset;"[""1,100""]";A;0;0;7653; -2;e4d51446-a241-47f7-932e-187102aca449;2022-07-07T16:03:18.378Z;TEST;send;mint asset;"[""1,100""]";A;0;0;7653; -2;2aa46d3c-111c-4b5b-80e1-5716ba4a889c;2022-07-07T16:03:18.379Z;TEST;send;transfer asset;"[""A""]";A;0;0;7652; -2;cad9d38d-5791-445f-a7ae-7bad0dea5525;2022-07-07T16:03:18.380Z;TEST;send;transfer asset;"[""""]";A;0;0;7651; -2;086a681d-3c3c-49ea-a66c-3251eae97633;2022-07-07T16:03:18.381Z;TEST;send;burn asset;"[""""]";A;0;0;7650; -1;ed54f76d-3ace-45f5-b233-7b541d7deec5;2022-07-07T16:03:18.375Z;TEST;send;initialize asset;"[""1,100""]";A;0;0;7656; -1;bc54f38c-909f-433b-ace9-5acf4c109784;2022-07-07T16:03:18.377Z;TEST;send;lock asset;"[""1,100""]";A;0;0;7655; -1;8006179b-8e93-4ac1-b806-016138c79b7c;2022-07-07T16:03:18.378Z;TEST;send;mint asset;"[""1,100""]";A;0;0;7654; -1;8bfbc22d-2224-4050-b513-205b1529a9d3;2022-07-07T16:03:18.379Z;TEST;send;transfer asset;"[""A""]";A;0;0;7653; -1;a47b4c5e-ed79-423a-a5f0-832af54d356f;2022-07-07T16:03:18.380Z;TEST;send;transfer asset;"[""""]";A;0;0;7652; -1;3aecbfb3-3b9f-43e9-a88d-dc8dc06b0608;2022-07-07T16:03:18.381Z;TEST;send;burn asset;"[""""]";A;0;0;7651; diff --git a/packages/cactus-plugin-cc-tx-visualization/src/test/csv/dummy-use-case-invalid.csv b/packages/cactus-plugin-cc-tx-visualization/src/test/csv/dummy-use-case-invalid.csv deleted file mode 100644 index 11c53ff5f7..0000000000 --- a/packages/cactus-plugin-cc-tx-visualization/src/test/csv/dummy-use-case-invalid.csv +++ /dev/null @@ -1,7 +0,0 @@ -caseID;receiptID;timestamp;blockchainID;invocationType;methodName;parameters;identity;cost;carbonFootprint;latency;revenue -INVALID_FABRIC_BESU_1;f0e58801-e6dd-44d4-91de-4adb2113a68b;2022-08-03T14:05:37.740Z;TEST;send;createAsset;"[""asset1,5""]";A;0;0;7602; -INVALID_FABRIC_BESU_1;fe6e7084-74da-4d1e-8681-6603111a71fc;2022-08-03T14:05:37.742Z;TEST;send;mintAsset;"[""asset1"",""Green"",""19"",""owner1"",""9999""]";A;0;0;7601; -INVALID_FABRIC_BESU_1;e7466cb2-4eaf-44f0-acd3-0b0dfae52801;2022-08-03T14:05:37.743Z;TEST;send;lockAsset;"[""asset1""]";A;0;0;7600; -INVALID_FABRIC_BESU_1;4df9be1c-6e47-40dd-8722-90072b0b04bd;2022-08-03T14:05:37.744Z;TEST;send;transferAsset;"[""asset1"",""owner2""]";A;0;0;7599; -INVALID_FABRIC_BESU_1;9a130336-c165-4e05-b72c-3b9c3fa583a0;2022-08-03T14:05:37.745Z;TEST;send;transferAsset;"[""asset1"",""owner1""]";A;0;0;7598; -INVALID_FABRIC_BESU_1;b8fef379-e64f-4aa0-97d8-45f28276576c;2022-08-03T14:05:37.746Z;TEST;send;BurnAsset;"[""asset1""]";A;0;0;7598; diff --git a/packages/cactus-plugin-cc-tx-visualization/src/test/csv/example-dummy-use-case.csv b/packages/cactus-plugin-cc-tx-visualization/src/test/csv/example-dummy-use-case.csv deleted file mode 100644 index a4e72b6acb..0000000000 --- a/packages/cactus-plugin-cc-tx-visualization/src/test/csv/example-dummy-use-case.csv +++ /dev/null @@ -1,9 +0,0 @@ -caseID;timestamp;blockchainID;invocationType;methodName;parameters;identity -1;2022-04-28T16:14:23.922Z;TEST;send;registerEmission;"[""1,100""]";company_A -2;2022-04-28T16:14:23.922Z;TEST;send;registerEmission;"[""2,100""]";company_B -1;2022-04-29T20:01:03.922Z;TEST;send;registerEmission;"[""2,100""]";company_A -1;2022-05-10T06:01:03.922Z;TEST;send;getEmissions;"[""company_A""]";auditor -1;2022-05-11T09:47:43.922Z;TEST;send;mintEmissionToken;"[""uuidTokenEmissions""]";protocol_administrator -2;2022-04-29T22:47:43.922Z;TEST;send;registerEmission;"[""2,100""]";company_B -2;2022-05-11T09:47:43.922Z;TEST;send;getEmissions;"[""company_B""]";auditor -2;2022-05-12T13:34:23.922Z;TEST;send;mintEmissionToken;"[""uuidTokenEmissions""]";protocol_administrator diff --git a/packages/cactus-plugin-cc-tx-visualization/src/test/csv/use-case-besu-fabric-6-events.csv b/packages/cactus-plugin-cc-tx-visualization/src/test/csv/use-case-besu-fabric-6-events.csv deleted file mode 100644 index 2619033017..0000000000 --- a/packages/cactus-plugin-cc-tx-visualization/src/test/csv/use-case-besu-fabric-6-events.csv +++ /dev/null @@ -1,7 +0,0 @@ -caseID;receiptID;timestamp;blockchainID;invocationType;methodName;parameters;identity;cost;carbonFootprint;latency;revenue -FABRIC_BESU;0xd184f5a49d170e2f7f9fcb7996e8db3d7764c13d798fc5a795e0d9371dd61435;2022-06-24T14:47:43.716Z;BESU_2X;SEND;createAsset;"[""asset1"",5]";0x627306090abab3a6e1400e9345bc60c78a8bef57;5.27;0.00018;10065;0 -FABRIC_BESU;0xc315d4ee310a04d4c0949279f4edba34fa8fb35cf5fe4fb1e4b95488202860fc;2022-06-24T14:47:45.312Z;BESU_2X;SEND;lockAsset;"[""asset1""]";0x627306090abab3a6e1400e9345bc60c78a8bef57;2.18;0.00018;8469;0 -FABRIC_BESU;7fddc8aef1a46f23fa33891b4ab6b951c7224671575b573cd47e7711cd9449b1;2022-06-24T14:47:47.102Z;FABRIC_2;FabricContractInvocationType.SEND;MintAsset;"[""asset1"",""Green"",""19"",""owner1"",""9999""]";user2;0;0.00018;6679;0 -FABRIC_BESU;7c395a691ba45d7fe921fb5f69b40fbff810459f8f9f274307c58fb070b2910a;2022-06-24T14:47:49.361Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;"[""asset1"",""owner2""]";user2;0;0.00018;4420;0 -FABRIC_BESU;a6b747257c6e92b8c85292561999dad7dcf56051f2c6c639a2bbbd987a4afbdf;2022-06-24T14:47:51.573Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;"[""asset1"",""owner1""]";user2;0;0.00018;2208;0 -FABRIC_BESU;fc20c6cd4f1cbd6b06da6cd1fc846a0b2051382096d63cd7e8a67865471526f1;2022-06-24T14:47:53.767Z;FABRIC_2;FabricContractInvocationType.SEND;BurnAsset;"[""asset1""]";user2;0;0.00018;14;0 diff --git a/packages/cactus-plugin-cc-tx-visualization/src/test/csv/use-case-besu-fabric-60-events.csv b/packages/cactus-plugin-cc-tx-visualization/src/test/csv/use-case-besu-fabric-60-events.csv deleted file mode 100644 index 2e6e397e0b..0000000000 --- a/packages/cactus-plugin-cc-tx-visualization/src/test/csv/use-case-besu-fabric-60-events.csv +++ /dev/null @@ -1,61 +0,0 @@ -caseID;receiptID;timestamp;blockchainID;invocationType;methodName;parameters;identity;cost;carbonFootprint;latency;revenue -10;0x0b84cd21633da69461dc0189b4ddc566bd4d794cb5b0094348c6d24217c66687;2022-06-25T10:59:25.183Z;BESU_2X;SEND;createAsset;"[""asset10"",5]";0x627306090abab3a6e1400e9345bc60c78a8bef57;5.28;0.00018;103484;0 -10;0x255fb16b63d60d9f24f9809e444f0c5da6a1145d9de25c8b8acca5f0791b73bc;2022-06-25T10:59:26.102Z;BESU_2X;SEND;lockAsset;"[""asset10""]";0x627306090abab3a6e1400e9345bc60c78a8bef57;2.18;0.00018;102566;0 -10;1b7572e4c269dc6ee321da24b8eb464d1a6cee310ba3975bd4f90edf414c4766;2022-06-25T10:59:27.347Z;FABRIC_2;FabricContractInvocationType.SEND;MintAsset;"[""asset10"",""Green"",""19"",""owner1"",""9999""]";user2;0;0.00018;101321;0 -10;264b1a9e086920b5c8e21562dfd0b7034a313fb1c672d4b0a5805120aacde642;2022-06-25T10:59:29.562Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;"[""asset10"",""owner2""]";user2;0;0.00018;99106;0 -10;17655a502c1ff999d966b926f99658b8dd84027e3f5b49b6374a162d7ebe39ce;2022-06-25T10:59:31.777Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;"[""asset10"",""owner1""]";user2;0;0.00018;96892;0 -10;6d173ade6a8da3e9b7b4cdc54a0756d4eeb5a6ecae61edb32c892956f87433bf;2022-06-25T10:59:34.051Z;FABRIC_2;FabricContractInvocationType.SEND;BurnAsset;"[""asset10""]";user2;0;0.00018;94618;0 -9;0xc27e6a83b344020f5cdffed3ec0e76f85ad1f46bef5874f7237219540626324a;2022-06-25T10:59:35.130Z;BESU_2X;SEND;createAsset;"[""asset9"",5]";0x627306090abab3a6e1400e9345bc60c78a8bef57;5.27;0.00018;93539;0 -9;0x19c60c14bcc4162e6633f76e0ee12911c8c5a4164a4e84fcdfc5bfa362f4546d;2022-06-25T10:59:36.173Z;BESU_2X;SEND;lockAsset;"[""asset9""]";0x627306090abab3a6e1400e9345bc60c78a8bef57;2.18;0.00018;92497;0 -9;7dc4caed5df3b823497626e64d8251b88ebda89658df4366d2bd85e0629ba542;2022-06-25T10:59:38.453Z;FABRIC_2;FabricContractInvocationType.SEND;MintAsset;"[""asset9"",""Green"",""19"",""owner1"",""9999""]";user2;0;0.00018;90217;0 -9;551bfac56479dc5ea1044a081526588ebe272984bfc113edf02cf4c7516d7d39;2022-06-25T10:59:40.676Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;"[""asset9"",""owner2""]";user2;0;0.00018;87994;0 -9;9b06aaa26a2235df1c83687eb5425ca58e7150f3a6b21b74a5bbac56fb3a768a;2022-06-25T10:59:42.867Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;"[""asset9"",""owner1""]";user2;0;0.00018;85803;0 -9;e15cdcc70b1bc670b50acf8dd7d074f07e43b49cecce6ef8216e9e25c70856e8;2022-06-25T10:59:45.105Z;FABRIC_2;FabricContractInvocationType.SEND;BurnAsset;"[""asset9""]";user2;0;0.00018;83566;0 -8;0x9b31a1c51a1498d0cbcbc6e7751ec96847509146f1b0824c72e88e36f28dc675;2022-06-25T10:59:46.224Z;BESU_2X;SEND;createAsset;"[""asset8"",5]";0x627306090abab3a6e1400e9345bc60c78a8bef57;5.27;0.00018;82447;0 -8;0x7d962f902de9367d477f24f13d106f0de8002f217f401eac16a485d274a03e2a;2022-06-25T10:59:47.386Z;BESU_2X;SEND;lockAsset;"[""asset8""]";0x627306090abab3a6e1400e9345bc60c78a8bef57;2.18;0.00018;81285;0 -8;d5ce85e36492b9c164d88c4ba4615202c20ff7018303ec7855fcbf979aa2038d;2022-06-25T10:59:49.537Z;FABRIC_2;FabricContractInvocationType.SEND;MintAsset;"[""asset8"",""Green"",""19"",""owner1"",""9999""]";user2;0;0.00018;79135;0 -8;6f4bacb0a6cc996ebd241a51e73c2b7da61085284f5bb2b7097191324391189a;2022-06-25T10:59:51.679Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;"[""asset8"",""owner2""]";user2;0;0.00018;76993;0 -8;750c903bd5870a72d6a48836123af036c34bed1ff0f0c427ec7702c9e6d5477d;2022-06-25T10:59:53.840Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;"[""asset8"",""owner1""]";user2;0;0.00018;74832;0 -8;70f3f9e97cceb4ae4c992c701b75188ffac571ea28bc2a7b664d9d83f7d2d634;2022-06-25T10:59:56.017Z;FABRIC_2;FabricContractInvocationType.SEND;BurnAsset;"[""asset8""]";user2;0;0.00018;72655;0 -7;0x7c2e2a12a0263a0562f0e874b5367856dff1295b447b6aa6587499520eb483f6;2022-06-25T10:59:57.165Z;BESU_2X;SEND;createAsset;"[""asset7"",5]";0x627306090abab3a6e1400e9345bc60c78a8bef57;5.27;0.00018;71508;0 -7;0xdd4f0626d4893812a69bbf7369598e8930328bf0a2f72530f5e328a3dab5f23f;2022-06-25T10:59:58.644Z;BESU_2X;SEND;lockAsset;"[""asset7""]";0x627306090abab3a6e1400e9345bc60c78a8bef57;2.18;0.00018;70029;0 -7;aafd581a460cb584394b5b02f158521fece5a64a392764a6c6b64a6144735dd6;2022-06-25T11:00:00.353Z;FABRIC_2;FabricContractInvocationType.SEND;MintAsset;"[""asset7"",""Green"",""19"",""owner1"",""9999""]";user2;0;0.00018;68320;0 -7;1dcaef34942fcd520df700e1ddb289940ecd92b48ef422ac8bcc297c816dccc0;2022-06-25T11:00:02.559Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;"[""asset7"",""owner2""]";user2;0;0.00018;66114;0 -7;3b66f7f62ecbdd4fe41c71f6379b712ad7e3f845b76e75af2f7c08e57aa1011b;2022-06-25T11:00:04.791Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;"[""asset7"",""owner1""]";user2;0;0.00018;63883;0 -7;99ee4284e38531fc2a4b2524019d48dcd8960d0d784d9c99f47f8514ed77b061;2022-06-25T11:00:06.981Z;FABRIC_2;FabricContractInvocationType.SEND;BurnAsset;"[""asset7""]";user2;0;0.00018;61693;0 -6;0x2348af3e9cf3e817918c947002ac5c5ce25d1a720c02fc35a90f91cb13bb0ec3;2022-06-25T11:00:07.306Z;BESU_2X;SEND;createAsset;"[""asset6"",5]";0x627306090abab3a6e1400e9345bc60c78a8bef57;5.27;0.00018;61368;0 -6;0xb257570d87c2025d4a0f5a95a2ed74fdac76ad5329449841ad2347b21d4f3432;2022-06-25T11:00:08.058Z;BESU_2X;SEND;lockAsset;"[""asset6""]";0x627306090abab3a6e1400e9345bc60c78a8bef57;2.18;0.00018;60617;0 -6;0b0aaf2bf5c0f563827bb8560840a9997ad30ef527c2b6ff08de7aea15ef3c7e;2022-06-25T11:00:09.195Z;FABRIC_2;FabricContractInvocationType.SEND;MintAsset;"[""asset6"",""Green"",""19"",""owner1"",""9999""]";user2;0;0.00018;59480;0 -6;7f3d17884f04f12f3d0aa514cfbf9c152b445e48e5b7379883c7b11d539460ab;2022-06-25T11:00:11.431Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;"[""asset6"",""owner2""]";user2;0;0.00018;57244;0 -6;594be967c7b886364cf2187676712bacd40eaa9e71a012bfc51d5af6d1e036e8;2022-06-25T11:00:13.676Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;"[""asset6"",""owner1""]";user2;0;0.00018;54999;0 -6;c3b4d35769879dfd5b69239b01bc99cb1c24da3ec23b684d9c1e9769e4051fbd;2022-06-25T11:00:15.933Z;FABRIC_2;FabricContractInvocationType.SEND;BurnAsset;"[""asset6""]";user2;0;0.00018;52743;0 -5;0x4056b743c139167e7520c3b092e506cb0a7bfcb5f01a97ea92cad8193356f063;2022-06-25T11:00:16.066Z;BESU_2X;SEND;createAsset;"[""asset5"",5]";0x627306090abab3a6e1400e9345bc60c78a8bef57;5.27;0.00018;52610;0 -5;0xc67fcd01535160e32f7b2b1d53cd92708a1bcbf69836000da85539e2e23efa15;2022-06-25T11:00:17.035Z;BESU_2X;SEND;lockAsset;"[""asset5""]";0x627306090abab3a6e1400e9345bc60c78a8bef57;2.18;0.00018;51641;0 -5;42b1100d844150d3223995b6c1baaa94150762de464be17cadee40c186d14b44;2022-06-25T11:00:18.087Z;FABRIC_2;FabricContractInvocationType.SEND;MintAsset;"[""asset5"",""Green"",""19"",""owner1"",""9999""]";user2;0;0.00018;50589;0 -5;8a9dd0e172f6b1f76ec9ba19509646b2719036735b713d160224c872e0bfd459;2022-06-25T11:00:20.293Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;"[""asset5"",""owner2""]";user2;0;0.00018;48383;0 -5;f738b68c0e698d6475df97e8d9d131eb2716cedb0b5ec8ef0725c7678cdb5721;2022-06-25T11:00:22.492Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;"[""asset5"",""owner1""]";user2;0;0.00018;46185;0 -5;9868694a2d0bfe679138eb43eb3f1fd13443bdd6fa99d4dc1a0a27fc37c76eaa;2022-06-25T11:00:24.713Z;FABRIC_2;FabricContractInvocationType.SEND;BurnAsset;"[""asset5""]";user2;0;0.00018;43964;0 -4;0x1a674d3f2a7128fd0673ed20bcaa65866ab94e881e6ffe63376d4ab4cd613a39;2022-06-25T11:00:25.504Z;BESU_2X;SEND;createAsset;"[""asset4"",5]";0x627306090abab3a6e1400e9345bc60c78a8bef57;5.27;0.00018;43173;0 -4;0x5e6d1389a7dab4fe7aa33337e39330d722aec12af775f3d14204c2c3e6e6085a;2022-06-25T11:00:26.032Z;BESU_2X;SEND;lockAsset;"[""asset4""]";0x627306090abab3a6e1400e9345bc60c78a8bef57;2.18;0.00018;42646;0 -4;575bf45fd7e82267451465f7cbba7539f52ede08122839cf7b289e9833618fc0;2022-06-25T11:00:26.921Z;FABRIC_2;FabricContractInvocationType.SEND;MintAsset;"[""asset4"",""Green"",""19"",""owner1"",""9999""]";user2;0;0.00018;41757;0 -4;5cea5444721da108ffeac701e33773dde47ac7cf3596463f23b3304c1f85cd51;2022-06-25T11:00:29.124Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;"[""asset4"",""owner2""]";user2;0;0.00018;39554;0 -4;f453e1de3aee3ac960fa1af1fc53f67f3e14fde5a37c68e30bd0795cdec6d58a;2022-06-25T11:00:31.343Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;"[""asset4"",""owner1""]";user2;0;0.00018;37336;0 -4;071c140a9278eb6e91ea48988d8baa0eb4bc2bf2e861e11a502a634bc9704f42;2022-06-25T11:00:33.553Z;FABRIC_2;FabricContractInvocationType.SEND;BurnAsset;"[""asset4""]";user2;0;0.00018;35126;0 -3;0x4365fd66956e3636a770292e7768b204b49c72fe3044171c36877d1d0dbed06b;2022-06-25T11:00:34.209Z;BESU_2X;SEND;createAsset;"[""asset3"",5]";0x627306090abab3a6e1400e9345bc60c78a8bef57;5.27;0.00018;34470;0 -3;0xcdad311631eaaea0722fff7fee626aff8edd9c1534517da781918277b4fe9c62;2022-06-25T11:00:35.117Z;BESU_2X;SEND;lockAsset;"[""asset3""]";0x627306090abab3a6e1400e9345bc60c78a8bef57;2.18;0.00018;33562;0 -3;5af29303a26443813ab900d7fd28eb4c6c8421333d865ed8c4329545997f79cf;2022-06-25T11:00:35.757Z;FABRIC_2;FabricContractInvocationType.SEND;MintAsset;"[""asset3"",""Green"",""19"",""owner1"",""9999""]";user2;0;0.00018;32923;0 -3;6b99476527ac6826128b30f95b9249097f398b38be9062b37dea79e9dced08d4;2022-06-25T11:00:37.979Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;"[""asset3"",""owner2""]";user2;0;0.00018;30701;0 -3;580e3274acd62a5e4596b3e77308d9ae34b86804950a26bb339cd77a9e90c34b;2022-06-25T11:00:40.169Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;"[""asset3"",""owner1""]";user2;0;0.00018;28511;0 -3;eb02da68b4ddeab17eae477c1ee4c2b26260d31bd8e15ff8d01dc76a24af8ac0;2022-06-25T11:00:42.330Z;FABRIC_2;FabricContractInvocationType.SEND;BurnAsset;"[""asset3""]";user2;0;0.00018;26350;0 -2;0x0df56eeaebb034e0c74e7eaac81310536a8f5cb021470f7f596c27e14221c03b;2022-06-25T11:00:43.118Z;BESU_2X;SEND;createAsset;"[""asset2"",5]";0x627306090abab3a6e1400e9345bc60c78a8bef57;5.27;0.00018;25563;0 -2;0x20d772dffe4ed51f09850544a282032598d0146a4d2b8a6da0334de837b86094;2022-06-25T11:00:44.327Z;BESU_2X;SEND;lockAsset;"[""asset2""]";0x627306090abab3a6e1400e9345bc60c78a8bef57;2.18;0.00018;24354;0 -2;1dec685fc674460e905bc5631934764af97a0a71c4bdaa4cca58f1b1c0097d33;2022-06-25T11:00:46.592Z;FABRIC_2;FabricContractInvocationType.SEND;MintAsset;"[""asset2"",""Green"",""19"",""owner1"",""9999""]";user2;0;0.00018;22089;0 -2;0da0bf6a104da6cae5d8e7971a1f05d0c684889043eec86d029108fd385d9ea1;2022-06-25T11:00:48.854Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;"[""asset2"",""owner2""]";user2;0;0.00018;19827;0 -2;dcce95975672efef29db26bbeffc6a1c5247da4f485168fb581cd308e5589c86;2022-06-25T11:00:51.117Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;"[""asset2"",""owner1""]";user2;0;0.00018;17565;0 -2;3083629ff79e16f8470e4ea1d8fbc5c9115491fcf6eb7e695e8f7838e0481afb;2022-06-25T11:00:53.342Z;FABRIC_2;FabricContractInvocationType.SEND;BurnAsset;"[""asset2""]";user2;0;0.00018;15340;0 -1;0x6907cca45d572b05bdf0db922fe58e313e0fdb0df44199ddd96b6005db09e3ae;2022-06-25T11:00:54.159Z;BESU_2X;SEND;createAsset;"[""asset1"",5]";0x627306090abab3a6e1400e9345bc60c78a8bef57;5.27;0.00018;14523;0 -1;0xfbf7a0ef853fd86384adc9b7f67f0cef8e8c68b5745890220ae989538e1946c1;2022-06-25T11:00:55.030Z;BESU_2X;SEND;lockAsset;"[""asset1""]";0x627306090abab3a6e1400e9345bc60c78a8bef57;2.18;0.00018;13652;0 -1;8c6f92d3dde2147ac0632107ad4273106fc73ab46bf340cb6cf7af46e244c67b;2022-06-25T11:00:55.573Z;FABRIC_2;FabricContractInvocationType.SEND;MintAsset;"[""asset1"",""Green"",""19"",""owner1"",""9999""]";user2;0;0.00018;13109;0 -1;4a6ac7d83bb4c5d67b1007688f81a2ff8e0df1792c34db3893eb652c409bcd14;2022-06-25T11:00:57.797Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;"[""asset1"",""owner2""]";user2;0;0.00018;10886;0 -1;7eb266fae4cf38b200a4f9f3a27d8ba39a1759b1367a0d5b8162f93b58a907e7;2022-06-25T11:01:00.009Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;"[""asset1"",""owner1""]";user2;0;0.00018;8674;0 -1;8a8f26e2aad74625f1dd084ef6fdcb141421b1c17511721350aaff20bcb49dd7;2022-06-25T11:01:02.244Z;FABRIC_2;FabricContractInvocationType.SEND;BurnAsset;"[""asset1""]";user2;0;0.00018;6440;0 diff --git a/packages/cactus-plugin-cc-tx-visualization/src/test/fixtures/python/process mining.ipynb b/packages/cactus-plugin-cc-tx-visualization/src/test/fixtures/python/process mining.ipynb deleted file mode 100644 index e3a085eab6..0000000000 --- a/packages/cactus-plugin-cc-tx-visualization/src/test/fixtures/python/process mining.ipynb +++ /dev/null @@ -1,423 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "module 'posixpath' has no attribute 'parents'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;31m# Change path if necessary\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mlevels_up\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mparents\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mlevels_up\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0mfile_path\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mparent\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m\"/csv/use-case-besu-fabric-6-events.csv\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mfile_path_other_model\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mparent\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m\"/csv/dummy-use-case-invalid.csv\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mAttributeError\u001b[0m: module 'posixpath' has no attribute 'parents'" - ] - } - ], - "source": [ - "import os\n", - "path = os.getcwd()\n", - "parent = os.path.dirname(path)\n", - "\n", - "\n", - "# Change path if necessary\n", - "file_path = parent + \"/csv/use-case-besu-fabric-6-events.csv\"\n", - "file_path_other_model = parent + \"/csv/dummy-use-case-invalid.csv\"\n", - "\n", - "import sys\n", - "\n", - "if __name__ == '__main__':\n", - " print(sys.argv)\n", - " print(file_path)\n", - "\n", - "\n", - "\n", - "# import sys\n", - "\n", - "# accept command line arguments\n", - "# inputArg1 = sys.argv[1]\n", - "\n", - "#print('inputArg1: ',inputArg1)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "# uncomment if problems with dependencies\n", - "#%pip install pm4py\n", - "#%pip install pandas\n", - "import pm4py\n", - "import datetime as dt\n", - "import time\n", - "import pandas\n", - "\n", - "# process mining\n", - "from pm4py.algo.discovery.alpha import algorithm as alpha_miner\n", - "from pm4py.algo.discovery.inductive import algorithm as inductive_miner\n", - "from pm4py.algo.discovery.heuristics import algorithm as heuristics_miner\n", - "from pm4py.algo.discovery.dfg import algorithm as dfg_discovery\n", - "\n", - "# viz\n", - "from pm4py.visualization.petri_net import visualizer as pn_visualizer\n", - "from pm4py.visualization.process_tree import visualizer as pt_visualizer\n", - "from pm4py.visualization.heuristics_net import visualizer as hn_visualizer\n", - "from pm4py.visualization.dfg import visualizer as dfg_visualization\n", - "\n", - "from pm4py.objects.conversion.process_tree import converter as pt_converter\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "def import_csv_original(file_path):\n", - " event_log = pandas.read_csv(file_path, sep=';')\n", - " event_log = pm4py.format_dataframe(event_log, case_id='caseID', activity_key='methodName', timestamp_key='timestamp')\n", - " return event_log\n", - "\n", - "def getStartActivities(event_log):\n", - " s = pm4py.get_start_activities(event_log)\n", - " print(\"Start activities: {}\\n\".format(s))\n", - " return s\n", - "def getEndActivities(event_log):\n", - " e = pm4py.get_end_activities(event_log)\n", - " print(\"End activities: {}\\n\".format(e))\n", - " return (e)\n", - "\n", - "def getAttributeFromLog(event_log, attr):\n", - " entries = pm4py.get_event_attribute_values(event_log,attr)\n", - " print(\"Entries: {}\\n\".format(entries))\n", - " return entries" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "/Users/rafaelapb/Projects/cactus-with-branches/packages/cactus-plugin-cc-tx-visualization/src/test/fixtures/../../csv/use-case-besu-fabric-6-events.csv\n" - ] - }, - { - "ename": "FileNotFoundError", - "evalue": "[Errno 2] No such file or directory: '/Users/rafaelapb/Projects/cactus-with-branches/packages/cactus-plugin-cc-tx-visualization/src/test/fixtures/../../csv/use-case-besu-fabric-6-events.csv'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfile_path\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mlog\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mimport_csv_original\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfile_path\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mlog_other_model\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mimport_csv_original\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfile_path_other_model\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlog\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"leght is\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlog\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mimport_csv_original\u001b[0;34m(file_path)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mimport_csv_original\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfile_path\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mevent_log\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpandas\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_csv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfile_path\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msep\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m';'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mevent_log\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpm4py\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat_dataframe\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mevent_log\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcase_id\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'caseID'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mactivity_key\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'methodName'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimestamp_key\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'timestamp'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mevent_log\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36mread_csv\u001b[0;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, dialect, error_bad_lines, warn_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options)\u001b[0m\n\u001b[1;32m 608\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkwds_defaults\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 609\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 610\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_read\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath_or_buffer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 611\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 612\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36m_read\u001b[0;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[1;32m 460\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 461\u001b[0m \u001b[0;31m# Create the parser.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 462\u001b[0;31m \u001b[0mparser\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mTextFileReader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath_or_buffer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 463\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 464\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mchunksize\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0miterator\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, f, engine, **kwds)\u001b[0m\n\u001b[1;32m 817\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"has_index_names\"\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"has_index_names\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 818\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 819\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_make_engine\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mengine\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 820\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 821\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mclose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36m_make_engine\u001b[0;34m(self, engine)\u001b[0m\n\u001b[1;32m 1048\u001b[0m )\n\u001b[1;32m 1049\u001b[0m \u001b[0;31m# error: Too many arguments for \"ParserBase\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1050\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mmapping\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mengine\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# type: ignore[call-arg]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1051\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1052\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_failover_to_python\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, src, **kwds)\u001b[0m\n\u001b[1;32m 1865\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1866\u001b[0m \u001b[0;31m# open handles\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1867\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_open_handles\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msrc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1868\u001b[0m \u001b[0;32massert\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhandles\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1869\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mkey\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m\"storage_options\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"encoding\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"memory_map\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"compression\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36m_open_handles\u001b[0;34m(self, src, kwds)\u001b[0m\n\u001b[1;32m 1360\u001b[0m \u001b[0mLet\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mreaders\u001b[0m \u001b[0mopen\u001b[0m \u001b[0mIOHanldes\u001b[0m \u001b[0mafter\u001b[0m \u001b[0mthey\u001b[0m \u001b[0mare\u001b[0m \u001b[0mdone\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mtheir\u001b[0m \u001b[0mpotential\u001b[0m \u001b[0mraises\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1361\u001b[0m \"\"\"\n\u001b[0;32m-> 1362\u001b[0;31m self.handles = get_handle(\n\u001b[0m\u001b[1;32m 1363\u001b[0m \u001b[0msrc\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1364\u001b[0m \u001b[0;34m\"r\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/pandas/io/common.py\u001b[0m in \u001b[0;36mget_handle\u001b[0;34m(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)\u001b[0m\n\u001b[1;32m 640\u001b[0m \u001b[0merrors\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"replace\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 641\u001b[0m \u001b[0;31m# Encoding\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 642\u001b[0;31m handle = open(\n\u001b[0m\u001b[1;32m 643\u001b[0m \u001b[0mhandle\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 644\u001b[0m \u001b[0mioargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmode\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/Users/rafaelapb/Projects/cactus-with-branches/packages/cactus-plugin-cc-tx-visualization/src/test/fixtures/../../csv/use-case-besu-fabric-6-events.csv'" - ] - } - ], - "source": [ - "print(file_path)\n", - "log = import_csv_original(file_path)\n", - "log_other_model = import_csv_original(file_path_other_model)\n", - "print(log)\n", - "print(\"leght is\", len(log))\n", - "print(log_other_model)\n", - "print(\"leght is\", len(log_other_model))\n", - "startAct = getStartActivities(log)\n", - "endAct = getEndActivities(log)\n", - "timestamps = getAttributeFromLog(log, \"timestamp\")\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "->( 'createAsset', 'lockAsset', 'MintAsset', *( 'TransferAsset', tau ), 'BurnAsset' )\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Execution Time : 0.001\n", - "Execution Time (ms): 1.402\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABKgAAABZCAYAAAAaXByKAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nO3dd5wU9f3H8ddtOeohEIKIWKLYEEssPzVobARNxA5IYkNjQWMsoLElxp8tloi9/4LYRawxGgu2EDVGY4IoFgg2LChFmnB3uzu/Pz4z7t7e9p292d17P32sx83Mzn73dm7uO5/5fD9fEBERERERERERERERERERERERERERERERERERERERERERERERkc6mIegGiIiIiIhkMSboBkhVeyDoBoiIiH8UoBIRERGRauUE3QCparqWEREREREREZGKc1AWlbQ3BgUvRUTqTijoBoiIiIiIiIiISOemAJWIiIiIiIiIiARKASoREREREREREQmUAlQiIiIiIiIiIhIoBahERERERERERCRQClCJiIiIiIiIiEigFKASEREREREREZFAKUAlIiIiIiIiIiKBUoBKREREREREREQCpQCViIiIiIiIiIgESgEqEREREREREREJlAJUIiIiIiIiIiISKAWoREREREREREQkUApQiYiIiIiIiIhIoBSgEhEREZF68B7gFPC4KKgGFmBb4GVgJdbW+RV4jbWBOHBTBfZdjOHYexwacDtERKRKKEAlIiIiIvXiB0CD+zgjw7LTAmpXoe4BPgPWBIYA31bgNY7ArgHGAl0rsH8REZGSKEAlIiIiIhK8rsAmwHRgBfAusHEFXmccMA3oDRxYgf2LiIiIiIiIiNQVBxhT4nNPd5+/foZ1J5Ec8ncSNtxtsfv9/e42/YArgLnAauA/wP459jMeuBZYimVBnZe27YbAY8BCYDnwKLBjhv14j6dSnjsSeMNtxwLgZqBXEe/FMwyYCWzgrn8mw88mX1sLWZ+vzZdmeL8fZWlLJmPc54iIiIiIiIiIVFylAlQAPd31HwKjgR5YgMcL6lztPr7nbnsoFmzZPMt+ZgL7AU3Aye6yXVO2+4+77/5Y9tLVWKZU+n6OSdv//kACuADoA2yFZVc9hw1bLOS9eG4jOfTxFawW1TrpP5gC2ppvfSFtLqcGlQJUIiIiIiIiItJhOiJAdVsR+/wzlgmUaT9/SlkWxgqd/9b9vivt30sEyyxK3096gOp9YFbaspHutnukPTfXe+kOLMGKpAOc6D7n3LTt8rW1kPdSSJsVoBIRkTZUg0pE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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Start Time : 2571.73599414\n", - "End Time : 2571.73943057\n", - "Execution Time : 0.003\n", - "Execution Time (ms): 3.436\n" - ] - } - ], - "source": [ - "#Another way to discover the tree\n", - "# # create the process tree\n", - "#tree = inductive_miner.apply_tree(log)\n", - "\n", - "# viz\n", - "#gviz = pt_visualizer.apply(tree)\n", - "#pt_visualizer.view(gviz)# convert the process tree to a petri net\n", - "\n", - "start_time = time.perf_counter()\n", - "process_tree = pm4py.discover_process_tree_inductive(log)\n", - "print(process_tree)\n", - "end_time = time.perf_counter()\n", - "pm4py.view_process_tree(process_tree)\n", - "\n", - "start_time_2 = time.perf_counter()\n", - "bpmn_model = pm4py.convert_to_bpmn(process_tree)\n", - "end_time_2 = time.perf_counter()\n", - "print(f\"Execution Time : {end_time_2 - start_time_2:0.3f}\" )\n", - "timeDiff_2 = end_time_2 - start_time_2\n", - "print(f\"Execution Time (ms): {timeDiff_2*1000:0.3f}\" )\n", - "\n", - "pm4py.view_bpmn(bpmn_model)\n", - "\n", - "print(f\"Start Time : {start_time}\")\n", - "print(f\"End Time : {end_time}\")\n", - "timeDiff_3 = end_time - start_time\n", - "print(f\"Execution Time : {timeDiff_3:0.3f}\")\n", - "print(f\"Execution Time (ms): {timeDiff_3*1000:0.3f}\" )\n", - "\n", - "\n", - "#net, initial_marking, final_marking = pt_converter.apply(tree)\n", - "\n", - "# alternatively, use the inductive_miner to create a petri net from scratch\n", - "# net, initial_marking, final_marking = inductive_miner.apply(log)\n", - "\n", - "# viz\n", - "parameters = {pn_visualizer.Variants.FREQUENCY.value.Parameters.FORMAT: \"png\"}\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/rafaelapb/.local/lib/python3.8/site-packages/pm4py/algo/discovery/dfg/adapters/pandas/df_statistics.py:82: FutureWarning: Passing a set as an indexer is deprecated and will raise in a future version. Use a list instead.\n", - " df_reduced = df[{case_id_glue, activity_key, target_activity_key}]\n" - ] - }, - { - "data": { - "image/png": "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rQHM+++/XzitVatWpm3btj7LrVmzxgBm7NixPsu1a9fOZ7nDhw+bBg0alLr+o0ePml69epnJkyeXWktOTo5JSEgw6enpxhhjXnnlFQOYp556yme5Y8eOGcDMnj27cFpeXp5JTk72a74xxlx00UUlPuP8+fMNYNLS0owxxixevNgAZt26daXWW9To0aNN3bp1y12mX79+pnnz5uUuc/3115tOnTpVuL3ibrnllhozKk9I74HS09PZvHkzV199tc/0Sy+9lHr16rFkyRKf5bp16+azXHx8PAcOHCix3pycHPr06UP9+vUZOnRoqdt+88036dixI02bNgVgwIABREdHlxgwIzY2lssvv5xHHnmEuXPncuzYMWrVqsW+ffv8mp+ens6WLVu45pprfNbbuXNnANLS0vz4Tfnau3cvCQnu4zkmJCSwd+9e5/VUZyEdoIyMDAAaNGhQYl5SUlLh/PKWK83IkSOJiYlh3rx5ZR4jTZ06lcGDB/tsr1evXmzdupXly5f7LLto0SJuvPFGHnjgARISEujTp4/PesubX1D7xIkTfY7HCnrOduzY4ddnKiozM5Po6OhKv6+46OhoDh486Lye6iykA9SwYUOAUv8RDxw4UDi/vOVK89hjj/Huu+/SoUMHbr/9do4ePeoz//vvv2fp0qUMGTLE50s9f/58oOSwTYmJiYwfP55du3axbNkycnNz6datG9u2batwfkHtY8aMwRhT4jVjxgw/f1u+9eTl5VX6fcXl5eX5/UeppgrpADVr1oxWrVqV6An6+uuvyc7OLjwQL1hu2bJlPsvt3r2b2NjYEs24Cy64gOjoaGbMmMGOHTsYM2aMz/zU1FQGDhxY4st85MgRGjZsyJw5c8jJyQFsc6lduzPPDu7SpQuTJ0/mxIkTrF69usL5zZo1o3Xr1qxaVfIZXB06dCg8iI+M9P+fqnHjxmRlZfm9fFmysrJo3FhPZvFKlXQizJ8/30RGRpo//OEPJiMjw2zatMlcccUV5sILLzSHDh0qsdxjjz1mMjIyzPbt201KSoq55557yl3/iy++aCIiIsyHH35ojDEmPz/ftGzZ0mzcuLHUGv/6178awKSmphpjjNmzZ48BzAsvvGAOHTpkMjMzzZgxY0xsbKzZtm1bhfONMea9994zUVFR5plnnjH79+83+/fvNw8++KC55JJLzLFjx4wxxmzc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nw3zugQJAt2RKuJAARJxoACJOFCARBwoQCIOFCARBwqQiAMFSMSBAiTiQAEScaAASaiLAeK9LqIsuhZOQl177G3xmcBOYAewHdgIbADWAwe9Kk4BklC3EbgfOB/40en/dsKOs5dwepk9wJfAp6dfq7FDiQWcc4Aef7w1e/durnC5Pn0e5cYbn3LdXEB8//2XvP76b9i582tOnDhKQkJTnnsuvUq3kZW1izFjfkS3bvcwePCkKl13ZXz77RJeeKEnTzyxjqZN2/r1nqNHs/jXv37NgAEvULduMvv2beGjjyawdu18Dh3aS4MGP6JDh75cf/3j1KmTUPi+qVPvJCXldzRp0sal5BzgvTLmNQMuAdoBV2AH+R8L5AKfAPOAt7B3BvujJTADaIK9sbRCVXIMNHbsf5k82TB5suGWW54rMW3AgBerYjMB889/DiIxsSkvvLCPP/95I+ecU6fKt7FixXSMyWfVqjfIy8ut8vUHyrFj2Ywb143WrbtTt64d2vvvf7+J77//ipEjF/DSSwcZPHgSK1fO4vnnu5Off7LwvT16jOSll3qzc+faQJWXDnwIjAcGAE2BC4F7sc2+l7B7pw+wg72UZwiwiEqOX17jOxHy8nLZu3czF198HTEx8Zx33sX89a9bqnw7K1akctll/Tl6NIs1a96q8vUHyptvjiExsSldu97tM33QoL/TtGlbzjmnDhdffC3XX/84O3d+zbp17xcu07x5J7p1G84//zmI/Pyg3eC8DZgG3AKcCwzCjk+xEPgK6FfKe+Kwg790xh5T+c25CfeXv2yqcJnrrnsAgI8+msjrr48E4Je/nMDu3RtYtWo2R49mcvnlA7jnnjc4ciSDDz54lq++eovMzHTOO681N9zwJJdeeuZzF13P4MGT2L17I59/Po2YmHi6dRtO375/LFx2//5tzJ49mm3bPiMv7zgXX3wtvXv/ngsu6OKznhkzhjNjxnDatEnhgQfsOPDffLOAd999gl271lO7dn06dvwFN988jtq16/n1WQps3foZ0dGx3HTTWFavnstnn03liit+WeL3VF6t/syvqOY33/w9H3zwLABPPNEOgKSk5owdu73Uf7fc3MOsWDGN++5702f6k0+W/I41a9YegAMHvveZ3r37CN59909s3ryUiy8O+gBFOcCc069LgUewTbppwEjsIJgFyw06mw0EdQ/U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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'createAsset': (node:createAsset connections:{lockAsset:[0.5]}), 'lockAsset': (node:lockAsset connections:{MintAsset:[0.5]}), 'MintAsset': (node:MintAsset connections:{TransferAsset:[0.5]}), 'TransferAsset': (node:TransferAsset connections:{TransferAsset:[0.5], BurnAsset:[0.5]}), 'BurnAsset': (node:BurnAsset connections:{})}\n" - ] - }, - { - "data": { - "image/png": "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WpT4XLrOk23bYO5cGDvWPh8/3j5On57atrIS7rgDDjsMSkqgc2e7ejlnDsRiubcD2LwZfvADOOggKCqCbt1g9GhYurRh81PbsmX2j8+gQfW3zdYxx9jHl19uunFKgzRuNbh61aq83BAIGJYvT7T52c8Ml15q//2Pf2ReDb7wQvve3r3pX7/wQsNrrxl27TK88oqhbVvDCWnU2i4AACAASURBVCc0bLXxoYcMp52WeL55syEctquNmzYlt50wwVBWZli40M7jxo2Gm26yNb36au7tNmywq9/l5Yb5823n2vvvG045xVBcbOexsavBM2fa6d53X/1ts10N3rHDjnP4cK0G+6zxYTXGcP/99j/0yivt89277Y9y2bLGh3Xu3HQ/Ahu0XH/cxx5rmDEj+bVRo+z4pkxJfr1fP8NJJ6WOY8CA5BBm227sWDudWbOS2332maFNG8NxxzU+rA88YKfx8MNNF1ZjDJ5ne+0V1nrl72pwte9+166izp4NH30Ejzxi92EOHNj4cZ9wQvLz6p7lDRtyG89779n9qxfVuph+9apw7V7hc86B116Db30LXn89sUq7YgWcemru7V58EQIBuxpf0wEHwJFH2h7adetym6faqjclmvpaUaEQ7N3btONspfI/rO3awQ032B/qf/6n3e66/famGXdZrfs/FRXZx1x390yfDjt3Qmlp8jbxBRfY9z/4AN58M9H+4YftLp7Vq+GMM6BDBxvMF15IHm827SorYccOW3NZWeqBJUuW2HarVuU2T7UVF9vHSKRx46ktGm1Y51QByv+wAnz/+/aH+NRTtoPj+ONbdvqel/m9SARmzbIdNibNNW5vuMG2q7l09Ty46ir4859h+3a7ZDTGdgg9+GBu7dq0sR1koVDd1x0+7bTs5ieTHj3s444duX82k4oKW1v1uKVOboS1rAwmTrSPTbVUzUVJCVRVJZ4feig8+qj999y50LWrPSAgnWuusY+zZydW9zp2hA8/tP8Oh+GssxI91TV3Y2TbbvRou4RatCh1+vffD3362PezmZ9MjjrKPjZ2dbqm9euTxy11ciOsYHdhbN+eORTN6dhjYeVKWLvWHq+8ejUMH27fe/xxuPrqzJ896ig48US7RHr++cTr3/623datrITPP4cHHrBLmdNPT/58Nu1++lO7v/nqq+1RXzt22F1JjzwCd91lNx1q7p6p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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "dfg, start_activities, end_activities = pm4py.discover_dfg(log)\n", - "pm4py.view_dfg(dfg, start_activities, end_activities)\n", - "\n", - "map = pm4py.discover_heuristics_net(log)\n", - "print(map)\n", - "pm4py.view_heuristics_net(map)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/rafaelapb/.local/lib/python3.8/site-packages/pm4py/algo/discovery/dfg/adapters/pandas/df_statistics.py:82: FutureWarning: Passing a set as an indexer is deprecated and will raise in a future version. Use a list instead.\n", - " df_reduced = df[{case_id_glue, activity_key, target_activity_key}]\n", - "/home/rafaelapb/.local/lib/python3.8/site-packages/pm4py/algo/discovery/dfg/adapters/pandas/df_statistics.py:82: FutureWarning: Passing a set as an indexer is deprecated and will raise in a future version. Use a list instead.\n", - " df_reduced = df[{case_id_glue, activity_key, target_activity_key}]\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# heuristics miner\n", - "net, im, fm = heuristics_miner.apply(log)\n", - "\n", - "# viz\n", - "gviz = pn_visualizer.apply(net, im, fm)\n", - "pn_visualizer.view(gviz)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3.8.8 ('base')", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.8" - }, - "vscode": { - "interpreter": { - "hash": "994fd3bf715f7d00910c6929cedf6117267fec036ef9d2716f71f2b8e3dc9b3e" - } - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/packages/cactus-plugin-cc-tx-visualization/src/test/fixtures/python/process_conformance.ipynb b/packages/cactus-plugin-cc-tx-visualization/src/test/fixtures/python/process_conformance.ipynb deleted file mode 100644 index fb7e30c891..0000000000 --- a/packages/cactus-plugin-cc-tx-visualization/src/test/fixtures/python/process_conformance.ipynb +++ /dev/null @@ -1,147 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "ename": "ImportError", - "evalue": "dlopen(/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/cvxopt/base.cpython-310-darwin.so, 0x0002): tried: '/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/cvxopt/base.cpython-310-darwin.so' (mach-o file, but is an incompatible architecture (have (x86_64), need (arm64e)))", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mImportError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m/Users/rafaelapb/Projects/cactus-with-branches/packages/cactus-plugin-cc-tx-visualization/src/test/fixtures/python/process_conformance.ipynb Cell 1\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mos\u001b[39;00m\u001b[39m# uncomment if problems with dependencies\u001b[39;00m\n\u001b[1;32m 2\u001b[0m \u001b[39m#%pip install pm4py\u001b[39;00m\n\u001b[1;32m 3\u001b[0m \u001b[39m#%pip install pandas\u001b[39;00m\n\u001b[0;32m----> 4\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mpm4py\u001b[39;00m\n\u001b[1;32m 5\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mdatetime\u001b[39;00m \u001b[39mas\u001b[39;00m \u001b[39mdt\u001b[39;00m\n\u001b[1;32m 6\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mtime\u001b[39;00m\n", - "File \u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pm4py/__init__.py:20\u001b[0m, in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39msys\u001b[39;00m\n\u001b[1;32m 18\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mtime\u001b[39;00m\n\u001b[0;32m---> 20\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mpm4py\u001b[39;00m \u001b[39mimport\u001b[39;00m util, objects, statistics, algo, visualization\n\u001b[1;32m 21\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mpm4py\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39manalysis\u001b[39;00m \u001b[39mimport\u001b[39;00m check_soundness, solve_marking_equation, solve_extended_marking_equation, \\\n\u001b[1;32m 22\u001b[0m construct_synchronous_product_net, insert_artificial_start_end\n\u001b[1;32m 23\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mpm4py\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mconformance\u001b[39;00m \u001b[39mimport\u001b[39;00m conformance_diagnostics_token_based_replay, conformance_diagnostics_alignments, \\\n\u001b[1;32m 24\u001b[0m fitness_token_based_replay, \\\n\u001b[1;32m 25\u001b[0m fitness_alignments, precision_token_based_replay, \\\n\u001b[1;32m 26\u001b[0m precision_alignments, conformance_alignments, conformance_tbr, evaluate_precision_alignments, \\\n\u001b[1;32m 27\u001b[0m evaluate_precision_tbr, evaluate_fitness_tbr, evaluate_fitness_alignments, conformance_diagnostics_footprints, \\\n\u001b[1;32m 28\u001b[0m fitness_footprints, precision_footprints, check_is_fitting\n", - "File \u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pm4py/util/__init__.py:18\u001b[0m, in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[39m'''\u001b[39;00m\n\u001b[1;32m 2\u001b[0m \u001b[39m This file is part of PM4Py (More Info: https://pm4py.fit.fraunhofer.de).\u001b[39;00m\n\u001b[1;32m 3\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[39m along with PM4Py. If not, see .\u001b[39;00m\n\u001b[1;32m 16\u001b[0m \u001b[39m'''\u001b[39;00m\n\u001b[0;32m---> 18\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mpm4py\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mutil\u001b[39;00m \u001b[39mimport\u001b[39;00m variants_util, lp, constants, points_subset, business_hours, regex, xes_constants, vis_utils, \\\n\u001b[1;32m 19\u001b[0m dt_parsing, colors, exec_utils, pandas_utils, typing\n", - "File \u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pm4py/util/lp/__init__.py:17\u001b[0m, in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[39m'''\u001b[39;00m\n\u001b[1;32m 2\u001b[0m \u001b[39m This file is part of PM4Py (More Info: https://pm4py.fit.fraunhofer.de).\u001b[39;00m\n\u001b[1;32m 3\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[39m along with PM4Py. If not, see .\u001b[39;00m\n\u001b[1;32m 16\u001b[0m \u001b[39m'''\u001b[39;00m\n\u001b[0;32m---> 17\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mpm4py\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mutil\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mlp\u001b[39;00m \u001b[39mimport\u001b[39;00m solver, util, variants\n", - "File \u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pm4py/util/lp/solver.py:58\u001b[0m, in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 55\u001b[0m DEFAULT_LP_SOLVER_VARIANT \u001b[39m=\u001b[39m SCIPY\n\u001b[1;32m 57\u001b[0m \u001b[39mif\u001b[39;00m pkgutil\u001b[39m.\u001b[39mfind_loader(\u001b[39m\"\u001b[39m\u001b[39mcvxopt\u001b[39m\u001b[39m\"\u001b[39m):\n\u001b[0;32m---> 58\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mpm4py\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mutil\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mlp\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mvariants\u001b[39;00m \u001b[39mimport\u001b[39;00m cvxopt_solver, cvxopt_solver_custom_align, cvxopt_solver_custom_align_ilp, \\\n\u001b[1;32m 59\u001b[0m cvxopt_solver_custom_align_arm\n\u001b[1;32m 61\u001b[0m custom_solver \u001b[39m=\u001b[39m cvxopt_solver_custom_align\n\u001b[1;32m 62\u001b[0m \u001b[39mtry\u001b[39;00m:\n\u001b[1;32m 63\u001b[0m \u001b[39m# for ARM-based Linux, we need to use a different call to GLPK\u001b[39;00m\n", - "File \u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pm4py/util/lp/variants/cvxopt_solver.py:19\u001b[0m, in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[39m'''\u001b[39;00m\n\u001b[1;32m 2\u001b[0m \u001b[39m This file is part of PM4Py (More Info: https://pm4py.fit.fraunhofer.de).\u001b[39;00m\n\u001b[1;32m 3\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[39m along with PM4Py. If not, see .\u001b[39;00m\n\u001b[1;32m 16\u001b[0m \u001b[39m'''\u001b[39;00m\n\u001b[1;32m 17\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39msys\u001b[39;00m\n\u001b[0;32m---> 19\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mcvxopt\u001b[39;00m \u001b[39mimport\u001b[39;00m matrix, solvers\n\u001b[1;32m 22\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mapply\u001b[39m(c, Aub, bub, Aeq, beq, parameters\u001b[39m=\u001b[39m\u001b[39mNone\u001b[39;00m):\n\u001b[1;32m 23\u001b[0m \u001b[39m\"\"\"\u001b[39;00m\n\u001b[1;32m 24\u001b[0m \u001b[39m Gets the overall solution of the problem\u001b[39;00m\n\u001b[1;32m 25\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 44\u001b[0m \u001b[39m Solution of the LP problem by the given algorithm\u001b[39;00m\n\u001b[1;32m 45\u001b[0m \u001b[39m \"\"\"\u001b[39;00m\n", - "File \u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/cvxopt/__init__.py:50\u001b[0m, in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 33\u001b[0m __copyright__ \u001b[39m=\u001b[39m \u001b[39m\"\"\"\u001b[39m\u001b[39mCopyright (c) 2012-2022 M. Andersen and L. Vandenberghe.\u001b[39m\n\u001b[1;32m 34\u001b[0m \u001b[39mCopyright (c) 2010-2011 L. Vandenberghe.\u001b[39m\n\u001b[1;32m 35\u001b[0m \u001b[39mCopyright (c) 2004-2009 J. Dahl and L. Vandenberghe.\u001b[39m\u001b[39m\"\"\"\u001b[39m\n\u001b[1;32m 37\u001b[0m __license__ \u001b[39m=\u001b[39m \u001b[39m\"\"\"\u001b[39m\u001b[39mThis program is free software; you can redistribute it and/or modify\u001b[39m\n\u001b[1;32m 38\u001b[0m \u001b[39mit under the terms of the GNU General Public License as published by\u001b[39m\n\u001b[1;32m 39\u001b[0m \u001b[39mthe Free Software Foundation; either version 3 of the License, or\u001b[39m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 47\u001b[0m \u001b[39mYou should have received a copy of the GNU General Public License\u001b[39m\n\u001b[1;32m 48\u001b[0m \u001b[39malong with this program. If not, see .\u001b[39m\u001b[39m\"\"\"\u001b[39m\n\u001b[0;32m---> 50\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mcvxopt\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mbase\u001b[39;00m\n\u001b[1;32m 52\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mcopyright\u001b[39m():\n\u001b[1;32m 53\u001b[0m \u001b[39mprint\u001b[39m(__copyright__)\n", - "\u001b[0;31mImportError\u001b[0m: dlopen(/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/cvxopt/base.cpython-310-darwin.so, 0x0002): tried: '/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/cvxopt/base.cpython-310-darwin.so' (mach-o file, but is an incompatible architecture (have (x86_64), need (arm64e)))" - ] - } - ], - "source": [ - "import os# uncomment if problems with dependencies\n", - "#%pip install pm4py\n", - "#%pip install pandas\n", - "import pm4py\n", - "import datetime as dt\n", - "import time\n", - "import pandas\n", - "path = os.getcwd()\n", - "parent = os.path.dirname(path)\n", - "\n", - "# Change path if necessary \n", - "file_path = parent + \"/csv/use-case-besu-fabric-6-events.csv\"\n", - "file_path_other_model = parent + \"/csv/dummy-use-case-invalid.csv\"\n", - "\n", - "import sys\n", - "\n", - "if __name__ == '__main__':\n", - " print(sys.argv)\n", - " print(file_path)\n", - "\n", - "\n", - "\n", - "# import sys\n", - "\n", - "# accept command line arguments\n", - "# inputArg1 = sys.argv[1]\n", - "\n", - "#print('inputArg1: ',inputArg1)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "\n", - "\n", - "def import_csv_original(file_path):\n", - " event_log = pandas.read_csv(file_path, sep=';')\n", - " event_log = pm4py.format_dataframe(event_log, case_id='caseID', activity_key='methodName', timestamp_key='timestamp')\n", - " return event_log\n", - "\n", - "def getStartActivities(event_log):\n", - " s = pm4py.get_start_activities(event_log)\n", - " print(\"Start activities: {}\\n\".format(s))\n", - " return s\n", - "def getEndActivities(event_log):\n", - " e = pm4py.get_end_activities(event_log)\n", - " print(\"End activities: {}\\n\".format(e))\n", - " return (e)\n", - "\n", - "def getAttributeFromLog(event_log, attr):\n", - " entries = pm4py.get_event_attribute_values(event_log,attr)\n", - " print(\"Entries: {}\\n\".format(entries))\n", - " return entries\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[{'alignment': [('createAsset', 'createAsset'), ('MintAsset', '>>'), ('lockAsset', 'lockAsset'), ('>>', 'MintAsset'), ('transferAsset', 'transferAsset'), ('>>', None), ('transferAsset', 'transferAsset'), ('BurnAsset', 'BurnAsset')], 'cost': 20001, 'visited_states': 10, 'queued_states': 26, 'traversed_arcs': 28, 'lp_solved': 8, 'fitness': 0.8181818181818181, 'bwc': 110000}]\n" - ] - } - ], - "source": [ - "\n", - "log = import_csv_original(file_path)\n", - "log_other_model = import_csv_original(file_path_other_model)\n", - "\n", - "net, initial_marking, final_marking = pm4py.discover_petri_net_inductive(log)\n", - "\n", - "aligned_traces = pm4py.conformance_diagnostics_alignments(log_other_model, net, initial_marking, final_marking)\n", - "\n", - "print(aligned_traces)\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3.10.2 64-bit", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.2" - }, - "vscode": { - "interpreter": { - "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49" - } - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/api-surface.test.ts b/packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/api-surface.test.ts deleted file mode 100644 index a77b09a829..0000000000 --- a/packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/api-surface.test.ts +++ /dev/null @@ -1,8 +0,0 @@ -import test, { Test } from "tape-promise/tape"; - -import * as apiSurface from "../../../main/typescript/public-api"; - -test("Library can be loaded", (t: Test) => { - t.ok(apiSurface, "apiSurface truthy OK"); - t.end(); -}); diff --git a/packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/cctxviz-generate-use-case-dummy-baseline-events.test.ts b/packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/cctxviz-generate-use-case-dummy-baseline-events.test.ts deleted file mode 100644 index cebc20f6ce..0000000000 --- a/packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/cctxviz-generate-use-case-dummy-baseline-events.test.ts +++ /dev/null @@ -1,207 +0,0 @@ -import test, { Test } from "tape-promise/tape"; -import { LoggerProvider, LogLevelDesc } from "@hyperledger/cactus-common"; -import { RabbitMQTestServer } from "@hyperledger/cactus-test-tooling"; -import { pruneDockerAllIfGithubAction } from "@hyperledger/cactus-test-tooling"; -import { IPluginCcTxVisualizationOptions } from "../../../main/typescript"; -import { - CcTxVisualization, - IChannelOptions, -} from "../../../main/typescript/plugin-cc-tx-visualization"; -import { randomUUID } from "crypto"; -import * as amqp from "amqp-ts"; -import { CrossChainModelType } from "../../../main/typescript/models/crosschain-model"; - -const testCase = "dummy-baseline-6-events"; -const logLevel: LogLevelDesc = "TRACE"; -const queueName = "cc-tx-log-entry-test"; - -const log = LoggerProvider.getOrCreate({ - level: logLevel, - label: "cctxviz-dummy-demo", -}); -test("BEFORE " + testCase, async (t: Test) => { - const pruning = pruneDockerAllIfGithubAction({ logLevel }); - await t.doesNotReject(pruning, "Pruning didn't throw OK"); - t.end(); -}); - -test(testCase, async (t: Test) => { - //initialize rabbitmq - const setupInfraTime = new Date(); - const options = { - publishAllPorts: true, - port: 5672, - logLevel: logLevel, - imageName: "rabbitmq", - imageTag: "3.9-management", - emitContainerLogs: true, - envVars: new Map([["AnyNecessaryEnvVar", "Can be set here"]]), - }; - const channelOptions: IChannelOptions = { - queueId: queueName, - dltTechnology: null, - persistMessages: false, - }; - - const cctxvizOptions: IPluginCcTxVisualizationOptions = { - instanceId: randomUUID(), - logLevel: logLevel, - eventProvider: "amqp://localhost", - channelOptions: channelOptions, - }; - - const testServer = new RabbitMQTestServer(options); - const tearDown = async () => { - t.comment("shutdown starts"); - await testServer.stop(); - await cctxViz.shutdown(); - await cctxViz.closeConnection(); - log.debug("running process exit"); - process.exit(0); - }; - - test.onFinish(tearDown); - await testServer.start(true); - t.ok(testServer); - - // Simulates a Cactus Ledger Connector plugin - const connection = new amqp.Connection(); - const queue = connection.declareQueue(queueName, { durable: false }); - - // Initialize our plugin - const cctxViz = new CcTxVisualization(cctxvizOptions); - const setupInfraTimeEnd = new Date(); - log.debug( - `EVAL-testFile-SETUP-INFRA:${ - setupInfraTimeEnd.getTime() - setupInfraTime.getTime() - }`, - ); - t.ok(cctxViz); - t.comment("cctxviz plugin is ok"); - - t.assert(cctxViz.numberUnprocessedReceipts === 0); - t.assert(cctxViz.numberEventsLog === 0); - - const currentTime = new Date(); - const timeStartSendMessages = new Date(); - - // caseID 1; registar emissions; Fabric blockchain, test message; parameters: asset 1, 100 units - const testMessage1 = new amqp.Message({ - caseID: "1", - timestamp: currentTime, - blockchainID: "TEST", - invocationType: "send", - methodName: "initialize asset", - // Asset 1, 100 units - parameters: ["1,100"], - identity: "A", - }); - queue.send(testMessage1); - - const testMessage2 = new amqp.Message({ - caseID: "1", - timestamp: new Date(currentTime.getTime() + 2), - blockchainID: "TEST", - invocationType: "send", - methodName: "lock asset", - // Asset 1, 100 units - parameters: ["1,100"], - identity: "A", - }); - queue.send(testMessage2); - - const testMessage3 = new amqp.Message({ - caseID: "1", - timestamp: new Date(currentTime.getTime() + 3), - blockchainID: "TEST", - invocationType: "send", - methodName: "mint asset", - // Asset 1, 100 units - parameters: ["1,100"], - identity: "A", - }); - queue.send(testMessage3); - - const testMessage4 = new amqp.Message({ - caseID: "1", - timestamp: new Date(currentTime.getTime() + 4), - blockchainID: "TEST", - invocationType: "send", - methodName: "transfer asset", - // Asset 1, 100 units - parameters: ["A"], - identity: "A", - }); - queue.send(testMessage4); - - const testMessage5 = new amqp.Message({ - caseID: "1", - timestamp: new Date(currentTime.getTime() + 5), - blockchainID: "TEST", - invocationType: "send", - methodName: "transfer asset", - // Asset 1, 100 units - parameters: [""], - identity: "A", - }); - queue.send(testMessage5); - - const testMessage6 = new amqp.Message({ - caseID: "1", - timestamp: new Date(currentTime.getTime() + 6), - blockchainID: "TEST", - invocationType: "send", - methodName: "burn asset", - // Asset 1, 100 units - parameters: [""], - identity: "A", - }); - queue.send(testMessage6); - const endTimeSendMessages = new Date(); - t.comment( - `EVAL-testFile-SEND-MESSAGES:${ - endTimeSendMessages.getTime() - timeStartSendMessages.getTime() - }`, - ); - - const timeStartPollReceipts = new Date(); - await cctxViz.pollTxReceipts(); - await cctxViz.hasProcessedXMessages(6, 4); - - const endTimePollReceipts = new Date(); - const totalTimePoll = - endTimePollReceipts.getTime() - timeStartPollReceipts.getTime(); - t.comment(`EVAL-testFile-POLL:${totalTimePoll}`); - - t.assert(cctxViz.numberEventsLog === 0); - t.assert(cctxViz.numberUnprocessedReceipts === 6); - - await cctxViz.txReceiptToCrossChainEventLogEntry(); - - t.assert(cctxViz.numberEventsLog === 6); - t.assert(cctxViz.numberUnprocessedReceipts === 0); - - const logName = await cctxViz.persistCrossChainLogCsv( - "dummy-use-case-6-events", - ); - - const startTimeAggregate = new Date(); - await cctxViz.aggregateCcTx(); - const endTimeAggregate = new Date(); - t.comment( - `EVAL-testFile-AGGREGATE-CCTX:${ - endTimeAggregate.getTime() - startTimeAggregate.getTime() - }`, - ); - - const map = - "{'registerEmission': (node:registerEmission connections:{registerEmission:[0.6666666666666666], getEmissions:[0.6666666666666666]}), 'getEmissions': (node:getEmissions connections:{mintEmissionToken:[0.6666666666666666]}), 'mintEmissionToken': (node:mintEmissionToken connections:{})}"; - // Persist heuristic map that is generated from the script that takes this input - await cctxViz.saveModel(CrossChainModelType.HeuristicMiner, map); - const savedModel = await cctxViz.getModel(CrossChainModelType.HeuristicMiner); - t.assert(map === savedModel); - - console.log(logName); - t.ok(logName); - t.end(); -}); diff --git a/packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/cctxviz-generate-use-case-dummy-invalid.test.ts b/packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/cctxviz-generate-use-case-dummy-invalid.test.ts deleted file mode 100644 index 02fb72e647..0000000000 --- a/packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/cctxviz-generate-use-case-dummy-invalid.test.ts +++ /dev/null @@ -1,200 +0,0 @@ -import test, { Test } from "tape-promise/tape"; -import { LoggerProvider, LogLevelDesc } from "@hyperledger/cactus-common"; -import { RabbitMQTestServer } from "@hyperledger/cactus-test-tooling"; -import { pruneDockerAllIfGithubAction } from "@hyperledger/cactus-test-tooling"; -import { IPluginCcTxVisualizationOptions } from "../../../main/typescript"; -import { - CcTxVisualization, - IChannelOptions, -} from "../../../main/typescript/plugin-cc-tx-visualization"; -import { randomUUID } from "crypto"; -import * as amqp from "amqp-ts"; - -const testCase = "dummy-baseline-invalid"; -const logLevel: LogLevelDesc = "TRACE"; -const queueName = "cc-tx-log-entry-test"; - -const log = LoggerProvider.getOrCreate({ - level: logLevel, - label: "cctxviz-dummy-demo", -}); -test("BEFORE " + testCase, async (t: Test) => { - const pruning = pruneDockerAllIfGithubAction({ logLevel }); - await t.doesNotReject(pruning, "Pruning didn't throw OK"); - t.end(); -}); - -test(testCase, async (t: Test) => { - //initialize rabbitmq - const setupInfraTime = new Date(); - const options = { - publishAllPorts: true, - port: 5672, - logLevel: logLevel, - imageName: "rabbitmq", - imageTag: "3.9-management", - emitContainerLogs: true, - envVars: new Map([["AnyNecessaryEnvVar", "Can be set here"]]), - }; - const channelOptions: IChannelOptions = { - queueId: queueName, - dltTechnology: null, - persistMessages: false, - }; - - const cctxvizOptions: IPluginCcTxVisualizationOptions = { - instanceId: randomUUID(), - logLevel: logLevel, - eventProvider: "amqp://localhost", - channelOptions: channelOptions, - }; - - const testServer = new RabbitMQTestServer(options); - const tearDown = async () => { - t.comment("shutdown starts"); - await testServer.stop(); - await cctxViz.shutdown(); - await cctxViz.closeConnection(); - log.debug("running process exit"); - process.exit(0); - }; - - test.onFinish(tearDown); - await testServer.start(true); - t.ok(testServer); - - // Simulates a Cactus Ledger Connector plugin - const connection = new amqp.Connection(); - const queue = connection.declareQueue(queueName, { durable: false }); - - // Initialize our plugin - const cctxViz = new CcTxVisualization(cctxvizOptions); - const setupInfraTimeEnd = new Date(); - log.debug( - `EVAL-testFile-SETUP-INFRA:${ - setupInfraTimeEnd.getTime() - setupInfraTime.getTime() - }`, - ); - t.ok(cctxViz); - t.comment("cctxviz plugin is ok"); - - t.assert(cctxViz.numberUnprocessedReceipts === 0); - t.assert(cctxViz.numberEventsLog === 0); - - const currentTime = new Date(); - let caseNumber = 1; - const caseID = "INVALID_FABRIC_BESU"; - - t.comment(`Sending ${caseNumber * 6} messages across ${caseNumber} cases`); - while (caseNumber > 0) { - // caseID 1; registar emissions; Fabric blockchain, test message; parameters: asset 1, 100 units - const testMessage1 = new amqp.Message({ - caseID: caseID + "_" + caseNumber, - timestamp: currentTime, - blockchainID: "TEST", - invocationType: "send", - methodName: "createAsset", - // Asset 1, 100 units - parameters: ["asset1,5"], - identity: "A", - }); - queue.send(testMessage1); - - // BAD ORDER MINT BEFORE LOCK - const testMessage3 = new amqp.Message({ - caseID: caseID + "_" + caseNumber, - timestamp: new Date(currentTime.getTime() + 2), - blockchainID: "TEST", - invocationType: "send", - methodName: "mintAsset", - // Asset 1, 100 units - parameters: ["asset1", "Green", "19", "owner1", "9999"], - identity: "A", - }); - queue.send(testMessage3); - - const testMessage2 = new amqp.Message({ - caseID: caseID + "_" + caseNumber, - timestamp: new Date(currentTime.getTime() + 3), - blockchainID: "TEST", - invocationType: "send", - methodName: "lockAsset", - // Asset 1, 100 units - parameters: ["asset1"], - identity: "A", - }); - queue.send(testMessage2); - - const testMessage4 = new amqp.Message({ - caseID: caseID + "_" + caseNumber, - timestamp: new Date(currentTime.getTime() + 4), - blockchainID: "TEST", - invocationType: "send", - methodName: "transferAsset", - // Asset 1, 100 units - parameters: ["asset1", "owner2"], - identity: "A", - }); - queue.send(testMessage4); - - const testMessage5 = new amqp.Message({ - caseID: caseID + "_" + caseNumber, - timestamp: new Date(currentTime.getTime() + 5), - blockchainID: "TEST", - invocationType: "send", - methodName: "transferAsset", - // Asset 1, 100 units - parameters: ["asset1", "owner1"], - identity: "A", - }); - queue.send(testMessage5); - - const testMessage6 = new amqp.Message({ - caseID: caseID + "_" + caseNumber, - timestamp: new Date(currentTime.getTime() + 6), - blockchainID: "TEST", - invocationType: "send", - methodName: "BurnAsset", - // Asset 1, 100 units - parameters: ["asset1"], - identity: "A", - }); - queue.send(testMessage6); - - caseNumber--; - } - - const timeStartPollReceipts = new Date(); - await cctxViz.pollTxReceipts(); - await cctxViz.hasProcessedXMessages(6, 4); - - const endTimePollReceipts = new Date(); - const totalTimePoll = - endTimePollReceipts.getTime() - timeStartPollReceipts.getTime(); - t.comment(`EVAL-testFile-POLL:${totalTimePoll}`); - - t.assert(cctxViz.numberEventsLog === 0); - t.assert(cctxViz.numberUnprocessedReceipts === 6); - - await cctxViz.txReceiptToCrossChainEventLogEntry(); - - t.assert(cctxViz.numberEventsLog === 6); - t.assert(cctxViz.numberUnprocessedReceipts === 0); - - const logName = await cctxViz.persistCrossChainLogCsv( - "dummy-use-case-invalid", - ); - - const startTimeAggregate = new Date(); - await cctxViz.aggregateCcTx(); - const endTimeAggregate = new Date(); - t.comment( - `EVAL-testFile-AGGREGATE-CCTX:${ - endTimeAggregate.getTime() - startTimeAggregate.getTime() - }`, - ); - - console.log(logName); - t.ok(logName); - t.end(); -}); diff --git a/packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/cctxviz-persist-cross-chain-log.test.ts b/packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/cctxviz-persist-cross-chain-log.test.ts deleted file mode 100644 index d32af002cf..0000000000 --- a/packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/cctxviz-persist-cross-chain-log.test.ts +++ /dev/null @@ -1,120 +0,0 @@ -import test, { Test } from "tape-promise/tape"; -import { LogLevelDesc } from "@hyperledger/cactus-common"; -import { RabbitMQTestServer } from "@hyperledger/cactus-test-tooling"; -import { pruneDockerAllIfGithubAction } from "@hyperledger/cactus-test-tooling"; -import { IPluginCcTxVisualizationOptions } from "../../../main/typescript"; -import { - CcTxVisualization, - IChannelOptions, -} from "../../../main/typescript/plugin-cc-tx-visualization"; -import { randomUUID } from "crypto"; -import * as amqp from "amqp-ts"; -//import { LedgerType } from "@hyperledger/cactus-core-api/src/main/typescript/public-api"; - -const testCase = "persist logs"; -const logLevel: LogLevelDesc = "TRACE"; -const queueName = "cc-tx-log-entry-test"; - -test("BEFORE " + testCase, async (t: Test) => { - const pruning = pruneDockerAllIfGithubAction({ logLevel }); - await t.doesNotReject(pruning, "Pruning didn't throw OK"); - t.end(); -}); - -test(testCase, async (t: Test) => { - //initialize rabbitmq - const options = { - publishAllPorts: true, - port: 5672, - logLevel: logLevel, - imageName: "rabbitmq", - imageTag: "3.9-management", - emitContainerLogs: true, - envVars: new Map([["AnyNecessaryEnvVar", "Can be set here"]]), - }; - const channelOptions: IChannelOptions = { - queueId: queueName, - dltTechnology: null, - persistMessages: false, - }; - - const cctxvizOptions: IPluginCcTxVisualizationOptions = { - instanceId: randomUUID(), - logLevel: logLevel, - eventProvider: "amqp://localhost", - channelOptions: channelOptions, - }; - - const testServer = new RabbitMQTestServer(options); - const tearDown = async () => { - // Connections to the RabbitMQ server need to be closed - - await testServer.stop(); - // todo problem connection closing is hanging here and l56 - await connection.close(); - - await cctxViz.closeConnection(); - - //await testServer.destroy(); - //await pruneDockerAllIfGithubAction({ logLevel }); - }; - - test.onFinish(tearDown); - - await testServer.start(true); - t.ok(testServer); - - // Simulates a Cactus Ledger Connector plugin - const connection = new amqp.Connection(); - const queue = connection.declareQueue(queueName, { durable: false }); - - // Initialize our plugin - const cctxViz = new CcTxVisualization(cctxvizOptions); - t.ok(cctxViz); - t.comment("cctxviz plugin is ok"); - await cctxViz.pollTxReceipts(); - t.assert(cctxViz.numberUnprocessedReceipts === 0); - t.assert(cctxViz.numberEventsLog === 0); - - // already activated by previous test - //await cctxViz.pollTxReceipts(); - - const testMessage = new amqp.Message({ - caseID: "caseID-TEST 1", - timestamp: new Date(), - blockchainID: "TEST", - invocationType: "call", - methodName: "methodName", - parameters: ["0", "2"], - identity: "person 1", - }); - queue.send(testMessage); - - const testMessage2 = new amqp.Message({ - caseID: "case1", - cost: 5, - revenue: 0, - carbonFootprint: 5, - timestamp: new Date(), - blockchainID: "TEST", - invocationType: "call", - methodName: "methodName", - parameters: ["0", "2"], - identity: "person 1", - }); - queue.send(testMessage2); - - await new Promise((resolve) => setTimeout(resolve, 1000)); - await cctxViz.txReceiptToCrossChainEventLogEntry(); - - t.assert(cctxViz.numberEventsLog === 2); - // because the second message did not have time to be send to processing before receipts were transformed into cross chain events - t.assert(cctxViz.numberUnprocessedReceipts === 0); - - await cctxViz.txReceiptToCrossChainEventLogEntry(); - - const logName = await cctxViz.persistCrossChainLogCsv(); - console.log(logName); - t.ok(logName); - t.end(); -}); diff --git a/packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/initialize-cctxviz-usecase-fabric-besu-6-events.test.ts b/packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/initialize-cctxviz-usecase-fabric-besu-6-events.test.ts deleted file mode 100644 index 0c533f674e..0000000000 --- a/packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/initialize-cctxviz-usecase-fabric-besu-6-events.test.ts +++ /dev/null @@ -1,583 +0,0 @@ -import test, { Test } from "tape-promise/tape"; -import { - IListenOptions, - LoggerProvider, - LogLevelDesc, - Servers, -} from "@hyperledger/cactus-common"; -import { - BesuTestLedger, - Containers, - FabricTestLedgerV1, - pruneDockerAllIfGithubAction, -} from "@hyperledger/cactus-test-tooling"; -import { RabbitMQTestServer } from "@hyperledger/cactus-test-tooling"; -import { IPluginCcTxVisualizationOptions } from "../../../main/typescript"; -import { - CcTxVisualization, - IChannelOptions, -} from "../../../main/typescript/plugin-cc-tx-visualization"; -import { randomUUID } from "crypto"; -import { IRabbitMQTestServerOptions } from "@hyperledger/cactus-test-tooling/dist/lib/main/typescript/rabbitmq-test-server/rabbit-mq-test-server"; -import { v4 as uuidv4 } from "uuid"; -import { PluginKeychainMemory } from "@hyperledger/cactus-plugin-keychain-memory"; -import { PluginRegistry } from "@hyperledger/cactus-core"; -import { DiscoveryOptions } from "fabric-network"; -import { Configuration } from "@hyperledger/cactus-core-api"; -import fs from "fs-extra"; -import LockAssetContractJson from "../../solidity/LockAsset.json"; -import { PluginImportType } from "@hyperledger/cactus-core-api"; - -import { - ChainCodeProgrammingLanguage, - DefaultEventHandlerStrategy, - FabricContractInvocationType, - FileBase64, - PluginLedgerConnectorFabric, - IPluginLedgerConnectorFabricOptions, -} from "@hyperledger/cactus-plugin-ledger-connector-fabric"; -import express from "express"; -import bodyParser from "body-parser"; -import http from "http"; -import path from "path"; -import { DefaultApi as FabricApi } from "@hyperledger/cactus-plugin-ledger-connector-fabric"; -import { AddressInfo } from "net"; -import Web3 from "web3"; -import { - EthContractInvocationType, - PluginFactoryLedgerConnector, - PluginLedgerConnectorBesu, - ReceiptType, - Web3SigningCredentialType, -} from "@hyperledger/cactus-plugin-ledger-connector-besu"; - -const testCase = "Instantiate plugin with fabric, send 2 transactions"; -const logLevel: LogLevelDesc = "TRACE"; - -// By default that's the Fabric connector queue -const queueName = "cc-tx-viz-queue"; - -const log = LoggerProvider.getOrCreate({ - level: logLevel, - label: "cctxviz-fabtest", -}); -//const fixturesPath = -("../../../../../cactus-plugin-ledger-connector-fabric/src/test/typescript/fixtures"); -const alternativeFixturesPath = "../fixtures"; - -let cctxViz: CcTxVisualization; -let options: IRabbitMQTestServerOptions; -let channelOptions: IChannelOptions; -let testServer: RabbitMQTestServer; -let cctxvizOptions: IPluginCcTxVisualizationOptions; -let ledger: FabricTestLedgerV1; -let besuTestLedger: BesuTestLedger; -const expressAppBesu = express(); -expressAppBesu.use(bodyParser.json({ limit: "250mb" })); - -const expressApp = express(); -expressApp.use(bodyParser.json({ limit: "250mb" })); -const server = http.createServer(expressApp); - -test(testCase, async (t: Test) => { - const setupInfraTime = new Date(); - pruneDockerAllIfGithubAction({ logLevel }) - .then(() => { - log.info("Pruning throw OK"); - }) - .catch(async () => { - await Containers.logDiagnostics({ logLevel }); - fail("Pruning didn't throw OK"); - }); - - options = { - publishAllPorts: true, - port: 5672, - logLevel: logLevel, - imageName: "rabbitmq", - imageTag: "3.9-management", - emitContainerLogs: true, - envVars: new Map([["AnyNecessaryEnvVar", "Can be set here"]]), - }; - channelOptions = { - queueId: queueName, - dltTechnology: null, - persistMessages: false, - }; - - cctxvizOptions = { - instanceId: randomUUID(), - logLevel: logLevel, - eventProvider: "amqp://localhost", - channelOptions: channelOptions, - }; - testServer = new RabbitMQTestServer(options); - - await testServer.start(); - cctxViz = new CcTxVisualization(cctxvizOptions); - - ledger = new FabricTestLedgerV1({ - emitContainerLogs: true, - publishAllPorts: true, - imageName: "ghcr.io/hyperledger/cactus-fabric2-all-in-one", - envVars: new Map([["FABRIC_VERSION", "2.2.0"]]), - logLevel, - }); - await ledger.start(); - - besuTestLedger = new BesuTestLedger(); - await besuTestLedger.start(); - const tearDown = async () => { - await cctxViz.closeConnection(); - await testServer.stop(); - await ledger.stop(); - await ledger.destroy(); - await besuTestLedger.stop(); - await besuTestLedger.destroy(); - await pruneDockerAllIfGithubAction({ logLevel }); - log.debug("executing exit"); - process.exit(0); - }; - - test.onFinish(tearDown); - t.ok(testServer); - const channelId = "mychannel"; - const channelName = channelId; - - const connectionProfile = await ledger.getConnectionProfileOrg1(); - const enrollAdminOut = await ledger.enrollAdmin(); - const adminWallet = enrollAdminOut[1]; - const [userIdentity] = await ledger.enrollUser(adminWallet); - const sshConfig = await ledger.getSshConfig(); - - const keychainInstanceId = uuidv4(); - const keychainId = uuidv4(); - const keychainEntryKey = "user2"; - const keychainEntryValue = JSON.stringify(userIdentity); - - const keychainPlugin = new PluginKeychainMemory({ - instanceId: keychainInstanceId, - keychainId, - logLevel, - backend: new Map([ - [keychainEntryKey, keychainEntryValue], - ["some-other-entry-key", "some-other-entry-value"], - ]), - }); - - const pluginRegistry = new PluginRegistry({ plugins: [keychainPlugin] }); - - const discoveryOptions: DiscoveryOptions = { - enabled: true, - asLocalhost: true, - }; - - // This is the directory structure of the Fabirc 2.x CLI container (fabric-tools image) - // const orgCfgDir = "/fabric-samples/test-network/organizations/"; - const orgCfgDir = - "/opt/gopath/src/github.com/hyperledger/fabric/peer/organizations/"; - - // these below mirror how the fabric-samples sets up the configuration - const org1Env = { - CORE_LOGGING_LEVEL: "debug", - FABRIC_LOGGING_SPEC: "debug", - CORE_PEER_LOCALMSPID: "Org1MSP", - - ORDERER_CA: `${orgCfgDir}ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem`, - - FABRIC_CFG_PATH: "/etc/hyperledger/fabric", - CORE_PEER_TLS_ENABLED: "true", - CORE_PEER_TLS_ROOTCERT_FILE: `${orgCfgDir}peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt`, - CORE_PEER_MSPCONFIGPATH: `${orgCfgDir}peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp`, - CORE_PEER_ADDRESS: "peer0.org1.example.com:7051", - ORDERER_TLS_ROOTCERT_FILE: `${orgCfgDir}ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem`, - }; - - // these below mirror how the fabric-samples sets up the configuration - const org2Env = { - CORE_LOGGING_LEVEL: "debug", - FABRIC_LOGGING_SPEC: "debug", - CORE_PEER_LOCALMSPID: "Org2MSP", - - FABRIC_CFG_PATH: "/etc/hyperledger/fabric", - CORE_PEER_TLS_ENABLED: "true", - ORDERER_CA: `${orgCfgDir}ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem`, - - CORE_PEER_ADDRESS: "peer0.org2.example.com:9051", - CORE_PEER_MSPCONFIGPATH: `${orgCfgDir}peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp`, - CORE_PEER_TLS_ROOTCERT_FILE: `${orgCfgDir}peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt`, - ORDERER_TLS_ROOTCERT_FILE: `${orgCfgDir}ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem`, - }; - - const pluginOptions: IPluginLedgerConnectorFabricOptions = { - collectTransactionReceipts: true, - instanceId: uuidv4(), - dockerBinary: "/usr/local/bin/docker", - peerBinary: "/fabric-samples/bin/peer", - goBinary: "/usr/local/go/bin/go", - pluginRegistry, - cliContainerEnv: org1Env, - sshConfig, - logLevel, - connectionProfile, - discoveryOptions, - eventHandlerOptions: { - strategy: DefaultEventHandlerStrategy.NetworkScopeAllfortx, - commitTimeout: 300, - }, - }; - const plugin = new PluginLedgerConnectorFabric(pluginOptions); - - const listenOptions: IListenOptions = { - hostname: "localhost", - port: 0, - server, - }; - const addressInfo = (await Servers.listen(listenOptions)) as AddressInfo; - const { port } = addressInfo; - - await plugin.getOrCreateWebServices(); - await plugin.registerWebServices(expressApp); - const apiUrl = `http://localhost:${port}`; - - const config = new Configuration({ basePath: apiUrl }); - - const apiClient = new FabricApi(config); - - // Setup: contract name - const contractName = "basic-asset-transfer-2"; - - // Setup: contract directory - const contractRelPath = "go/basic-asset-transfer/chaincode-typescript"; - const contractDir = path.join( - __dirname, - alternativeFixturesPath, - contractRelPath, - ); - const sourceFiles: FileBase64[] = []; - // Setup: push files - { - const filename = "./tslint.json"; - const relativePath = "./"; - const filePath = path.join(contractDir, relativePath, filename); - const buffer = await fs.readFile(filePath); - sourceFiles.push({ - body: buffer.toString("base64"), - filepath: relativePath, - filename, - }); - } - { - const filename = "./tsconfig.json"; - const relativePath = "./"; - const filePath = path.join(contractDir, relativePath, filename); - const buffer = await fs.readFile(filePath); - sourceFiles.push({ - body: buffer.toString("base64"), - filepath: relativePath, - filename, - }); - } - { - const filename = "./package.json"; - const relativePath = "./"; - const filePath = path.join(contractDir, relativePath, filename); - const buffer = await fs.readFile(filePath); - sourceFiles.push({ - body: buffer.toString("base64"), - filepath: relativePath, - filename, - }); - } - { - const filename = "./index.ts"; - const relativePath = "./src/"; - const filePath = path.join(contractDir, relativePath, filename); - const buffer = await fs.readFile(filePath); - sourceFiles.push({ - body: buffer.toString("base64"), - filepath: relativePath, - filename, - }); - } - { - const filename = "./asset.ts"; - const relativePath = "./src/"; - const filePath = path.join(contractDir, relativePath, filename); - const buffer = await fs.readFile(filePath); - sourceFiles.push({ - body: buffer.toString("base64"), - filepath: relativePath, - filename, - }); - } - { - const filename = "./assetTransfer.ts"; - const relativePath = "./src/"; - const filePath = path.join(contractDir, relativePath, filename); - const buffer = await fs.readFile(filePath); - sourceFiles.push({ - body: buffer.toString("base64"), - filepath: relativePath, - filename, - }); - } - // Setup: Deploy smart contract - const res = await apiClient.deployContractV1({ - channelId, - ccVersion: "1.0.0", - // constructorArgs: { Args: ["john", "99"] }, - sourceFiles, - ccName: contractName, - targetOrganizations: [org1Env, org2Env], - caFile: `${orgCfgDir}ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem`, - ccLabel: "basic-asset-transfer-2", - ccLang: ChainCodeProgrammingLanguage.Typescript, - ccSequence: 1, - orderer: "orderer.example.com:7050", - ordererTLSHostnameOverride: "orderer.example.com", - connTimeout: 60, - }); - - const { success } = res.data; - t.assert(success); - t.assert(res.status === 200); - - const contractNameBesu = "LockAsset"; - - const rpcApiHttpHost = await besuTestLedger.getRpcApiHttpHost(); - const rpcApiWsHost = await besuTestLedger.getRpcApiWsHost(); - - /** - * Constant defining the standard 'dev' Besu genesis.json contents. - * - * @see https://github.com/hyperledger/besu/blob/1.5.1/config/src/main/resources/dev.json - */ - const firstHighNetWorthAccount = besuTestLedger.getGenesisAccountPubKey(); - const besuKeyPair = { - privateKey: besuTestLedger.getGenesisAccountPrivKey(), - }; - - const web3 = new Web3(rpcApiHttpHost); - const testEthAccount = web3.eth.accounts.create(uuidv4()); - - const keychainEntryKeyBesu = uuidv4(); - const keychainEntryValueBesu = testEthAccount.privateKey; - const keychainPluginBesu = new PluginKeychainMemory({ - instanceId: uuidv4(), - keychainId: uuidv4(), - // pre-provision keychain with mock backend holding the private key of the - // test account that we'll reference while sending requests with the - // signing credential pointing to this keychain entry. - backend: new Map([[keychainEntryKeyBesu, keychainEntryValueBesu]]), - logLevel, - }); - keychainPluginBesu.set( - LockAssetContractJson.contractName, - JSON.stringify(LockAssetContractJson), - ); - const factory = new PluginFactoryLedgerConnector({ - pluginImportType: PluginImportType.Local, - }); - const connector: PluginLedgerConnectorBesu = await factory.create({ - collectTransactionReceipts: true, - rpcApiHttpHost, - rpcApiWsHost, - instanceId: uuidv4(), - pluginRegistry: new PluginRegistry({ plugins: [keychainPluginBesu] }), - }); - - const balance = await web3.eth.getBalance(testEthAccount.address); - t.ok(balance); - - const deployOut = await connector.deployContract({ - keychainId: keychainPluginBesu.getKeychainId(), - contractName: LockAssetContractJson.contractName, - contractAbi: LockAssetContractJson.abi, - constructorArgs: [], - web3SigningCredential: { - ethAccount: firstHighNetWorthAccount, - secret: besuKeyPair.privateKey, - type: Web3SigningCredentialType.PrivateKeyHex, - }, - bytecode: LockAssetContractJson.bytecode, - gas: 1000000, - }); - t.ok(deployOut); - t.ok(deployOut.transactionReceipt); - - const setupInfraTimeEnd = new Date(); - log.debug( - `EVAL-testFile-SETUP-INFRA:${ - setupInfraTimeEnd.getTime() - setupInfraTime.getTime() - }`, - ); - - const timeStartSendMessages = new Date(); - - await connector.transact({ - web3SigningCredential: { - ethAccount: firstHighNetWorthAccount, - secret: besuKeyPair.privateKey, - type: Web3SigningCredentialType.PrivateKeyHex, - }, - consistencyStrategy: { - blockConfirmations: 0, - receiptType: ReceiptType.NodeTxPoolAck, - }, - transactionConfig: { - from: firstHighNetWorthAccount, - to: testEthAccount.address, - value: 10e9, - gas: 1000000, - }, - }); - const { success: createRes } = await connector.invokeContract({ - caseID: "FABRIC_BESU", - contractName: contractNameBesu, - keychainId: keychainPluginBesu.getKeychainId(), - invocationType: EthContractInvocationType.Send, - methodName: "createAsset", - params: ["asset1", 5], - signingCredential: { - ethAccount: testEthAccount.address, - secret: besuKeyPair.privateKey, - type: Web3SigningCredentialType.PrivateKeyHex, - }, - gas: 1000000, - }); - t.ok(createRes); - t.assert(createRes === true); - log.warn("create ok"); - const { success: lockRes } = await connector.invokeContract({ - caseID: "FABRIC_BESU", - contractName: contractNameBesu, - keychainId: keychainPluginBesu.getKeychainId(), - invocationType: EthContractInvocationType.Send, - methodName: "lockAsset", - params: ["asset1"], - signingCredential: { - ethAccount: testEthAccount.address, - secret: besuKeyPair.privateKey, - type: Web3SigningCredentialType.PrivateKeyHex, - }, - gas: 1000000, - }); - log.warn("checking lock res"); - t.ok(lockRes); - const assetId = "asset1"; - const assetOwner = "owner1"; - - const createResFabric = await apiClient.runTransactionV1({ - caseID: "FABRIC_BESU", - contractName, - channelName, - params: [assetId, "Green", "19", assetOwner, "9999"], - methodName: "MintAsset", - invocationType: FabricContractInvocationType.Send, - signingCredential: { - keychainId, - keychainRef: keychainEntryKey, - }, - }); - t.ok(createResFabric); - - // READS are not considered transactions, but are relevant to our use case - /* - const getRes = await apiClient.runTransactionV1({ - caseID: "FABRIC_BESU", - contractName, - channelName, - params: [assetId], - methodName: "ReadAsset", - invocationType: FabricContractInvocationType.Call, - signingCredential: { - keychainId, - keychainRef: keychainEntryKey, - }, - }); - expect(getRes).toBeDefined(); - */ - - // Setup: transact - const transferAssetRes = await apiClient.runTransactionV1({ - caseID: "FABRIC_BESU", - contractName, - channelName, - params: [assetId, "owner2"], - methodName: "TransferAsset", - invocationType: FabricContractInvocationType.Send, - signingCredential: { - keychainId, - keychainRef: keychainEntryKey, - }, - }); - t.ok(transferAssetRes); - // Setup: transact - const transferAssetBackRes = await apiClient.runTransactionV1({ - caseID: "FABRIC_BESU", - contractName, - channelName, - params: [assetId, "owner1"], - methodName: "TransferAsset", - invocationType: FabricContractInvocationType.Send, - signingCredential: { - keychainId, - keychainRef: keychainEntryKey, - }, - }); - t.ok(transferAssetBackRes); - // Setup: transact - const burnAssetRes = await apiClient.runTransactionV1({ - caseID: "FABRIC_BESU", - contractName, - channelName, - params: [assetId], - methodName: "BurnAsset", - invocationType: FabricContractInvocationType.Send, - signingCredential: { - keychainId, - keychainRef: keychainEntryKey, - }, - }); - t.ok(burnAssetRes); - - // Initialize our plugin - t.ok(cctxViz); - log.info("cctxviz plugin is ok"); - const endTimeSendMessages = new Date(); - log.debug( - `EVAL-testFile-SEND-MESSAGES:${ - endTimeSendMessages.getTime() - timeStartSendMessages.getTime() - }`, - ); - const timeStartPollReceipts = new Date(); - await cctxViz.pollTxReceipts(); - await cctxViz.hasProcessedXMessages(6, 4); - - const endTimePollReceipts = new Date(); - const totalTimePoll = - endTimePollReceipts.getTime() - timeStartPollReceipts.getTime(); - log.debug(`EVAL-testFile-POLL:${totalTimePoll}`); - - // Number of messages on queue: 0 - t.assert(cctxViz.numberUnprocessedReceipts > 1); - t.assert(cctxViz.numberEventsLog === 0); - - await cctxViz.txReceiptToCrossChainEventLogEntry(); - - // Number of messages on queue: 0 - t.assert(cctxViz.numberUnprocessedReceipts === 0); - t.assert(cctxViz.numberEventsLog > 1); - - await cctxViz.persistCrossChainLogCsv("use-case-besu-fabric-6-events"); - - const startTimeAggregate = new Date(); - await cctxViz.aggregateCcTx(); - const endTimeAggregate = new Date(); - log.debug( - `EVAL-testFile-AGGREGATE-CCTX:${ - endTimeAggregate.getTime() - startTimeAggregate.getTime() - }`, - ); -}); diff --git a/packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/initialize-rabbitmq.test.ts b/packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/initialize-rabbitmq.test.ts deleted file mode 100644 index ac4489260a..0000000000 --- a/packages/cactus-plugin-cc-tx-visualization/src/test/typescript/integration/initialize-rabbitmq.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -import test, { Test } from "tape-promise/tape"; -import { LogLevelDesc } from "@hyperledger/cactus-common"; -import { RabbitMQTestServer } from "@hyperledger/cactus-test-tooling"; -import { pruneDockerAllIfGithubAction } from "@hyperledger/cactus-test-tooling"; - -const testCase = "Instantiate plugin"; -const logLevel: LogLevelDesc = "TRACE"; - -test("BEFORE " + testCase, async (t: Test) => { - const pruning = pruneDockerAllIfGithubAction({ logLevel }); - await t.doesNotReject(pruning, "Pruning didn't throw OK"); - t.end(); -}); - -test(testCase, async (t: Test) => { - const options = { - publishAllPorts: true, - port: 5672, - logLevel: logLevel, - imageName: "rabbitmq", - imageTag: "3.9-management", - emitContainerLogs: true, - envVars: new Map([["AnyNecessaryEnvVar", "Can be set here"]]), - }; - - const testServer = new RabbitMQTestServer(options); - const tearDown = async () => { - await testServer.stop(); - // Destruction occurs when the RabbitMQ stops and has no listening connections - //await testServer.destroy(); - await pruneDockerAllIfGithubAction({ logLevel }); - }; - - test.onFinish(tearDown); - await testServer.start(); - t.ok(testServer); - //await new Promise((resolve) => setTimeout(resolve, 3000)); - t.end(); -}); diff --git a/packages/cactus-plugin-cc-tx-visualization/.gitignore b/packages/cactus-plugin-ccmodel-hephaestus/.gitignore similarity index 82% rename from packages/cactus-plugin-cc-tx-visualization/.gitignore rename to packages/cactus-plugin-ccmodel-hephaestus/.gitignore index a3a215c6f3..e923932be3 100644 --- a/packages/cactus-plugin-cc-tx-visualization/.gitignore +++ b/packages/cactus-plugin-ccmodel-hephaestus/.gitignore @@ -1,4 +1,4 @@ cactus-openapi-spec-plugin-consortium-manual.json src/main/typescript/generated/openapi/typescript-axios/.npmignore src/test/csv -src/test/test-results/*.out +src/test/json diff --git a/packages/cactus-plugin-ccmodel-hephaestus/README.md b/packages/cactus-plugin-ccmodel-hephaestus/README.md new file mode 100644 index 0000000000..7ca59b9578 --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/README.md @@ -0,0 +1,149 @@ +# `@hyperledger/cactus-plugin-ccmodel-hephaestus` + +The package provides `Hyperledger Cacti` a way to generate process models from arbitrary cross-chain use cases. The implementation follows the paper [Hephaestus](https://www.techrxiv.org/doi/full/10.36227/techrxiv.20718058.v3). + +With this plugin it will be possible to generate cross-chain models from local transactions in different ledgers (currently supports Besu, Ethereum, and Fabric), realizing arbitrary cross-chain use cases and allowing operators to monitor their applications. +Through monitoring, errors like outliers and malicious behavior can be identified, which can enable programmatically stopping attacks (circuit breaker), including bridge hacks. + +## Summary + +- [`@hyperledger/cactus-plugin-ccmodel-hephaestus`](#hyperledgercactus-plugin-ccmodel-hephaestus) + - [Summary](#summary) + - [Getting Started](#getting-started) + - [Prerequisites](#prerequisites) + - [Architecture](#architecture) + - [RxJS Transaction Monitoring](#rxjs-transaction-monitoring) + - [Cross-Chain Model Pipeline](#cross-chain-model-pipeline) + - [PM4Py Overview](#pm4py-overview) + - [Running the tests](#running-the-tests) + - [Usage](#usage) + - [Contributing](#contributing) + - [License](#license) + + +## Getting Started + +Clone the git repository on your local machine. Follow these instructions that will get you a copy of the project up and running on your local machine for development and testing purposes. + +### Prerequisites + +In the root of the project to install the dependencies execute the command: +```sh +npm run configure +``` + +Know how to use the following plugins of the project: + + - [cactus-plugin-ledger-connector-besu](https://github.com/hyperledger/cactus/tree/main/packages/cactus-plugin-ledger-connector-besu) + - [cactus-plugin-ledger-connector-ethereum](https://github.com/hyperledger/cactus/tree/main/packages/cactus-plugin-ledger-connector-ethereum) + - [cactus-plugin-ledger-connector-fabric](https://github.com/hyperledger/cactus/tree/main/packages/cactus-plugin-ledger-connector-fabric) + + +## Architecture + +### RxJS Transaction Monitoring + +This plugin utilizes RxJS (Reactive Extensions for JavaScript) to monitor transactions issued in Hyperledger Besu, Hyperledger Ethereum, and Hyperledger Fabric connectors. + +RxJS provides a powerful framework for asynchronous or callback-based code, each connector maintains an RxJS `ReplaySubject`, named `txSubject`, which acts as a message bus for emitting transaction data. + +- When a transaction is issued in a connector, the `ReplaySubject` stores the value it observes in an internal buffer. This observation is achieved by passing the value to its `next` method. +- When a new subscriber subscribes to the `txSubject`, it synchronously emits all values in its buffer in a First-In-First-Out (FIFO) manner. This ensures that subscribers receive the most recent transactional data, regardless of when they subscribe. +- The transactional data emitted includes essential information such as the transaction ID, timestamp, and other parameters, which are necessary for creating transaction receipts within the plugin. + +### Cross-Chain Model Pipeline + +The plugin employs a structured pipeline to create a cross-chain model from monitored connector transactions: + +1. **Transaction Emission**: Connectors issue local transactions against their respective target blockchains. Each transaction's data is emitted by the `txSubject` to the subscribers within our plugin. + +2. **Receipt Polling**: Upon receiving of transactional data, the plugin processes it into transaction receipts. This step involves precessing transactional information received such as transaction IDs, timestamps, and other parameters. + +3. **Cross-Chain Event Logging**: Processed receipts information can then be used to create cross-chain events, forming a cross-chain event log. + +4. **Cross-Chain Model**: The plugin uses the cross chain event log to create the cross-chain model with the information received from the connectors, using the Process Mining for Python (PM4PY) library. This model can then be used to verify new and unmodeled transactional information received from the connectors. + +### PM4Py Overview + +[PM4Py](https://pm4py.fit.fraunhofer.de/) is an open-source library designed for process mining, that provides tools to analyze and visualize business processes. +With it we can generate process models from the event logs created from transactional data and compare event logs with process models to identify deviations. + +## Running the tests + - **basic-mock-test.test.ts**: Conducts the simulation of a transaction without instantiating the connectors, and tests that the plugin monitors, captures, and processes the transactional data and creates a cross-chain event. + - **monitor-4-besu-events.test.ts**: Tests the plugin's ability to monitor, capture, and process the transactional data from besu connectors, and exports transactional data, in both CSV and JSON formats, as cross-chain event logs. + - **monitor-4-ethereum-events.test.ts**: Tests the plugin's ability to monitor, capture, and process the transactional data from ethereum connectors, and exports transactional data, in both CSV and JSON formats, as cross-chain event logs. + - **monitor-4-fabric-events.test.ts**: Tests the plugin's ability to monitor, capture, and process the transactional data from fabric connectors, and exports transactional data, in both CSV and JSON formats, as cross-chain event logs. + - **monitor-besu-ethereum-fabric-events.test.ts**: Tests the plugin's ability to monitor transactional data from besu, ethereum, and fabric connectors at the same time. + - **cross-chain-model-serialization.test.ts**: Tests the plugin's ability to create the cross-chain model using the PM4PY (Process Mining for Python) library and save it serialized. + - **cross-chain-model-conformance-checking.test.ts**: Tests the plugin's ability to check the conformity of unmodeled transactions against the cross-chain model using the PM4PY (Process Mining for Python) library. + - **cross-chain-model-periodic-update.test.ts**: Tests the plugin's ability to periodically update the cross-chain model with received transactional data. + +## Usage +Let us consider three conectors: one connected to Hyperledger Besu and, another connected to Hyperledger Ethereum, and a third connected to Hyperledger Fabric. To monitor cross-chain transactions and create a cross-chain model we should follow the next steps. + +After instantiating the connectors, we instantiate the plugin as follows: +```typescript +let hephaestusOptions: IPluginCcModelHephaestusOptions; + +hephaestusOptions = { + instanceId: randomUUID(), + logLevel: logLevel, + besuTxObservable: besuConnector.getTxSubjectObservable(), + ethereumTxObservable: ethereumConnector.getTxSubjectObservable(), + fabricTxObservable: fabricConnector.getTxSubjectObservable(), +}; +hephaestus = new CcModelHephaestus(hephaestusOptions); +``` + +We set the desired caseID and start monitoring and processing the transactions into transaction receipts: + +```typescript +hephaestus.setCaseId("Desired_CaseID"); +hephaestus.monitorTransactions(); +``` + +We can create cross-chain events from processed transaction receipts and add them to the cross-chain event log: + +```typescript +hephaestus.txReceiptToCrossChainEventLogEntry(); +``` + +We can export the transactional data captured to CSV and JSON files: + +```typescript +hephaestus.persistCrossChainLogCsv("output-file-CSV"); +hephaestus.persistCrossChainLogJson("output-file-JSON"); +``` + +We can create the cross-chain model with events created from the transactional data captured: +```typescript +await hephaestus.createModel(); +``` + +We can periodically update the cross-chain model with events created from the transactional data captured: +```typescript +const timeInterval = 10000; +const fileName = "file-with-modeled-logs" +await hephaestus.periodicCCModelUpdate( + fileName, + timeInterval, + ); +await hephaestus.stopPeriodicCCModelUpdate(fileName); +``` + +After creating or updating a model with the desired event logs, we can perform a conformance check of the newly received transactional data against the model: +```typescript +const model = hephaestus.getModel(CrossChainModelType.PetriNet); +hephaestus.setIsModeling(false); +//receive more transactional data from connectors +await hephaestus.checkConformance(model); +``` + + +## Contributing +We welcome contributions to Hyperledger Cactus in many forms, and there’s always plenty to do! + +Please review [CONTIRBUTING.md](https://github.com/hyperledger/cactus/blob/main/CONTRIBUTING.md "CONTIRBUTING.md") to get started. + +## License +This distribution is published under the Apache License Version 2.0 found in the [LICENSE ](https://github.com/hyperledger/cactus/blob/main/LICENSE "LICENSE ")file. \ No newline at end of file diff --git a/packages/cactus-plugin-cc-tx-visualization/package.json b/packages/cactus-plugin-ccmodel-hephaestus/package.json similarity index 63% rename from packages/cactus-plugin-cc-tx-visualization/package.json rename to packages/cactus-plugin-ccmodel-hephaestus/package.json index 2f04aafc45..72c52941a6 100644 --- a/packages/cactus-plugin-cc-tx-visualization/package.json +++ b/packages/cactus-plugin-ccmodel-hephaestus/package.json @@ -1,37 +1,7 @@ { - "name": "@hyperledger/cactus-plugin-cc-tx-visualization", + "name": "@hyperledger/cactus-plugin-ccmodel-hephaestus", "version": "1.0.0", "description": "A web service plugin that provides management capabilities on cross-chain transactions visualization.", - "main": "dist/lib/main/typescript/index.js", - "mainMinified": "dist/cactus-plugin-cc-tx-visualization.node.umd.min.js", - "browser": "dist/cactus-plugin-cc-tx-visualization.web.umd.js", - "browserMinified": "dist/cactus-plugin-cc-tx-visualization.web.umd.min.js", - "module": "dist/lib/main/typescript/index.js", - "types": "dist/types/main/typescript/index.d.ts", - "files": [ - "dist/*" - ], - "scripts": { - "watch": "npm-watch", - "webpack": "npm-run-all webpack:dev webpack:prod", - "webpack:dev": "npm-run-all webpack:dev:node webpack:dev:web", - "webpack:dev:web": "webpack --env=dev --target=web --config ../../webpack.config.js", - "webpack:dev:node": "webpack --env=dev --target=node --config ../../webpack.config.js", - "webpack:prod": "npm-run-all webpack:prod:node webpack:prod:web", - "webpack:prod:web": "webpack --env=prod --target=web --config ../../webpack.config.js", - "webpack:prod:node": "webpack --env=prod --target=node --config ../../webpack.config.js" - }, - "publishConfig": { - "access": "public" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/hyperledger/cactus.git" - }, "keywords": [ "Hyperledger", "Cactus", @@ -39,6 +9,15 @@ "Blockchain", "Distributed Ledger Technology" ], + "homepage": "https://github.com/hyperledger/cactus#readme", + "bugs": { + "url": "https://github.com/hyperledger/cactus/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/hyperledger/cactus.git" + }, + "license": "Apache-2.0", "author": { "name": "Hyperledger Cactus Contributors", "email": "cactus@lists.hyperledger.org", @@ -58,35 +37,61 @@ }, { "name": "Rafael Belchior" + }, + { + "name": "Bruno Mateus" } ], - "license": "Apache-2.0", - "bugs": { - "url": "https://github.com/hyperledger/cactus/issues" + "main": "dist/lib/main/typescript/index.js", + "module": "dist/lib/main/typescript/index.js", + "browser": "dist/cactus-plugin-ccmodel-hephaestus.web.umd.js", + "types": "dist/types/main/typescript/index.d.ts", + "files": [ + "dist/*" + ], + "scripts": { + "build": "npm run tsc", + "tsc": "tsc --project ./tsconfig.json", + "watch": "npm-watch", + "webpack": "npm-run-all webpack:dev webpack:prod", + "webpack:dev": "npm-run-all webpack:dev:node webpack:dev:web", + "webpack:dev:web": "webpack --env=dev --target=web --config ../../webpack.config.js", + "webpack:dev:node": "webpack --env=dev --target=node --config ../../webpack.config.js", + "webpack:prod": "npm-run-all webpack:prod:node webpack:prod:web", + "webpack:prod:web": "webpack --env=prod --target=web --config ../../webpack.config.js", + "webpack:prod:node": "webpack --env=prod --target=node --config ../../webpack.config.js" }, - "homepage": "https://github.com/hyperledger/cactus#readme", "dependencies": { - "@hyperledger/cactus-common": "1.0.0", - "@hyperledger/cactus-core": "1.0.0", - "@hyperledger/cactus-core-api": "1.0.0", - "@hyperledger/cactus-plugin-ledger-connector-fabric": "1.0.0", - "@hyperledger/cactus-plugin-ledger-connector-besu": "1.0.0", - "amqp-ts": "1.8.0", - "axios": "0.21.1", - "body-parser": "1.19.0", - "csv-stringify": "6.0.5", - "express": "4.17.1", - "fabric-contract-api": "2.2.3", - "jose": "1.28.1", - "json-stable-stringify": "1.0.1", - "prom-client": "13.0.0", - "typescript-optional": "2.0.1", - "uuid": "8.3.2" + "@hyperledger/cactus-common": "2.0.0-alpha.2", + "@hyperledger/cactus-core": "2.0.0-alpha.2", + "@hyperledger/cactus-core-api": "2.0.0-alpha.2", + "@hyperledger/cactus-plugin-ledger-connector-besu": "2.0.0-alpha.2", + "@hyperledger/cactus-plugin-ledger-connector-ethereum": "2.0.0-alpha.2", + "@hyperledger/cactus-plugin-ledger-connector-fabric": "2.0.0-alpha.2", + "run-time-error-cjs": "1.4.0", + "typescript-optional": "2.0.1" }, "devDependencies": { - "@hyperledger/cactus-test-tooling": "1.0.0", + "@hyperledger/cactus-plugin-keychain-memory": "2.0.0-alpha.2", + "@hyperledger/cactus-test-geth-ledger": "2.0.0-alpha.2", + "@hyperledger/cactus-test-tooling": "2.0.0-alpha.2", "@types/express": "4.17.8", - "@types/json-stable-stringify": "1.0.32", - "@types/uuid": "8.3.0" - } + "@types/uuid": "8.3.0", + "body-parser": "1.19.0", + "express": "4.17.1", + "fabric-network": "2.2.20", + "socket.io": "4.5.4", + "uuid": "8.3.2", + "web3": "1.6.1", + "web3-core": "1.6.1" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + }, + "publishConfig": { + "access": "public" + }, + "browserMinified": "dist/cactus-plugin-ccmodel-hephaestus.web.umd.min.js", + "mainMinified": "dist/cactus-plugin-ccmodel-hephaestus.node.umd.min.js" } diff --git a/packages/cactus-plugin-cc-tx-visualization/src/main/typescript/index.ts b/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/index.ts similarity index 100% rename from packages/cactus-plugin-cc-tx-visualization/src/main/typescript/index.ts rename to packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/index.ts diff --git a/packages/cactus-plugin-cc-tx-visualization/src/main/typescript/index.web.ts b/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/index.web.ts similarity index 100% rename from packages/cactus-plugin-cc-tx-visualization/src/main/typescript/index.web.ts rename to packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/index.web.ts diff --git a/packages/cactus-plugin-cc-tx-visualization/src/main/typescript/models/carbon-footprint.ts b/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/models/carbon-footprint.ts similarity index 58% rename from packages/cactus-plugin-cc-tx-visualization/src/main/typescript/models/carbon-footprint.ts rename to packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/models/carbon-footprint.ts index 376c2c2292..13623fdcad 100644 --- a/packages/cactus-plugin-cc-tx-visualization/src/main/typescript/models/carbon-footprint.ts +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/models/carbon-footprint.ts @@ -1,27 +1,14 @@ import { LedgerType } from "@hyperledger/cactus-core-api"; -export function calculateGasPriceBesu(gasUsed: number): number { - if (!gasUsed) { - return 0; - } - return getGasPrice() * gasUsed; -} - -// The conversion rate gwei-dollar can be dynamic -export function gweiToDollar(gwei: number): number | string { - if (!gwei) { +export function calculateGasPriceEth( + gasUsed: number, + effectiveGasPrice: string | undefined, +): number { + if (!gasUsed || !effectiveGasPrice) { return 0; } - return (gwei * 0.00000255).toFixed(2); -} - -// This value can be retrieved dynamically; 1 gas = 30 gwei -export function getGasPrice(): number { - return 30; -} -// price per gwei -export function gasToDollar(gwei: number): number { - return gwei * 0.005899; + const gasPrice = parseFloat(effectiveGasPrice); + return gasUsed * gasPrice; } export function calculateCarbonFootPrintFabric( diff --git a/packages/cactus-plugin-cc-tx-visualization/src/main/typescript/models/cross-chain-event.ts b/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/models/cross-chain-event.ts similarity index 96% rename from packages/cactus-plugin-cc-tx-visualization/src/main/typescript/models/cross-chain-event.ts rename to packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/models/cross-chain-event.ts index c9ee7b19e6..be13220159 100644 --- a/packages/cactus-plugin-cc-tx-visualization/src/main/typescript/models/cross-chain-event.ts +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/models/cross-chain-event.ts @@ -1,7 +1,7 @@ export type CrossChainEvent = { caseID: string; receiptID: string; - timestamp: Date; + timestamp: string; blockchainID: string; invocationType: string; methodName: string; @@ -10,7 +10,6 @@ export type CrossChainEvent = { cost?: number | string; carbonFootprint?: number | string; latency?: number; - revenue?: number; }; export interface ICrossChainEventLog { @@ -67,7 +66,6 @@ export class CrossChainEventLog { "cost", "carbonFootprint", "latency", - "revenue", ]; } } diff --git a/packages/cactus-plugin-cc-tx-visualization/src/main/typescript/models/crosschain-model.ts b/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/models/crosschain-model.ts similarity index 87% rename from packages/cactus-plugin-cc-tx-visualization/src/main/typescript/models/crosschain-model.ts rename to packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/models/crosschain-model.ts index 5241771d0e..38f89e7bd0 100644 --- a/packages/cactus-plugin-cc-tx-visualization/src/main/typescript/models/crosschain-model.ts +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/models/crosschain-model.ts @@ -17,10 +17,19 @@ export class CrossChainModel { >(); this.lastAggregationDate = new Date(); } + get lastAggregation(): Date { return this.lastAggregationDate; } + get ccModelType(): CrossChainModelType | undefined { + return this.modelType; + } + + public setType(modelType: CrossChainModelType): void { + this.modelType = modelType; + } + public setLastAggregationDate(date: Date): void { this.lastAggregationDate = date; } @@ -56,19 +65,17 @@ export class CrossChainModel { } export enum CrossChainModelType { - HeuristicMiner, + PetriNet, ProcessTree, - DirectFollowGraph, } export type CrossChainTransactionSchema = { ccTxID: string; - // the receipt ids of each cross chain event + // the IDs of all cross chain events of the cross chain transaction processedCrossChainEvents: string[]; latency: number; carbonFootprint: number | undefined; cost: number | undefined; throughput: number; latestUpdate: Date; - revenue: number; }; diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/models/transaction-receipt.ts b/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/models/transaction-receipt.ts new file mode 100644 index 0000000000..96475d1169 --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/models/transaction-receipt.ts @@ -0,0 +1,33 @@ +import { LedgerType } from "@hyperledger/cactus-core-api"; +import { FabricSigningCredential } from "@hyperledger/cactus-plugin-ledger-connector-fabric"; + +export interface TransactionReceipt { + caseID: string; + blockchainID: LedgerType; + invocationType: string; + methodName: string; + parameters: string[]; + timestamp: Date; +} + +export interface FabricV2TxReceipt extends TransactionReceipt { + channelName: string; + transactionID: string; + contractName: string; + signingCredentials: FabricSigningCredential; + cost?: number; +} + +export interface BesuV2TxReceipt extends TransactionReceipt { + transactionID: string; + gasUsed: number; + from: string; + gasPrice?: number; +} + +export interface EthereumTxReceipt extends TransactionReceipt { + transactionID: string; + gasUsed: number | string; + from: string; + effectiveGasPrice?: string; +} diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/models/utils.ts b/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/models/utils.ts new file mode 100644 index 0000000000..df20eae7a1 --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/models/utils.ts @@ -0,0 +1,7 @@ +export function toSeconds(date: number): number { + return Math.floor(date / 1000); +} + +export function millisecondsLatency(date: Date): number { + return new Date().getTime() - date.getTime(); +} diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/plugin-ccmodel-hephaestus.ts b/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/plugin-ccmodel-hephaestus.ts new file mode 100644 index 0000000000..71f1f57ffe --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/plugin-ccmodel-hephaestus.ts @@ -0,0 +1,973 @@ +import { Server } from "http"; +import { Server as SecureServer } from "https"; +import { Optional } from "typescript-optional"; +import { promisify } from "util"; +import { + IPluginWebService, + IWebServiceEndpoint, + ICactusPlugin, + ICactusPluginOptions, + LedgerType, +} from "@hyperledger/cactus-core-api"; + +import { RuntimeError } from "run-time-error-cjs"; + +import fs from "fs"; +import path from "path"; + +import { PluginRegistry } from "@hyperledger/cactus-core"; +import { Express } from "express"; + +import { + Checks, + Logger, + LoggerProvider, + LogLevelDesc, +} from "@hyperledger/cactus-common"; +import { + calculateGasPriceEth, + CarbonFootPrintConstants, +} from "./models/carbon-footprint"; +import { + CrossChainEvent, + CrossChainEventLog, +} from "./models/cross-chain-event"; +import { + createModelPM4PY, + checkConformancePM4PY, + convertToProcessTreePM4PY, +} from "./pm4py-adapter/ccmodel-adapter"; + +export interface IWebAppOptions { + port: number; + hostname: string; +} +import { + CrossChainModel, + CrossChainModelType, + CrossChainTransactionSchema, +} from "./models/crosschain-model"; +import { + BesuV2TxReceipt, + EthereumTxReceipt, + FabricV2TxReceipt, +} from "./models/transaction-receipt"; +import { millisecondsLatency } from "./models/utils"; +import { RunTransactionV1Exchange as RunTransactionV1ExchangeBesu } from "@hyperledger/cactus-plugin-ledger-connector-besu"; +import { RunTransactionV1Exchange as RunTransactionV1ExchangeEth } from "@hyperledger/cactus-plugin-ledger-connector-ethereum"; +import { RunTxReqWithTxId } from "@hyperledger/cactus-plugin-ledger-connector-fabric"; + +import { Observable } from "rxjs"; +import { filter, tap } from "rxjs/operators"; + +export interface IPluginCcModelHephaestusOptions extends ICactusPluginOptions { + connectorRegistry?: PluginRegistry; + logLevel?: LogLevelDesc; + webAppOptions?: IWebAppOptions; + instanceId: string; + ethTxObservable?: Observable; + besuTxObservable?: Observable; + fabricTxObservable?: Observable; +} + +export class CcModelHephaestus implements ICactusPlugin, IPluginWebService { + private readonly log: Logger; + private readonly instanceId: string; + private endpoints: IWebServiceEndpoint[] | undefined; + private httpServer: Server | SecureServer | null = null; + private crossChainLog: CrossChainEventLog; + private uncheckedEventLog: CrossChainEventLog; + private nonConformanceCrossChainLog: CrossChainEventLog; + private crossChainModel: CrossChainModel; + public readonly className = "plugin-ccmodel-hephaestus"; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + private txReceipts: any[]; + private caseID: string; + private ethTxObservable?: Observable; + private besuTxObservable?: Observable; + private fabricTxObservable?: Observable; + private startMonitoring: number | null = null; + private periodicUpdate: boolean; + private isModeling: boolean; + + constructor(public readonly options: IPluginCcModelHephaestusOptions) { + const startTime = new Date(); + const fnTag = `PluginCcModelHephaestus#constructor()`; + if (!options) { + throw new Error(`${fnTag} options falsy.`); + } + Checks.truthy(options.instanceId, `${fnTag} options.instanceId`); + const level = this.options.logLevel || "INFO"; + const label = this.className; + this.log = LoggerProvider.getOrCreate({ + label: label, + level: level, + }); + this.instanceId = this.options.instanceId; + this.crossChainLog = new CrossChainEventLog({ + name: "HEPHAESTUS_EVENT_LOGS", + }); + this.uncheckedEventLog = new CrossChainEventLog({ + name: "HEPHAESTUS_CONFORMANCE_LOGS", + }); + this.nonConformanceCrossChainLog = new CrossChainEventLog({ + name: "HEPHAESTUS_NON_CONFORMANCE_LOGS", + }); + //todo should allow different models to be instantiated + this.crossChainModel = new CrossChainModel(); + this.txReceipts = []; + + this.caseID = "UNDEFINED_CASE_ID"; + + this.ethTxObservable = options.ethTxObservable; + this.besuTxObservable = options.besuTxObservable; + this.fabricTxObservable = options.fabricTxObservable; + + this.periodicUpdate = false; + this.isModeling = true; + + const finalTime = new Date(); + this.log.debug( + `EVAL-${this.className}-SETUP-CONSTRUCTOR:${finalTime.getTime() - startTime.getTime()}`, + ); + } + + getOpenApiSpec(): unknown { + throw new Error("Method not implemented."); + } + + get ccModel(): CrossChainModel { + return this.crossChainModel; + } + + get numberEventsLog(): number { + return this.crossChainLog.numberEvents(); + } + + get numberEventsUncheckedLog(): number { + return this.uncheckedEventLog.numberEvents(); + } + + get numberEventsNonConformanceLog(): number { + return this.nonConformanceCrossChainLog.numberEvents(); + } + + get numberUnprocessedReceipts(): number { + return this.txReceipts.length; + } + + public purgeCrossChainEvents(): void { + this.crossChainLog.purgeLogs(); + } + + public getInstanceId(): string { + return this.instanceId; + } + + public getCaseId(): string { + return this.caseID; + } + + public setIsModeling(bool: boolean): void { + this.isModeling = bool; + } + + public setCaseId(id: string): void { + this.caseID = id; + } + + public async onPluginInit(): Promise { + return; + } + + public async shutdown(): Promise { + this.log.info(`Shutting down...`); + const serverMaybe = this.getHttpServer(); + if (serverMaybe.isPresent()) { + this.log.info(`Awaiting server.close() ...`); + const server = serverMaybe.get(); + await promisify(server.close.bind(server))(); + this.log.info(`server.close() OK`); + } else { + this.log.info(`No HTTP server found, skipping...`); + } + } + + async registerWebServices(app: Express): Promise { + const webServices = await this.getOrCreateWebServices(); + await Promise.all(webServices.map((ws) => ws.registerExpress(app))); + return webServices; + } + + public async getOrCreateWebServices(): Promise { + if (Array.isArray(this.endpoints)) { + return this.endpoints; + } + + const { log } = this; + + log.info(`Installing web services for plugin ${this.getPackageName()}...`); + + const endpoints: IWebServiceEndpoint[] = []; + + // TODO implement endpoints + + const pkg = this.getPackageName(); + log.info(`Installed web services for plugin ${pkg} OK`, { endpoints }); + + return endpoints; + } + + public getHttpServer(): Optional { + return Optional.ofNullable(this.httpServer); + } + + public getPackageName(): string { + return `@hyperledger/cactus-plugin-ccmodel-hephaestus`; + } + + public createReceiptFromRunTransactionV1ExchangeEth( + data: RunTransactionV1ExchangeEth, + caseId: string, + ): EthereumTxReceipt { + return { + caseID: caseId, + blockchainID: LedgerType.Ethereum, + timestamp: data.timestamp, + transactionID: data.response.transactionReceipt.transactionHash, + from: data.response.transactionReceipt.from, + invocationType: data.request.invocationType, + methodName: data.request.methodName, + parameters: data.request.params, + gasUsed: data.response.transactionReceipt.gasUsed, + effectiveGasPrice: data.response.transactionReceipt.effectiveGasPrice, + }; + } + + public pollTxReceiptsEth(data: RunTransactionV1ExchangeEth): void { + const fnTag = `${this.className}#pollTxReceiptsEth()`; + this.log.debug(fnTag); + + const ethReceipt = this.createReceiptFromRunTransactionV1ExchangeEth( + data, + this.caseID, + ); + this.txReceipts.push(ethReceipt); + return; + } + + public createReceiptFromRunTransactionV1ExchangeBesu( + data: RunTransactionV1ExchangeBesu, + caseId: string, + ): BesuV2TxReceipt { + return { + caseID: caseId, + blockchainID: LedgerType.Besu2X, + timestamp: data.timestamp, + transactionID: data.response.transactionReceipt.transactionHash, + from: data.response.transactionReceipt.from, + invocationType: data.request.invocationType, + methodName: data.request.methodName, + parameters: data.request.params, + gasUsed: data.response.transactionReceipt.gasUsed, + gasPrice: data.request.gasPrice as number, + }; + } + + public pollTxReceiptsBesu(data: RunTransactionV1ExchangeBesu): void { + const fnTag = `${this.className}#pollTxReceiptsBesu()`; + this.log.debug(fnTag); + + const besuReceipt = this.createReceiptFromRunTransactionV1ExchangeBesu( + data, + this.caseID, + ); + this.txReceipts.push(besuReceipt); + return; + } + + public createReceiptFromRunTxReqWithTxId( + data: RunTxReqWithTxId, + caseId: string, + ): FabricV2TxReceipt { + return { + caseID: caseId, + blockchainID: LedgerType.Fabric2, + timestamp: data.timestamp, + channelName: data.request.channelName, + transactionID: data.transactionId, + contractName: data.request.contractName, + signingCredentials: data.request.signingCredential, + invocationType: data.request.invocationType, + methodName: data.request.methodName, + parameters: data.request.params, + }; + } + + public pollTxReceiptsFabric(data: RunTxReqWithTxId): void { + const fnTag = `${this.className}#pollTxReceiptsFabric()`; + this.log.debug(fnTag); + + const fabricReceipt = this.createReceiptFromRunTxReqWithTxId( + data, + this.caseID, + ); + this.txReceipts.push(fabricReceipt); + return; + } + + public watchRunTransactionV1ExchangeEth(duration: number = 0): void { + const fnTag = `${this.className}#watchRunTransactionV1ExchangeEth()`; + this.log.debug(fnTag); + + if (!this.ethTxObservable) { + this.log.debug( + `${fnTag}-No Ethereum transaction observable provided, monitoring skipped`, + ); + return; + } + if (duration < 0) { + this.log.debug( + `${fnTag}-Negative duration provided (${duration}), monitoring all transactions`, + ); + } + !this.startMonitoring || (this.startMonitoring = Date.now()); + + this.ethTxObservable + .pipe( + // Filter only the values emitted within the specified duration + // if no duration provided, skip filtering + duration > 0 + ? filter( + (data) => + this.startMonitoring! - data.timestamp.getTime() <= duration, + ) + : tap(), + ) + .subscribe({ + next: (data: RunTransactionV1ExchangeEth) => { + // Handle the data whenever a new value is received by the observer + this.pollTxReceiptsEth(data); + }, + error: (error: unknown) => { + this.log.error( + `${fnTag}- error`, + error, + `receiving RunTransactionV1ExchangeEth by Ethereum transaction observable`, + this.ethTxObservable, + ); + throw error; + }, + }); + } + + public watchRunTransactionV1ExchangeBesu(duration: number = 0): void { + const fnTag = `${this.className}#watchRunTransactionV1ExchangeBesu()`; + this.log.debug(fnTag); + + if (!this.besuTxObservable) { + this.log.debug( + `${fnTag}-No Besu transaction observable provided, monitoring skipped`, + ); + return; + } + if (duration < 0) { + this.log.debug( + `${fnTag}-Negative duration provided (${duration}), monitoring all transactions`, + ); + } + + !this.startMonitoring || (this.startMonitoring = Date.now()); + + this.besuTxObservable + .pipe( + // Filter only the values emitted within the specified duration + // if no duration provided, skip filtering + duration > 0 + ? filter( + (data) => + this.startMonitoring! - data.timestamp.getTime() <= duration, + ) + : tap(), + ) + .subscribe({ + next: (data: RunTransactionV1ExchangeBesu) => { + // Handle the data whenever a new value is received by the observer + this.pollTxReceiptsBesu(data); + }, + error: (error: unknown) => { + this.log.error( + `${fnTag}- error`, + error, + `receiving RunTransactionV1ExchangeBesu by Besu transaction observable`, + this.besuTxObservable, + ); + throw error; + }, + }); + } + + public watchRunTxReqWithTxId(duration: number = 0): void { + const fnTag = `${this.className}#watchRunTxReqWithTxId()`; + this.log.debug(fnTag); + + if (!this.fabricTxObservable) { + this.log.debug( + `${fnTag}-No Fabric transaction observable provided, monitoring skipped`, + ); + return; + } + if (duration < 0) { + this.log.debug( + `${fnTag}-Negative duration provided (${duration}), monitoring all transactions`, + ); + } + !this.startMonitoring || (this.startMonitoring = Date.now()); + + this.fabricTxObservable + .pipe( + // Filter only the values emitted within the specified duration + // if no duration provided, skip filtering + duration > 0 + ? filter( + (data) => + this.startMonitoring! - data.timestamp.getTime() <= duration, + ) + : tap(), + ) + .subscribe({ + next: (data: RunTxReqWithTxId) => { + // Handle the data whenever a new value is received by the observer + this.pollTxReceiptsFabric(data); + }, + error: (error: unknown) => { + this.log.error( + `${fnTag}- error`, + error, + `receiving RunTxReqWithTxId by Fabric transaction observable`, + this.fabricTxObservable, + ); + throw error; + }, + }); + } + + public monitorTransactions(duration: number = 0): void { + const fnTag = `${this.className}#monitorTransactions()`; + this.log.debug(fnTag); + + this.startMonitoring = Date.now(); + this.watchRunTxReqWithTxId(duration); + this.watchRunTransactionV1ExchangeBesu(duration); + this.watchRunTransactionV1ExchangeEth(duration); + return; + } + + private createCrossChainEventFromEthReceipt( + ethReceipt: EthereumTxReceipt, + updatingCCModel: boolean, + ): void { + const ccEventFromEth: CrossChainEvent = { + caseID: ethReceipt.caseID, + receiptID: ethReceipt.transactionID, + blockchainID: ethReceipt.blockchainID, + invocationType: ethReceipt.invocationType, + methodName: ethReceipt.methodName, + parameters: ethReceipt.parameters, + timestamp: ethReceipt.timestamp.toISOString(), + identity: ethReceipt.from, + cost: calculateGasPriceEth( + ethReceipt.gasUsed as number, + ethReceipt.effectiveGasPrice, + ), + carbonFootprint: CarbonFootPrintConstants(ethReceipt.blockchainID), + latency: millisecondsLatency(ethReceipt.timestamp), + }; + + if (this.isModeling == false && updatingCCModel == false) { + this.uncheckedEventLog.addCrossChainEvent(ccEventFromEth); + + this.log.info( + "Added Cross Chain event from ETHEREUM for conformance checking", + ); + this.log.debug( + `Conformance Cross-chain log: ${JSON.stringify(ccEventFromEth)}`, + ); + } else { + this.crossChainLog.addCrossChainEvent(ccEventFromEth); + this.log.info("Added Cross Chain event from ETHEREUM"); + this.log.debug(`Cross-chain log: ${JSON.stringify(ccEventFromEth)}`); + } + } + + private createCrossChainEventFromBesuReceipt( + besuReceipt: BesuV2TxReceipt, + updatingCCModel: boolean, + ): void { + const ccEventFromBesu: CrossChainEvent = { + caseID: besuReceipt.caseID, + receiptID: besuReceipt.transactionID, + blockchainID: besuReceipt.blockchainID, + invocationType: besuReceipt.invocationType, + methodName: besuReceipt.methodName, + parameters: besuReceipt.parameters, + timestamp: besuReceipt.timestamp.toISOString(), + identity: besuReceipt.from, + cost: besuReceipt.gasUsed, + carbonFootprint: CarbonFootPrintConstants(besuReceipt.blockchainID), + latency: millisecondsLatency(besuReceipt.timestamp), + }; + + if (this.isModeling == false && updatingCCModel == false) { + this.uncheckedEventLog.addCrossChainEvent(ccEventFromBesu); + + this.log.info( + "Added Cross Chain event from BESU for conformance checking", + ); + this.log.debug( + `Conformance Cross-chain log: ${JSON.stringify(ccEventFromBesu)}`, + ); + } else { + this.crossChainLog.addCrossChainEvent(ccEventFromBesu); + this.log.info("Added Cross Chain event from BESU"); + this.log.debug(`Cross-chain log: ${JSON.stringify(ccEventFromBesu)}`); + } + } + + private createCrossChainEventFromFabricReceipt( + fabricReceipt: FabricV2TxReceipt, + updatingCCModel: boolean, + ): void { + const ccEventFromFabric: CrossChainEvent = { + caseID: fabricReceipt.caseID, + receiptID: fabricReceipt.transactionID, + blockchainID: fabricReceipt.blockchainID, + invocationType: fabricReceipt.invocationType, + methodName: fabricReceipt.methodName, + parameters: fabricReceipt.parameters, + timestamp: fabricReceipt.timestamp.toISOString(), + identity: fabricReceipt.signingCredentials.keychainRef, + cost: fabricReceipt.cost || 0, + carbonFootprint: CarbonFootPrintConstants(fabricReceipt.blockchainID), + latency: millisecondsLatency(fabricReceipt.timestamp), + }; + + if (this.isModeling == false && updatingCCModel == false) { + this.uncheckedEventLog.addCrossChainEvent(ccEventFromFabric); + + this.log.info( + "Added Cross Chain event from FABRIC for conformance checking", + ); + this.log.debug( + `Conformance Cross-chain log: ${JSON.stringify(ccEventFromFabric)}`, + ); + } else { + this.crossChainLog.addCrossChainEvent(ccEventFromFabric); + this.log.info("Added Cross Chain event from FABRIC"); + this.log.debug(`Cross-chain log: ${JSON.stringify(ccEventFromFabric)}`); + } + } + + private async createCrossChainEventFromReceipt( + receipt: BesuV2TxReceipt | EthereumTxReceipt | FabricV2TxReceipt, + updatingCCModel: boolean, + ): Promise { + switch (receipt.blockchainID) { + // Process Besu transaction receipt + case LedgerType.Besu2X: + this.createCrossChainEventFromBesuReceipt( + receipt as BesuV2TxReceipt, + updatingCCModel, + ); + break; + // Process Ethereum transaction receipt + case LedgerType.Ethereum: + this.createCrossChainEventFromEthReceipt( + receipt as EthereumTxReceipt, + updatingCCModel, + ); + break; + // Process Fabric transaction receipt + case LedgerType.Fabric2: + this.createCrossChainEventFromFabricReceipt( + receipt as FabricV2TxReceipt, + updatingCCModel, + ); + break; + default: + this.log.warn( + `Tx Receipt with case ID ${receipt.caseID} is not supported`, + ); + break; + } + } + + public async txReceiptToCrossChainEventLogEntry( + updatingCCModel: boolean = false, + ): Promise { + const startTime = new Date(); + const fnTag = `${this.className}#txReceiptToCrossChainEventLogEntry()`; + this.log.debug(fnTag); + // We are processing receipts to update the CrossChainLog. + // At the end of the processing, we need to clear the transaction receipts that have been processed + // Therefore, we need a listen method that hephaestus is always running, doing polls every X seconds, followed by receipt processing (this method) + try { + this.txReceipts.forEach((receipt) => { + this.createCrossChainEventFromReceipt(receipt, updatingCCModel); + }); + // Clear receipt array + this.txReceipts = []; + const finalTime = new Date(); + this.log.debug( + `EVAL-${this.className}-RECEIPT2EVENT:${finalTime.getTime() - startTime.getTime()}`, + ); + return; + } catch (error) { + const details = this.txReceipts.map((receipt) => { + return { + caseID: receipt.caseID, + receiptID: receipt.receiptID, + blockchainID: receipt.blockchainID, + timestamp: receipt.timestamp, + invocationType: receipt.invocationType, + methodName: receipt.methodName, + parameters: receipt.parameters, + }; + }); + this.log.error( + `${fnTag} Failed to create cross chain events from transaction receipts:`, + error, + `Receipts' details:`, + JSON.stringify(details), + ); + throw error; + } + } + + // Parses the cross chain event log to updates the cross chain model + // This is part of the cc model; have a set that maps case id to data structure; this data structure are the consolidated metrics for a cctx, stores each txid + // run over cc log; if case id is unique create new entry, otherwise add tx to cctx, update metrics, update last update; this is an updatable model + public async aggregateCcTx(): Promise { + const startTime = new Date(); + const lastAggregated = this.crossChainModel.lastAggregation; + const newAggregationDate = new Date(); + const ccTxSet = this.crossChainModel.getCCTxs(); + const logEntries = this.crossChainLog.logEntries; + // If entries are more recent than aggregation + let metrics: CrossChainTransactionSchema = { + ccTxID: "", + processedCrossChainEvents: [], + latency: 0, + carbonFootprint: 0, + cost: 0, + throughput: 0, + latestUpdate: newAggregationDate, + }; + const lastAggregatedTime = new Date(lastAggregated).getTime(); + const logsToAggregate = logEntries.filter( + (log) => new Date(log.timestamp).getTime() > lastAggregatedTime, + ); + if (logsToAggregate.length === 0) { + const finalTime = new Date(); + + this.log.debug( + `EVAL-${this.className}-AGGREGATE-CCTX-NO_NEW_LOGS:${finalTime.getTime() - startTime.getTime()}`, + ); + return; + } + logsToAggregate.forEach((eventEntry) => { + const key = eventEntry.caseID; + const eventID = eventEntry.receiptID; + let latency = eventEntry.latency as number; + let carbonFootprint = eventEntry.carbonFootprint as number; + let cost = eventEntry.cost as number; + + if (!latency) { + latency = 0; + } + if (!carbonFootprint) { + carbonFootprint = 0; + } + if (!cost) { + cost = 0; + } + if (ccTxSet?.has(key)) { + const existingCCTx = ccTxSet.get(key); + const previousEvents = existingCCTx?.processedCrossChainEvents || []; + const numberOfCurrentEvents = previousEvents.length + 1; + const previousLatency = existingCCTx?.latency || 0; + const previousCarbonFootprint = existingCCTx?.carbonFootprint || 0; + const previousCost = existingCCTx?.cost || 0; + const currentCost = (cost + previousCost) / numberOfCurrentEvents; + + const updatedMetrics = { + ccTxID: key, + processedCrossChainEvents: [...previousEvents, eventID], + latency: (latency + previousLatency) / numberOfCurrentEvents, + carbonFootprint: + (carbonFootprint + previousCarbonFootprint) / numberOfCurrentEvents, + cost: currentCost, + throughput: Number( + latency != 0 + ? (( + 1 / + ((latency + previousLatency) / numberOfCurrentEvents) + ).toFixed(3) as unknown as number) + : 0, + ), + latestUpdate: lastAggregated, + }; + this.crossChainModel.setCCTxs(key, updatedMetrics); + } else { + metrics = { + ccTxID: key, + processedCrossChainEvents: [eventID], + latency: latency, + carbonFootprint: carbonFootprint, + cost: cost, + throughput: Number( + (latency != 0 ? 1 / latency : 0).toFixed(3) as unknown as number, + ), + latestUpdate: lastAggregated, + }; + this.crossChainModel.setCCTxs(key, metrics); + } + }); + this.crossChainModel.setLastAggregationDate(newAggregationDate); + const finalTime = new Date(); + this.log.debug( + `${this.className}-AGGREGATE-CCTX-SUCCESS:${finalTime.getTime() - startTime.getTime()}`, + ); + return; + } + + public async persistCrossChainLogCsv(name?: string): Promise { + const startTime = new Date(); + const columns = + this.crossChainLog.getCrossChainLogAttributes() as (keyof CrossChainEvent)[]; + const logName = name + ? `${name}.csv` + : `hephaestus_log_${startTime.getTime()}.csv`; + const csvFolder = path.join(__dirname, "../", "../", "test", "csv"); + const logPath = path.join(csvFolder, logName); + const fnTag = `${this.className}#persistCrossChainLogCsv()`; + const ccEvents = this.crossChainLog.logEntries; + + try { + // Convert log entries to CSV rows + const csvRows = ccEvents.map((entry) => { + return columns + .map((header) => { + const value = entry[header]; + return typeof value === "string" && value.includes(";") + ? `"${value}"` + : value; + }) + .join(";"); + }); + + // Concatenate columns and rows into a single CSV string + const data = [columns.join(";"), ...csvRows].join("\n"); + this.log.debug(data); + + // Create directory if it doesn't exist + if (!fs.existsSync(csvFolder)) { + fs.mkdirSync(csvFolder); + } + fs.writeFileSync(logPath, data); + + const finalTime = new Date(); + this.log.debug( + `EVAL-${this.className}-PERSIST-LOG-CVS:${finalTime.getTime() - startTime.getTime()}`, + ); + return logName; + } catch (error) { + const errorMessage = `${fnTag} Failed to export cross-chain event log to CSV file:`; + throw new RuntimeError(errorMessage, error); + } + } + + public async persistCrossChainLogJson(name?: string): Promise { + const startTime = new Date(); + const logName = name + ? `${name}.json` + : `hephaestus_log_${startTime.getTime()}.json`; + const jsonFolder = path.join(__dirname, "../", "../", "test", "json"); + const logPath = path.join(jsonFolder, logName); + const fnTag = `${this.className}#persistCrossChainLogJson()`; + + const ccEvents = this.crossChainLog.logEntries; + + try { + const data = JSON.stringify(ccEvents, null, 2); + this.log.debug(data); + + // Create directory if it doesn't exist + if (!fs.existsSync(jsonFolder)) { + fs.mkdirSync(jsonFolder); + } + fs.writeFileSync(logPath, data); + + const finalTime = new Date(); + this.log.debug( + `EVAL-${this.className}-PERSIST-LOG-JSON:${finalTime.getTime() - startTime.getTime()}`, + ); + + return logName; + } catch (error) { + const errorMessage = `${fnTag} Failed to export cross-chain event log to JSON file:`; + throw new RuntimeError(errorMessage, error); + } + } + + private async persistUncheckedEventLog(): Promise { + const startTime = new Date(); + const logName = `hephaestus_log_${startTime.getTime()}`; + const jsonFolder = path.join(__dirname, "../", "../", "test", "json"); + const logPath = path.join(jsonFolder, logName + ".json"); + const fnTag = `${this.className}#persistUncheckedEventLog()`; + + const ccEvents = this.uncheckedEventLog.logEntries; + + try { + const data = JSON.stringify(ccEvents, null, 2); + this.log.debug(data); + + // Create directory if it doesn't exist + if (!fs.existsSync(jsonFolder)) { + fs.mkdirSync(jsonFolder); + } + fs.writeFileSync(logPath, data); + + const finalTime = new Date(); + this.log.debug( + `EVAL-${this.className}-PERSIST-LOG-JSON:${finalTime.getTime() - startTime.getTime()}`, + ); + + return logName; + } catch (error) { + const errorMessage = `${fnTag} Failed to export cross-chain event log to JSON file:`; + throw new RuntimeError(errorMessage, error); + } + } + + public async stopPeriodicCCModelUpdate(fileName: string = ""): Promise { + const fnTag = `${this.className}#stopPeriodicCCModelUpdate()`; + this.log.debug(fnTag); + await this.txReceiptToCrossChainEventLogEntry(true); + await this.createModel(fileName); + this.periodicUpdate = false; + } + + public async periodicCCModelUpdate( + fileName: string = "", + timeInterval: number, + ): Promise { + const fnTag = `${this.className}#periodicCCModelUpdate()`; + this.log.debug(fnTag); + + timeInterval = timeInterval < 5000 ? 5000 : timeInterval; + + this.periodicUpdate = true; + const intervalId = setInterval(async () => { + if (this.periodicUpdate == true) { + await this.txReceiptToCrossChainEventLogEntry(true); + if (fileName != "") { + await this.persistCrossChainLogCsv(fileName); + await this.persistCrossChainLogJson(fileName); + } + await this.checkConformanceAndUpdateModel(fileName); + } else { + clearInterval(intervalId); + } + }, timeInterval); + } + + public async checkConformanceAndUpdateModel(fileName: string): Promise { + const model = this.getModel(CrossChainModelType.PetriNet); + if (!model) { + return; + } + const conformanceDetails = await this.checkConformance(model); + this.filterCrossChainLogsByConformance(conformanceDetails); + const modelPM4PY = await this.createModel(fileName); + if (modelPM4PY) { + this.ccModel.setType(CrossChainModelType.PetriNet); + this.saveModel(CrossChainModelType.PetriNet, modelPM4PY); + } + } + + // Receives a serialized model and saves it + public saveModel(modelType: CrossChainModelType, model: string): void { + this.crossChainModel.saveModel(modelType, model); + } + + // Gets the saved serialized model with the specified CrossChainModelType + public getModel(modelType: CrossChainModelType): string | undefined { + return this.crossChainModel.getModel(modelType); + } + + public async createModel(fileName: string = ""): Promise { + if (fileName == "") { + fileName = await this.persistCrossChainLogCsv(); + fileName = fileName.split(".")[0]; + } + await this.aggregateCcTx(); + const petriNet = createModelPM4PY(fileName); + this.ccModel.setType(CrossChainModelType.PetriNet); + this.saveModel(CrossChainModelType.PetriNet, petriNet); + return petriNet; + } + + // creates a file with unmodeled logs and performs a conformance check + public async checkConformance(serializedCCModel: string): Promise { + const fileName = await this.persistUncheckedEventLog(); + const conformanceDetails = checkConformancePM4PY( + fileName, + serializedCCModel, + ); + this.filterCrossChainLogsByConformance(conformanceDetails); + return conformanceDetails; + } + + private filterCrossChainLogsByConformance( + conformanceDetails: string | undefined, + ): void { + const fnTag = `${this.className}#filterCrossChainLogsByConformance()`; + if (!conformanceDetails) { + throw new Error(`${fnTag} conformance details falsy.`); + } + + const entries = this.uncheckedEventLog.logEntries; + const details = conformanceDetails.split("\n"); + + const misbehaviour = details[2]; + + if (misbehaviour === "[]") { + // if it conforms, add to ccmodel + entries.forEach((entry) => { + this.crossChainLog.addCrossChainEvent(entry); + }); + } else { + // else keep it in a different log of non-conformance + entries.forEach((entry) => { + this.nonConformanceCrossChainLog.addCrossChainEvent(entry); + }); + } + // clean uncheckedEventLog + this.uncheckedEventLog.purgeLogs(); + } + + public convertModelToProcessTree(): string | undefined { + const petriNet = this.ccModel.getModel(CrossChainModelType.PetriNet); + if (!petriNet) { + return; + } + const tree = convertToProcessTreePM4PY(petriNet); + if (!tree) { + return; + } + this.saveModel(CrossChainModelType.ProcessTree, tree); + return tree; + } +} diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/plugin-factory-ccmodel-hephaestus.ts b/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/plugin-factory-ccmodel-hephaestus.ts new file mode 100644 index 0000000000..37676d287b --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/plugin-factory-ccmodel-hephaestus.ts @@ -0,0 +1,20 @@ +import { + IPluginFactoryOptions, + PluginFactory, +} from "@hyperledger/cactus-core-api"; +import { + IPluginCcModelHephaestusOptions, + CcModelHephaestus, +} from "./plugin-ccmodel-hephaestus"; + +export class PluginFactoryWebService extends PluginFactory< + CcModelHephaestus, + IPluginCcModelHephaestusOptions, + IPluginFactoryOptions +> { + async create( + pluginOptions: IPluginCcModelHephaestusOptions, + ): Promise { + return new CcModelHephaestus(pluginOptions); + } +} diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/pm4py-adapter/ccmodel-adapter.ts b/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/pm4py-adapter/ccmodel-adapter.ts new file mode 100644 index 0000000000..ee7f9c29d8 --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/pm4py-adapter/ccmodel-adapter.ts @@ -0,0 +1,97 @@ +import { execSync } from "child_process"; + +import path from "path"; + +export function createModelPM4PY(file_name: string): string { + const createModelScript = path.join(__dirname, "create_model.py"); + const command = `python3 ${createModelScript} ${file_name}`; + + try { + const startTime = new Date(); + const serializedCCModel = execSync(command).toString("utf-8"); + const finalTime = new Date(); + console.log( + `CREATE-MODEL-PM4PY:${finalTime.getTime() - startTime.getTime()}`, + ); + return serializedCCModel; + } catch (error) { + console.error(`Error executing ${command}:`, error); + throw error; + } +} + +export function checkConformancePM4PY( + file_name: string, + serializedCCModel: string, +): string { + const checkConformanceScript = path.join(__dirname, "check_conformance.py"); + const command = `python3 ${checkConformanceScript} ${file_name} \'${serializedCCModel}\'`; + + try { + const checkOutput = execSync(command).toString("utf-8"); + return checkOutput; + } catch (error) { + console.error(`Error executing ${command}:`, error); + throw error; + } +} + +export function convertToProcessTreePM4PY( + serializedCCModel: string, +): string | undefined { + const ConvertModelScript = path.join(__dirname, "convert_model.py"); + const command = `python3 ${ConvertModelScript} \'${serializedCCModel}\' ProcessTree`; + + try { + const output = execSync(command, { encoding: "utf-8" }); + return output; + } catch (error) { + console.error(`Error executing ${command}:`, error); + throw error; + } +} + +// // not needed? +// // this is just assigning the serialized process to hepheastus' ccmodel +// export function processModelToCCModelPM4PY( +// ccmodel: CrossChainModel, +// // processModel: string, +// ): CrossChainModel { +// // something like that +// // ccmodel.setModel(ccmodel.ccModelType, processModel); +// return ccmodel; +// } + +// // converts the ccmodel into process model for later conformance checking +// // if needed it's going to be different +// export function ccModelToProcessModelPM4PY( +// model: CrossChainModel, +// modelType: CrossChainModelType, +// ): string { +// let processModel: string | undefined; +// if (modelType == CrossChainModelType.PetriNet) { +// // call pm4py to make PetriNet +// processModel = model.getModel(CrossChainModelType.PetriNet); +// } else if (modelType == CrossChainModelType.ProcessTree) { +// // call pm4py to make ProcessTree +// processModel = model.getModel(CrossChainModelType.ProcessTree); +// } else { +// return "failed"; +// } + +// const processModelToCCModel = path.join( +// __dirname, +// "ccmodel_to_process_model.py", // serializes the ccmodel +// ); +// const command = `python3 ${processModelToCCModel} ${modelType} ${processModel}`; + +// try { +// const output = execSync(command, { encoding: "utf-8" }); +// console.log("Command output:", output); +// // return parseMP4PYOutput(output); +// return output; +// } catch (error) { +// console.error(`Error executing ${command}:`, error); +// throw error; +// } +// } diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/pm4py-adapter/check_conformance.py b/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/pm4py-adapter/check_conformance.py new file mode 100644 index 0000000000..19a3b58e5d --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/pm4py-adapter/check_conformance.py @@ -0,0 +1,188 @@ +import sys +import os +# uncomment if problems with dependencies +#%pip install pm4py +#%pip install pandas +import pm4py +import time +import pandas +import pickle +import json +from pm4py.objects.petri_net.obj import PetriNet, Marking +from pm4py.objects.petri_net.utils import petri_utils + +#chage path if necessary +path = os.getcwd() +parent = os.path.dirname(path) +csv_dir = path + "/packages/cactus-plugin-ccmodel-hephaestus/src/test/csv" +json_dir = path + "/packages/cactus-plugin-ccmodel-hephaestus/src/test/json" +pnml_file = path + "/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/pm4py-adapter/process_models/pnml/petri_output.pnml" + +################################################################## + +def import_csv_original(file_path): + event_log = pandas.read_csv(file_path, sep=';') + event_log = pm4py.format_dataframe(event_log, case_id='caseID', activity_key='methodName', timestamp_key='timestamp') + return event_log + +def import_json_original(file_path): + with open(file_path, 'r') as file: + data = json.load(file) + event_log = pandas.DataFrame(data) + event_log = pm4py.format_dataframe(event_log, case_id='caseID', activity_key='methodName', timestamp_key='timestamp') + return event_log + +################################################################## + +def unserialize_and_check_conformance_file(ccLog): + net, initial_marking, final_marking = pm4py.read_pnml(pnml_file) + # pm4py.view_petri_net(net, initial_marking, final_marking) + + # check conformance: + print("\n----diagnostics:") + diagnostics = pm4py.conformance_diagnostics_alignments(ccLog, net, initial_marking, final_marking) + print(diagnostics) + +################################################################## + +def divide_model(model): + split_model = model.split(';') + return split_model[0], split_model[1], split_model[2], split_model[3], split_model[4] + +def get_from_to_arc(arc): + if '->' in arc: + return arc.split('->') + else: + return None, None + +def get_place(places_set, name): + for place in places_set: + if place.name == name: + return place + return None + +def get_transition(transitions_set, name): + name = name[1:name.find(',')] + for transition in transitions_set: + if transition.name == name: + return transition + return None + +def unserialize_model(model): + (places_str, transitions_str, arcs_str, im_str, fm_str) = divide_model(model) + + net = PetriNet("unserialized__petri_net") + + #unserialize places: + places_str = places_str[1:-1].replace(" ", "") + places_str_list = places_str.split(',') # creates a list of stringed places + for place_str in places_str_list: + net.places.add(PetriNet.Place(place_str)) # creates place from each string + + #unserialize transitions: + transitions_str = transitions_str[1:-1].replace(" ", "").replace("(", "").replace(")", "") + transitions_str_list = transitions_str.split(',') # creates a list of strings + i = 0 + while i < len(transitions_str_list): + if transitions_str_list[i] == 'None': + net.transitions.add(PetriNet.Transition(None, transitions_str_list[i+1])) + elif transitions_str_list[i+1] == 'None': + net.transitions.add(PetriNet.Transition(transitions_str_list[i], None)) + else: + net.transitions.add(PetriNet.Transition(transitions_str_list[i], transitions_str_list[i+1])) + i += 2 + + #unserialize arcs: + arcs_str = arcs_str[1:-1].replace(" ", "") + text_parsed = arcs_str + arcs_list = [] + while True: + next_parentisis = text_parsed.find(')') + next_comma = text_parsed.find(',', next_parentisis, len(text_parsed)) + + if next_parentisis != -1 and next_comma != -1: + arcs_list.append(text_parsed[:next_comma]) + text_parsed = text_parsed[next_comma + 1:] + else: + break + arcs_list.append(text_parsed[:len(text_parsed)]) + + # creates arc from place names + for arc in arcs_list: + (source, target) = get_from_to_arc(arc) + + # source is a place, target is a transition + if get_place(net.places, source) != None: + place = get_place(net.places, source) + transition = get_transition(net.transitions, target) + petri_utils.add_arc_from_to(place, transition, net) + + # target is a place, source is a transition + elif get_place(net.places, target) != None: + transition = get_transition(net.transitions, source) + place = get_place(net.places, target) + petri_utils.add_arc_from_to(transition, place, net) + + # target and source are both a transition or a place - cannot happen + else: + print("arcs cannot have the same type in source and target") + exit(1) + + ### unserialize tokens + im_info = im_str.replace("[", "").replace("]", "").replace("\'", "").split(':') + fm_info = fm_str.replace("[", "").replace("]", "").replace("\'", "").split(':') + initial_marking = Marking() + im_place = get_place(net.places, im_info[0]) + fm_place = get_place(net.places, fm_info[0]) + initial_marking[im_place] = int(im_info[1]) + final_marking = Marking() + final_marking[fm_place] = int(fm_info[1]) + + return net, initial_marking, final_marking + +def unserialize_and_check_conformance(ccLog): + (net, initial_marking, final_marking) = unserialize_model(serialized_ccmodel) + # pm4py.view_petri_net(net, initial_marking, final_marking) + + # check conformance: + diagnostics = pm4py.conformance_diagnostics_alignments(ccLog, net, initial_marking, final_marking) + print(diagnostics) + + alignment = diagnostics[0]["alignment"] + non_modeled_activities = [] + skips = [] + for activity in alignment: + if activity[0] == ">>" and activity[1] != None: + skips.append(activity) + elif activity[0] != ">>" and activity[1] == ">>": + non_modeled_activities.append(activity) + print(skips) + print(non_modeled_activities) + +################################################################## + +def main(): + file_csv = file + ".csv" + file_json = file + ".json" + + file_path_csv = os.path.join(csv_dir, file_csv) + file_path_json = os.path.join(json_dir, file_json) + if (os.path.exists(file_path_csv)): + ccLog = import_csv_original(file_path_csv) + unserialize_and_check_conformance(ccLog) + elif (os.path.exists(file_path_json)): + ccLog = import_json_original(file_path_json) + unserialize_and_check_conformance(ccLog) + else: + print(f"File '{file}' does not exist") + print(file_path_json) + exit(1) + +if __name__ == "__main__": + # if len(sys.argv) != 3: + # print("Usage: python3 check_conformance_json.py file_with_new_logs serialized_ccmodel") + # exit(1) + + file = sys.argv[1] + serialized_ccmodel = sys.argv[2] + main() \ No newline at end of file diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/pm4py-adapter/convert_model.py b/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/pm4py-adapter/convert_model.py new file mode 100644 index 0000000000..bbf2360586 --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/pm4py-adapter/convert_model.py @@ -0,0 +1,123 @@ +import sys +# uncomment if problems with dependencies +#%pip install pm4py +import pm4py +from pm4py.objects.petri_net.obj import PetriNet, Marking +from pm4py.objects.petri_net.utils import petri_utils + +################################################################## + +def divide_model(model): + split_model = model.split(';') + return split_model[0], split_model[1], split_model[2], split_model[3], split_model[4] + +def get_from_to_arc(arc): + if '->' in arc: + return arc.split('->') + else: + return None, None + +def get_place(places_set, name): + for place in places_set: + if place.name == name: + return place + return None + +def get_transition(transitions_set, name): + name = name[1:name.find(',')] + for transition in transitions_set: + if transition.name == name: + return transition + return None + +def unserialize_model(model): + (places_str, transitions_str, arcs_str, im_str, fm_str) = divide_model(model) + + net = PetriNet("unserialized__petri_net") + + #unserialize places: + places_str = places_str[1:-1].replace(" ", "") + places_str_list = places_str.split(',') # creates a list of stringed places + for place_str in places_str_list: + net.places.add(PetriNet.Place(place_str)) # creates place from each string + + #unserialize transitions: + transitions_str = transitions_str[1:-1].replace(" ", "").replace("(", "").replace(")", "") + transitions_str_list = transitions_str.split(',') # creates a list of strings + i = 0 + while i < len(transitions_str_list): + if transitions_str_list[i] == 'None': + net.transitions.add(PetriNet.Transition(None, transitions_str_list[i+1])) + elif transitions_str_list[i+1] == 'None': + net.transitions.add(PetriNet.Transition(transitions_str_list[i], None)) + else: + net.transitions.add(PetriNet.Transition(transitions_str_list[i], transitions_str_list[i+1])) + i += 2 + + #unserialize arcs: + arcs_str = arcs_str[1:-1].replace(" ", "") + text_parsed = arcs_str + arcs_list = [] + while True: + next_parentisis = text_parsed.find(')') + next_comma = text_parsed.find(',', next_parentisis, len(text_parsed)) + + if next_parentisis != -1 and next_comma != -1: + arcs_list.append(text_parsed[:next_comma]) + text_parsed = text_parsed[next_comma + 1:] + else: + break + arcs_list.append(text_parsed[:len(text_parsed)]) + + # creates arc from place names + for arc in arcs_list: + (source, target) = get_from_to_arc(arc) + + # source is a place, target is a transition + if get_place(net.places, source) != None: + place = get_place(net.places, source) + transition = get_transition(net.transitions, target) + petri_utils.add_arc_from_to(place, transition, net) + + # target is a place, source is a transition + elif get_place(net.places, target) != None: + transition = get_transition(net.transitions, source) + place = get_place(net.places, target) + petri_utils.add_arc_from_to(transition, place, net) + + # target and source are both a transition or a place - cannot happen + else: + print("arcs cannot have the same type in source and target") + exit(1) + + ### unserialize tokens + im_info = im_str.replace("[", "").replace("]", "").replace("\'", "").split(':') + fm_info = fm_str.replace("[", "").replace("]", "").replace("\'", "").split(':') + initial_marking = Marking() + im_place = get_place(net.places, im_info[0]) + fm_place = get_place(net.places, fm_info[0]) + initial_marking[im_place] = int(im_info[1]) + final_marking = Marking() + final_marking[fm_place] = int(fm_info[1]) + + return net, initial_marking, final_marking + +################################################################## + +def main(): + (petri_net, initial_marking, final_marking) = unserialize_model(serialized_model) + if(convertion_type == "ProcessTree"): + process_tree = pm4py.convert_to_process_tree(petri_net, initial_marking, final_marking) + print(process_tree) + if(convertion_type == "BPMN"): + bpmn = pm4py.convert_to_bpmn(petri_net, initial_marking, final_marking) + print(bpmn) + +if __name__ == "__main__": + if len(sys.argv) != 3: + print("Usage: python3 convert_model_csv.py serialized_model type_to_convert_to") + exit(1) + + serialized_model = sys.argv[1] + convertion_type = sys.argv[2] + main() \ No newline at end of file diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/pm4py-adapter/create_model.py b/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/pm4py-adapter/create_model.py new file mode 100644 index 0000000000..d92751c9e9 --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/pm4py-adapter/create_model.py @@ -0,0 +1,84 @@ +import sys +import os +# uncomment if problems with dependencies +#%pip install pm4py +#%pip install pandas +import pm4py +import time +import pandas +import pickle +import json + +#chage path if necessary +path = os.getcwd() +parent = os.path.dirname(path) +csv_dir = path + "/packages/cactus-plugin-ccmodel-hephaestus/src/test/csv" +json_dir = path + "/packages/cactus-plugin-ccmodel-hephaestus/src/test/json" +pnml_file = path + "/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/pm4py-adapter/process_models/pnml/petri_output.pnml" + +def import_csv_original(file_path): + event_log = pandas.read_csv(file_path, sep=';') + event_log = pm4py.format_dataframe(event_log, case_id='caseID', activity_key='methodName', timestamp_key='timestamp') + return event_log + +def import_json_original(file_path): + with open(file_path, 'r') as file: + data = json.load(file) + event_log = pandas.DataFrame(data) + event_log = pm4py.format_dataframe(event_log, case_id='caseID', activity_key='methodName', timestamp_key='timestamp') + return event_log + +################################################################## +# unused + +def create_and_serialize_model_file(ccLog): + pn, im, fm = pm4py.discover_petri_net_inductive(ccLog) + pm4py.write_pnml(pn, im, fm, pnml_file) + +def create_and_serialize_model_pickle(ccLog): + pn, im, fm = pm4py.discover_petri_net_inductive(ccLog) + + pn_str = pickle.dumps(pn) + print(pn_str) + im_str = pickle.dumps(im) + print(im_str) + fm_str = pickle.dumps(fm) + print(fm_str) + + return pn_str + b"\n" + im_str + b"\n" + fm_str + b"\n" + +################################################################## + +def create_and_serialize_model(ccLog): + pn, im, fm = pm4py.discover_petri_net_inductive(ccLog) + # pm4py.view_petri_net(pn, im, fm) + return str(pn.places) + ";" + str(pn.transitions) + ";" + str(pn.arcs) + ";" + str(im) + ";" + str(fm) + +################################################################## + +def main(): + file_csv = file + ".csv" + file_json = file + ".json" + + file_path_csv = os.path.join(csv_dir, file_csv) + file_path_json = os.path.join(json_dir, file_json) + + if (os.path.exists(file_path_csv)): + ccLog = import_csv_original(file_path_csv) + serialized_model = create_and_serialize_model(ccLog) + print(serialized_model) + elif (os.path.exists(file_path_json)): + ccLog = import_json_original(file_path_json) + serialized_model = create_and_serialize_model(ccLog) + print(serialized_model) + else: + print(f"File '{file}' does not exist") + exit(1) + +if __name__ == "__main__": + if len(sys.argv) != 2: + print("Usage: python3 create_model_csv.py file_with_logs") + exit(1) + + file = sys.argv[1] + main() \ No newline at end of file diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/public-api.ts b/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/public-api.ts new file mode 100755 index 0000000000..3e81fe76c1 --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/main/typescript/public-api.ts @@ -0,0 +1,16 @@ +export { + CcModelHephaestus, + IPluginCcModelHephaestusOptions, + IWebAppOptions, +} from "./plugin-ccmodel-hephaestus"; + +export { PluginFactoryWebService } from "./plugin-factory-ccmodel-hephaestus"; + +import { IPluginFactoryOptions } from "@hyperledger/cactus-core-api"; +import { PluginFactoryWebService } from "./plugin-factory-ccmodel-hephaestus"; + +export async function createPluginFactory( + pluginFactoryOptions: IPluginFactoryOptions, +): Promise { + return new PluginFactoryWebService(pluginFactoryOptions); +} diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-basic-test.csv b/packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-basic-test.csv new file mode 100644 index 0000000000..b53c925f56 --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-basic-test.csv @@ -0,0 +1,2 @@ +caseID;receiptID;timestamp;blockchainID;invocationType;methodName;parameters;identity;cost;carbonFootprint;latency +basic-TEST;txID1;2024-05-27T09:05:43.640Z;FABRIC_2;FabricContractInvocationType.SEND;methodName2;0,2;person 1;0;0.00018;4 \ No newline at end of file diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-besu-4-events.csv b/packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-besu-4-events.csv new file mode 100644 index 0000000000..a44a57f6bd --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-besu-4-events.csv @@ -0,0 +1,5 @@ +caseID;receiptID;timestamp;blockchainID;invocationType;methodName;parameters;identity;cost;carbonFootprint;latency +BESU_MONITORING;0xe6800f6ff8d1a8ea5ee677dbb9320f849d28a8a533608affea5ef138be088736;2024-05-27T09:34:25.795Z;BESU_2X;SEND;createAsset;e59eeb10-ab45-4d44-95b3-f4ecbabd3f3b,10;0x627306090abab3a6e1400e9345bc60c78a8bef57;91441;0.00018;3457 +BESU_MONITORING;0x320482edd9e264453bbd7dee3826b7f9960fcaa27ce70398e21eee9be14423aa;2024-05-27T09:34:27.303Z;BESU_2X;SEND;lockAsset;e59eeb10-ab45-4d44-95b3-f4ecbabd3f3b;0x627306090abab3a6e1400e9345bc60c78a8bef57;30543;0.00018;1953 +BESU_MONITORING;0x99ae2b0951af4d674734bdc8ba21838eb2df3aefa7d2bc54f51c12ad713c06b5;2024-05-27T09:34:28.641Z;BESU_2X;SEND;isPresent;e59eeb10-ab45-4d44-95b3-f4ecbabd3f3b;0x627306090abab3a6e1400e9345bc60c78a8bef57;25157;0.00018;615 +BESU_MONITORING;0xd2da2adaf8f4e39dbd55ff8b42179efd67d402c58a61cdd30ca8d142be955f5c;2024-05-27T09:34:29.246Z;BESU_2X;SEND;deleteAsset;e59eeb10-ab45-4d44-95b3-f4ecbabd3f3b;0x627306090abab3a6e1400e9345bc60c78a8bef57;20705;0.00018;11 \ No newline at end of file diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-besu-ethereum-fabric-events-3-cases.csv b/packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-besu-ethereum-fabric-events-3-cases.csv new file mode 100644 index 0000000000..5f19ca27f8 --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-besu-ethereum-fabric-events-3-cases.csv @@ -0,0 +1,28 @@ +caseID;receiptID;timestamp;blockchainID;invocationType;methodName;parameters;identity;cost;carbonFootprint;latency +BESU_ETHEREUM_FABRIC_1;0x6b2082f5ca10801ab311fefa9fd5fc0ddcca253da5707232ac07599585d88fb4;2024-05-20T10:32:59.263Z;BESU_2X;SEND;createAsset;fe99ebeb-d7d8-4b7b-828b-89e4c914fe0c,10;0x627306090abab3a6e1400e9345bc60c78a8bef57;91441;0.00018;110153 +BESU_ETHEREUM_FABRIC_1;0x8bcbdc64574f2767526685aedb2197158da87c619a4bb7bf64e3aaa00ac72872;2024-05-20T10:33:00.553Z;BESU_2X;SEND;lockAsset;fe99ebeb-d7d8-4b7b-828b-89e4c914fe0c;0x627306090abab3a6e1400e9345bc60c78a8bef57;30543;0.00018;108865 +BESU_ETHEREUM_FABRIC_1;0x8068f71dc71de14e80c8b6be2042c2001ac383c42bc363608df5510277cedc81;2024-05-20T10:33:01.883Z;BESU_2X;SEND;deleteAsset;fe99ebeb-d7d8-4b7b-828b-89e4c914fe0c;0x627306090abab3a6e1400e9345bc60c78a8bef57;20705;0.00018;107535 +BESU_ETHEREUM_FABRIC_1;0x1d37b5ea2741eb9b7ca8bf49ae3b563c0632ab3660953ef6298650a8248b313b;2024-05-20T10:33:07.943Z;ETHEREUM;SEND;createAsset;asset1,5;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;129786009655382;0;101476 +BESU_ETHEREUM_FABRIC_1;0x9a28d1480e72257d585fb854bbeb840e08c12e37d9e0665888184aaad2892fa9;2024-05-20T10:33:12.103Z;ETHEREUM;SEND;lockAsset;asset1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;41156218131450;0;97316 +BESU_ETHEREUM_FABRIC_1;0x4c5a867c54cd89dbe8c2fd2131401d9fa7a4e8def2ff3635fc3222df6d45057c;2024-05-20T10:33:17.246Z;ETHEREUM;SEND;deleteAsset;asset1,owner1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;40955165049120;0;92174 +BESU_ETHEREUM_FABRIC_1;453887cf863ff5329f47ba82b0a6de9d63a1b7eb07be932ac4d6fd71c03f1227;2024-05-20T10:33:23.599Z;FABRIC_2;FabricContractInvocationType.SEND;CreateAsset;519c8966-cb7d-4cbc-8ee4-dc7fa1fc5850,10,owner1;user1;0;0.00018;85821 +BESU_ETHEREUM_FABRIC_1;547e59b76a912a65638585f42d33e264cefe1898a10cfeafd97929a6547dfd96;2024-05-20T10:33:29.855Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;519c8966-cb7d-4cbc-8ee4-dc7fa1fc5850,owner2;user1;0;0.00018;79566 +BESU_ETHEREUM_FABRIC_1;9486bee925044c747d5faa942449f899d3c8a8c9e9a42ffe37ca46278545e636;2024-05-20T10:33:35.386Z;FABRIC_2;FabricContractInvocationType.SEND;DeleteAsset;519c8966-cb7d-4cbc-8ee4-dc7fa1fc5850;user1;0;0.00018;74035 +BESU_ETHEREUM_FABRIC_2;0xafac857fc46846e2c6bb651a1c406606f58357211fb65f6887617a5cac878c23;2024-05-20T10:33:36.055Z;BESU_2X;SEND;createAsset;fe99ebeb-d7d8-4b7b-828b-89e4c914fe0c,10;0x627306090abab3a6e1400e9345bc60c78a8bef57;91441;0.00018;73367 +BESU_ETHEREUM_FABRIC_2;0x5061e439a6cff371957872531932990013c6e052d82b7ab199785c2fd7e74e93;2024-05-20T10:33:38.902Z;BESU_2X;SEND;lockAsset;fe99ebeb-d7d8-4b7b-828b-89e4c914fe0c;0x627306090abab3a6e1400e9345bc60c78a8bef57;30543;0.00018;70520 +BESU_ETHEREUM_FABRIC_2;0xe72063132b259c1a57e202cb5321258102767816b1240f513499faa04af8781d;2024-05-20T10:33:40.054Z;BESU_2X;SEND;deleteAsset;fe99ebeb-d7d8-4b7b-828b-89e4c914fe0c;0x627306090abab3a6e1400e9345bc60c78a8bef57;20705;0.00018;69369 +BESU_ETHEREUM_FABRIC_2;0x8fc2d26d58c153f941eb38d2455c8388ccc29f75a9e9c4367e4264b6c6395708;2024-05-20T10:33:47.139Z;ETHEREUM;SEND;createAsset;asset1,5;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;103394573872490;0;62284 +BESU_ETHEREUM_FABRIC_2;0x219f64ee149bf347d9dd31a80d9dc3ec859423245ff3fdd75f6c8dc46991c4c2;2024-05-20T10:33:52.281Z;ETHEREUM;SEND;lockAsset;asset1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;33538215602250;0;57143 +BESU_ETHEREUM_FABRIC_2;0xb4f7ed38e06cfc4fa9e524bcbab5f438d4f8f08bd08ddc36ed62079c668b3a16;2024-05-20T10:33:57.501Z;ETHEREUM;SEND;deleteAsset;asset1,owner1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;34079554985280;0;51924 +BESU_ETHEREUM_FABRIC_2;525368f5e7ebbed3edd2cb5f52fcc5f441bbdff5863fc08597b87402abaa681e;2024-05-20T10:34:03.161Z;FABRIC_2;FabricContractInvocationType.SEND;CreateAsset;519c8966-cb7d-4cbc-8ee4-dc7fa1fc5850,10,owner1;user1;0;0.00018;46264 +BESU_ETHEREUM_FABRIC_2;5374737a2ac9149c4068a776249c2bc5b45e80b34c5f37a9340966a4edf2c4a4;2024-05-20T10:34:08.645Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;519c8966-cb7d-4cbc-8ee4-dc7fa1fc5850,owner2;user1;0;0.00018;40780 +BESU_ETHEREUM_FABRIC_2;67fdd728e47ab2ae655ecca44bda5999067cf11c2e79bd317ee6ad03dd5eb5cf;2024-05-20T10:34:14.183Z;FABRIC_2;FabricContractInvocationType.SEND;DeleteAsset;519c8966-cb7d-4cbc-8ee4-dc7fa1fc5850;user1;0;0.00018;35243 +BESU_ETHEREUM_FABRIC_3;0xf7e10e0fa005951955ab2e03d1742430d4b9e73303c07cadf640148460f1859e;2024-05-20T10:34:15.031Z;BESU_2X;SEND;createAsset;fe99ebeb-d7d8-4b7b-828b-89e4c914fe0c,10;0x627306090abab3a6e1400e9345bc60c78a8bef57;91441;0.00018;34395 +BESU_ETHEREUM_FABRIC_3;0xe96e1c157a0c42487428da97c6a97c548bcd4d17b25fdbc8d8ca747adfbeeac6;2024-05-20T10:34:16.505Z;BESU_2X;SEND;lockAsset;fe99ebeb-d7d8-4b7b-828b-89e4c914fe0c;0x627306090abab3a6e1400e9345bc60c78a8bef57;30543;0.00018;32922 +BESU_ETHEREUM_FABRIC_3;0x03abead1107ae01dff9bdfb941124e80adc0609bd613461152c0df7d902a1c63;2024-05-20T10:34:17.879Z;BESU_2X;SEND;deleteAsset;fe99ebeb-d7d8-4b7b-828b-89e4c914fe0c;0x627306090abab3a6e1400e9345bc60c78a8bef57;20705;0.00018;31548 +BESU_ETHEREUM_FABRIC_3;0xdaf77bc2c7bdba632dd34d7ff8036dcb18c3fcfcfa8a34e315099a674c662351;2024-05-20T10:34:22.191Z;ETHEREUM;SEND;createAsset;asset1,5;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;95004006312862;0;27237 +BESU_ETHEREUM_FABRIC_3;0x3e8cc1e7762ebbf015fbcc7527be575ce932bad1e52c277ef5ad06978f46c90f;2024-05-20T10:34:27.469Z;ETHEREUM;SEND;lockAsset;asset1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;31116241250400;0;21959 +BESU_ETHEREUM_FABRIC_3;0xbf8a4b150c4c431b415829e5722840f1e7541109507b7ca497f7bc2453b64fed;2024-05-20T10:34:32.014Z;ETHEREUM;SEND;deleteAsset;asset1,owner1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;31893607627440;0;17414 +BESU_ETHEREUM_FABRIC_3;8e2146a7989e14efbc97d369a98d8203401dfbd034df77fcb66f7b32e4a50e99;2024-05-20T10:34:38.174Z;FABRIC_2;FabricContractInvocationType.SEND;CreateAsset;519c8966-cb7d-4cbc-8ee4-dc7fa1fc5850,10,owner1;user1;0;0.00018;11255 +BESU_ETHEREUM_FABRIC_3;cd118aeed54618ead4514f17c2682178f4f788b7e5f7f0d0772744ae22e9f9b2;2024-05-20T10:34:43.744Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;519c8966-cb7d-4cbc-8ee4-dc7fa1fc5850,owner2;user1;0;0.00018;5685 +BESU_ETHEREUM_FABRIC_3;93f066ba9539c48b32a11b2e6cd469cab38e9cb4e78be4385f259286afb674cb;2024-05-20T10:34:49.405Z;FABRIC_2;FabricContractInvocationType.SEND;DeleteAsset;519c8966-cb7d-4cbc-8ee4-dc7fa1fc5850;user1;0;0.00018;25 \ No newline at end of file diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-besu-ethereum-fabric-events.csv b/packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-besu-ethereum-fabric-events.csv new file mode 100644 index 0000000000..231f0be83a --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-besu-ethereum-fabric-events.csv @@ -0,0 +1,28 @@ +caseID;receiptID;timestamp;blockchainID;invocationType;methodName;parameters;identity;cost;carbonFootprint;latency +BESU_ETHEREUM_FABRIC_1;0xb81ed2022db3f730c182da98690974fa6b2b1f4ae503d4d9c9160c160a0cc589;2024-05-27T09:15:37.576Z;BESU_2X;SEND;createAsset;024505e9-8b77-4fcf-a9f1-63d2fe838f94,10;0x627306090abab3a6e1400e9345bc60c78a8bef57;91441;0.00018;116909 +BESU_ETHEREUM_FABRIC_1;0x3957718d932e5c08f5183d7e354f27e92bbf1f7bad03f23300bce9190e0e9c1d;2024-05-27T09:15:39.273Z;BESU_2X;SEND;lockAsset;024505e9-8b77-4fcf-a9f1-63d2fe838f94;0x627306090abab3a6e1400e9345bc60c78a8bef57;30543;0.00018;115213 +BESU_ETHEREUM_FABRIC_1;0xc23ab99376855ab985aa8964ce2da5a6d7ff4539c34b33daf54d927396547808;2024-05-27T09:15:40.109Z;BESU_2X;SEND;deleteAsset;024505e9-8b77-4fcf-a9f1-63d2fe838f94;0x627306090abab3a6e1400e9345bc60c78a8bef57;20705;0.00018;114379 +BESU_ETHEREUM_FABRIC_1;0x1d37b5ea2741eb9b7ca8bf49ae3b563c0632ab3660953ef6298650a8248b313b;2024-05-27T09:15:46.123Z;ETHEREUM;SEND;createAsset;asset1,5;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;129786009655382;0;108366 +BESU_ETHEREUM_FABRIC_1;0x9a28d1480e72257d585fb854bbeb840e08c12e37d9e0665888184aaad2892fa9;2024-05-27T09:15:51.381Z;ETHEREUM;SEND;lockAsset;asset1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;41156218131450;0;103109 +BESU_ETHEREUM_FABRIC_1;0x4c5a867c54cd89dbe8c2fd2131401d9fa7a4e8def2ff3635fc3222df6d45057c;2024-05-27T09:15:56.367Z;ETHEREUM;SEND;deleteAsset;asset1,owner1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;40955165049120;0;98124 +BESU_ETHEREUM_FABRIC_1;88ab44939551ea52c8abdb2779163278a07713bf397b215cce2dac9be478b08a;2024-05-27T09:16:03.019Z;FABRIC_2;FabricContractInvocationType.SEND;CreateAsset;966c0c39-b39a-49de-bf00-82b62444615a,10,owner1;user1;0;0.00018;91472 +BESU_ETHEREUM_FABRIC_1;04a5f33f1461b1f446086dcd435cedfb7f690b35b4359f87724a18755fd12bbb;2024-05-27T09:16:08.577Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;966c0c39-b39a-49de-bf00-82b62444615a,owner2;user1;0;0.00018;85916 +BESU_ETHEREUM_FABRIC_1;5f25721a387592f30d493aa455025aff308c7009b7b05d45949006e7e964094f;2024-05-27T09:16:14.245Z;FABRIC_2;FabricContractInvocationType.SEND;DeleteAsset;966c0c39-b39a-49de-bf00-82b62444615a;user1;0;0.00018;80250 +BESU_ETHEREUM_FABRIC_2;0x9198a615db48db3c018bef59d47dfb93568dbbf6d04a56acb595db24d192fc06;2024-05-27T09:16:15.243Z;BESU_2X;SEND;createAsset;024505e9-8b77-4fcf-a9f1-63d2fe838f94,10;0x627306090abab3a6e1400e9345bc60c78a8bef57;91441;0.00018;79254 +BESU_ETHEREUM_FABRIC_2;0x1451b68f1f59a5425cb442075c2a8504ad08d0fe605180ee3a02e9019f82c3f3;2024-05-27T09:16:17.305Z;BESU_2X;SEND;lockAsset;024505e9-8b77-4fcf-a9f1-63d2fe838f94;0x627306090abab3a6e1400e9345bc60c78a8bef57;30543;0.00018;77194 +BESU_ETHEREUM_FABRIC_2;0x0801c6aecd6d105d0249d51868050395cad9b5e17f56ee4654c2ec47cbf49f82;2024-05-27T09:16:18.359Z;BESU_2X;SEND;deleteAsset;024505e9-8b77-4fcf-a9f1-63d2fe838f94;0x627306090abab3a6e1400e9345bc60c78a8bef57;20705;0.00018;76141 +BESU_ETHEREUM_FABRIC_2;0x8fc2d26d58c153f941eb38d2455c8388ccc29f75a9e9c4367e4264b6c6395708;2024-05-27T09:16:26.125Z;ETHEREUM;SEND;createAsset;asset1,5;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;103394573872490;0;68378 +BESU_ETHEREUM_FABRIC_2;0x219f64ee149bf347d9dd31a80d9dc3ec859423245ff3fdd75f6c8dc46991c4c2;2024-05-27T09:16:31.184Z;ETHEREUM;SEND;lockAsset;asset1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;33538215602250;0;63331 +BESU_ETHEREUM_FABRIC_2;0xb4f7ed38e06cfc4fa9e524bcbab5f438d4f8f08bd08ddc36ed62079c668b3a16;2024-05-27T09:16:36.363Z;ETHEREUM;SEND;deleteAsset;asset1,owner1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;34079554985280;0;58154 +BESU_ETHEREUM_FABRIC_2;ec20bf8b8418971e43685ba2b6bee62c845dd272d901af92a158d21e982a8d47;2024-05-27T09:16:43.981Z;FABRIC_2;FabricContractInvocationType.SEND;CreateAsset;966c0c39-b39a-49de-bf00-82b62444615a,10,owner1;user1;0;0.00018;50536 +BESU_ETHEREUM_FABRIC_2;d68666a62b997c8527718aba35b7fddef109dafee2273133b618847e2a8074c6;2024-05-27T09:16:51.969Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;966c0c39-b39a-49de-bf00-82b62444615a,owner2;user1;0;0.00018;42549 +BESU_ETHEREUM_FABRIC_2;5cbf80fe64c979d92f0e35f40bd130a05772d36268c2ee3f73d2aad463359978;2024-05-27T09:16:59.118Z;FABRIC_2;FabricContractInvocationType.SEND;DeleteAsset;966c0c39-b39a-49de-bf00-82b62444615a;user1;0;0.00018;35400 +BESU_ETHEREUM_FABRIC_3;0x4985326b838f116fa612b9c1d81335ea4ee957a20c54a44ae42579ec4710a99a;2024-05-27T09:17:00.202Z;BESU_2X;SEND;createAsset;024505e9-8b77-4fcf-a9f1-63d2fe838f94,10;0x627306090abab3a6e1400e9345bc60c78a8bef57;91441;0.00018;34317 +BESU_ETHEREUM_FABRIC_3;0x967eb4286a012277a74270dce024c9c0872739c0733f8211b206ccf16432a122;2024-05-27T09:17:01.250Z;BESU_2X;SEND;lockAsset;024505e9-8b77-4fcf-a9f1-63d2fe838f94;0x627306090abab3a6e1400e9345bc60c78a8bef57;30543;0.00018;33269 +BESU_ETHEREUM_FABRIC_3;0x7d6c1bdfaafd4b5f4799450da507b517603d2963291649ec832d191944dca56d;2024-05-27T09:17:02.477Z;BESU_2X;SEND;deleteAsset;024505e9-8b77-4fcf-a9f1-63d2fe838f94;0x627306090abab3a6e1400e9345bc60c78a8bef57;20705;0.00018;32051 +BESU_ETHEREUM_FABRIC_3;0x8f63925f9c4e05884840fc15df27f41cd75d97a13a3aa3a34ed8497cde5af522;2024-05-27T09:17:06.542Z;ETHEREUM;SEND;createAsset;asset1,5;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;94325755557346;0;27986 +BESU_ETHEREUM_FABRIC_3;0x972b7d58b0cd9e3e603c577f2cb4fabd8a64ed0c070d55950bf403e27f446390;2024-05-27T09:17:11.777Z;ETHEREUM;SEND;lockAsset;asset1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;30920461153200;0;22752 +BESU_ETHEREUM_FABRIC_3;0x5bcfdbf3d6b1baf09446a581afb9b9dd76298639f7bda9db71f6a60d8d55ea15;2024-05-27T09:17:16.969Z;ETHEREUM;SEND;deleteAsset;asset1,owner1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;31716906746400;0;17563 +BESU_ETHEREUM_FABRIC_3;0e1e5982732b3426ca1feb4a0585d48adc3ee67706c7c92289ace06d949a4fad;2024-05-27T09:17:22.893Z;FABRIC_2;FabricContractInvocationType.SEND;CreateAsset;966c0c39-b39a-49de-bf00-82b62444615a,10,owner1;user1;0;0.00018;11640 +BESU_ETHEREUM_FABRIC_3;b925b6b6e68a07c12be5fe01a58869f844cd73d88254f3b427a65ac52eae7a32;2024-05-27T09:17:28.417Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;966c0c39-b39a-49de-bf00-82b62444615a,owner2;user1;0;0.00018;6116 +BESU_ETHEREUM_FABRIC_3;b99476b1334e81083ae88ae4991d72af4ca91adb63022ee8e37cde0beae10621;2024-05-27T09:17:34.473Z;FABRIC_2;FabricContractInvocationType.SEND;DeleteAsset;966c0c39-b39a-49de-bf00-82b62444615a;user1;0;0.00018;60 \ No newline at end of file diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-ethereum-3-unmodeled-events.csv b/packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-ethereum-3-unmodeled-events.csv new file mode 100644 index 0000000000..cf9950b9c0 --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-ethereum-3-unmodeled-events.csv @@ -0,0 +1,4 @@ +caseID;receiptID;timestamp;blockchainID;invocationType;methodName;parameters;identity;cost;carbonFootprint;latency +ETHEREUM_MONITORING;0xc0730eff8158a22803060879fd555b04d3940733b58f3b5d73698ea693e5d8de;2024-05-17T14:52:01.098Z;ETHEREUM;SEND;createAsset;asset2,10;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;103396064181676;0;10250 +ETHEREUM_MONITORING;0x319fc6d76fc7216599060623d0613fea997d164b8c7fbab08635190556d12162;2024-05-17T14:52:06.257Z;ETHEREUM;SEND;lockAsset;asset2;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;33538645761600;0;5091 +ETHEREUM_MONITORING;0x6ea284a62910fd25c30722aa7b20b325cc5f4304f25cd10d0186041b39e7e95e;2024-05-17T14:52:11.337Z;ETHEREUM;SEND;deleteAsset;asset2;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;34079943209040;0;13 \ No newline at end of file diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-ethereum-4-events.csv b/packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-ethereum-4-events.csv new file mode 100644 index 0000000000..634807ddfc --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-ethereum-4-events.csv @@ -0,0 +1,5 @@ +caseID;receiptID;timestamp;blockchainID;invocationType;methodName;parameters;identity;cost;carbonFootprint;latency +ETHEREUM_MONITORING;0x1d37b5ea2741eb9b7ca8bf49ae3b563c0632ab3660953ef6298650a8248b313b;2024-05-27T09:33:21.366Z;ETHEREUM;SEND;createAsset;asset1,5;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;135530010970738;0;15298 +ETHEREUM_MONITORING;0xd3732704dc43d1a1035974655cd62ee9cbad0e1a76449aba26f8d25d3833ac72;2024-05-27T09:33:26.632Z;ETHEREUM;SEND;lockAsset;asset1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;42814248832950;0;10033 +ETHEREUM_MONITORING;0xdddabe51b7894122aed2ec29891c8de590b727cfbea99dbdabc55feb1ba04718;2024-05-27T09:33:31.653Z;ETHEREUM;SEND;isPresent;asset1,owner1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;33945972851475;0;5012 +ETHEREUM_MONITORING;0x154f57cfdd1c482a246377a80ddcaaa1e14d92678882a119cb0cdf96ebb83d7e;2024-05-27T09:33:36.658Z;ETHEREUM;SEND;deleteAsset;asset1,owner1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;40955256397680;0;7 \ No newline at end of file diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-fabric-4-events.csv b/packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-fabric-4-events.csv new file mode 100644 index 0000000000..ad9d3bffc0 --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-fabric-4-events.csv @@ -0,0 +1,5 @@ +caseID;receiptID;timestamp;blockchainID;invocationType;methodName;parameters;identity;cost;carbonFootprint;latency +FABRIC_MONITORING;4b21851915d609fc0541037a569ce502ac9b87a415664755494422e4e8cb30dc;2024-05-27T09:31:47.774Z;FABRIC_2;FabricContractInvocationType.SEND;CreateAsset;78fffaa3-06ed-4daa-bedc-8f7d72992231,10,owner1;user1;0;0.00018;16298 +FABRIC_MONITORING;e26794398de369ba8ee2eb97235ef5d1dceceb8fda57413732a5550bf5cc420f;2024-05-27T09:31:53.120Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;78fffaa3-06ed-4daa-bedc-8f7d72992231,owner2;user1;0;0.00018;10952 +FABRIC_MONITORING;fa3bbd9ec8cb372e09211e057074fcf03f0c5f178c7ae098fbd3ead0956d17a4;2024-05-27T09:31:58.521Z;FABRIC_2;FabricContractInvocationType.SEND;TransferAsset;78fffaa3-06ed-4daa-bedc-8f7d72992231,owner1;user1;0;0.00018;5552 +FABRIC_MONITORING;677867c703fa64b1a4651a5c661ccd4cf2ca84259a64eae534d88d7cc3cafe48;2024-05-27T09:32:04.061Z;FABRIC_2;FabricContractInvocationType.SEND;DeleteAsset;78fffaa3-06ed-4daa-bedc-8f7d72992231;user1;0;0.00018;12 \ No newline at end of file diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-periodic-update.csv b/packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-periodic-update.csv new file mode 100644 index 0000000000..4299f0a23d --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/csv/example-dummy-periodic-update.csv @@ -0,0 +1,29 @@ +caseID;receiptID;timestamp;blockchainID;invocationType;methodName;parameters;identity;cost;carbonFootprint;latency +CCMODEL_UPDATE;0x1d37b5ea2741eb9b7ca8bf49ae3b563c0632ab3660953ef6298650a8248b313b;2024-05-27T09:40:42.941Z;ETHEREUM;SEND;createAsset;asset1,5;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;135530010970738;0;4921 +CCMODEL_UPDATE;0xd3732704dc43d1a1035974655cd62ee9cbad0e1a76449aba26f8d25d3833ac72;2024-05-27T09:40:49.281Z;ETHEREUM;SEND;lockAsset;asset1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;42814248832950;0;8580 +CCMODEL_UPDATE;0x5121ac2440d82d580bc30c9e445365871a0bbd7310580bd7e7617d66abdc0d33;2024-05-27T09:40:52.233Z;ETHEREUM;SEND;deleteAsset;asset1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;42451616646000;0;5628 +CCMODEL_UPDATE;0x3be2b1b2c1bec476f0d37cb6990b2ae7b54804a166262aef639ba6993d64e896;2024-05-27T09:40:57.247Z;ETHEREUM;SEND;createAsset;asset1,5;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;120363911294810;0;615 +CCMODEL_UPDATE;0x1ae44035a0580491f47933802ca3f99c11ca524b9c2add9169b67079d1085d56;2024-05-27T09:41:02.421Z;ETHEREUM;SEND;lockAsset;asset1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;38436488700900;0;5440 +CCMODEL_UPDATE;0xb64d1e48f4f69bf930950bc13d9c05513642af08dbdd5079f428db0fc17c839d;2024-05-27T09:41:07.408Z;ETHEREUM;SEND;deleteAsset;asset1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;38500479768000;0;454 +CCMODEL_UPDATE;0xb299fbed0ff28d4b29404142d8bee7b33a6ac2d480f22af3fdac030e9197e955;2024-05-27T09:41:12.385Z;ETHEREUM;SEND;createAsset;asset1,5;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;110203266779032;0;5476 +CCMODEL_UPDATE;0xf88b5da58aa42c36a798cbbb773da6650e27dd55ab9a870f542e899b827720ba;2024-05-27T09:41:17.387Z;ETHEREUM;SEND;lockAsset;asset1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;35503574548200;0;475 +CCMODEL_UPDATE;0x620e72017b4bc4689c11d329504a8ea73729ed3f4eae2c73c7d2ad440f1d3463;2024-05-27T09:41:22.263Z;ETHEREUM;SEND;deleteAsset;asset1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;35853385067280;0;5598 +CCMODEL_UPDATE;0xaaf8cacf1951a808f769e87a32304952d9bbdb3eeb2e56fde12959c5d775b49f;2024-05-27T09:41:27.170Z;ETHEREUM;SEND;createAsset;asset1,5;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;103396064181676;0;692 +CCMODEL_UPDATE;0xb205b16fac624e125354b93d9d9b542b6dbbf84816c6ed32a9e8ddd0c89cde50;2024-05-27T09:41:32.195Z;ETHEREUM;SEND;lockAsset;asset1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;33538645761600;0;5666 +CCMODEL_UPDATE;0x621becfe651fee97f77384c62b1730c6c0f364bf40f4be96fcc871c25d2410bc;2024-05-27T09:41:37.087Z;ETHEREUM;SEND;deleteAsset;asset1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;34079943209040;0;775 +CCMODEL_UPDATE;0xa9ba355c1b6c24475762f8d85e3fe31373488d4ed5767d85cdd8bad701b635d3;2024-05-27T09:41:42.152Z;ETHEREUM;SEND;createAsset;asset1,5;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;98835525300660;0;5710 +CCMODEL_UPDATE;0xadf19829cc25a097e457ed78fe9430fb0d306820ed91adbb94e538a291535849;2024-05-27T09:41:47.039Z;ETHEREUM;SEND;lockAsset;asset1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;32222226180300;0;823 +CCMODEL_UPDATE;0x39d64d6a97e476d64ebee18f8769fea61f8619ada119c58264dab2a04f8b11be;2024-05-27T09:41:52.133Z;ETHEREUM;SEND;deleteAsset;asset1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;32891811777840;0;5728 +CCMODEL_UPDATE;0xebfd45ff34e3ff7bd33d3c9bb5379877b7b0fd08e4357045dac805ed19cee100;2024-05-27T09:41:57.039Z;ETHEREUM;SEND;createAsset;asset1,5;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;95780155968798;0;823 +CCMODEL_UPDATE;0xe280efdc199b8635b392024bf969d7a78f7de3aaef64499c01dc240c425da1c2;2024-05-27T09:42:02.152Z;ETHEREUM;SEND;lockAsset;asset1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;31340280308100;0;5709 +CCMODEL_UPDATE;0x96129a0b72d96b2bb3c7d359cf0d7d444f814b18614889b07a391af1d12314f2;2024-05-27T09:42:07.066Z;ETHEREUM;SEND;deleteAsset;asset1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;32095813562880;0;796 +CCMODEL_UPDATE;0xd3d2045c8d79914a43bf0d0fa48233cb0c6d3d8d4c623767badeb6f5157e9876;2024-05-27T09:42:12.164Z;ETHEREUM;SEND;createAsset;asset1,5;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;93733186606720;0;5697 +CCMODEL_UPDATE;0xd5d911f6b56aaa9539605c428404558111b31701753843d7e37b8732967b721b;2024-05-27T09:42:17.148Z;ETHEREUM;SEND;lockAsset;asset1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;30749413489950;0;714 +CCMODEL_UPDATE;0xcbc1a5c07d93f980362adaf84f66db3127e7d5745cca0117cbf9f05078d6b03b;2024-05-27T09:42:22.248Z;ETHEREUM;SEND;deleteAsset;asset1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;31562528045760;0;5613 +CCMODEL_UPDATE;0x9cd9db21f05539f6dff370095d8d1763f0914b5d197405d30fc941d8c090c678;2024-05-27T09:42:27.135Z;ETHEREUM;SEND;createAsset;asset1,5;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;92361802785924;0;727 +CCMODEL_UPDATE;0x6adbc6ffea1acadabe5c67cef94a855383c38b58a5b8ff296b48e399f30a4ad3;2024-05-27T09:42:32.319Z;ETHEREUM;SEND;lockAsset;asset1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;30353557405200;0;5542 +CCMODEL_UPDATE;0x96ecf2aa1876492afddccf5e2a0083e21b1c85b24550fc0e4c7437699729ce18;2024-05-27T09:42:37.207Z;ETHEREUM;SEND;deleteAsset;asset1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;31205249014320;0;655 +CCMODEL_UPDATE;0xcf6652ab02e110b03816ba739c83a600424e9ee0611c34544ca4a239081018be;2024-05-27T09:42:42.165Z;ETHEREUM;SEND;createAsset;asset1,5;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;91443032771380;0;5696 +CCMODEL_UPDATE;0x76ea903dabc8a71125125ee782e22d06cebb3923cdeb0186236186145b299c2e;2024-05-27T09:42:47.055Z;ETHEREUM;SEND;lockAsset;asset1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;30088350292200;0;806 +CCMODEL_UPDATE;0x60fb968f395815fc788974d19ccb11fa5e361b74e9d9ae1bd2224b8f03be395f;2024-05-27T09:42:52.213Z;ETHEREUM;SEND;deleteAsset;asset1;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;30965886922560;0;5648 +CCMODEL_UPDATE;0x13b53c3379a666e719caa33ea0161d08594e663f90e268f25017c2e7068290c8;2024-05-27T09:42:57.111Z;ETHEREUM;SEND;createAsset;asset1,5;0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0;90827495125774;0;751 \ No newline at end of file diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/fixtures/python/.ipynb_checkpoints/process mining-checkpoint.ipynb b/packages/cactus-plugin-ccmodel-hephaestus/src/test/fixtures/python/.ipynb_checkpoints/process mining-checkpoint.ipynb new file mode 100644 index 0000000000..460facfb36 --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/fixtures/python/.ipynb_checkpoints/process mining-checkpoint.ipynb @@ -0,0 +1,286 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['/usr/local/lib/python3.8/dist-packages/ipykernel_launcher.py', '-f', '/home/bruno/.local/share/jupyter/runtime/kernel-2fed1eb2-9dc1-47ec-b7f2-f355b444c690.json']\n", + "/home/bruno/Documentos/blockchain-integration-framework/packages/cactus-plugin-ccmodel-hephaestus/src/test/fixtures/../csv/use-case-besu-fabric-6-events.csv\n" + ] + } + ], + "source": [ + "import os\n", + "path = os.getcwd()\n", + "parent = os.path.dirname(path)\n", + "\n", + "\n", + "# Change path if necessary\n", + "file_path = parent + \"/../csv/example-dummy-6-events.csv\"\n", + "file_path_other_model = parent + \"/../csv/example-dummy-ethereum-4-events.csv\"\n", + "\n", + "import sys\n", + "\n", + "if __name__ == '__main__':\n", + " print(sys.argv)\n", + " print(file_path)\n", + "\n", + "\n", + "\n", + "# import sys\n", + "\n", + "# accept command line arguments\n", + "# inputArg1 = sys.argv[1]\n", + "\n", + "#print('inputArg1: ',inputArg1)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "# uncomment if problems with dependencies\n", + "#%pip install pm4py\n", + "#%pip install pandas\n", + "import pm4py\n", + "import datetime as dt\n", + "import time\n", + "import pandas\n", + "\n", + "# process mining\n", + "from pm4py.algo.discovery.alpha import algorithm as alpha_miner\n", + "from pm4py.algo.discovery.inductive import algorithm as inductive_miner\n", + "from pm4py.algo.discovery.heuristics import algorithm as heuristics_miner\n", + "from pm4py.algo.discovery.dfg import algorithm as dfg_discovery\n", + "\n", + "# viz\n", + "from pm4py.visualization.petri_net import visualizer as pn_visualizer\n", + "from pm4py.visualization.process_tree import visualizer as pt_visualizer\n", + "from pm4py.visualization.heuristics_net import visualizer as hn_visualizer\n", + "from pm4py.visualization.dfg import visualizer as dfg_visualization\n", + "\n", + "from pm4py.objects.conversion.process_tree import converter as pt_converter\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "def import_csv_original(file_path):\n", + " event_log = pandas.read_csv(file_path, sep=';')\n", + " event_log = pm4py.format_dataframe(event_log, case_id='caseID', activity_key='methodName', timestamp_key='timestamp')\n", + " return event_log\n", + "\n", + "def getStartActivities(event_log):\n", + " s = pm4py.get_start_activities(event_log)\n", + " print(\"Start activities: {}\\n\".format(s))\n", + " return s\n", + "def getEndActivities(event_log):\n", + " e = pm4py.get_end_activities(event_log)\n", + " print(\"End activities: {}\\n\".format(e))\n", + " return (e)\n", + "\n", + "def getAttributeFromLog(event_log, attr):\n", + " entries = pm4py.get_event_attribute_values(event_log,attr)\n", + " print(\"Entries: {}\\n\".format(entries))\n", + " return entries" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/home/bruno/Documentos/blockchain-integration-framework/packages/cactus-plugin-ccmodel-hephaestus/src/test/fixtures/../csv/use-case-besu-fabric-6-events.csv\n" + ] + }, + { + "ename": "FileNotFoundError", + "evalue": "[Errno 2] No such file or directory: '/home/bruno/Documentos/blockchain-integration-framework/packages/cactus-plugin-ccmodel-hephaestus/src/test/fixtures/../csv/use-case-besu-fabric-6-events.csv'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[4], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28mprint\u001b[39m(file_path)\n\u001b[0;32m----> 2\u001b[0m log \u001b[38;5;241m=\u001b[39m \u001b[43mimport_csv_original\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfile_path\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3\u001b[0m log_other_model \u001b[38;5;241m=\u001b[39m import_csv_original(file_path_other_model)\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28mprint\u001b[39m(log)\n", + "Cell \u001b[0;32mIn[3], line 2\u001b[0m, in \u001b[0;36mimport_csv_original\u001b[0;34m(file_path)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mimport_csv_original\u001b[39m(file_path):\n\u001b[0;32m----> 2\u001b[0m event_log \u001b[38;5;241m=\u001b[39m \u001b[43mpandas\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread_csv\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfile_path\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msep\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m;\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3\u001b[0m event_log \u001b[38;5;241m=\u001b[39m pm4py\u001b[38;5;241m.\u001b[39mformat_dataframe(event_log, case_id\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcaseID\u001b[39m\u001b[38;5;124m'\u001b[39m, activity_key\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmethodName\u001b[39m\u001b[38;5;124m'\u001b[39m, timestamp_key\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtimestamp\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m event_log\n", + "File \u001b[0;32m~/.local/lib/python3.8/site-packages/pandas/io/parsers/readers.py:912\u001b[0m, in \u001b[0;36mread_csv\u001b[0;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, date_format, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options, dtype_backend)\u001b[0m\n\u001b[1;32m 899\u001b[0m kwds_defaults \u001b[38;5;241m=\u001b[39m _refine_defaults_read(\n\u001b[1;32m 900\u001b[0m dialect,\n\u001b[1;32m 901\u001b[0m delimiter,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 908\u001b[0m dtype_backend\u001b[38;5;241m=\u001b[39mdtype_backend,\n\u001b[1;32m 909\u001b[0m )\n\u001b[1;32m 910\u001b[0m kwds\u001b[38;5;241m.\u001b[39mupdate(kwds_defaults)\n\u001b[0;32m--> 912\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_read\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilepath_or_buffer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/.local/lib/python3.8/site-packages/pandas/io/parsers/readers.py:577\u001b[0m, in \u001b[0;36m_read\u001b[0;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[1;32m 574\u001b[0m _validate_names(kwds\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnames\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m))\n\u001b[1;32m 576\u001b[0m \u001b[38;5;66;03m# Create the parser.\u001b[39;00m\n\u001b[0;32m--> 577\u001b[0m parser \u001b[38;5;241m=\u001b[39m \u001b[43mTextFileReader\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilepath_or_buffer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 579\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m chunksize \u001b[38;5;129;01mor\u001b[39;00m iterator:\n\u001b[1;32m 580\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m parser\n", + "File \u001b[0;32m~/.local/lib/python3.8/site-packages/pandas/io/parsers/readers.py:1407\u001b[0m, in \u001b[0;36mTextFileReader.__init__\u001b[0;34m(self, f, engine, **kwds)\u001b[0m\n\u001b[1;32m 1404\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhas_index_names\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m kwds[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhas_index_names\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[1;32m 1406\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles: IOHandles \u001b[38;5;241m|\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m-> 1407\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_engine \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_engine\u001b[49m\u001b[43m(\u001b[49m\u001b[43mf\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mengine\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/.local/lib/python3.8/site-packages/pandas/io/parsers/readers.py:1661\u001b[0m, in \u001b[0;36mTextFileReader._make_engine\u001b[0;34m(self, f, engine)\u001b[0m\n\u001b[1;32m 1659\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m mode:\n\u001b[1;32m 1660\u001b[0m mode \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m-> 1661\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles \u001b[38;5;241m=\u001b[39m \u001b[43mget_handle\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1662\u001b[0m \u001b[43m \u001b[49m\u001b[43mf\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1663\u001b[0m \u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1664\u001b[0m \u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mencoding\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1665\u001b[0m \u001b[43m \u001b[49m\u001b[43mcompression\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mcompression\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1666\u001b[0m \u001b[43m \u001b[49m\u001b[43mmemory_map\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mmemory_map\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1667\u001b[0m \u001b[43m \u001b[49m\u001b[43mis_text\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mis_text\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1668\u001b[0m \u001b[43m \u001b[49m\u001b[43merrors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mencoding_errors\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mstrict\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1669\u001b[0m \u001b[43m \u001b[49m\u001b[43mstorage_options\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mstorage_options\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1670\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1671\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 1672\u001b[0m f \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles\u001b[38;5;241m.\u001b[39mhandle\n", + "File \u001b[0;32m~/.local/lib/python3.8/site-packages/pandas/io/common.py:859\u001b[0m, in \u001b[0;36mget_handle\u001b[0;34m(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)\u001b[0m\n\u001b[1;32m 854\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(handle, \u001b[38;5;28mstr\u001b[39m):\n\u001b[1;32m 855\u001b[0m \u001b[38;5;66;03m# Check whether the filename is to be opened in binary mode.\u001b[39;00m\n\u001b[1;32m 856\u001b[0m \u001b[38;5;66;03m# Binary mode does not support 'encoding' and 'newline'.\u001b[39;00m\n\u001b[1;32m 857\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ioargs\u001b[38;5;241m.\u001b[39mencoding \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m ioargs\u001b[38;5;241m.\u001b[39mmode:\n\u001b[1;32m 858\u001b[0m \u001b[38;5;66;03m# Encoding\u001b[39;00m\n\u001b[0;32m--> 859\u001b[0m handle \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mopen\u001b[39;49m\u001b[43m(\u001b[49m\n\u001b[1;32m 860\u001b[0m \u001b[43m \u001b[49m\u001b[43mhandle\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 861\u001b[0m \u001b[43m \u001b[49m\u001b[43mioargs\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 862\u001b[0m \u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mioargs\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mencoding\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 863\u001b[0m \u001b[43m \u001b[49m\u001b[43merrors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43merrors\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 864\u001b[0m \u001b[43m \u001b[49m\u001b[43mnewline\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 865\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 866\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 867\u001b[0m \u001b[38;5;66;03m# Binary mode\u001b[39;00m\n\u001b[1;32m 868\u001b[0m handle \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mopen\u001b[39m(handle, ioargs\u001b[38;5;241m.\u001b[39mmode)\n", + "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/home/bruno/Documentos/blockchain-integration-framework/packages/cactus-plugin-ccmodel-hephaestus/src/test/fixtures/../csv/use-case-besu-fabric-6-events.csv'" + ] + } + ], + "source": [ + "print(file_path)\n", + "log = import_csv_original(file_path)\n", + "log_other_model = import_csv_original(file_path_other_model)\n", + "print(log)\n", + "print(\"lenght is\", len(log))\n", + "print(log_other_model)\n", + "print(\"lenght is\", len(log_other_model))\n", + "startAct = getStartActivities(log)\n", + "endAct = getEndActivities(log)\n", + "timestamps = getAttributeFromLog(log, \"timestamp\")\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Install graphviz, if not done already\n", + "Open a terminal window and intall graphviz with:\n", + "`sudo apt install graphviz`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "#Another way to discover the tree\n", + "# # create the process tree\n", + "#tree = inductive_miner.apply_tree(log)\n", + "\n", + "# viz\n", + "#gviz = pt_visualizer.apply(tree)\n", + "#pt_visualizer.view(gviz)# convert the process tree to a petri net\n", + "\n", + "start_time = time.perf_counter()\n", + "process_tree = pm4py.discover_process_tree_inductive(log)\n", + "print(process_tree)\n", + "end_time = time.perf_counter()\n", + "pm4py.view_process_tree(process_tree)\n", + "\n", + "parameters = {pn_visualizer.Variants.FREQUENCY.value.Parameters.FORMAT: \"png\"}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "dfg, start_activities, end_activities = pm4py.discover_dfg(log)\n", + "pm4py.view_dfg(dfg, start_activities, end_activities)\n", + "\n", + "map = pm4py.discover_heuristics_net(log)\n", + "print(map)\n", + "pm4py.view_heuristics_net(map)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "# heuristics miner\n", + "net, im, fm = heuristics_miner.apply(log)\n", + "\n", + "# viz\n", + "gviz = pn_visualizer.apply(net, im, fm)\n", + "pn_visualizer.view(gviz)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + }, + "vscode": { + "interpreter": { + "hash": "994fd3bf715f7d00910c6929cedf6117267fec036ef9d2716f71f2b8e3dc9b3e" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/fixtures/python/.ipynb_checkpoints/process_conformance-checkpoint.ipynb b/packages/cactus-plugin-ccmodel-hephaestus/src/test/fixtures/python/.ipynb_checkpoints/process_conformance-checkpoint.ipynb new file mode 100644 index 0000000000..c6c5ef6fd5 --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/fixtures/python/.ipynb_checkpoints/process_conformance-checkpoint.ipynb @@ -0,0 +1,186 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['/usr/local/lib/python3.8/dist-packages/ipykernel_launcher.py', '-f', '/home/bruno/.local/share/jupyter/runtime/kernel-85cfe7fb-4cec-4b85-affb-ff95bb09e084.json']\n", + "/home/bruno/Documentos/blockchain-integration-framework/packages/cactus-plugin-cc-tx-visualization/src/test/fixtures\n", + "/home/bruno/Documentos/blockchain-integration-framework/packages/cactus-plugin-cc-tx-visualization/src/test/fixtures/../csv/use-case-besu-fabric-6-events.csv\n" + ] + } + ], + "source": [ + "import os\n", + "# uncomment if problems with dependencies\n", + "# %pip install pm4py\n", + "# %pip install pandas\n", + "import pm4py\n", + "import datetime as dt\n", + "import time\n", + "import pandas\n", + "\n", + "from pm4py.visualization.petri_net import visualizer as pn_visualizer\n", + "\n", + "path = os.getcwd()\n", + "parent = os.path.dirname(path)\n", + "\n", + "# Change path if necessary \n", + "file_path = parent + \"/../csv/example-dummy-6-events.csv\"\n", + "file_path_other_model = parent + \"/../csv/example-dummy-ethereum-4-events.csv\"\n", + "\n", + "import sys\n", + "\n", + "if __name__ == '__main__':\n", + " print(sys.argv)\n", + " print(parent)\n", + " print(file_path)\n", + "\n", + "\n", + "\n", + "# import sys\n", + "\n", + "# accept command line arguments\n", + "# inputArg1 = sys.argv[1]\n", + "\n", + "#print('inputArg1: ',inputArg1)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "def import_csv_original(file_path):\n", + " event_log = pandas.read_csv(file_path, sep=';')\n", + " event_log = pm4py.format_dataframe(event_log, case_id='caseID', activity_key='methodName', timestamp_key='timestamp')\n", + " return event_log\n", + "\n", + "def getStartActivities(event_log):\n", + " s = pm4py.get_start_activities(event_log)\n", + " print(\"Start activities: {}\\n\".format(s))\n", + " return s\n", + "def getEndActivities(event_log):\n", + " e = pm4py.get_end_activities(event_log)\n", + " print(\"End activities: {}\\n\".format(e))\n", + " return (e)\n", + "\n", + "def getAttributeFromLog(event_log, attr):\n", + " entries = pm4py.get_event_attribute_values(event_log,attr)\n", + " print(\"Entries: {}\\n\".format(entries))\n", + " return entries\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[{'alignment': [('InitializeAsset', '>>'), ('>>', 'createAsset'), ('>>', 'lockAsset'), ('CreateAsset', 'CreateAsset'), ('LockAsset', '>>'), ('TransferAsset', 'TransferAsset'), ('>>', None), ('TransferAsset', 'TransferAsset'), ('DeleteAsset', 'DeleteAsset')], 'cost': 40001, 'visited_states': 9, 'queued_states': 23, 'traversed_arcs': 24, 'lp_solved': 2, 'fitness': 0.6363636363636364, 'bwc': 110000}, {'alignment': [('InitializeAsset', '>>'), ('>>', 'createAsset'), ('>>', 'lockAsset'), ('CreateAsset', 'CreateAsset'), ('LockAsset', '>>'), ('TransferAsset', 'TransferAsset'), ('>>', None), ('TransferAsset', 'TransferAsset'), ('DeleteAsset', 'DeleteAsset')], 'cost': 40001, 'visited_states': 9, 'queued_states': 23, 'traversed_arcs': 24, 'lp_solved': 2, 'fitness': 0.6363636363636364, 'bwc': 110000}]\n" + ] + } + ], + "source": [ + "\n", + "log = import_csv_original(file_path)\n", + "log_other_model = import_csv_original(file_path_other_model)\n", + "\n", + "net, initial_marking, final_marking = pm4py.discover_petri_net_inductive(log)\n", + "\n", + "aligned_traces = pm4py.conformance_diagnostics_alignments(log_other_model, net, initial_marking, final_marking)\n", + "\n", + "print(aligned_traces)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABe0AAACUCAIAAACBVZWTAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOzdeTxU/fcA8DtjX4ZESlS28JRIVKSNyNIuS7YopZ1SoUeLlKJF2hSpLNlVUp42WcrWRosKxVMioZKyLzO/P+7vO9/5WsaY7c7ovP/olTt3OTPjuHPPfO754EgkEgIAAAAAAAAAAAAAOB4e6wAAAAAAAAAAAAAAAE2gjgMAAAAAAAAAAADAHaCOAwAAAAAAAAAAAMAdeLEOAAAAAAAAAAAAwEZVVVVeXh7WUbCKtbU11iEA5sNBn2MAAAAAAAAAAH+mxMREGxsbrKNgFbjeH5LgvioAAAAAAAAAAAAA7gB1HAAAAAAAAAAAAADuAHUcAAAAAAAAAAAAAO4AdRwAAAAAAAAAAAAA7gB1HAAAAAAAAAAAAADuAHUcAAAAAAAAAAAAAO4AdRwAAAAAAAAAAAAA7gB1HAAAAAAAAAAAAADuAHUcAAAAAAAAAAAAAO4AdRwAAAAAAAAAAAAA7gB1HAAAAAAAAAAAAADuAHUcAAAAAAAAAAAAAO4AdRwAAAAAAAAAAAAA7gB1HAAAAAAAAAAAAADuAHUcAAAAAAAAAAAAAO4AdRwAAAAAAAAAAAAA7gB1HAAAAAAAAAAAAADuAHUcAAAAAAAAAAAAAO4AdRwAAAAAAAAAAAAA7gB1HAAAAAAAAAAAAADuAHUcAAAAAAAAAAAAAO7Ay57DdHR0fPjwobS0tKKior6+vqmpqbm5ubm5WUJCQkREREREZPTo0SoqKioqKmPGjGFPSABwNcgpAKj4+fNnWVlZSUnJp0+fmpubGxoampqaEAQRFRVFc0ReXl5VVVVFRWXYsGFYBwsAN/n8+XNpaWlZWVlNTQ163mloaEDPO6KioiNGjFBUVFRTU1NSUuLn58c6WAAAAGBoYmEdp7Gx8eHDh5mZmZmZmcXFxV1dXTgcTlZWduTIkeTzfUVFBXr9WVVV1dDQgCAIgUDQ09MzMDAwMDDQ0dHh4eFhXYQAcBfIKQCo+Pfff9HsyMrKqqqqQhBEQEBAXl6eXLtBEKSurg6t6Xz8+LG9vR1BEDk5ublz56IJoqCggPFzAIDzdHV1PX/+HE2uvLw8tCQ6fPhwWVlZ9LwjISFRW1uL1nRqa2urq6tJJBIvL6+6urqBgYGhoeHs2bPFxMSwfh4AAADA0IEjkUjM3WNHR0daWlpkZOTt27e7uromTZpkYGAwY8YMdGiAkJBQfxvW19eXlpa+efPm4cOHGRkZX79+HTlypK2t7cqVK7W0tJgbJABcBHIKACpqa2vj4uIiIyNfvHghLCysr68/d+7cKVOmqKiojBs3rr/CZXd396dPn8rKygoLCzMzM3Nzc1tbW6dMmbJy5UpbW1tpaWk2PwsAOFBhYWFUVFRcXFxdXZ2MjAxakZkwYYKampqUlFR/W7W2tpaVlZWWlubl5WVmZr5+/ZqPj8/c3NzJycnc3BwG6QAAOFBiYqKNjQ3WUbAK06/3AUcgMU9dXd3ff/89fPhwPB5vbGwcFRVVX19P997evHmzf//+8ePHIwiiqal55cqVzs5OJkYLAOeDnAKAiqdPn1pYWPDy8oqLi69ZsyYjI6O9vZ2+XbW1tT148GD16tViYmK8vLzLly9//vw5c6MFgFt0dnZGR0draGggCKKionLgwIF3797Rvbe6urrIyMh58+bh8XhJSUkfHx9GTmQAAMAKCQkJGF+TsxLWry5gCeaMx/n69WtAQMCFCxdERETc3NxWrVolKyvL+G5R+fn5ISEh8fHx48aN8/b2dnZ25uVlU1sfALACOQUAFXl5eX5+fnfv3tXR0fHw8Fi6dCmVgWmD0trampKSEhQU9OzZM1NT07179+rp6TFlzwBwvq6urkuXLgUGBlZWVtra2m7YsIGJv/9VVVURERGnTp1qaWlxdXX18vIaOXIks3YOAAA0IpFI3759+/79+7dv39D/1NXVvX379sqVK1iHxipMud4HnIbROk53d/fZs2f37t0rKiq6c+fOtWvXCgsLMys4ShUVFQEBAZGRkRMmTAgJCYEP1mCogpwCgIra2lpPT8/o6OhZs2b9/fffJiYmLDrQnTt3/P39c3NznZycAgMD4U4rMOTl5uZu3LixpKRk1apVnp6eioqKrDhKS0tLWFjYsWPHmpubDxw4sGHDBujaBgBgll+/ftXV1ZHLNOi/vZdQXv8SCARpaWlxcfHCwkIMI2cpqOMMSQzVcYqKilxcXN68ebNjxw4fHx8WXW1SKi0t3bx584MHD1xcXIKCgggEAquPCAA7QU4BQEVYWJiXlxeBQAgODrawsGDDEa9evbp169bm5uYjR46sWbOGDUcEgP1+/fq1bdu2y5cvGxsbnzlzBr39lqWam5sPHjwYFBSkrq5+8eLFyZMns/qIAACu1tra2kChpqbmy5cvPZZUVVV1dHSQNxEUFJSgMHr0aBkZmR5LZGVlBQQEEOiPA7gQ/XWcs2fPbt++XU9P7/z586qqqswNi7qEhAR3d3cxMbGEhARo1wqGDMgpAPrT2Ni4Zs2a69eve3h47Nu3D518ij2ampp8fX1PnDhhZWUVFhYG0+6AIaawsNDGxqapqenUqVNWVlbsPHRJScm6deuePHkSFBS0YcMGdh4aAMA5GhoaehdlKJfU1NSgc7CSSUhI9C7K9F5CewxQxwFch546TlNTk7Ozc0pKyp49e/bs2YPH41kRGXU1NTX29vb5+fnBwcHr1q1jfwAAMBHkFABUFBUVWVlZNTc3x8TEGBoaYhJDenq6g4MDgUBITk7W1NTEJAYAmC4kJMTDw2PmzJlXrlwZNWoU+wPo7u728/M7ePCgpaXlpUuX2FmiBQCwGjqIpndRhvLH2tpaIpFI3gQdRNNnUYa8ZNSoUUz/qAx1HMB1Bl3Hqa+vNzc3r6ysjI+PNzAwYFFYtOju7t6/f//Bgwe9vb39/f1xOByGwQBAN8gpAKjIyMhYunSpjo5OXFwctl1Ra2pqbG1ti4qKUlJSsE1VABhHIpG8vb2PHj26b9++3bt3Y9uk5sGDB7a2tgoKCmlpaVRmNAcAcAjyXU593t+ELqmvr+/q6iJvQnmXU48yDflHaWlprGbegDoO4DqDq+N8+vTJxMSkvb397t27KioqrAuLdtHR0S4uLra2tuHh4Xx8fFiHA8DgQE4BQEVKSoqtra25uXlMTIygoCDW4SAdHR1OTk7Xrl2Ljo62trbGOhwA6NTd3b1hw4bLly+HhoauXr0a63AQBEEqKipMTExIJNLdu3eVlJSwDgeAPxSr29BwLKjjAK4ziJJndXX1nDlzhg0blpWVhcng2z45OjoOHz7c2tq6u7s7OjoaRhAALgI5BQAVycnJK1as2LRp04kTJzC52bA3fn7+mJgYNzc3Ozs7Hh6e5cuXYx0RAINGJBKdnJxSUlJSU1PNzMywDuf/KSoqPnz40NTUdN68ebm5ubKyslhHBMBQw3gbGkVFRQbb0AAAmIXW8TiNjY1z5szp6up6+PDh8OHDWR3WYGVkZJibm7u4uJw9exbrWAaWn58fFBSEdRRDWVJSEtYhDAxyiokgp2inp6fn4eGBdRQDy8zMNDc3X716NWf+Bm7bti0kJOTWrVvGxsZYxzKwoKCg/Px8rKMY+jw8PPT09LCOYmDbt28/c+ZMamqqiYkJ1rH09P3799mzZ+NwOM48MwLAmbioDQ3HgvE4gOvQNB6nra3N3Ny8oaEhNzeXM0+rhoaGERER9vb28vLyO3fuxDqcAXz+/Dk5OdnS0hLrQIagqqqqgoICrKMYGOQUc0FO0YgrsgNBkBcvXixdunTZsmWnT5/GOpa+HT9+vKamxtLS8uHDh5zf9jg/P7+goEBXVxfrQIay5ORkKysrzq/jBAYGBgcHx8fHc2ARB0EQSUnJO3fu6OvrL168+MGDBxx+IwYArMZ4GxpFRUWOakMDAGAWmnLYw8PjzZs3BQUFcnJyrA6IbitWrPjy5Yunp6eOjg5XdKDkijEjXIdbqumQU6wAOTUgNk8qTJ/GxkZLS0sdHZ2IiAiO/SYQj8dHRUXNnz/fysrq2bNnnD8Zua6uLiQIS3HFLagPHjz4+++/T5w4wcl/CsaMGXPnzh09PT103BDW4QDAEoy3oVFUVNTX1+e6NjQAAGYZuI6TlJR07ty52NhYNTU1NgTECA8Pj7y8PHQ+ERkZGazDAaBvkFMAULFx48ampqYrV67w8/NjHQs1/Pz8CQkJWlpaa9euTUhIwDocAAZQV1fn6Oi4fPlyNzc3rGMZwIQJE8LDw62trfX19W1tbbEOB4DBgTY0AAA2GKCO8+nTpzVr1mzevJlbzqPh4eHa2tqrV6++ffs21rEA0AfIKQCoCAsLS0hIuHfvHlfUDUeOHBkVFWViYnLx4kUXFxeswwGgXyQSycHBQUREJDw8HOtYaGJlZbV+/foNGzbo6+uPHTsW63AAQBBmtKEh3+X0x7ahAQAwywB1HHd399GjRx87dow90TBu2LBh0dHRs2bNio+PX7FiBdbhANAT5BQA/amtrfX29t6+fbuhoSHWsdDKyMho69atnp6eixcvHjFiBNbhANC32NjYBw8e5OXlcf49gGQnTpzIyMjYtm3b1atXsY4FDHHQhgYAwHWo/XG5c+fOjRs30tPTuetOyxkzZqxatWrbtm1mZmbi4uJYhwPAf0FOAUCFp6enqKjonj17sA5kcHx9fRMSEry9vS9evIh1LAD04devX56enq6urtOnT8c6lkEQFBQ8c+bM/Pnz09LSFixYgHU4gCtBGxoAwFDVbx2no6Nj48aNtra28+bNY2dATBEQEJCSkuLv73/kyBGsYwHg/0FOAUBFXl5edHR0cnKyqKgo1rEMDoFACAoKWrFiBdddJ4M/hK+vb2dnp7+/P9aBDJqxsbGVldXWrVvnz5/Px8eHdTiAs0AbGsAsHR0dNTU1WEcBwOD0W8eJjo6urq4ODAxk1pF+//6dkZHx/Pnz4uLi79+///r1S1hYWEJCYvz48dra2nPnzmXixD1SUlK7d+/evXv3zp07YaA74BBMzyl2gpwCrObn5zdr1iwLCwusA6GHtbX1yZMn/fz80tLSsI4FgP9RW1t7/vz5wMDA4cOHYx0LPY4cOaKiohITE+Ps7Ix1LIBNoA0NYJ329vaKiooP/1FSUlJaWlpTU0P56wQAV+i7jtPd3R0YGOjk5DRmzBjGj/Hw4cNTp06lpaW1tbX1tw4Oh9PX11+7dq29vT0PDw/jB3V1dT18+HBwcDA3fgEFhh7m5hQmIKcA6xQVFd27d+/OnTtYB0I/Hx+fBQsWPH/+XFtbG+tYAPivEydOiImJrVmzButA6CQvL+/g4ODv7+/o6MiUz4cAQ9CGBrATkUh88+YNWq8pLy8vKSkpKyv7+vUriURCEERAQACHw5EvTseNG/fp0ydM4wVgcPr+q5eUlFRRUfHPP/8wuPeXL19u3bo1KytrwDVJJFJOTk5OTs6BAwcCAwMZ/0pWWFh427ZtAQEBnp6e0NEDYI5ZOYUhyCnAOv7+/jo6OvPnz8c6EPqZmZlNmTIlMDAwMTER61gA+H8/f/48d+6cj4+PkJAQ1rHQz9vbOyoq6urVq9bW1ljHAvoGbWgAB8LhcC4uLk+fPuXn5yeRSJ2dnZSPtre3o//h4+NTUFDw9PTk3no3+DP1Xce5cOHCkiVLlJWV6d4vkUj09/c/cOBAj5wZ0IcPH5YvX25tbX3+/HkJCQm6A0AQZMOGDX5+fomJiWvXrmVkPwAwjvGc4gSQU4AVamtrb9y4ER0djXUgDMHhcNu3b3d2dq6vr4d7DwGHSEhI6OrqWr9+PdaBMERFRWXRokUXLlyAOg4moA0N4FI4HO7gwYMmJiaUBcQeeHl5ZWRkMjMzc3Jy2BkbAIzro45TVVWVlZV1/fp1unfa2tpqZ2eXkpJC9x4SExNfvnx5+/ZtBQUFunciLi6+ZMmS6OhouOYE2GI8pzgE5BRghZiYGGFh4SVLlmAdCKOWLVu2cePG+Pj4LVu2YB0LAAiCIJGRkRYWFlw013h/HB0draysqqqqmNhLEUAbGjDkzZ8/X19f//Hjx5Q365Hx8vIOHz48KysLqoqAG/VRx4mMjJSQkDA1NaVvj+3t7WZmZtnZ2YwFhpSWls6YMSMvL4+RUo6jo+PChQsrKioUFRUZjAcAujGYUxwFcgowXXR0tI2NDVff94ESEhJatmxZdHQ01HEAJ/jw4UNBQYGvry/WgTDBwoULJSQkYmNjPT09sY6FC0AbGgDIAgICZs2a1Xs5Ly8vgUDIzMxk5EoTAAz18ef4+vXr1tbW/Pz89O1x1apVjBdxUF+/fjU3N8/Ly6P7Bqv58+dLSkqmpKR4eHgwJSQA6MBgTnEUyCnAXBUVFS9evAgKCsI6EOaws7ObP39+ZWXl2LFjsY4F/OmuXbs2YsSIefPmYR0IE/Dz81tYWFy7du0Pr+NAGxoABoVIJH769Gn06NH19fWUvT54eHgEBATu378/YcIEDMMDgBE96zg/f/588eKFj48PfbsLDQ2Ni4tjOKr/Kikp2bRpU2xsLH2b8/Lyzp07NzMzE645AVYYzClOAzkFmCszM1NYWHjGjBlYB8Ics2bNEhQUzMzMdHJywjoW8KfLyMiYN2/ekJnjycjI6PLly79+/aLlNrGqqipBQUEpKSk2BMYs0IYGACYikUjXr1/fu3dvSUmJqakp5UwjeDyel5f39u3blPNLWltbQwcuwF161nGysrJIJNLs2bPp2Nfnz5937tzJjKj+R1xcnI2NDd2tEwwNDb28vDo7O/n4+JgbGAC0YCSnOBPkFGCizMxMfX39IfNVsKCgoJ6eHtRxAOY6Oztzc3OHzEg3BEHmzZtHJBIfPny4cOFCKqs9efLk+PHj165d++eff4yNjdkWHhXQhgYANktPT9+1a9fz588XLFgQGxuroaGxcOHCe/fudXZ24nA4PB6fkpLS581WAHCRnnWchw8fampqSkpK0rEvPz+/379/MyOqnry9vRctWkTf6crQ0PD379+FhYXTp09nemBDRnp6urGx8evXr9XV1Wnfqrq6euzYsa6urufOneO02DgHIznFmbg0p7y9vQMDAxEEuX37NiO9imjfDyQILbKzszdu3Ih1FMxkaGh44cIFrKOg35s3b44cOZKRkVFXVzdixAglJSVTU9Ply5erqKiw4nBw9mGRZ8+eNTU1zZ07F+tAmEZSUnLSpElZWVl91nG6u7uvXbt2/Pjxx48f8/HxdXd3f/v2jdUhQRsaADhNbm7u7t27s7KyjIyMnj17NmXKFHT5oUOH0CE5OBwuOTl5aPSsBH+4nueJ169fa2lp0bGjz58/R0ZGMiOkPpSUlCQmJq5YsYKObVVUVERFRd+8ecNd15xcISoqikgkxsfHnzhxQlBQEOtwOBTdOcWxuDSnAgICnJ2d//rrL7btBxJkQD9//qyqqhpiCaKlpVVZWUnj3R+cJj4+3tnZ2d3d/eHDh7Kysg0NDVlZWTt37ty/f39bWxvW0f0XJNeAiouLCQSCsrIy1oEw0+TJk4uLi3ss/P3796VLl44ePfrlyxf0Cz90uCgjdRxoQwMA1ykoKPD3979165a+vn52dnaPgfAaGhqWlpbJyclRUVFDYH5MAJDedZzS0lL6hqFGRkZSto9iuvDwcPrqODgcTllZubS0lOkh9dDY2JiYmLh8+fLhw4ez+lgcIiIiwsrKKikp6fr167a2tliHwz5dXV2hoaFWVlbS0tIDrkx3TnEstuUUgiBRUVHTpk1TU1Njw7GY7o9NkKKios+fP5uamg7Y2xv9LVJVVWVLXGyCPp2ysjIdHR2WHujhw4ft7e2GhobMaoBSXFzs7Ozs4eFx6NAhdMnIkSNtbGwmTpw4bdo0phyCWf7Y5Lp58+aIESN0dXUHXLO0tFRFRQWHw7EhKrZRVVWlnEmjoqIiLCzs7NmzbW1t6JiX7u5u9CE8Ht9fHQfa0AAwxBQXF/v5+SUnJ+vq6j548MDQ0LDP1Q4cOGBkZGRvb8/m8ABgFRKF5uZm9I5B0uBpaGiwNE4eHp6vX7/SERiJRELb69C3Le2+fPmCIAgvL6+5uXlsbGxzc3N/ayYkJPR45ftz586d6dOnCwoKysnJLV++vKCggEQinT59Gn1NTp8+vX79enQyLxsbG3STmzdvamtrCwgISEtLr1u3rrGxEV1eX1+/Y8cOJSUlAQEBTU1NynfZy8uL8qUeN24c9V2hcnJyNDQ0ysvLEQQxNjbuEfmHDx8WL14sKSkpKiq6ZMmS/Px86sv7O1x/sTH+2jIC/V6ah4dn3rx5ERERPV4ZSozkFCdjT06RSCS0BZ26uvrRo0crKyv7W43G9/3du3cIgty+fZu8hJxiw4cPd3Bw+PLlC+X6fSZgj/1Q3tYRFxdH3pYzE8TS0tLS0nLAF4pBV65cQRCEQCC4uLhkZGR0d3f3t2ZkZKSAgEBXVxerQ2Knrq4uAQGBK1eusPpA6P19kpKSbm5u+fn5RCKxvzVpfN9tbW35+Ph+/PjR3wpw9qECQZCEhATq6zBu7dq1CILIycn5+PgUFxdTWXPhwoV2dnasjofNrl69isfjW1panj17Zmdnx8PD09/9R3x8fLNnz/bw8HByclqwYIGurq6SklKPIXI4HE5KSkpNTU1fX3/JkiUuLi7e3t7Hjh2LiIi4efNmfn5+WVkZlfM7AABzb9++dXR0xOPxGhoaiYmJWIcDhpT29vbi4uKrV68eO3Zs9+7d27Ztc3V1tbKycnZ23rRpk5eXV0BAQGRkZEFBQUNDAyYR/s+VD3px8vLly8HuhQ03ITPyCWnXrl2ampr0bUs7tI6DIAgPDw8OhxMQEFixYsXNmzc7Ojp6rEnjNefNmzfxePzu3bu/fftWXV1tZ2cnIiKCPoT2IZKXl09MTGxqajp9+jT6STolJQWHw+3Zs+fHjx8vXrxQU1MzNDREP9y7u7u7u7t/+/bt9+/fV65cERAQoPwIeP/+fQRBXr9+TV5CZVeoNWvWHDlyhEQi6enp4fH4HtfYmpqaNjY2tbW1DQ0N7u7u5Mj7W07lcL1jo4KddRwEQfB4PB6P5+PjW7Zs2dWrV1tbW3usSXdOcTj25BSJRELvuMHhcLy8vDgcTk9P79y5c9++feuxGn11HDTF/v777/r6+nfv3k2dOlVZWfnXr1+Uj/aZgJT7aWtrW7Ro0dmzZ3scizMThG11HHQUANoJW0pKatu2bU+ePOm9pp+fn6qqKqvjYb/x48cfPHiQ1UcJDAxEX2H0X1lZ2f6u7Wl83yUkJLS0tKivA2ef/jDyKYV2a9euRYdfoW+6mpra4cOHP3782HvNSZMm+fj4sDoeNnvy5AnynyFv1Bvt43A4GRmZ6dOnL1iwYOXKlR4eHv7+/uHh4devX3/06NHbt2/r6uqolJgBABzu48ePrq6uPDw8EyZMSExMpPJNBgC0+/fffy9duuTo6KikpISebfF4vJyc3KRJk3R1dY2MjKysrMzMzGbPnq2tra2oqEi+VVZaWtrU1DQwMPDJkyds+3ryf658Hj9+jCBInx8IqLt79y4zCjUD8PLyou9JBgQEKCgo0Lct7ch1HDL0Q4aoqKiDg0Nqair5TaXxmlNVVXXSpEnkH3///j18+HDy/xEEWbNmTY9NVFRU1NXVyT/evHkTQZAHDx703vmiRYvWrVtH/rH3p1Xqu2pubh42bFhVVRWJRDp79iyCIJQXLa2trQjFJ9rOzk5paWkqy6kfjpPrOGRolUFYWBh9r8nFO7pzisOxJ6dI/6njkOFwOB4eHjweb2BgEBkZSa650FfHUVVVpfytKyoqQhAkICCA/Gh/CUjeT0tLi6mp6YULF3ociGMThG11nB5t6dE/hqNHj/by8nr37h15zR07dkydOpXV8bCftra2p6cnq48SGBjYo9cGeiObsrLyvn373r9/T16Tlve9sbERQRAzMzPqq8HZpz8Iu+o4PUagoMmloaERHBxcU1NDXnPcuHFotWvIaG5uXr16Nfqs0S9R+vu4iJo1axbWIQMAmK+ystLNzU1AQEBBQSE0NHSIDekFmHj9+vXOnTsVFBQQBBESEpo3b97+/fsTExNfvnzZ+0t6St3d3RUVFXfu3AkODra1tR01ahSCIOLi4itWrEhLS+vs7GRp2P9zFkQ/nxEIBOqnxt4+fPgw2E3oQPdRCAQCiybSog5tGNTU1JSYmLh48WIZGRl3d/ecnBxatq2qqiotLaXs0SUqKvr9+3fKdXrcy1ZVVVVWVkY5OQXahvbBgwe99z98+PCysjIqR6e+q6tXr06ZMkVWVhZBEBsbGz4+voiICPLKgoKCU6dO3bVrV1JSUmtrKy8vb21tLZXlg4qcM6FnkZaWlvj4+MWLF48YMWLdunU5OTm/fv1C6MopDodVTqF/MdGpZ1etWiUpKblgwYKkpCTK2UBohKbYnDlzyEsmT54sJiaWnp6O0JaAzc3NCxYsEBcXX7NmTY+dQ4L0gP4x/PLlS1BQ0F9//aWiouLr61tRUfH79++hlx0IdgmCdl398OHDoUOHxo8fr6mpefLkya9fv9K+BxrbqcDZh3OgyfX69evt27fLysrq6emFhYX9+vVr6CWXsLAwei9hTEzMuXPnli5dKiwsjCAIHx9fn7+3dXV17A4RAMBK9fX13t7eKioqKSkpp06dKisrQ4fkYB0X4FZNTU2nTp3S1taeNGlSUlKSra1tVlZWQ0NDenr63r17raysNDQ0qM+lgMfjFRQUTExM3N3dY2Nja2pqiouLDxw4UFVVtXDhwjFjxnh4eLx//55F8f/Ptzro505RUdHB7qVHQzgWofsoBAKhsbHR2tqaufH0QGUuD/SzdX19/fnz50+dOoU2xy0rK6MyjSt6qxr1lslCQkK9Nzlz5syZM2col1dWViII8vbt2927d+fl5dXV1ZFIJARBJk+eTI44Z9AAACAASURBVP3o/e0KQZDLly87Ojqi/5eUlDQ1Nb158+ajR49mzZqFLrx79+7Bgwe3bt3q4OBgZGS0d+9e9MNxn8sHPNxgsfq9JhKJ/T2EFhQaGxsvX74cFhaGvoOfPn0aYt2vCQTCz58/Wf06IwjSo3RChjazJBKJ9+7du337NjoqITMzc86cOQN+SYvqM8UkJSXR5bQk4JYtWzQ1NZOTkx8/ftxj6i5OTpCSkhJWv3HofS59PoRec3748MHf39/Pz09SUlJWVvb79++SkpIsDYnN0IIgq1/n0tJS6q8zem3v4eEhJSU1btw46lNoiYmJSUhI1NTU0HJoOPv06cSJE8nJyXRsSLsXL170uRytcSMI8uTJkydPnmzZsqWrq6ukpKStrW0ozeeFVqZERETs7OxcXV07Ojry8/MfPHhw586dwsLC7u5ufn5+8hxS/Z0+AABc58ePH6dOnQoKChISEvL19XV3dx9Kf9kA+/348eP06dOnTp3q6OiwtrYOCgqaPXs2U2YGmDhx4sSJE7ds2VJRUXHlypWoqKhTp05ZW1vv2rVr0qRJjO+fEk0XPANiz3SkLS0tbDgKh5CSkkIQ5MePH4PdpPdg/ujo6M7OTiMjo8+fP2dlZaFDvJycnPq7AKC+KwRBPn36lJWVtXr1atx/oAPRKb8UlZCQOH78eHV1dXZ2dltb2+zZs9GelH0up344AFihzxT7/v07upyWBNy9e3dqaqqmpubKlSsp/zpBggAuZW5uXlxc/PPnz8FuCGcfgAl+fv45c+b4+fk9efLkx48fqamp69evHz9+PPooHb/JAHCd7u7uT58+PX/+PDs7Oy0tLSkp6f79+/n5+a9evaqvr8c6OiZoamoKDAxUUlI6c+aMj4/Px48fvby8oIgD6NbS0rJ37155eflTp065ubl9+vTp4sWLc+bMoVLEqa+vf/XqVV5e3v3795OSktLS0rKzs58/f15ZWUmeJLE3RUXFvXv3lpWVxcTEvHnzRlNTc9myZegHEqah/OCC3lDw/fv3nndfDQQd6cpq8+fPH2xgqLNnz0pJSdG3Le1698chQ3sWjBgxws3N7dGjR7T3x6G8ab+6ulpAQADt8IqOnOrdlUNNTc3AwIByiYaGRnx8fElJCYIgR48eJS9fsWIFZZ9adAw5ZReA/nZFIpF8fX3t7e0pH2pqapKSkhIVFW1qaiKRSDU1NZSRo7+y8fHx/S2nfrjesVGBVX8cMrRzgbi4uKur66NHj9D2CnTkFIdjT06RevXHIUO75PDx8ZmbmycmJsbExNDyvvfujzNx4kTyo7374/SXgJT7efPmjaCg4KZNm8hrcnKCYNUfhwzt5TF+/Ph9+/aVl5evW7fO0NCQ1fGw39y5czds2MDqo/Tuj9PjdSb3TKHxfX/79q2goGDv5rhBQUFiYmLo3zE4+/QHwag/DorcO0xXVzc0NLSxsXH48OHnzp1jdTxshl6XZmRkUF/ty5cv0dHRzs7OLS0t7AkMALbp7OzMzc09ePCghYXFxIkT+zsLoIYPH66rq7tq1aoLFy58+PAB69gHp6mpKTg4WFpamkAgeHl5/fz5E+uIANe7ceOGvLy8uLh4YGAguclmb+/fvw8LC1u1atX06dPRqTn7IyAgoK6uvnz5cn9//7y8vP4a4hCJxNTU1EmTJgkKCu7bt496zx3aMafPcXh4OJVnyCy2trb0PcmAgABFRUX6tqUd0/scU06X8/HjRxMTE1dXV/Sh/j5Jp6Wl8fDwHD58uL6+vr6+ftu2bRMmTGhtbW1raxsxYoSGhsabN29aW1vv3r0rLi5O+Un67du3CIIkJSXV19ePGjXq6dOn/e2KSCQqKSm9ffu2x6H9/f0RBImIiCCRSOjI/KCgoMbGxoaGBk9PT0FBwfLy8v6WU4m8z9iovGjQ55g92JNTJBb3OSbPV/Xt27eSkpJp06YpKyuTZ5mlkoA99nPixAkcDnfv3j0SicThCQJ9jtlDW1ub7sb8tGNun2NUcnKykJCQt7f3v//+29HR8fHjx4MHDwoKCkZHR6MrwNmnPwj0OWa9iooKBEGovxEADEnNzc1XrlxZuHAh2v5CVlbWysrKx8cnOjo6Ly+vvLy8trYWLWf/+PHj8+fPJSUl6enpZ8+edXNzMzIyEhERQRBk7Nix69evz83NxfrZDKC9vT00NFRGRkZERMTLy+vHjx9YRwS43tevXxcvXozD4ezt7SnPlWREIjEnJ2fdunVjxoxBEERERMTIyMjd3T0kJCQ9Pb2kpOTz58/or2JTU9PXr1/Ly8vz8vKioqJ8fHysrKzQtn0EAmHRokUxMTF9fovQ2dl5/PhxAoGgpKSUlZXF+JNizrzj+fn5A9RgmMHf35++J8ml846TSKTbt29PmzZNQEBg9OjRHh4e6CfLuLg4ypelx5T1d+/e1dXVFRAQGDlypJ2d3efPn9HlT548mTVrlqio6JgxY1xdXS0tLdHNyb/KGzduFBcXFxMT27hxY3+7omydUFRURD6ol5cXebmJiQmJRLp165axsbGkpKSYmNjMmTPJU430t5xK5H3G1h+Yd5w9uHHeccrfUvJX+uQUk5CQsLe3//LlC+UmfSbg0aNHyfvZtGnT7du3yT+OHDmSwxOEA+cdV1FRYXU87KesrMyN846j3rx54+joKCMjw8/PLysra2FhkZOTgz4EZx8qEA6bd1xDQ2PozTuOjppEO0MB8IcoLCx0dnYmEAh8fHyLFy8+f/48HSnQ3t7+6NEjX19ftEMHepLiwNHiHR0dkZGRCgoK/Pz8rq6ufV5vAzBYDx48GDVqlJKSUp/DOb99++bn56ekpIQgiIaGhp+f36NHj3pfvw+opKTk3LlzCxcu5OPjExMTW716NeXHFbKqqqqlS5fy8PD4+fl1d3fT83z+43+ufFpaWvB4/PXr1we7l5aWlj4H+jLXnTt36HuSNjY2S5cupW9b2qF1HF5eXnNz89jY2Obm5v7WZE+t4c/EzjoODw/PvHnzIiIiyCM4eqM7pzgce3KKRCJpa2sjCKKurn706FG0e26fIKdoxLY6DoIgBALBxcUlIyODylkqKipKQEBgiE0a2tXVxc/PHxMTw+oDoXc0S0pKurm55efnE4nE/tZkz/v+h2NbHQdBEDk5uf5qdmSLFi2ys7NjdTxslpycjMfjmTUiHQAOl5OTY25ujsPh0MkH0VbxjCsqKtq2bZukpKSoqOiOHTs4pFbS3d2dmJiorKzMx8fn6upaVVWFdURgKOjq6vL19eXh4bGysup9vfbly5ft27eLioqi3zi+ePGCKQetra0NDg7W1NTE4XALFizocwTcqVOnBAQEjIyMamtr6T5QzyufsWPHBgYG0rEjY2NjlhZxCAQC3WfuyZMns2GI+8+fP8PCwmipbcM1J+uw57Xt7Ow8c+YMjYlHd05xMvbkFIlEioyMpLwNpz+QUzRiz/V8YWHhjRs32tvbB1wTvfGwoqKC1SGxEzrBJBtu/cjOzr537x4tVTCo47ABe+o4qamp+fn5tKy5Y8cObW1tVsfDZocOHVJQUMA6CgBYrry8fMGCBQiC6Ovr//PPP6w4xO/fv48dOyYjIyMkJLR//34My6No6xANDQ08Hm9lZcV1fXwAx2pra7O0tBQUFDx79myPh1pbW/ft2ycoKCgjI3P8+HH0nkTmIhKJaWlpM2bMQBBk0aJFvT/rPnv2TElJSUFBge5Bpj1bUaqqqpaWltJRZ7GxsWGkTDOgxYsX09ecnEQiffjwgcoM38wiLi6+du3aITa9NOgTLy/vpk2b0PnjB0R3TnEstuUUgiArV65UU1Njw4EAE2lpaS1evBjt1UKdqqoqgiBDLEHQp8OGBJk9e7axsTF6lw34QyxatEhXV5eWNVVVVcvKykj9Tw3GjUpLS9HBbuinXqzDQRAEwQGOhPXvBf3a29sPHDigrq7+77//pqen5+TkmJmZseJAoqKi27dvr6io2L9//9GjRzU0NO7evcuKA1GXnp6uo6OzdOlSVVXVd+/eJSYmore3AMCgpqamxYsXp6en3717d+PGjZQP3b59W11d/fjx4wcOHPj33389PDzQBlLMhcPhzM3Nc3Nz79279+HDB3V1dX9//46ODvIK2traT58+lZGR0dPTo69HTc+bodTV1bOysujY0YoVK3bt2sW6Ke7c3Nzo27C0tLSpqUldXZ258QBAI7pzimNBTgFmERcXl5OTKywsNDU1xToWpikqKho7dqyYmBjWgYA/mrq6+u/fvz98+ECeh3sIKCoqampqWrVqVWdnp7i4uLa29tT/GDt2LFZRbd26VU9PD6ujgx7y8/ODg4OxjoJOHz9+XLFixevXrz09PXft2kV9LiqmEBQU3Llzp729vbe3t6mpqaOjY2hoqJCQEKuPiyBITk6Oj4/Pw4cPjYyMnj171t/8pADQ4fv37/Pnz6+pqcnOztbQ0CAvb29v9/T0PHXq1MKFCzMyMthz4jA2Nn758mVISMiePXuuXbuWkJCgrKyMPiQhIXHv3j1LS8v58+enpqYaGBgMas896zhz5sw5efLkt2/fpKSkBrUjERGR7du3e3t7D2orGpmZmU2bNo2+bTMyMggEAvx1AFihO6c4FuQUYKK5c+dmZWX9/fffWAfCNBkZGYM9EwPAdDo6OgQCITMzc8jUcb5//15cXHzjxg1TU9PS0tLnz58/f/48JyfnxIkTHR0dw4YNmzhx4syZM/X19adOnTpq1CgGD9fR0dHa2iouLj7gmnp6etbW1gweDjARl9Zxrl275uLioqio+PLlS/JlHnuMHj06Kipq2bJlq1evfvPmDeV1Jivk5+fv3r07IyPDyMjoyZMnU6dOZd2xwB+oubl5wYIFP378yM3NVVBQIC9H66Rv376Ni4tbsWIFO0Pi4+Nzd3dfunSpjY3NlClTwsLCyAGIiIikpqY6OjouWbIkIyNDR0eH9t32vK9q7ty5OBzu4cOHdITo7u6ODpJnLgEBgaCgILo3z8jImDNnDjqzAwDsx0hOcSbIKcBEBgYGubm57e3tWAfCHG1tbfn5+VDHAZjj5eXV19fPzMzEOhCmefDgAR6Pnz17Ni8v78SJE1euXHny5MmcnJwfP36gE/EoKirevHlz6dKlMjIyo0ePXrRoka+v782bN799+0bH4Z4/f66qqnrlyhUOuYELDG2BgYHLly9ftGhRTk4Om4s4ZMuWLSsqKuLl5Z06dWpOTg4rDvHq1Stra+sZM2a0t7dnZGTcv38fijiAuTo7O62srMrLy+/cuUNZxCkoKNDR0ens7CwsLGRzEYds3Lhx2dnZq1atsrW1pRz7wsfHFx0dPXPmTDMzs0G1GuhZxxEXF9fS0rp//z4dwQkKCl6+fJnp9+r7+fnR3SCjq6srKyvL0NCQuSEBQDtGcooDQU4B5jI0NGxpacnNzcU6EOZ4+PBhW1sbJAjgBIaGhuiEcVgHwhz379/X0dHpfceiiIjIzJkz3d3do6Ki3rx509DQ8OjRIy8vLwkJiaSkpMWLF48YMYJc1klPT29ubqblcM+ePauvr1+5cuWMGTNevXrFgicEAIIgSHd39/r163fv3n3x4sWoqCj23NPUH3l5+aysrLlz586fP//mzZtM3PPbt2+tra0nT55cWVmZmpqak5MDX3gAVnBxccnJyblz5w7l4JLU1FRDQ8M5c+bk5uZiVSdFCQgInDx5MjQ09NixYxs2bCCfoPn4+JKSkhQVFc3MzOrq6mjcW886DoIgFhYWSUlJlG14aKenp3f69Gk6NuyPjY3Nzp076d78zp07P378WLJkCRNDAmCwGMkpTgM5BZhLXl5+ypQpcXFxWAfCHLGxsdOmTRszZgzWgQCAWFhY1NfXp6enYx0IE3R0dFy/ft3CwmLANcXExCjLOl++fElNTXV1dUUQ5Ny5c8bGxuLi4pTDedra2vrcz+PHj/F4PDqliJaWlpubW2NjI5OfFfjjdXd329vbR0VFJScnr169GutwEARBhISEkpOT7e3tLSws4uPjGd/hv//+u27dOg0NjXfv3iUkJOTn5y9atIjx3QLQW0hISGxsbHJysra2NnlhfHz88uXLHR0dExMT6Zs0ielcXV2TkpIiIiIcHBzIpRwREZG0tDQcDufo6EgkEmnZT8/+OAiCrFy5cs+ePbdv36bvUm3Dhg21tbX79++nY9sejI2NIyMjGWk7Hx0dPWvWLEVFRcaDAYBuDOYUR4GcAkzn6Oi4b9++kydPCgsLYx0LQ1paWq5du3bo0CGsAwEAQRBESUlJT08vOjraxMQE61gYdfPmzYaGBltb28FuKCMjs2jRIvJ145cvX57/h5+f348fP/j4+MaPH6+tra2trT1z5szJkyej48rz8vK6uroQBEH/PXfuXGxsbFBQkKOjI1dPhwQ4yqZNm1JTU//555+5c+diHct/8fDwhIWFEQgEJycnCQkJuv+AVFZW+vv7X7p0SVlZ+dKlSw4ODnh8HwMImKKqqiovL49FOwcIgnB+F7BXr17t2LFjz5498+fPJy+8c+fOypUr3d3djx07hmFsvS1btuyff/4xNzffvHnzuXPn0IVSUlIJCQkzZ848fPiwj4/PwHvpczbyefPmLVu2jL6ZzFEhISEM3mC1cuXKjo4ORmJoaGgQEhK6cOECIzthhYSEhP5eecAgjn1tGc8pTgA5xe0sLS0tLS2xjqKn2tpaXl7emJgYrANhVHR0NB8fX11dHdaB9MSZ7/sQgyBIQkIC1lH0dP78eWFh4Z8/f2IdCKOWLFlibGzM3H12d3e/ffs2Kipqy5Ytenp66Pe0oqKis2fP3rJlS+9iDTqhta6u7suXL8k74cz3/U/GRZ8H9uzZw8PDc/XqVawD6RuRSFy1apWwsHBubu5gt62trfXy8hIUFBw3blxoaGhnZycrIqSEvu+AdVj9DjKosbFRWVnZ0NCwu7ubvPDx48eioqIODg5EIhHD2KhITU3l5eXdt28f5cKTJ0/y8vJmZ2cPuHnf70p8fDwPD09ZWRkjkeXm5qqoqNDxiyIuLn7x4kVGDo3y9/cXFxfnwI8vXHSO4Toc+9oyJacwBznF7Tj2en758uXa2tpYR8EQIpGopaVlZWWFdSB94Nj3fShBOPJ6vqGhQUxMLCAgAOtAGFJSUsLDw5OYmMjSo3R0dBQWFoaFha1du5ZKAwVeXl48Hr9lyxb0VMiZ7/ufjFs+D8THx+NwOKZc77BOR0eHmZnZqFGjvn79SuMm37598/LyEhISkpOTCw4ObmtrY2mEZNzyvnMjrnht3dzcpKSkampqyEtqampGjhy5cOFCNpQRGREWFobD4ShPcEQicfHixePHj29tbaW+bd/D2ywtLZWUlAIDA+mowpDNmDHj5cuXAQEBtE+3zM/Pv379+rdv3zJ+j2hzc3NwcPDmzZtpmTMSAFZjSk5hC3IKsI6Pj09hYeHdu3exDoR+aWlpRUVFXl5eWAcCwH8NGzZsw4YNQUFBLS0tWMdCv8OHDysrKy9fvpylR+Hj49PS0lq7di1ayulvTsauri4ikXju3DklJaWwsDCWhgSGqg8fPqxbt27z5s0c0hOnP3x8fAkJCWJiYra2tgN2TP/9+3dgYKCSktLFixf37dtXVlbm7u4uICDAnlDBn+z169chISFHjhwZNWoUuoRIJK5cuZJAIMTExPDy9tFGhnOsXbt2/fr1Li4uZWVl6BIcDnf27NmampojR45Q37bvOg4PD4+Xl1d0dHRlZSUjkQkKCnp5eX38+DE8PNzY2JjK66ipqenv719eXn7u3LnRo0czclBUaGhoS0vL1q1bGd8VAIxjVk5hCHIKsI6WlpaJicnBgwexDoR+hw4dWrBgAWVrPQA4gYeHR1NTU3h4ONaB0Onff/+NjY3dtWsX6zpr9PbkyRPqbSa7urq+f/++bt06BEG497QOMNHe3m5tba2srHz06FGsYxkYeiWcl5d3+PDh/tZpbm4ODAwcN27ckSNHtm7dWl5ejg7JYWec4I9FJBLXrVs3ffp0Z2dn8sIDBw48evQoMTGx9xSHHCgoKEhZWdnOzo48JY6cnNzevXsDAgIqKiqobNjvSdHBwUFOTs7T05Px4ERERFxcXO7du/fr16/8/PwLFy4EBAT4+PgcPHjw7Nmz9+7d+/79+4sXL/7++285OTnGD4cgSH19vb+//6ZNm2gfCgQAqzExp9gPcgqw2t69e3Nzc69evYp1IPRISEh4/Pjx3r17sQ4EgJ6kpaXXr19/4MCB79+/Yx0LPXbu3CkvL29nZ8fOgxYUFPQefYDH4/n4+MjlJH5+frTlf3Z2dm1tLTvDA1ztyJEj79+/T0hI4JaxKjo6OgEBAX5+fm/fvu3xUEdHR1hYmLKy8sGDB11dXcvLy319fbniyhkMGbGxsU+fPg0JCSE3NSsuLvb39z9y5IiWlha2sdFIUFAwISHh3bt3lM2Yt27dqqSkNMC03VTuubpz5w6CIP/88w9zbv9io1WrVsnIyHBgFw8UV9xnyKU4/LWFnGIRDn/fOQeH90lxcnKSk5P7/fs31oEMzq9fv2RlZdesWYN1IP3i8Pd9aEA4uE/Kr1+/Ro8e7erqinUgg4bea5mWlsbOg9bX1yMIQjlZh6Sk5NSpU9GZ9SIjIx89evTlyxd0ZU5+3/9MHP554OPHj8LCwkeOHME6kMHp7u6eNm3arFmzyP1iOzo6QkNDZWVlhYWF3dzcaG+gwyIc/r5zNU5+bbu7uydOnOjk5EReQiQS586dq6OjQ9nwmCv4+/sLCQlVVFSQl1y/fh2Hw7169aq/TajdMGZiYrJs2bJt27YZGBhwyHTrtMjNzY2IiEhISIAuHoDTQE4BQMWRI0fU1NT279/PFaPNyfbt29fW1kZlzDkA2CIQCMeOHXNwcFi1apWuri7W4dCqtbV18+bNlpaW5ubm7DxuXV3dli1bFCkICwuzMwAwhG3atEleXp7rblHH4/GnT5/W09OLi4tbsWLF1atXd+3a9fnzZ2dnZ19fXxkZGawDBH+oa9euvXv3jnK2sujo6EePHj1+/Jidt+IyxY4dO6Kjo7dt25aSkoIuWbJkibq6ekBAQExMTJ+bDND4Jzg4WENDw8PDIyQkhMnBssbPnz8dHR3NzMysrKywjgWAPkBOAdAfaWnpo0ePurq6mpiYGBkZYR0OTe7du3fy5MmLFy/CLYeAk9na2kZGRjo4ODx//pxbKvJbt26tr68/ceIEm487YcKEU6dOsfmg4E+Qm5ublpaWnp7eXxdtTjZt2jRnZ2dvb29fX9+PHz86Ozvv2bNnzJgxWMcF/miBgYHLly+fOHEi+mNnZ+e+fftcXFxobFbY2Njo7u7OygCRSZMmbd++nZY1+fn5g4ODTU1NHz9+PH36dARBcDjcrl27HB0dfX19x48f33uTAeo4Y8eODQ8Pt7KymjlzJptvTqYDiURycXFpaWm5ePEi1rEA0DfIKQCocHFxyczMtLe3LyoqYkrPe5aqra11cnKytLSk7K4HAGeKiorS0tJas2ZNUlIS1rEMLDEx8cKFC8nJyczqnAgA5vz9/fX09ObNm4d1IHTy8fGJioqaN2/e7du3lZSUsA4H/Ony8vKePXt27tw58pKYmJjq6updu3bRuIfW1tbIyEjWRPf/TExMaKzjoCvr6+v7+/unpqaiS6ytrX18fM6fP3/8+PHe6w884sjS0nLz5s0bNmzo3d2K0xw7duzGjRsJCQnkWccA4ECQUwBQERISIi4uTtm3nzO1t7dbWVmJiYlx70xA4I8iLS0dExNz/fp19o9wGazi4uI1a9Zs2bLFwsIC61gAYI6XL1/euXOHq9vhKyoq2traVlZWKigoYB0LAEhUVNTEiRN1dHTQH4lE4tGjRx0cHOTl5TGNiyHe3t63bt0qLCxEf+Th4Vm5cmVMTExXV1fvlWmaUP3YsWMvXrwwNTXNzc3l2BF0sbGx3t7eR48enTNnDtax0ATuUmGFqqoqrEOgCeQUK0BODaigoIDzu2OIiYklJyfPnj175cqVsbGxnHmHM5FIdHR0fPXqVU5ODoFAwDqcgRUUFECCgLlz5wYEBOzYsUNGRmbFihVYh9O3yspKU1NTLS0t7uqT1R81NbXS0tL+HkUnb2VnPAiCPH/+3M3N7cWLFy0tLbKysox8cKqurh47dqyrqyvlV+JMl56ebmxs/Pr1a3V1ddYdhdVOnjypqalpYmKCdSAM2bVr18SJE9PT0+fPn491LOCP1tHRkZyc7O3tTV5y7969d+/ecem0p2QLFiyYNGlSSEgI+TtCJycnPz+/9PR0U1PTHivT9PlYQEDg1q1bkpKS8+bNq6urY3K8zJCRkbF69ert27d7eHhgHcvAxowZY2lpiXUUQ5OcnBxXvLaQU8wFOUUjXV1dPT09rKMYmIaGxo0bN27cuLFp0yasY+mbh4fHjRs3kpOTueK6Qk9Pj/Prd9zO0tKSY4vylHbs2LFt27aVK1ei8ydymu/fv5uamkpISKSkpPDz82MdDnP8+++/6NwiaGWK/CNWA6Ps7e1lZWVra2vfvn3LYAvnqKgoIpEYHx/f1tbGrPCGpNbW1mvXrq1evZo8NTKX+uuvv3R1daOjo7EOBPzpUlNTf/78SdmhIioqSl9fX01NDcOoGIfD4ZydnZOSklpbW9ElCgoKM2bMiIqK6mNt2mfDqqqqGjdunIaGBnm2RQ5x8+ZNYWFhR0dH8mR4AHAFyCkAqEhOTubh4dm8eTNHTR7Z3d29adMmHh6ea9euYR0LAPQgEon29vbCwsK3bt3COpb/UV1draGhIS8vX11djXUstEIGmndcVVWVSh3Hx8eHxQH2hF4bhIaGMmVvKioq6EC/2NhYpuywT/fv30cQ5PXr17SszJlzJF+5coWXlxfzybmZIiQkRERE5NevX1gH8j84830fGjjztXV23a7yqQAAIABJREFUdp4zZw75x8bGRmFh4cH+ZaupqWF1XcbExGSwT622tpaXlzc+Pp68JDg4WEJCoqurq8eagxivLisrm52d3dHRMWPGjLKyMtY94UGJioqysLCwsrK6dOkStxe5wZ8GcgoAKpYvX56cnBweHm5packhX/Z2dHTY2dmFh4fHxsYuW7YM63AAoAcOh4uMjLS3t1+yZAnn9LAvLy+fM2dOZ2dndnY25/c4p11JSUl/zRq2bt168ODBM2fO4HA4HA535syZDRs2DB8+HIfDoXe9ffv2befOncrKyoKCgpMnT75x4wZ5W/JW58+fd3NzExcXl5WV9fPzI69QXl6+ZMkSKSkpAoGwdOnSgoICdCshISEEQdatW4fD4cij9G/duqWjoyMoKDhy5Mj169f/+vWL8hC9A0Pl5uYKCgoGBAQgCHL58uUez67PAKgs7y8Mb29vY2NjBEEmTZqEw+G4tPNFXFycmZnZyJEjsQ6ECWxsbDo7O2/evIl1IOCPlpmZaWhoSP4xJSWFSCRaW1tjGBKzSEtLGxsbx8XFkZcYGho2NDS8ePGi56qDLRHV19dPmzZtxIgR6enpg92Wubq6unx8fHA43O7du2HUAOBekFMAUJGRkSEmJjZ37tyamhpsI6murp41a9awYcOys7OxjQQAxhGJxF27duFwuL179/b+lo/N7t27JyUlpaen9+3bN2wjGSxkoPE4lHqMxyH7/fs3giDy8vKJiYlNTU2nT5+2sbEhkUju7u7u7u7fvn37/fv3lStXBAQEiouLe2yF3oX669evkydPIgiSlZWFPqqpqWljY1NbW9vQ0ODu7i4iIkK51YULF8j7SUlJweFwe/bs+fHjx4sXL9TU1AwNDdHPAP0FhlqzZs2RI0dIJJKenh4ej6+srKR8Uv0F0N9yKmFw+3iczs5OAoFw/vx5rANhmtmzZ69atQrrKP4HB77vQwYHvrYfPnxAEOTRo0fkJY6OjvPmzRvsfjhzPA6JRDpz5gyBQOjs7ER/JBKJI0eORP/eUqLnXWlqarKxscHj8Rie+6urq+fMmSMkJBQeHo5JAAAwEeQUAFS8fPly/PjxI0eOvH//PlYx3L17V1paWlVVlcZrCQC4QmhoqKCgoIGBAVa396LfH+DxeDs7u+bmZkxiYAQT6zhr1qyhvvmiRYvWrVvXY6vVq1ejP3Z1dQkLCx84cID0n5unyIF1dnZKS0tTbkVZx1FRUVFXVyf/iI6zePDgAfXAmpubhw0bVlVVRSKRzp49iyDIwYMHyY/2FwCVwKiEwe11nNzcXARBysrKsA6EaXx9fceOHYt1FP+DA9/3IYMDX9vw8HBhYeH29nbyEjk5Oco/QTTi2DoOOqPx48ePyUtsbGzMzMx6rEbPPCAiIiLx8fFnz549cuSIgYEB++dOjo2NnTx58tevXwsKClxcXNh8dACYDnIKACo0NDSeP39uYGBgYmKyY8eOpqYmdh799+/f27ZtMzMzMzIyevr0KVc0NgaARq6urvn5+dXV1ZMnT46Pj2fz0d+8eTNnzpygoKDz58/HxMQw2HOX22loaFBfYfjw4b1vwZ40aRL6Hx4eHikpKXTmBEFBwalTp+7atQttlsnLy1tbW9vnPquqqsrKyubOnUteMn36dARBHjx4QD2wq1evTpkyRVZWFkEQGxsbPj6+iIgI8qP9BdDfclrC4DSPHz9G61wDyszMlJOTGz9+PKtDYhtDQ8PKysry8nKsAxmcqqoqHAUeHp7hw4fPnDnzyJEj6E18A/L29ka3paVPfHp6Og6HKy4uHlSQ1dXVPDw8GzZsGNRWg0VfbJyjqKhoypQp5F7479+/r6qqMjAwwDYqJvrrr79Gjx6dkZFBXjJ9+vSioqIeq9E/n+v69esLCgpaWlomT57s5eXV3NxM965o9+7dO0NDQ0dHRwsLi2fPng14zgOAi0BOAdAfAoEQFxd34cKFy5cvq6mpJSYmsue4CQkJampq0dHR4eHhMTExXDHFOACDMnny5GfPni1ZssTe3t7IyKikpIQNB21qatq5c6eWllZ7e3tBQcHatWvZcFAOh3auofT27VsLC4tRo0bh8Xi0q1FDQ0OPdURFRcn/5+PjIxKJ6P/v3r27dOnSrVu3Dhs2bMGCBY8fP+7zoN++fUMoWuHgcDhpaWkEQSorK6kEhiDI5cuXHRwc0P9LSkqampp++PDh0aNH5BX6C6DP5bSEwWkCAwNHjhy5du3a58+fU1+zsLBwiM0YOG3aNF5e3sLCQqwDGRw5OTkSieTk5ITezdfR0fH69evVq1efPXtWQ0Pj9evXA+4hICDg3bt3LA0S5oCjRUlJiaqqKvnHwsJCPj4+HR0dDENiOl1dXcq/Laqqql+/fv358yflOvTXcRAE0dTUfPz4cXBwcFhY2Pjx44OCglh35fn+/XsXFxdNTc1fv37l5+efP3+e8tQFwNAAOQUAFatXry4pKZk/f/6KFSv09fX/+ecfFh2IRCKlpaXNmDHD1tbWzMyspKRk1apVLDoWAJgjEAhhYWG5ubk/fvzQ0NBYs2YN2n2AFZqamo4fPz5+/PiLFy+ePHny8ePH8P1Bnzo7O42MjD5//pyVlYV2SXByciKRSDRuLiEhcfz48erq6uzs7La2ttmzZ/c5ekJKSgpBEE9Pzx7D9alPLP3p06esrCx0Fm0UehsU5ZCc/gLoczl9YWCrsbGxtbU1IiJCR0dHQ0MjLCysv7GiJSUl3D4Xcg8CAgLjxo0rLS1l9YHa29vRGh8r8PDwyMrKrl69+unTpwiCmJub0zjAiqUiIiKsrKx+/vx5/fp1rGNhty9fvtC4ZmlpKWUdp6SkREFBgTw8Z2hQVVWlTDH0+b5//55yHYbqOAiC8PDwbNy4sbS01M7Obt++ffLy8n5+fp8/f2Zwt2QkEiknJ8fe3v6vv/7KyckJDQ19/PjxtGnTmLV/ADgN5BQAVIwYMeLSpUv5+fnDhg1buHChtrZ2TExMS0sLs/bf0tISExOjra29aNEiSUnJgoKC8PBw9BoDgKFNV1f36dOn58+fz87OVlNTs7e3z83Npb1wMKDKysr9+/crKCj4+vo6ODiUlpZu2LABj2f0g+hQVVFRUVNTY2Njo6amxsPDgyBIe3s7jdt+/fqVfL+Vrq7uhQsXOjo6nj171ntNOTk5NTU19DqWTFNTE+2I0Z+IiAg7OzvKgktTU5OUlFRiYiL65VN/AfS3nHoYnPlLgt6J09XVhSBIcXHxxo0bpaWlXV1de4xS6e7urqiooLzmHBp6XGSyyI8fP2RkZExNTa9cucK6Iou0tPShQ4eqqqrOnz9PXtjn7Gl9GtQ8a9R3+4fPAefo6KisrHzgwAHqXyQ0NzdXV1dT5lSPss7QoKqq+v79++7ubvRHeXl5AQGBnklHR+ud/tTX1+/evVtKSgqPxxsYGFy6dOnr16/07YpIJL58+XLv3r2KiooIgmhpacXFxWE+nwIAbAY5BQAVhYWFlpaWfHx8BALB2dn53r17ra2t9O2qpaXl7t27Tk5OBAKBj4/PysqqqKiIudECwC26urpiYmImT56MIIiSktK+fftevXpF9ySGNTU1Fy9enDt3Lh6PHzFixN69e7luUioqEOb1OabsPUwikdra2kaMGKGhofHmzZvW1ta7d++Ki4trampS2UpJSWnTpk2k/zTvDAoKamxsbGho8PT0FBQULC8v73OrtLQ0Hh6ew4cP19fX19fXb9u2bcKECejf0j4DIxKJSkpKb9++7fEs/P39EQSJiIigEgCVwKiEgTYNTEpKqq+vHzVq1NOnT6m8yOQKlKCgoISEhIyMzIQJE7S1tfX19RcuXGhlZeXo6Ojm5ubl5bVv377g4ODQ0NDIyMjU1NT79+8/evSouLi4vLy8urqaPFNMf/ocYsPHx4cgyKRJk0JDQ3///k0ikSoqKhAEKSgooL43rrN169bp06ez+ijoAA08Ho/H4/n5+a2srFJSUtra2nqvSXsvXvJ9VZQaGxtxOJyBgQH6I5XZ09D7qm7fvj3gmr37c1NZGfWHzwE3Z84cBEF4eXnR65QTJ0702YAfbRNWWFhIXjJ16lQPDw86jsixfY5JJFJeXh6CIB8/fiQvUVRUPHz4MOU6zH9X2tvbU1JSli9fLiAggMPh1NXV3dzc4uLiCgsLm5qaqGz49evXrKyskJAQGxsb9LbY0aNHb9++/eXLl0wPEgAuAjkFABV1dXUnT55E74sWFBQ0NDQ8cOBAWlra+/fvqXwQ7+zsfP/+fVpamp+fn4GBgaCgIIIg06ZNO3XqVH19PTvjB4BjvXjxwsPDQ0ZGBkGQkSNHrlixIiQkJDs7u7a2lspWTU1NhYWFcXFxW7ZsmThxIpqYlpaWN27c6OjoYFvw7IHQXMcRFxcnf7JH75BCxcXFUX7ob2hoID/05MmTWbNmiYqKjhkzxtXV1dLSEl2npqaGcit7e3vKQbtKSkokEunWrVvGxsaSkpJiYmIzZ85EJ346ffo05bHIs/bevXtXV1dXQEBg5MiRdnZ2nz9/7i8wysseymK3l5dXj+uWPgOgsry/MFAbN24UFxcXExPbuHEj9dcZveZMTEwMDQ0NDg4OCAjw8vJyc3Nbu3atlZXVggUL5s2bp62t/ddff8nLy0tISFC5F4NAIEhLSysqKk6ePFlXV9fIyMjCwsLe3t7V1XXnzp0SEhL9bYj20BUSElq7dm1sbCyCIB8+fKDll4SLHDhwQEVFhdVH6XGjDR8fHw6HExERcXBwSE1NpTzFM1jHIZFIkpKSioqK6P+pzJ7Wo44zqHnWqKxMgjng/lPHIScR+nZPmzYtODi4rq6OvBraNYYyp5SUlA4dOkTHETm5joMOvXnx4gV5iaampo+PD+U6OBLzRsz20NTU9H/t3WtUE2ceBvBJALGScLFyExAEmwTFUu60QZEgakOtFqroFtB1ba3UWql4tGK91SpsCy0uWN3WgqBolbUiIIuXRJAVUG6KIAGhVkFEogYSFhBD9sPsZnMAKWhgAJ/fp+TlJfMMYTjMP+8lJydHIBAIhcLr16+TIw/NzMyMjIwYDAaDwdDR0ZFIJFKpVCaT1dXVNTc3EwShq6vL5XK9vLx4PJ6Dg8PwHEsJQAlcUwB9uHPnjlAoFAgEFy9eJFfHHDNmzKRJk/T09PT09Mjln2QyWXNzs0QiuXv37pMnTwiCsLS09PT05PF4PB7PwsKC4nMAGH7kcnlJSQl5cV2+fJkcma+vr29mZsZgMJhMpr6+fmtrq0wmk0qlTU1N9fX1BEFoaWlNnz6dvLLIYgTV5zEoaDTaL7/8snjxYqqDwH8dP348ICBgQHc3XV1dzc3Nra2tbW1tLS0tMpmsra2N/FeKfCCVStva2sjfcPJBS0vLtWvX+j/TLTY2NiQkhEajPdc5DUd79+6NiIjo/4Imz6ehoWHixIk928eMGfPkyRM9Pb2AgICgoCAul3vixIl+vu/Lly9PSUnpuZjRq6++qq+vX1NTU1dXZ2FhsWbNGmXds6mpycjIaPPmzV9//XVlZaWtrW1mZua8efP67nn+/HkfH5+ysjJym8u+OxMEkZSUlJCQQO7R9vDhQ1NTU0tLS9X1UFxdXR8+fBgREfHOO++orj7ea/uAsvXtOa6p5zNr1qzs7OxujeSsUhqNNnv27KVLl/r5+RUVFc2aNauxsZH8iJogCBMTky1btqxZs2agR7x//z75QcXgmTt3bn92N+uJzJaTkzNjxgyyZcaMGQ4ODnv37lX20VRPxt4wGAw+n8/n8wmC6OzsrK2traysrKmpEYvF5J/C1tZWa2tr8p8AExMTFovFZrPJLQwBoCdcUwB9mDRp0rJly5YtW0YQREtLS1VVlUgkun37tlQqlUgk5D9tpqam+vr6TCbTysqKzWazWCxdXV2qgwMMaxoaGs7Ozs7Ozhs2bCAIor6+XiQSVVVV3b9/n7zXffz4sbGx8ZQpUxgMhqGhobW1NYfDsba2JueYAAxzdDrdwMCgj/E1vRo3blwfX9XS0urs7GQymY6OjtnZ2X5+fqOpiEMQBJPJlEgkJ06cGNSj9NygjUR+DNPc3BwfH//3v//d3Nz8Bdd5JCf62dvbEyq7p8XGxqr26bl7Wv979qdzfHx8UFAQ+ZjcAy4tLe3SpUvK2/isrKxdu3atW7cuMDBw9uzZW7dudXNze1b7gLL1x2C/1wRB9LpSuHKBmHPnzmVlZa1atYo8a21tbWUfqVQ6+j4qIDdIVV0WislkdlslahDrOKq0tLTYbPboW4IIgCq4pgD6oKurS955Uh0EYLQxMzMzMzPj8XhUBwGgjEKh6LktNI1G09TU7OzsNDc39/Pzmz9/vqenZ1paWnZ2tnLgwKgxduzYjo4OykeidXZ2EgRRV1dXV1dHEERGRoavr+9zvM7p06cVCgX5Qaly97TIyMi+v6v/Pf+wM7kHnFAoXLFihWp7QkKCso5D7vUWFRWVn58fHh4+c+bMiooKGxubXtsHlK0/huC97vuDZ7Kg097eTo7Z2bNnz86dO8l5kR0dHaplndGBPCPVvzNjx47t9mcHMywAAAAAAAD6hVyAmXysoaFBo9HodDqXy42MjKyurr57925MTMzs2bO1tLR0dHQIgiC38RpNpFKprq7u8y380X99z9si7+GNjY3Xrl27Y8cOgiCer4jT2NgYHh5uYWGxatUqYiCbuA1on7W+Ow//PeAG+71WKBRTpkx51tE1NDTodLqWlhafzw8PDycIYvPmzcrFrXR0dEbfJUaOTlIdZySTychBOkqo4wAAAAAAAPSLcgIIk8lcvHhxcnLyw4cPL126FBoa2u1etOfkiNFBKpV2u6UcMuR+Rrq6ugEBAefOnWtoaIiJiel1+7C+yeXy+vr6n3/+2cXFhU6nZ2RkKM8oKioqJycnIiJCLBaLxeLPP//86dOnCxYs6PkiffQkF16prKwUi8WmpqaFhYXP6qxQKJKSksjyhJKOjk5oaKhMJktJSSFbbty48d1337W0tEgkkgMHDowdO9bFxaWP9gFlG+hPb2iQS4bT6fSZM2fGx8c/fPgwIyODHDbV94SjUYA8I9W5/y0tLajjAAAAAAAAPA+FQhEWFnbx4sVHjx4lJycvWbJEX1+/156o46iLpqYmnU7X1tZesGDB6dOnxWJxYmLi7Nmz+7/wUF1dHY1GO3ToUGtrK7kd0vTp0w8ePLhmzZrr168rR7UQBMHn88+cOZOammpubm5nZ9fY2JiVlTV27NhNmzbZ2toSBPH2228HBgb20ZMgCFtb25CQkJUrV9rY2Pj5+Tk7O/faWSKR0On0mpqaqVOnlpaWKjNs2rSJrOwsX7583rx5JiYm6enpmZmZ1tbWlpaWly9fzsjIsLa2flb7QLOp7X1SB+VmVS4uLlFRUQ0NDQKBIDg4mPyV63lN6erqjspLjPjfySpbul10Q7Q+DgAAAAAAwEhnbGz8zTff9KeniYkJQRD19fXPMWBkOKuvrydPbWiQE2qCgoJ8fX3JSsRzMDc3V/R706U5c+bMmTOnW2NERERERER/epLi4uLIHcT77txrqp7H8vX17XXi2LPaB5pt+Jg2bdqyZcsCAgJ63UVUT0+PIAiJRKJsMTY2JvdJHE3IM1K9yiQSCXnuSqjjAAAAAAAAqJmhoeH48eNFIpG3tzfVWdRJJBKpDmAZJHQ6fc6cOUuXLn3vvfe63cHC6MPhcDw9PZcuXdp30dPMzExbW/vWrVvu7u5kC5vNFolEQ5Jx6FRWVk6YMOHVV18ln7a2tjY0NJAjrZRQxwEAAAAAAFA/FotVVVVFdQo1E4lE/v7+g30UY2PjrKyswT4KDBP79+/vTzcNDQ0bGxvVa4rNZp8+fXrQclGjqqpKdVfi6upqhULRrcKF9XEAAAAAAADUj8PhlJeXU51CncRi8YMHD0bZTDEYQboNwOFwOA0NDY8ePaIwktqVl5er1nFEIpGmpubkyZNV+6COAwAAAAAAoH5vvfXW5cuXnzx5QnUQtbl48aKGhoabmxvVQeAlxeFwKioqlE/ffPNNDQ2NnJwcCiOpV0dHR35+PpfLVbZUVFRYW1srt1onoY4DAAAAAACgfjwe79///veVK1eoDqI2AoHAycnpWVt0AQw2d3f38vJysVhMPtXX17e3txcKhdSmUqO8vLy2tjYej6dsycnJeeutt7p1Qx0HAAAAAABA/WxsbCZNmiQQCKgOojYCgcDLy4vqFPDy8vT0pNPp2dnZyhYej3fhwgUKI6mXQCCwtra2srIin7a3t+fn5/e86FDHAQAAAAAAGBR8Pj8lJYXqFOpx48YNkUj0rI2uAYaAnp6eo6Oj6gAcPp9fXl5+8+ZNClOpUUpKCp/PVz7Nzc1tb29XHZ5DQh0HAAAAAABgUAQGBpaVlZWWllIdRA0SExMtLS09PDyoDgIvNR6Pp7qXmaenp4WFxeHDhymMpC6FhYU3b94MCgpStpw9e5bFYpmbm3friToOAAAAAADAoOByuSwWKykpieogL6qrq+vo0aNBQUE0Go3qLPBSe//992/dulVQUEA+pdPpgYGBhw4dksvl1AZ7cUlJSa+99pqLiwv5tKur69ixY4sWLerZE3UcAAAAAACAwRIUFHTo0CGZTEZ1kBeSmpp679491ZECAJRwdna2s7NTrY0uW7bs3r176enpFKZ6cVKp9PDhw8uXL1eWSoVC4d27dwMDA3t2Rh0HAAAAAABgsISEhDx58uTAgQNUB3khu3fvXrhwIYvFojoIAPHBBx8cPXq0o6ODfMpms999993du3dTm+oF7du3r7Ozc/Xq1cqWpKQkV1dXDofTs7PmEAYDAAAAAAB4uYwfP37VqlXffvttSEjIK6+8QnWc55GZmVlYWPjDDz9QHQSAIAgiMDDwyy+/TElJ+eCDD8iW8PBwV1fX8+fPz549uz+vYGBgkJaWNpgZCSMjo/53bm9vj4mJ+eSTTwwMDMgWsVickpISGRnZa3+aQqFQQ0YAAAAAgJcJVgkZnobn3U1DQ4ONjc2OHTs2bNhAdZYBk8vlbm5uxsbGGRkZVGfpxfHjxwMCAobn+z7SDeefbWBgYHFx8Y0bN+j0/84xmjt3rkQiycvLU7aMIHv27Nm1a9dvv/2mrP5s2bJl//79t2/fZjAYPftjPA4AAAAAwID98ssvVEeAEcPU1HTjxo3bt29fvHixpaUl1XEG5sCBA9euXSsuLqY6CMD/hYeH29nZnT59euHChWRLdHS0g4PDTz/99NFHH1GbbaDu3r379ddfh4eHK4s4LS0tcXFxGzZs6LWIQ2A8DgAAAAAAwGDr6Oiwt7efPn36iRMnqM4yAA8ePOBwOB999FFERATVWXo3nMeMjHTD/Gfr7+9/586dK1euKEdHrl+/PiEhobKy0tDQkNpsA/Lee++Vl5eXlZVpa2uTLbt27YqKirp9+7aenl6v3zLyRhwBAAAAAACMLNra2jExMf/4xz9G0EguhUKxatUqJpP55ZdfUp0FoLutW7eWlJQcOnRI2bJ9+/Zx48apLhU8/CUnJ6empu7bt09ZxKmrq4uMjFy/fv2zijgE6jgAAAAAAABDYO7cuZ988snKlStFIhHVWfolJiYmLS0tPj5eR0eH6iwA3dnb24eEhISFhYnFYrKFyWQePnz41KlTsbGx1Gbrp1u3bq1evfqzzz5TXZ45NDTUxMQkLCysj29EHQcAAAAAAGAofPvtt2w2e+nSpe3t7VRn+QMFBQUbN27cuXMnj8ejOgtA73bt2qWtra06XszT03Pbtm1hYWGFhYUUBuuPtrY2f39/NputuinVuXPnUlJSYmJixo4d28f3Yn0cAAAAAACAIVJTU+Pq6jpz5syUlBQNDQ2q4/SupqaGy+U6Ojqmp6cP891/yDVcRtBstREkLy/v+++/H+YVgyNHjgQHB//zn//08fEhW7q6uvh8/vXr1//1r39NnjyZ2njP8vTpU39//9zc3MLCQmXIx48fOzg4uLi4/OEqWqjjAAAAAAAADJ2CggJvb29/f/+EhIRhuIF9U1OTh4eHrq6uQCBgMplUx/kDZB2H6hSj2fCvGAQFBZ09e7akpGTixIlki1Qq9fLykkgkubm5JiYm1MbrSaFQfPjhh8nJyefOneNyucpGf3//q1evlpSUTJgwoe9XQB0HAAAAAABgSKWlpfn5+X366adRUVHDqpTT2Ng4b9681tbW3Nxc5S7IAMOZTCZzcXExNja+cOGCcoxbY2Ojh4cHg8HIysoaVr/JCoXi888/j42NPXXqlK+vr7I9Ojp648aNAoFgxowZf/giw3qMHAAAAAAAwOgzf/78pKSkuLi45cuXd3Z2Uh3nv2praz08PFpbW8+ePTusbn0B+sBgMI4dO1ZQUKC6NrCxsfHZs2dlMpmHh8dvv/1GYTxVnZ2dwcHB+/btO3z4sGoR5/z585s2bfrqq6/6U8QhUMcBAAAAAAAYekuWLElLSzt58uTChQubm5upjkNcuXKFy+Xq6+vn5uZaWVlRHQdgAOzt7RMSEvbu3au6ZvDkyZNzc3OZTCaXyx0Oyx5LJJL58+enpqZmZGSoTgYsLi728/NbvHjxxo0b+/lSqOMAAAAAAABQYM6cOQKBoKSkxMnJqaioiKoYCoUiJiZmxowZDg4OQqEQI3FgJAoICIiNjf3iiy8OHjyobDQ2NhYKha+//rqHh8ff/vY3CuNdvXrV0dGxrKxMKBSq7jJeW1vr6+vr4uJy8ODB/k+xRB0HAAAAAACAGi4uLiUlJZMnT+Zyud9//71cLh/iAA8ePPDz8wsLC9u2bVt6ejqDwRjiAADqsnr16s2bN3/88cfx8fHKRl1d3TNnzoSHh4eGhvr7+zc1NQ1xKrlcHh0d7eHhwWKxSktLnZyclF+qrKzk8XgWFhapqana2tr9f02N7du3qz8pAAAAAAAA9AODwQgsMhr+AAAGDElEQVQMDKTRaFu2bElLS3vjjTfMzMyG4LhyuXz//v1+fn6PHj06deoUmWEIjgsweHg8nra29tq1axUKxaxZs8hGGo3m6ek5c+bMuLi47777Tk9Pz9HRcWh+2/Pz8xcuXHj06NFt27b98MMPqnXSq1ev+vj4mJubnzlzRl9ff0Avi/E4AAAAAAAAVKLT6Vu2bLl27Zquru6bb775l7/8pba2dlCPmJmZ6ebmtm7dug8//LCiomLmzJmDejiAIbNx48aYmJivvvpq3bp1qgPcZs2aVVFRsWLFirVr17q5uWVlZQ1qjJqamhUrVnC5XAMDg2vXrm3evJlO/3/5JT093cvLy93dXSgU/uEu4z2hjgMAAAAAAEA9W1vbCxcuJCUlXbx4kc1mBwcHV1RUqPcQXV1dv/76q7OzM5/PNzY2Li0tjYyM1NHRUe9RAKj16aefJicnHzhwwNvb+969e8p2BoPxzTfflJSUTJgwYd68eS4uLqdOnerq6lLv0SsqKoKDgzkcTk5OzpEjRy5cuMDhcJRfffr0aXh4+IIFC5YsWXLy5Mlx48Y9xyFQxwEAAAAAABgWaDTan/70p+rq6uTk5KKiomnTpjk7O8fExLz4oh4VFRXbt2+fMmWKv7+/qalpQUFBRkbG1KlT1RIbYLgJCAgoKioSi8X29vaZmZmqX5o2bVpmZmZpaamtre37779vYWHx2WeflZSUvOARJRJJYmKij4+PnZ1dcXHxwYMHKysrlyxZotqnvr6ex+NFR0dHR0f/9NNPmpqaz3csmkKheMG4AAAAAAAAoF5dXV3nz59PSkr69ddfOzs73d3deTwej8dzdXXt55KoYrE4OztbIBBcuHBBJBJZWVkFBgYGBwe/9tprgx0eYDiQSqUff/zxsWPHVq5cuWfPnvHjx3frUFVVlZiYePjw4d9//53D4Xh7e3t5eXl6evZzrlNHR8eVK1cEAoFAIMjLyxszZoyfn19QUJC3t7fqLCqCILq6un788cfNmzcbGRkdP358+vTpL3JeqOMAAAAAAAAMXzKZ7PTp0+fOnRMKhb///rumpqaVlRWLxWKxWIaGhoz/kUgkLS0tMpmsvr6+qqqqsrLywYMHGhoaTk5OPB6Pz+d7eHhgJWN4CR09enT9+vWdnZ2RkZF//vOfe14FXV1dly5dyszMFAgExcXFcrncyMiIw+Gw2eyJEycymUwmk6mvry/7nwcPHlRXV4tEotu3b8vlcisrKy8vLx8fn/nz5/e641tRUVFISEhJScnatWt37Njx4jMZUccBAAAAAAAYGWpqaoqKisgyTW1tbVNTk/Le0sDAgMlkMhgMExMTNpvNZrM5HI67u7uenh7VqQEo1tLSsnXr1ri4uNdffz08PHzhwoXdxssoSSSSgoKCmzdvikSiqqqq+/fvy2QyqVT6+PFjZc3U0NDQxsaGw+GwWCwnJydra+tnHffGjRu7d+8+fvw4l8uNi4uzs7NTy+mgjgMAAAAAAAAAo1xZWdnOnTtPnjzJ4XC++OKLRYsW9XOK4nMoKCiIiIhITU21s7PbsmXLokWL1DgaDnUcAAAAAAAAAHgp1NTU/PWvf/35558ZDMb8+fODg4O9vb3VVWSpr69PSUlJSEgoLS194403QkNDAwMDnzX257mhjgMAAAAAAAAAL5H6+vojR44kJiaWl5fb2Nj4+PjweLxZs2YZGhoO9KU6Ojry8vLIBcXz8/MNDAyWLFkSFBTk5uY2CMEJAnUcAAAAAAAAAHg5FRcXp6SkCIXCwsJCuVxua2s7depUFovFZrOnTJliYGBAroljYGCgXItKIpHcuXOnqqqKXKmqtLS0ra3N2tqax+O98847b7/99pgxYwY1M+o4AAAAAAAAAPBSk0ql2dnZeXl5IpFIJBJVV1d3dHQ8qzONRrO0tCTLPY6Ojl5eXpaWlkMWFXUcAAAAAAAAAID/k8vl9+7da25uJsfgPH78WEdHhxybo6+vb2pq+sorr1CVDXUcAAAAAAAAAICRQc3LJgMAAAAAAAAAwCBBHQcAAAAAAAAAYGRAHQcAAAAAAAAAYGT4D9D731X6hs6CAAAAAElFTkSuQmCC", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[{'alignment': [('InitializeAsset', '>>'), ('>>', 'createAsset'), ('>>', 'lockAsset'), ('CreateAsset', 'CreateAsset'), ('LockAsset', '>>'), ('TransferAsset', 'TransferAsset'), ('>>', None), ('TransferAsset', 'TransferAsset'), ('DeleteAsset', 'DeleteAsset')], 'cost': 40001, 'visited_states': 9, 'queued_states': 23, 'traversed_arcs': 24, 'lp_solved': 2, 'fitness': 0.6363636363636364, 'bwc': 110000}, {'alignment': [('InitializeAsset', '>>'), ('>>', 'createAsset'), ('>>', 'lockAsset'), ('CreateAsset', 'CreateAsset'), ('LockAsset', '>>'), ('TransferAsset', 'TransferAsset'), ('>>', None), ('TransferAsset', 'TransferAsset'), ('DeleteAsset', 'DeleteAsset')], 'cost': 40001, 'visited_states': 9, 'queued_states': 23, 'traversed_arcs': 24, 'lp_solved': 2, 'fitness': 0.6363636363636364, 'bwc': 110000}]\n" + ] + } + ], + "source": [ + "\n", + "log = import_csv_original(file_path)\n", + "log_other_model = import_csv_original(file_path_other_model)\n", + "\n", + "net, initial_marking, final_marking = pm4py.discover_petri_net_inductive(log)\n", + "\n", + "gviz = pn_visualizer.apply(net, initial_marking, final_marking)\n", + "pn_visualizer.view(gviz)\n", + "\n", + "aligned_traces = pm4py.conformance_diagnostics_alignments(log_other_model, net, initial_marking, final_marking)\n", + "\n", + "print(aligned_traces)\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + }, + "vscode": { + "interpreter": { + "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/fixtures/python/process mining.ipynb b/packages/cactus-plugin-ccmodel-hephaestus/src/test/fixtures/python/process mining.ipynb new file mode 100644 index 0000000000..460facfb36 --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/fixtures/python/process mining.ipynb @@ -0,0 +1,286 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['/usr/local/lib/python3.8/dist-packages/ipykernel_launcher.py', '-f', '/home/bruno/.local/share/jupyter/runtime/kernel-2fed1eb2-9dc1-47ec-b7f2-f355b444c690.json']\n", + "/home/bruno/Documentos/blockchain-integration-framework/packages/cactus-plugin-ccmodel-hephaestus/src/test/fixtures/../csv/use-case-besu-fabric-6-events.csv\n" + ] + } + ], + "source": [ + "import os\n", + "path = os.getcwd()\n", + "parent = os.path.dirname(path)\n", + "\n", + "\n", + "# Change path if necessary\n", + "file_path = parent + \"/../csv/example-dummy-6-events.csv\"\n", + "file_path_other_model = parent + \"/../csv/example-dummy-ethereum-4-events.csv\"\n", + "\n", + "import sys\n", + "\n", + "if __name__ == '__main__':\n", + " print(sys.argv)\n", + " print(file_path)\n", + "\n", + "\n", + "\n", + "# import sys\n", + "\n", + "# accept command line arguments\n", + "# inputArg1 = sys.argv[1]\n", + "\n", + "#print('inputArg1: ',inputArg1)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "# uncomment if problems with dependencies\n", + "#%pip install pm4py\n", + "#%pip install pandas\n", + "import pm4py\n", + "import datetime as dt\n", + "import time\n", + "import pandas\n", + "\n", + "# process mining\n", + "from pm4py.algo.discovery.alpha import algorithm as alpha_miner\n", + "from pm4py.algo.discovery.inductive import algorithm as inductive_miner\n", + "from pm4py.algo.discovery.heuristics import algorithm as heuristics_miner\n", + "from pm4py.algo.discovery.dfg import algorithm as dfg_discovery\n", + "\n", + "# viz\n", + "from pm4py.visualization.petri_net import visualizer as pn_visualizer\n", + "from pm4py.visualization.process_tree import visualizer as pt_visualizer\n", + "from pm4py.visualization.heuristics_net import visualizer as hn_visualizer\n", + "from pm4py.visualization.dfg import visualizer as dfg_visualization\n", + "\n", + "from pm4py.objects.conversion.process_tree import converter as pt_converter\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "def import_csv_original(file_path):\n", + " event_log = pandas.read_csv(file_path, sep=';')\n", + " event_log = pm4py.format_dataframe(event_log, case_id='caseID', activity_key='methodName', timestamp_key='timestamp')\n", + " return event_log\n", + "\n", + "def getStartActivities(event_log):\n", + " s = pm4py.get_start_activities(event_log)\n", + " print(\"Start activities: {}\\n\".format(s))\n", + " return s\n", + "def getEndActivities(event_log):\n", + " e = pm4py.get_end_activities(event_log)\n", + " print(\"End activities: {}\\n\".format(e))\n", + " return (e)\n", + "\n", + "def getAttributeFromLog(event_log, attr):\n", + " entries = pm4py.get_event_attribute_values(event_log,attr)\n", + " print(\"Entries: {}\\n\".format(entries))\n", + " return entries" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/home/bruno/Documentos/blockchain-integration-framework/packages/cactus-plugin-ccmodel-hephaestus/src/test/fixtures/../csv/use-case-besu-fabric-6-events.csv\n" + ] + }, + { + "ename": "FileNotFoundError", + "evalue": "[Errno 2] No such file or directory: '/home/bruno/Documentos/blockchain-integration-framework/packages/cactus-plugin-ccmodel-hephaestus/src/test/fixtures/../csv/use-case-besu-fabric-6-events.csv'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[4], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28mprint\u001b[39m(file_path)\n\u001b[0;32m----> 2\u001b[0m log \u001b[38;5;241m=\u001b[39m \u001b[43mimport_csv_original\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfile_path\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3\u001b[0m log_other_model \u001b[38;5;241m=\u001b[39m import_csv_original(file_path_other_model)\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28mprint\u001b[39m(log)\n", + "Cell \u001b[0;32mIn[3], line 2\u001b[0m, in \u001b[0;36mimport_csv_original\u001b[0;34m(file_path)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mimport_csv_original\u001b[39m(file_path):\n\u001b[0;32m----> 2\u001b[0m event_log \u001b[38;5;241m=\u001b[39m \u001b[43mpandas\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread_csv\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfile_path\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msep\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m;\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3\u001b[0m event_log \u001b[38;5;241m=\u001b[39m pm4py\u001b[38;5;241m.\u001b[39mformat_dataframe(event_log, case_id\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcaseID\u001b[39m\u001b[38;5;124m'\u001b[39m, activity_key\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmethodName\u001b[39m\u001b[38;5;124m'\u001b[39m, timestamp_key\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtimestamp\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m event_log\n", + "File \u001b[0;32m~/.local/lib/python3.8/site-packages/pandas/io/parsers/readers.py:912\u001b[0m, in \u001b[0;36mread_csv\u001b[0;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, date_format, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options, dtype_backend)\u001b[0m\n\u001b[1;32m 899\u001b[0m kwds_defaults \u001b[38;5;241m=\u001b[39m _refine_defaults_read(\n\u001b[1;32m 900\u001b[0m dialect,\n\u001b[1;32m 901\u001b[0m delimiter,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 908\u001b[0m dtype_backend\u001b[38;5;241m=\u001b[39mdtype_backend,\n\u001b[1;32m 909\u001b[0m )\n\u001b[1;32m 910\u001b[0m kwds\u001b[38;5;241m.\u001b[39mupdate(kwds_defaults)\n\u001b[0;32m--> 912\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_read\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilepath_or_buffer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/.local/lib/python3.8/site-packages/pandas/io/parsers/readers.py:577\u001b[0m, in \u001b[0;36m_read\u001b[0;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[1;32m 574\u001b[0m _validate_names(kwds\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnames\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m))\n\u001b[1;32m 576\u001b[0m \u001b[38;5;66;03m# Create the parser.\u001b[39;00m\n\u001b[0;32m--> 577\u001b[0m parser \u001b[38;5;241m=\u001b[39m \u001b[43mTextFileReader\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilepath_or_buffer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 579\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m chunksize \u001b[38;5;129;01mor\u001b[39;00m iterator:\n\u001b[1;32m 580\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m parser\n", + "File \u001b[0;32m~/.local/lib/python3.8/site-packages/pandas/io/parsers/readers.py:1407\u001b[0m, in \u001b[0;36mTextFileReader.__init__\u001b[0;34m(self, f, engine, **kwds)\u001b[0m\n\u001b[1;32m 1404\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhas_index_names\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m kwds[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhas_index_names\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[1;32m 1406\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles: IOHandles \u001b[38;5;241m|\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m-> 1407\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_engine \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_engine\u001b[49m\u001b[43m(\u001b[49m\u001b[43mf\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mengine\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/.local/lib/python3.8/site-packages/pandas/io/parsers/readers.py:1661\u001b[0m, in \u001b[0;36mTextFileReader._make_engine\u001b[0;34m(self, f, engine)\u001b[0m\n\u001b[1;32m 1659\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m mode:\n\u001b[1;32m 1660\u001b[0m mode \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m-> 1661\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles \u001b[38;5;241m=\u001b[39m \u001b[43mget_handle\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1662\u001b[0m \u001b[43m \u001b[49m\u001b[43mf\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1663\u001b[0m \u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1664\u001b[0m \u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mencoding\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1665\u001b[0m \u001b[43m \u001b[49m\u001b[43mcompression\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mcompression\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1666\u001b[0m \u001b[43m \u001b[49m\u001b[43mmemory_map\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mmemory_map\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1667\u001b[0m \u001b[43m \u001b[49m\u001b[43mis_text\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mis_text\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1668\u001b[0m \u001b[43m \u001b[49m\u001b[43merrors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mencoding_errors\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mstrict\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1669\u001b[0m \u001b[43m \u001b[49m\u001b[43mstorage_options\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mstorage_options\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1670\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1671\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 1672\u001b[0m f \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles\u001b[38;5;241m.\u001b[39mhandle\n", + "File \u001b[0;32m~/.local/lib/python3.8/site-packages/pandas/io/common.py:859\u001b[0m, in \u001b[0;36mget_handle\u001b[0;34m(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)\u001b[0m\n\u001b[1;32m 854\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(handle, \u001b[38;5;28mstr\u001b[39m):\n\u001b[1;32m 855\u001b[0m \u001b[38;5;66;03m# Check whether the filename is to be opened in binary mode.\u001b[39;00m\n\u001b[1;32m 856\u001b[0m \u001b[38;5;66;03m# Binary mode does not support 'encoding' and 'newline'.\u001b[39;00m\n\u001b[1;32m 857\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ioargs\u001b[38;5;241m.\u001b[39mencoding \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m ioargs\u001b[38;5;241m.\u001b[39mmode:\n\u001b[1;32m 858\u001b[0m \u001b[38;5;66;03m# Encoding\u001b[39;00m\n\u001b[0;32m--> 859\u001b[0m handle \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mopen\u001b[39;49m\u001b[43m(\u001b[49m\n\u001b[1;32m 860\u001b[0m \u001b[43m \u001b[49m\u001b[43mhandle\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 861\u001b[0m \u001b[43m \u001b[49m\u001b[43mioargs\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 862\u001b[0m \u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mioargs\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mencoding\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 863\u001b[0m \u001b[43m \u001b[49m\u001b[43merrors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43merrors\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 864\u001b[0m \u001b[43m \u001b[49m\u001b[43mnewline\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 865\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 866\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 867\u001b[0m \u001b[38;5;66;03m# Binary mode\u001b[39;00m\n\u001b[1;32m 868\u001b[0m handle \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mopen\u001b[39m(handle, ioargs\u001b[38;5;241m.\u001b[39mmode)\n", + "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/home/bruno/Documentos/blockchain-integration-framework/packages/cactus-plugin-ccmodel-hephaestus/src/test/fixtures/../csv/use-case-besu-fabric-6-events.csv'" + ] + } + ], + "source": [ + "print(file_path)\n", + "log = import_csv_original(file_path)\n", + "log_other_model = import_csv_original(file_path_other_model)\n", + "print(log)\n", + "print(\"lenght is\", len(log))\n", + "print(log_other_model)\n", + "print(\"lenght is\", len(log_other_model))\n", + "startAct = getStartActivities(log)\n", + "endAct = getEndActivities(log)\n", + "timestamps = getAttributeFromLog(log, \"timestamp\")\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Install graphviz, if not done already\n", + "Open a terminal window and intall graphviz with:\n", + "`sudo apt install graphviz`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "#Another way to discover the tree\n", + "# # create the process tree\n", + "#tree = inductive_miner.apply_tree(log)\n", + "\n", + "# viz\n", + "#gviz = pt_visualizer.apply(tree)\n", + "#pt_visualizer.view(gviz)# convert the process tree to a petri net\n", + "\n", + "start_time = time.perf_counter()\n", + "process_tree = pm4py.discover_process_tree_inductive(log)\n", + "print(process_tree)\n", + "end_time = time.perf_counter()\n", + "pm4py.view_process_tree(process_tree)\n", + "\n", + "parameters = {pn_visualizer.Variants.FREQUENCY.value.Parameters.FORMAT: \"png\"}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "dfg, start_activities, end_activities = pm4py.discover_dfg(log)\n", + "pm4py.view_dfg(dfg, start_activities, end_activities)\n", + "\n", + "map = pm4py.discover_heuristics_net(log)\n", + "print(map)\n", + "pm4py.view_heuristics_net(map)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "# heuristics miner\n", + "net, im, fm = heuristics_miner.apply(log)\n", + "\n", + "# viz\n", + "gviz = pn_visualizer.apply(net, im, fm)\n", + "pn_visualizer.view(gviz)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + }, + "vscode": { + "interpreter": { + "hash": "994fd3bf715f7d00910c6929cedf6117267fec036ef9d2716f71f2b8e3dc9b3e" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/fixtures/python/process_conformance.ipynb b/packages/cactus-plugin-ccmodel-hephaestus/src/test/fixtures/python/process_conformance.ipynb new file mode 100644 index 0000000000..c6c5ef6fd5 --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/fixtures/python/process_conformance.ipynb @@ -0,0 +1,186 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['/usr/local/lib/python3.8/dist-packages/ipykernel_launcher.py', '-f', '/home/bruno/.local/share/jupyter/runtime/kernel-85cfe7fb-4cec-4b85-affb-ff95bb09e084.json']\n", + "/home/bruno/Documentos/blockchain-integration-framework/packages/cactus-plugin-cc-tx-visualization/src/test/fixtures\n", + "/home/bruno/Documentos/blockchain-integration-framework/packages/cactus-plugin-cc-tx-visualization/src/test/fixtures/../csv/use-case-besu-fabric-6-events.csv\n" + ] + } + ], + "source": [ + "import os\n", + "# uncomment if problems with dependencies\n", + "# %pip install pm4py\n", + "# %pip install pandas\n", + "import pm4py\n", + "import datetime as dt\n", + "import time\n", + "import pandas\n", + "\n", + "from pm4py.visualization.petri_net import visualizer as pn_visualizer\n", + "\n", + "path = os.getcwd()\n", + "parent = os.path.dirname(path)\n", + "\n", + "# Change path if necessary \n", + "file_path = parent + \"/../csv/example-dummy-6-events.csv\"\n", + "file_path_other_model = parent + \"/../csv/example-dummy-ethereum-4-events.csv\"\n", + "\n", + "import sys\n", + "\n", + "if __name__ == '__main__':\n", + " print(sys.argv)\n", + " print(parent)\n", + " print(file_path)\n", + "\n", + "\n", + "\n", + "# import sys\n", + "\n", + "# accept command line arguments\n", + "# inputArg1 = sys.argv[1]\n", + "\n", + "#print('inputArg1: ',inputArg1)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "def import_csv_original(file_path):\n", + " event_log = pandas.read_csv(file_path, sep=';')\n", + " event_log = pm4py.format_dataframe(event_log, case_id='caseID', activity_key='methodName', timestamp_key='timestamp')\n", + " return event_log\n", + "\n", + "def getStartActivities(event_log):\n", + " s = pm4py.get_start_activities(event_log)\n", + " print(\"Start activities: {}\\n\".format(s))\n", + " return s\n", + "def getEndActivities(event_log):\n", + " e = pm4py.get_end_activities(event_log)\n", + " print(\"End activities: {}\\n\".format(e))\n", + " return (e)\n", + "\n", + "def getAttributeFromLog(event_log, attr):\n", + " entries = pm4py.get_event_attribute_values(event_log,attr)\n", + " print(\"Entries: {}\\n\".format(entries))\n", + " return entries\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[{'alignment': [('InitializeAsset', '>>'), ('>>', 'createAsset'), ('>>', 'lockAsset'), ('CreateAsset', 'CreateAsset'), ('LockAsset', '>>'), ('TransferAsset', 'TransferAsset'), ('>>', None), ('TransferAsset', 'TransferAsset'), ('DeleteAsset', 'DeleteAsset')], 'cost': 40001, 'visited_states': 9, 'queued_states': 23, 'traversed_arcs': 24, 'lp_solved': 2, 'fitness': 0.6363636363636364, 'bwc': 110000}, {'alignment': [('InitializeAsset', '>>'), ('>>', 'createAsset'), ('>>', 'lockAsset'), ('CreateAsset', 'CreateAsset'), ('LockAsset', '>>'), ('TransferAsset', 'TransferAsset'), ('>>', None), ('TransferAsset', 'TransferAsset'), ('DeleteAsset', 'DeleteAsset')], 'cost': 40001, 'visited_states': 9, 'queued_states': 23, 'traversed_arcs': 24, 'lp_solved': 2, 'fitness': 0.6363636363636364, 'bwc': 110000}]\n" + ] + } + ], + "source": [ + "\n", + "log = import_csv_original(file_path)\n", + "log_other_model = import_csv_original(file_path_other_model)\n", + "\n", + "net, initial_marking, final_marking = pm4py.discover_petri_net_inductive(log)\n", + "\n", + "aligned_traces = pm4py.conformance_diagnostics_alignments(log_other_model, net, initial_marking, final_marking)\n", + "\n", + "print(aligned_traces)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[{'alignment': [('InitializeAsset', '>>'), ('>>', 'createAsset'), ('>>', 'lockAsset'), ('CreateAsset', 'CreateAsset'), ('LockAsset', '>>'), ('TransferAsset', 'TransferAsset'), ('>>', None), ('TransferAsset', 'TransferAsset'), ('DeleteAsset', 'DeleteAsset')], 'cost': 40001, 'visited_states': 9, 'queued_states': 23, 'traversed_arcs': 24, 'lp_solved': 2, 'fitness': 0.6363636363636364, 'bwc': 110000}, {'alignment': [('InitializeAsset', '>>'), ('>>', 'createAsset'), ('>>', 'lockAsset'), ('CreateAsset', 'CreateAsset'), ('LockAsset', '>>'), ('TransferAsset', 'TransferAsset'), ('>>', None), ('TransferAsset', 'TransferAsset'), ('DeleteAsset', 'DeleteAsset')], 'cost': 40001, 'visited_states': 9, 'queued_states': 23, 'traversed_arcs': 24, 'lp_solved': 2, 'fitness': 0.6363636363636364, 'bwc': 110000}]\n" + ] + } + ], + "source": [ + "\n", + "log = import_csv_original(file_path)\n", + "log_other_model = import_csv_original(file_path_other_model)\n", + "\n", + "net, initial_marking, final_marking = pm4py.discover_petri_net_inductive(log)\n", + "\n", + "gviz = pn_visualizer.apply(net, initial_marking, final_marking)\n", + "pn_visualizer.view(gviz)\n", + "\n", + "aligned_traces = pm4py.conformance_diagnostics_alignments(log_other_model, net, initial_marking, final_marking)\n", + "\n", + "print(aligned_traces)\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + }, + "vscode": { + "interpreter": { + "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-basic-test.json b/packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-basic-test.json new file mode 100644 index 0000000000..c09113c41f --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-basic-test.json @@ -0,0 +1,18 @@ +[ + { + "caseID": "basic-TEST", + "receiptID": "txID1", + "blockchainID": "FABRIC_2", + "invocationType": "FabricContractInvocationType.SEND", + "methodName": "methodName2", + "parameters": [ + "0", + "2" + ], + "timestamp": "2024-05-27T09:05:43.640Z", + "identity": "person 1", + "cost": 0, + "carbonFootprint": 0.00018, + "latency": 4 + } +] \ No newline at end of file diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-besu-4-events.json b/packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-besu-4-events.json new file mode 100644 index 0000000000..be97efbdd9 --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-besu-4-events.json @@ -0,0 +1,63 @@ +[ + { + "caseID": "BESU_MONITORING", + "receiptID": "0xe6800f6ff8d1a8ea5ee677dbb9320f849d28a8a533608affea5ef138be088736", + "blockchainID": "BESU_2X", + "invocationType": "SEND", + "methodName": "createAsset", + "parameters": [ + "e59eeb10-ab45-4d44-95b3-f4ecbabd3f3b", + 10 + ], + "timestamp": "2024-05-27T09:34:25.795Z", + "identity": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "cost": 91441, + "carbonFootprint": 0.00018, + "latency": 3457 + }, + { + "caseID": "BESU_MONITORING", + "receiptID": "0x320482edd9e264453bbd7dee3826b7f9960fcaa27ce70398e21eee9be14423aa", + "blockchainID": "BESU_2X", + "invocationType": "SEND", + "methodName": "lockAsset", + "parameters": [ + "e59eeb10-ab45-4d44-95b3-f4ecbabd3f3b" + ], + "timestamp": "2024-05-27T09:34:27.303Z", + "identity": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "cost": 30543, + "carbonFootprint": 0.00018, + "latency": 1953 + }, + { + "caseID": "BESU_MONITORING", + "receiptID": "0x99ae2b0951af4d674734bdc8ba21838eb2df3aefa7d2bc54f51c12ad713c06b5", + "blockchainID": "BESU_2X", + "invocationType": "SEND", + "methodName": "isPresent", + "parameters": [ + "e59eeb10-ab45-4d44-95b3-f4ecbabd3f3b" + ], + "timestamp": "2024-05-27T09:34:28.641Z", + "identity": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "cost": 25157, + "carbonFootprint": 0.00018, + "latency": 615 + }, + { + "caseID": "BESU_MONITORING", + "receiptID": "0xd2da2adaf8f4e39dbd55ff8b42179efd67d402c58a61cdd30ca8d142be955f5c", + "blockchainID": "BESU_2X", + "invocationType": "SEND", + "methodName": "deleteAsset", + "parameters": [ + "e59eeb10-ab45-4d44-95b3-f4ecbabd3f3b" + ], + "timestamp": "2024-05-27T09:34:29.246Z", + "identity": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "cost": 20705, + "carbonFootprint": 0.00018, + "latency": 11 + } +] \ No newline at end of file diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-besu-ethereum-fabric-events-3-cases.json b/packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-besu-ethereum-fabric-events-3-cases.json new file mode 100644 index 0000000000..1fcd8d1fa4 --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-besu-ethereum-fabric-events-3-cases.json @@ -0,0 +1,425 @@ +[ + { + "caseID": "BESU_ETHEREUM_FABRIC_1", + "receiptID": "0x6b2082f5ca10801ab311fefa9fd5fc0ddcca253da5707232ac07599585d88fb4", + "blockchainID": "BESU_2X", + "invocationType": "SEND", + "methodName": "createAsset", + "parameters": [ + "fe99ebeb-d7d8-4b7b-828b-89e4c914fe0c", + 10 + ], + "timestamp": "2024-05-20T10:32:59.263Z", + "identity": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "cost": 91441, + "carbonFootprint": 0.00018, + "latency": 110153 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_1", + "receiptID": "0x8bcbdc64574f2767526685aedb2197158da87c619a4bb7bf64e3aaa00ac72872", + "blockchainID": "BESU_2X", + "invocationType": "SEND", + "methodName": "lockAsset", + "parameters": [ + "fe99ebeb-d7d8-4b7b-828b-89e4c914fe0c" + ], + "timestamp": "2024-05-20T10:33:00.553Z", + "identity": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "cost": 30543, + "carbonFootprint": 0.00018, + "latency": 108865 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_1", + "receiptID": "0x8068f71dc71de14e80c8b6be2042c2001ac383c42bc363608df5510277cedc81", + "blockchainID": "BESU_2X", + "invocationType": "SEND", + "methodName": "deleteAsset", + "parameters": [ + "fe99ebeb-d7d8-4b7b-828b-89e4c914fe0c" + ], + "timestamp": "2024-05-20T10:33:01.883Z", + "identity": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "cost": 20705, + "carbonFootprint": 0.00018, + "latency": 107535 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_1", + "receiptID": "0x1d37b5ea2741eb9b7ca8bf49ae3b563c0632ab3660953ef6298650a8248b313b", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "createAsset", + "parameters": [ + "asset1", + 5 + ], + "timestamp": "2024-05-20T10:33:07.943Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 129786009655382, + "carbonFootprint": 0, + "latency": 101476 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_1", + "receiptID": "0x9a28d1480e72257d585fb854bbeb840e08c12e37d9e0665888184aaad2892fa9", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "lockAsset", + "parameters": [ + "asset1" + ], + "timestamp": "2024-05-20T10:33:12.103Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 41156218131450, + "carbonFootprint": 0, + "latency": 97316 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_1", + "receiptID": "0x4c5a867c54cd89dbe8c2fd2131401d9fa7a4e8def2ff3635fc3222df6d45057c", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "deleteAsset", + "parameters": [ + "asset1", + "owner1" + ], + "timestamp": "2024-05-20T10:33:17.246Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 40955165049120, + "carbonFootprint": 0, + "latency": 92174 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_1", + "receiptID": "453887cf863ff5329f47ba82b0a6de9d63a1b7eb07be932ac4d6fd71c03f1227", + "blockchainID": "FABRIC_2", + "invocationType": "FabricContractInvocationType.SEND", + "methodName": "CreateAsset", + "parameters": [ + "519c8966-cb7d-4cbc-8ee4-dc7fa1fc5850", + "10", + "owner1" + ], + "timestamp": "2024-05-20T10:33:23.599Z", + "identity": "user1", + "cost": 0, + "carbonFootprint": 0.00018, + "latency": 85821 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_1", + "receiptID": "547e59b76a912a65638585f42d33e264cefe1898a10cfeafd97929a6547dfd96", + "blockchainID": "FABRIC_2", + "invocationType": "FabricContractInvocationType.SEND", + "methodName": "TransferAsset", + "parameters": [ + "519c8966-cb7d-4cbc-8ee4-dc7fa1fc5850", + "owner2" + ], + "timestamp": "2024-05-20T10:33:29.855Z", + "identity": "user1", + "cost": 0, + "carbonFootprint": 0.00018, + "latency": 79566 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_1", + "receiptID": "9486bee925044c747d5faa942449f899d3c8a8c9e9a42ffe37ca46278545e636", + "blockchainID": "FABRIC_2", + "invocationType": "FabricContractInvocationType.SEND", + "methodName": "DeleteAsset", + "parameters": [ + "519c8966-cb7d-4cbc-8ee4-dc7fa1fc5850" + ], + "timestamp": "2024-05-20T10:33:35.386Z", + "identity": "user1", + "cost": 0, + "carbonFootprint": 0.00018, + "latency": 74035 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_2", + "receiptID": "0xafac857fc46846e2c6bb651a1c406606f58357211fb65f6887617a5cac878c23", + "blockchainID": "BESU_2X", + "invocationType": "SEND", + "methodName": "createAsset", + "parameters": [ + "fe99ebeb-d7d8-4b7b-828b-89e4c914fe0c", + 10 + ], + "timestamp": "2024-05-20T10:33:36.055Z", + "identity": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "cost": 91441, + "carbonFootprint": 0.00018, + "latency": 73367 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_2", + "receiptID": "0x5061e439a6cff371957872531932990013c6e052d82b7ab199785c2fd7e74e93", + "blockchainID": "BESU_2X", + "invocationType": "SEND", + "methodName": "lockAsset", + "parameters": [ + "fe99ebeb-d7d8-4b7b-828b-89e4c914fe0c" + ], + "timestamp": "2024-05-20T10:33:38.902Z", + "identity": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "cost": 30543, + "carbonFootprint": 0.00018, + "latency": 70520 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_2", + "receiptID": "0xe72063132b259c1a57e202cb5321258102767816b1240f513499faa04af8781d", + "blockchainID": "BESU_2X", + "invocationType": "SEND", + "methodName": "deleteAsset", + "parameters": [ + "fe99ebeb-d7d8-4b7b-828b-89e4c914fe0c" + ], + "timestamp": "2024-05-20T10:33:40.054Z", + "identity": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "cost": 20705, + "carbonFootprint": 0.00018, + "latency": 69369 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_2", + "receiptID": "0x8fc2d26d58c153f941eb38d2455c8388ccc29f75a9e9c4367e4264b6c6395708", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "createAsset", + "parameters": [ + "asset1", + 5 + ], + "timestamp": "2024-05-20T10:33:47.139Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 103394573872490, + "carbonFootprint": 0, + "latency": 62284 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_2", + "receiptID": "0x219f64ee149bf347d9dd31a80d9dc3ec859423245ff3fdd75f6c8dc46991c4c2", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "lockAsset", + "parameters": [ + "asset1" + ], + "timestamp": "2024-05-20T10:33:52.281Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 33538215602250, + "carbonFootprint": 0, + "latency": 57143 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_2", + "receiptID": "0xb4f7ed38e06cfc4fa9e524bcbab5f438d4f8f08bd08ddc36ed62079c668b3a16", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "deleteAsset", + "parameters": [ + "asset1", + "owner1" + ], + "timestamp": "2024-05-20T10:33:57.501Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 34079554985280, + "carbonFootprint": 0, + "latency": 51924 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_2", + "receiptID": "525368f5e7ebbed3edd2cb5f52fcc5f441bbdff5863fc08597b87402abaa681e", + "blockchainID": "FABRIC_2", + "invocationType": "FabricContractInvocationType.SEND", + "methodName": "CreateAsset", + "parameters": [ + "519c8966-cb7d-4cbc-8ee4-dc7fa1fc5850", + "10", + "owner1" + ], + "timestamp": "2024-05-20T10:34:03.161Z", + "identity": "user1", + "cost": 0, + "carbonFootprint": 0.00018, + "latency": 46264 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_2", + "receiptID": "5374737a2ac9149c4068a776249c2bc5b45e80b34c5f37a9340966a4edf2c4a4", + "blockchainID": "FABRIC_2", + "invocationType": "FabricContractInvocationType.SEND", + "methodName": "TransferAsset", + "parameters": [ + "519c8966-cb7d-4cbc-8ee4-dc7fa1fc5850", + "owner2" + ], + "timestamp": "2024-05-20T10:34:08.645Z", + "identity": "user1", + "cost": 0, + "carbonFootprint": 0.00018, + "latency": 40780 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_2", + "receiptID": "67fdd728e47ab2ae655ecca44bda5999067cf11c2e79bd317ee6ad03dd5eb5cf", + "blockchainID": "FABRIC_2", + "invocationType": "FabricContractInvocationType.SEND", + "methodName": "DeleteAsset", + "parameters": [ + "519c8966-cb7d-4cbc-8ee4-dc7fa1fc5850" + ], + "timestamp": "2024-05-20T10:34:14.183Z", + "identity": "user1", + "cost": 0, + "carbonFootprint": 0.00018, + "latency": 35243 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_3", + "receiptID": "0xf7e10e0fa005951955ab2e03d1742430d4b9e73303c07cadf640148460f1859e", + "blockchainID": "BESU_2X", + "invocationType": "SEND", + "methodName": "createAsset", + "parameters": [ + "fe99ebeb-d7d8-4b7b-828b-89e4c914fe0c", + 10 + ], + "timestamp": "2024-05-20T10:34:15.031Z", + "identity": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "cost": 91441, + "carbonFootprint": 0.00018, + "latency": 34395 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_3", + "receiptID": "0xe96e1c157a0c42487428da97c6a97c548bcd4d17b25fdbc8d8ca747adfbeeac6", + "blockchainID": "BESU_2X", + "invocationType": "SEND", + "methodName": "lockAsset", + "parameters": [ + "fe99ebeb-d7d8-4b7b-828b-89e4c914fe0c" + ], + "timestamp": "2024-05-20T10:34:16.505Z", + "identity": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "cost": 30543, + "carbonFootprint": 0.00018, + "latency": 32922 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_3", + "receiptID": "0x03abead1107ae01dff9bdfb941124e80adc0609bd613461152c0df7d902a1c63", + "blockchainID": "BESU_2X", + "invocationType": "SEND", + "methodName": "deleteAsset", + "parameters": [ + "fe99ebeb-d7d8-4b7b-828b-89e4c914fe0c" + ], + "timestamp": "2024-05-20T10:34:17.879Z", + "identity": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "cost": 20705, + "carbonFootprint": 0.00018, + "latency": 31548 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_3", + "receiptID": "0xdaf77bc2c7bdba632dd34d7ff8036dcb18c3fcfcfa8a34e315099a674c662351", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "createAsset", + "parameters": [ + "asset1", + 5 + ], + "timestamp": "2024-05-20T10:34:22.191Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 95004006312862, + "carbonFootprint": 0, + "latency": 27237 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_3", + "receiptID": "0x3e8cc1e7762ebbf015fbcc7527be575ce932bad1e52c277ef5ad06978f46c90f", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "lockAsset", + "parameters": [ + "asset1" + ], + "timestamp": "2024-05-20T10:34:27.469Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 31116241250400, + "carbonFootprint": 0, + "latency": 21959 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_3", + "receiptID": "0xbf8a4b150c4c431b415829e5722840f1e7541109507b7ca497f7bc2453b64fed", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "deleteAsset", + "parameters": [ + "asset1", + "owner1" + ], + "timestamp": "2024-05-20T10:34:32.014Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 31893607627440, + "carbonFootprint": 0, + "latency": 17414 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_3", + "receiptID": "8e2146a7989e14efbc97d369a98d8203401dfbd034df77fcb66f7b32e4a50e99", + "blockchainID": "FABRIC_2", + "invocationType": "FabricContractInvocationType.SEND", + "methodName": "CreateAsset", + "parameters": [ + "519c8966-cb7d-4cbc-8ee4-dc7fa1fc5850", + "10", + "owner1" + ], + "timestamp": "2024-05-20T10:34:38.174Z", + "identity": "user1", + "cost": 0, + "carbonFootprint": 0.00018, + "latency": 11255 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_3", + "receiptID": "cd118aeed54618ead4514f17c2682178f4f788b7e5f7f0d0772744ae22e9f9b2", + "blockchainID": "FABRIC_2", + "invocationType": "FabricContractInvocationType.SEND", + "methodName": "TransferAsset", + "parameters": [ + "519c8966-cb7d-4cbc-8ee4-dc7fa1fc5850", + "owner2" + ], + "timestamp": "2024-05-20T10:34:43.744Z", + "identity": "user1", + "cost": 0, + "carbonFootprint": 0.00018, + "latency": 5685 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_3", + "receiptID": "93f066ba9539c48b32a11b2e6cd469cab38e9cb4e78be4385f259286afb674cb", + "blockchainID": "FABRIC_2", + "invocationType": "FabricContractInvocationType.SEND", + "methodName": "DeleteAsset", + "parameters": [ + "519c8966-cb7d-4cbc-8ee4-dc7fa1fc5850" + ], + "timestamp": "2024-05-20T10:34:49.405Z", + "identity": "user1", + "cost": 0, + "carbonFootprint": 0.00018, + "latency": 25 + } +] \ No newline at end of file diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-besu-ethereum-fabric-events.json b/packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-besu-ethereum-fabric-events.json new file mode 100644 index 0000000000..263cd1cc4b --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-besu-ethereum-fabric-events.json @@ -0,0 +1,425 @@ +[ + { + "caseID": "BESU_ETHEREUM_FABRIC_1", + "receiptID": "0xb81ed2022db3f730c182da98690974fa6b2b1f4ae503d4d9c9160c160a0cc589", + "blockchainID": "BESU_2X", + "invocationType": "SEND", + "methodName": "createAsset", + "parameters": [ + "024505e9-8b77-4fcf-a9f1-63d2fe838f94", + 10 + ], + "timestamp": "2024-05-27T09:15:37.576Z", + "identity": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "cost": 91441, + "carbonFootprint": 0.00018, + "latency": 116909 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_1", + "receiptID": "0x3957718d932e5c08f5183d7e354f27e92bbf1f7bad03f23300bce9190e0e9c1d", + "blockchainID": "BESU_2X", + "invocationType": "SEND", + "methodName": "lockAsset", + "parameters": [ + "024505e9-8b77-4fcf-a9f1-63d2fe838f94" + ], + "timestamp": "2024-05-27T09:15:39.273Z", + "identity": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "cost": 30543, + "carbonFootprint": 0.00018, + "latency": 115213 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_1", + "receiptID": "0xc23ab99376855ab985aa8964ce2da5a6d7ff4539c34b33daf54d927396547808", + "blockchainID": "BESU_2X", + "invocationType": "SEND", + "methodName": "deleteAsset", + "parameters": [ + "024505e9-8b77-4fcf-a9f1-63d2fe838f94" + ], + "timestamp": "2024-05-27T09:15:40.109Z", + "identity": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "cost": 20705, + "carbonFootprint": 0.00018, + "latency": 114379 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_1", + "receiptID": "0x1d37b5ea2741eb9b7ca8bf49ae3b563c0632ab3660953ef6298650a8248b313b", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "createAsset", + "parameters": [ + "asset1", + 5 + ], + "timestamp": "2024-05-27T09:15:46.123Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 129786009655382, + "carbonFootprint": 0, + "latency": 108366 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_1", + "receiptID": "0x9a28d1480e72257d585fb854bbeb840e08c12e37d9e0665888184aaad2892fa9", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "lockAsset", + "parameters": [ + "asset1" + ], + "timestamp": "2024-05-27T09:15:51.381Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 41156218131450, + "carbonFootprint": 0, + "latency": 103109 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_1", + "receiptID": "0x4c5a867c54cd89dbe8c2fd2131401d9fa7a4e8def2ff3635fc3222df6d45057c", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "deleteAsset", + "parameters": [ + "asset1", + "owner1" + ], + "timestamp": "2024-05-27T09:15:56.367Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 40955165049120, + "carbonFootprint": 0, + "latency": 98124 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_1", + "receiptID": "88ab44939551ea52c8abdb2779163278a07713bf397b215cce2dac9be478b08a", + "blockchainID": "FABRIC_2", + "invocationType": "FabricContractInvocationType.SEND", + "methodName": "CreateAsset", + "parameters": [ + "966c0c39-b39a-49de-bf00-82b62444615a", + "10", + "owner1" + ], + "timestamp": "2024-05-27T09:16:03.019Z", + "identity": "user1", + "cost": 0, + "carbonFootprint": 0.00018, + "latency": 91472 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_1", + "receiptID": "04a5f33f1461b1f446086dcd435cedfb7f690b35b4359f87724a18755fd12bbb", + "blockchainID": "FABRIC_2", + "invocationType": "FabricContractInvocationType.SEND", + "methodName": "TransferAsset", + "parameters": [ + "966c0c39-b39a-49de-bf00-82b62444615a", + "owner2" + ], + "timestamp": "2024-05-27T09:16:08.577Z", + "identity": "user1", + "cost": 0, + "carbonFootprint": 0.00018, + "latency": 85916 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_1", + "receiptID": "5f25721a387592f30d493aa455025aff308c7009b7b05d45949006e7e964094f", + "blockchainID": "FABRIC_2", + "invocationType": "FabricContractInvocationType.SEND", + "methodName": "DeleteAsset", + "parameters": [ + "966c0c39-b39a-49de-bf00-82b62444615a" + ], + "timestamp": "2024-05-27T09:16:14.245Z", + "identity": "user1", + "cost": 0, + "carbonFootprint": 0.00018, + "latency": 80250 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_2", + "receiptID": "0x9198a615db48db3c018bef59d47dfb93568dbbf6d04a56acb595db24d192fc06", + "blockchainID": "BESU_2X", + "invocationType": "SEND", + "methodName": "createAsset", + "parameters": [ + "024505e9-8b77-4fcf-a9f1-63d2fe838f94", + 10 + ], + "timestamp": "2024-05-27T09:16:15.243Z", + "identity": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "cost": 91441, + "carbonFootprint": 0.00018, + "latency": 79254 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_2", + "receiptID": "0x1451b68f1f59a5425cb442075c2a8504ad08d0fe605180ee3a02e9019f82c3f3", + "blockchainID": "BESU_2X", + "invocationType": "SEND", + "methodName": "lockAsset", + "parameters": [ + "024505e9-8b77-4fcf-a9f1-63d2fe838f94" + ], + "timestamp": "2024-05-27T09:16:17.305Z", + "identity": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "cost": 30543, + "carbonFootprint": 0.00018, + "latency": 77194 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_2", + "receiptID": "0x0801c6aecd6d105d0249d51868050395cad9b5e17f56ee4654c2ec47cbf49f82", + "blockchainID": "BESU_2X", + "invocationType": "SEND", + "methodName": "deleteAsset", + "parameters": [ + "024505e9-8b77-4fcf-a9f1-63d2fe838f94" + ], + "timestamp": "2024-05-27T09:16:18.359Z", + "identity": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "cost": 20705, + "carbonFootprint": 0.00018, + "latency": 76141 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_2", + "receiptID": "0x8fc2d26d58c153f941eb38d2455c8388ccc29f75a9e9c4367e4264b6c6395708", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "createAsset", + "parameters": [ + "asset1", + 5 + ], + "timestamp": "2024-05-27T09:16:26.125Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 103394573872490, + "carbonFootprint": 0, + "latency": 68378 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_2", + "receiptID": "0x219f64ee149bf347d9dd31a80d9dc3ec859423245ff3fdd75f6c8dc46991c4c2", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "lockAsset", + "parameters": [ + "asset1" + ], + "timestamp": "2024-05-27T09:16:31.184Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 33538215602250, + "carbonFootprint": 0, + "latency": 63331 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_2", + "receiptID": "0xb4f7ed38e06cfc4fa9e524bcbab5f438d4f8f08bd08ddc36ed62079c668b3a16", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "deleteAsset", + "parameters": [ + "asset1", + "owner1" + ], + "timestamp": "2024-05-27T09:16:36.363Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 34079554985280, + "carbonFootprint": 0, + "latency": 58154 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_2", + "receiptID": "ec20bf8b8418971e43685ba2b6bee62c845dd272d901af92a158d21e982a8d47", + "blockchainID": "FABRIC_2", + "invocationType": "FabricContractInvocationType.SEND", + "methodName": "CreateAsset", + "parameters": [ + "966c0c39-b39a-49de-bf00-82b62444615a", + "10", + "owner1" + ], + "timestamp": "2024-05-27T09:16:43.981Z", + "identity": "user1", + "cost": 0, + "carbonFootprint": 0.00018, + "latency": 50536 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_2", + "receiptID": "d68666a62b997c8527718aba35b7fddef109dafee2273133b618847e2a8074c6", + "blockchainID": "FABRIC_2", + "invocationType": "FabricContractInvocationType.SEND", + "methodName": "TransferAsset", + "parameters": [ + "966c0c39-b39a-49de-bf00-82b62444615a", + "owner2" + ], + "timestamp": "2024-05-27T09:16:51.969Z", + "identity": "user1", + "cost": 0, + "carbonFootprint": 0.00018, + "latency": 42549 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_2", + "receiptID": "5cbf80fe64c979d92f0e35f40bd130a05772d36268c2ee3f73d2aad463359978", + "blockchainID": "FABRIC_2", + "invocationType": "FabricContractInvocationType.SEND", + "methodName": "DeleteAsset", + "parameters": [ + "966c0c39-b39a-49de-bf00-82b62444615a" + ], + "timestamp": "2024-05-27T09:16:59.118Z", + "identity": "user1", + "cost": 0, + "carbonFootprint": 0.00018, + "latency": 35400 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_3", + "receiptID": "0x4985326b838f116fa612b9c1d81335ea4ee957a20c54a44ae42579ec4710a99a", + "blockchainID": "BESU_2X", + "invocationType": "SEND", + "methodName": "createAsset", + "parameters": [ + "024505e9-8b77-4fcf-a9f1-63d2fe838f94", + 10 + ], + "timestamp": "2024-05-27T09:17:00.202Z", + "identity": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "cost": 91441, + "carbonFootprint": 0.00018, + "latency": 34317 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_3", + "receiptID": "0x967eb4286a012277a74270dce024c9c0872739c0733f8211b206ccf16432a122", + "blockchainID": "BESU_2X", + "invocationType": "SEND", + "methodName": "lockAsset", + "parameters": [ + "024505e9-8b77-4fcf-a9f1-63d2fe838f94" + ], + "timestamp": "2024-05-27T09:17:01.250Z", + "identity": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "cost": 30543, + "carbonFootprint": 0.00018, + "latency": 33269 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_3", + "receiptID": "0x7d6c1bdfaafd4b5f4799450da507b517603d2963291649ec832d191944dca56d", + "blockchainID": "BESU_2X", + "invocationType": "SEND", + "methodName": "deleteAsset", + "parameters": [ + "024505e9-8b77-4fcf-a9f1-63d2fe838f94" + ], + "timestamp": "2024-05-27T09:17:02.477Z", + "identity": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "cost": 20705, + "carbonFootprint": 0.00018, + "latency": 32051 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_3", + "receiptID": "0x8f63925f9c4e05884840fc15df27f41cd75d97a13a3aa3a34ed8497cde5af522", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "createAsset", + "parameters": [ + "asset1", + 5 + ], + "timestamp": "2024-05-27T09:17:06.542Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 94325755557346, + "carbonFootprint": 0, + "latency": 27986 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_3", + "receiptID": "0x972b7d58b0cd9e3e603c577f2cb4fabd8a64ed0c070d55950bf403e27f446390", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "lockAsset", + "parameters": [ + "asset1" + ], + "timestamp": "2024-05-27T09:17:11.777Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 30920461153200, + "carbonFootprint": 0, + "latency": 22752 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_3", + "receiptID": "0x5bcfdbf3d6b1baf09446a581afb9b9dd76298639f7bda9db71f6a60d8d55ea15", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "deleteAsset", + "parameters": [ + "asset1", + "owner1" + ], + "timestamp": "2024-05-27T09:17:16.969Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 31716906746400, + "carbonFootprint": 0, + "latency": 17563 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_3", + "receiptID": "0e1e5982732b3426ca1feb4a0585d48adc3ee67706c7c92289ace06d949a4fad", + "blockchainID": "FABRIC_2", + "invocationType": "FabricContractInvocationType.SEND", + "methodName": "CreateAsset", + "parameters": [ + "966c0c39-b39a-49de-bf00-82b62444615a", + "10", + "owner1" + ], + "timestamp": "2024-05-27T09:17:22.893Z", + "identity": "user1", + "cost": 0, + "carbonFootprint": 0.00018, + "latency": 11640 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_3", + "receiptID": "b925b6b6e68a07c12be5fe01a58869f844cd73d88254f3b427a65ac52eae7a32", + "blockchainID": "FABRIC_2", + "invocationType": "FabricContractInvocationType.SEND", + "methodName": "TransferAsset", + "parameters": [ + "966c0c39-b39a-49de-bf00-82b62444615a", + "owner2" + ], + "timestamp": "2024-05-27T09:17:28.417Z", + "identity": "user1", + "cost": 0, + "carbonFootprint": 0.00018, + "latency": 6116 + }, + { + "caseID": "BESU_ETHEREUM_FABRIC_3", + "receiptID": "b99476b1334e81083ae88ae4991d72af4ca91adb63022ee8e37cde0beae10621", + "blockchainID": "FABRIC_2", + "invocationType": "FabricContractInvocationType.SEND", + "methodName": "DeleteAsset", + "parameters": [ + "966c0c39-b39a-49de-bf00-82b62444615a" + ], + "timestamp": "2024-05-27T09:17:34.473Z", + "identity": "user1", + "cost": 0, + "carbonFootprint": 0.00018, + "latency": 60 + } +] \ No newline at end of file diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-ethereum-3-unmodeled-events.json b/packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-ethereum-3-unmodeled-events.json new file mode 100644 index 0000000000..aad876857b --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-ethereum-3-unmodeled-events.json @@ -0,0 +1,48 @@ +[ + { + "caseID": "ETHEREUM_MONITORING", + "receiptID": "0xc0730eff8158a22803060879fd555b04d3940733b58f3b5d73698ea693e5d8de", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "createAsset", + "parameters": [ + "asset2", + 10 + ], + "timestamp": "2024-05-17T14:52:01.098Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 103396064181676, + "carbonFootprint": 0, + "latency": 10250 + }, + { + "caseID": "ETHEREUM_MONITORING", + "receiptID": "0x319fc6d76fc7216599060623d0613fea997d164b8c7fbab08635190556d12162", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "lockAsset", + "parameters": [ + "asset2" + ], + "timestamp": "2024-05-17T14:52:06.257Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 33538645761600, + "carbonFootprint": 0, + "latency": 5091 + }, + { + "caseID": "ETHEREUM_MONITORING", + "receiptID": "0x6ea284a62910fd25c30722aa7b20b325cc5f4304f25cd10d0186041b39e7e95e", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "deleteAsset", + "parameters": [ + "asset2" + ], + "timestamp": "2024-05-17T14:52:11.337Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 34079943209040, + "carbonFootprint": 0, + "latency": 13 + } +] \ No newline at end of file diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-ethereum-4-events.json b/packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-ethereum-4-events.json new file mode 100644 index 0000000000..7961841699 --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-ethereum-4-events.json @@ -0,0 +1,65 @@ +[ + { + "caseID": "ETHEREUM_MONITORING", + "receiptID": "0x1d37b5ea2741eb9b7ca8bf49ae3b563c0632ab3660953ef6298650a8248b313b", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "createAsset", + "parameters": [ + "asset1", + 5 + ], + "timestamp": "2024-05-27T09:33:21.366Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 135530010970738, + "carbonFootprint": 0, + "latency": 15298 + }, + { + "caseID": "ETHEREUM_MONITORING", + "receiptID": "0xd3732704dc43d1a1035974655cd62ee9cbad0e1a76449aba26f8d25d3833ac72", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "lockAsset", + "parameters": [ + "asset1" + ], + "timestamp": "2024-05-27T09:33:26.632Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 42814248832950, + "carbonFootprint": 0, + "latency": 10033 + }, + { + "caseID": "ETHEREUM_MONITORING", + "receiptID": "0xdddabe51b7894122aed2ec29891c8de590b727cfbea99dbdabc55feb1ba04718", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "isPresent", + "parameters": [ + "asset1", + "owner1" + ], + "timestamp": "2024-05-27T09:33:31.653Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 33945972851475, + "carbonFootprint": 0, + "latency": 5012 + }, + { + "caseID": "ETHEREUM_MONITORING", + "receiptID": "0x154f57cfdd1c482a246377a80ddcaaa1e14d92678882a119cb0cdf96ebb83d7e", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "deleteAsset", + "parameters": [ + "asset1", + "owner1" + ], + "timestamp": "2024-05-27T09:33:36.658Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 40955256397680, + "carbonFootprint": 0, + "latency": 7 + } +] \ No newline at end of file diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-fabric-4-events.json b/packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-fabric-4-events.json new file mode 100644 index 0000000000..22e8d70b03 --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-fabric-4-events.json @@ -0,0 +1,66 @@ +[ + { + "caseID": "FABRIC_MONITORING", + "receiptID": "4b21851915d609fc0541037a569ce502ac9b87a415664755494422e4e8cb30dc", + "blockchainID": "FABRIC_2", + "invocationType": "FabricContractInvocationType.SEND", + "methodName": "CreateAsset", + "parameters": [ + "78fffaa3-06ed-4daa-bedc-8f7d72992231", + "10", + "owner1" + ], + "timestamp": "2024-05-27T09:31:47.774Z", + "identity": "user1", + "cost": 0, + "carbonFootprint": 0.00018, + "latency": 16298 + }, + { + "caseID": "FABRIC_MONITORING", + "receiptID": "e26794398de369ba8ee2eb97235ef5d1dceceb8fda57413732a5550bf5cc420f", + "blockchainID": "FABRIC_2", + "invocationType": "FabricContractInvocationType.SEND", + "methodName": "TransferAsset", + "parameters": [ + "78fffaa3-06ed-4daa-bedc-8f7d72992231", + "owner2" + ], + "timestamp": "2024-05-27T09:31:53.120Z", + "identity": "user1", + "cost": 0, + "carbonFootprint": 0.00018, + "latency": 10952 + }, + { + "caseID": "FABRIC_MONITORING", + "receiptID": "fa3bbd9ec8cb372e09211e057074fcf03f0c5f178c7ae098fbd3ead0956d17a4", + "blockchainID": "FABRIC_2", + "invocationType": "FabricContractInvocationType.SEND", + "methodName": "TransferAsset", + "parameters": [ + "78fffaa3-06ed-4daa-bedc-8f7d72992231", + "owner1" + ], + "timestamp": "2024-05-27T09:31:58.521Z", + "identity": "user1", + "cost": 0, + "carbonFootprint": 0.00018, + "latency": 5552 + }, + { + "caseID": "FABRIC_MONITORING", + "receiptID": "677867c703fa64b1a4651a5c661ccd4cf2ca84259a64eae534d88d7cc3cafe48", + "blockchainID": "FABRIC_2", + "invocationType": "FabricContractInvocationType.SEND", + "methodName": "DeleteAsset", + "parameters": [ + "78fffaa3-06ed-4daa-bedc-8f7d72992231" + ], + "timestamp": "2024-05-27T09:32:04.061Z", + "identity": "user1", + "cost": 0, + "carbonFootprint": 0.00018, + "latency": 12 + } +] \ No newline at end of file diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-periodic-update.json b/packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-periodic-update.json new file mode 100644 index 0000000000..8b4e9fbbbb --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/json/example-dummy-periodic-update.json @@ -0,0 +1,432 @@ +[ + { + "caseID": "CCMODEL_UPDATE", + "receiptID": "0x1d37b5ea2741eb9b7ca8bf49ae3b563c0632ab3660953ef6298650a8248b313b", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "createAsset", + "parameters": [ + "asset1", + 5 + ], + "timestamp": "2024-05-27T09:40:42.941Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 135530010970738, + "carbonFootprint": 0, + "latency": 4921 + }, + { + "caseID": "CCMODEL_UPDATE", + "receiptID": "0xd3732704dc43d1a1035974655cd62ee9cbad0e1a76449aba26f8d25d3833ac72", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "lockAsset", + "parameters": [ + "asset1" + ], + "timestamp": "2024-05-27T09:40:49.281Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 42814248832950, + "carbonFootprint": 0, + "latency": 8580 + }, + { + "caseID": "CCMODEL_UPDATE", + "receiptID": "0x5121ac2440d82d580bc30c9e445365871a0bbd7310580bd7e7617d66abdc0d33", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "deleteAsset", + "parameters": [ + "asset1" + ], + "timestamp": "2024-05-27T09:40:52.233Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 42451616646000, + "carbonFootprint": 0, + "latency": 5628 + }, + { + "caseID": "CCMODEL_UPDATE", + "receiptID": "0x3be2b1b2c1bec476f0d37cb6990b2ae7b54804a166262aef639ba6993d64e896", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "createAsset", + "parameters": [ + "asset1", + 5 + ], + "timestamp": "2024-05-27T09:40:57.247Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 120363911294810, + "carbonFootprint": 0, + "latency": 615 + }, + { + "caseID": "CCMODEL_UPDATE", + "receiptID": "0x1ae44035a0580491f47933802ca3f99c11ca524b9c2add9169b67079d1085d56", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "lockAsset", + "parameters": [ + "asset1" + ], + "timestamp": "2024-05-27T09:41:02.421Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 38436488700900, + "carbonFootprint": 0, + "latency": 5440 + }, + { + "caseID": "CCMODEL_UPDATE", + "receiptID": "0xb64d1e48f4f69bf930950bc13d9c05513642af08dbdd5079f428db0fc17c839d", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "deleteAsset", + "parameters": [ + "asset1" + ], + "timestamp": "2024-05-27T09:41:07.408Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 38500479768000, + "carbonFootprint": 0, + "latency": 454 + }, + { + "caseID": "CCMODEL_UPDATE", + "receiptID": "0xb299fbed0ff28d4b29404142d8bee7b33a6ac2d480f22af3fdac030e9197e955", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "createAsset", + "parameters": [ + "asset1", + 5 + ], + "timestamp": "2024-05-27T09:41:12.385Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 110203266779032, + "carbonFootprint": 0, + "latency": 5476 + }, + { + "caseID": "CCMODEL_UPDATE", + "receiptID": "0xf88b5da58aa42c36a798cbbb773da6650e27dd55ab9a870f542e899b827720ba", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "lockAsset", + "parameters": [ + "asset1" + ], + "timestamp": "2024-05-27T09:41:17.387Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 35503574548200, + "carbonFootprint": 0, + "latency": 475 + }, + { + "caseID": "CCMODEL_UPDATE", + "receiptID": "0x620e72017b4bc4689c11d329504a8ea73729ed3f4eae2c73c7d2ad440f1d3463", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "deleteAsset", + "parameters": [ + "asset1" + ], + "timestamp": "2024-05-27T09:41:22.263Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 35853385067280, + "carbonFootprint": 0, + "latency": 5598 + }, + { + "caseID": "CCMODEL_UPDATE", + "receiptID": "0xaaf8cacf1951a808f769e87a32304952d9bbdb3eeb2e56fde12959c5d775b49f", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "createAsset", + "parameters": [ + "asset1", + 5 + ], + "timestamp": "2024-05-27T09:41:27.170Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 103396064181676, + "carbonFootprint": 0, + "latency": 692 + }, + { + "caseID": "CCMODEL_UPDATE", + "receiptID": "0xb205b16fac624e125354b93d9d9b542b6dbbf84816c6ed32a9e8ddd0c89cde50", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "lockAsset", + "parameters": [ + "asset1" + ], + "timestamp": "2024-05-27T09:41:32.195Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 33538645761600, + "carbonFootprint": 0, + "latency": 5666 + }, + { + "caseID": "CCMODEL_UPDATE", + "receiptID": "0x621becfe651fee97f77384c62b1730c6c0f364bf40f4be96fcc871c25d2410bc", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "deleteAsset", + "parameters": [ + "asset1" + ], + "timestamp": "2024-05-27T09:41:37.087Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 34079943209040, + "carbonFootprint": 0, + "latency": 775 + }, + { + "caseID": "CCMODEL_UPDATE", + "receiptID": "0xa9ba355c1b6c24475762f8d85e3fe31373488d4ed5767d85cdd8bad701b635d3", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "createAsset", + "parameters": [ + "asset1", + 5 + ], + "timestamp": "2024-05-27T09:41:42.152Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 98835525300660, + "carbonFootprint": 0, + "latency": 5710 + }, + { + "caseID": "CCMODEL_UPDATE", + "receiptID": "0xadf19829cc25a097e457ed78fe9430fb0d306820ed91adbb94e538a291535849", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "lockAsset", + "parameters": [ + "asset1" + ], + "timestamp": "2024-05-27T09:41:47.039Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 32222226180300, + "carbonFootprint": 0, + "latency": 823 + }, + { + "caseID": "CCMODEL_UPDATE", + "receiptID": "0x39d64d6a97e476d64ebee18f8769fea61f8619ada119c58264dab2a04f8b11be", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "deleteAsset", + "parameters": [ + "asset1" + ], + "timestamp": "2024-05-27T09:41:52.133Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 32891811777840, + "carbonFootprint": 0, + "latency": 5728 + }, + { + "caseID": "CCMODEL_UPDATE", + "receiptID": "0xebfd45ff34e3ff7bd33d3c9bb5379877b7b0fd08e4357045dac805ed19cee100", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "createAsset", + "parameters": [ + "asset1", + 5 + ], + "timestamp": "2024-05-27T09:41:57.039Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 95780155968798, + "carbonFootprint": 0, + "latency": 823 + }, + { + "caseID": "CCMODEL_UPDATE", + "receiptID": "0xe280efdc199b8635b392024bf969d7a78f7de3aaef64499c01dc240c425da1c2", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "lockAsset", + "parameters": [ + "asset1" + ], + "timestamp": "2024-05-27T09:42:02.152Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 31340280308100, + "carbonFootprint": 0, + "latency": 5709 + }, + { + "caseID": "CCMODEL_UPDATE", + "receiptID": "0x96129a0b72d96b2bb3c7d359cf0d7d444f814b18614889b07a391af1d12314f2", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "deleteAsset", + "parameters": [ + "asset1" + ], + "timestamp": "2024-05-27T09:42:07.066Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 32095813562880, + "carbonFootprint": 0, + "latency": 796 + }, + { + "caseID": "CCMODEL_UPDATE", + "receiptID": "0xd3d2045c8d79914a43bf0d0fa48233cb0c6d3d8d4c623767badeb6f5157e9876", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "createAsset", + "parameters": [ + "asset1", + 5 + ], + "timestamp": "2024-05-27T09:42:12.164Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 93733186606720, + "carbonFootprint": 0, + "latency": 5697 + }, + { + "caseID": "CCMODEL_UPDATE", + "receiptID": "0xd5d911f6b56aaa9539605c428404558111b31701753843d7e37b8732967b721b", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "lockAsset", + "parameters": [ + "asset1" + ], + "timestamp": "2024-05-27T09:42:17.148Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 30749413489950, + "carbonFootprint": 0, + "latency": 714 + }, + { + "caseID": "CCMODEL_UPDATE", + "receiptID": "0xcbc1a5c07d93f980362adaf84f66db3127e7d5745cca0117cbf9f05078d6b03b", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "deleteAsset", + "parameters": [ + "asset1" + ], + "timestamp": "2024-05-27T09:42:22.248Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 31562528045760, + "carbonFootprint": 0, + "latency": 5613 + }, + { + "caseID": "CCMODEL_UPDATE", + "receiptID": "0x9cd9db21f05539f6dff370095d8d1763f0914b5d197405d30fc941d8c090c678", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "createAsset", + "parameters": [ + "asset1", + 5 + ], + "timestamp": "2024-05-27T09:42:27.135Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 92361802785924, + "carbonFootprint": 0, + "latency": 727 + }, + { + "caseID": "CCMODEL_UPDATE", + "receiptID": "0x6adbc6ffea1acadabe5c67cef94a855383c38b58a5b8ff296b48e399f30a4ad3", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "lockAsset", + "parameters": [ + "asset1" + ], + "timestamp": "2024-05-27T09:42:32.319Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 30353557405200, + "carbonFootprint": 0, + "latency": 5542 + }, + { + "caseID": "CCMODEL_UPDATE", + "receiptID": "0x96ecf2aa1876492afddccf5e2a0083e21b1c85b24550fc0e4c7437699729ce18", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "deleteAsset", + "parameters": [ + "asset1" + ], + "timestamp": "2024-05-27T09:42:37.207Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 31205249014320, + "carbonFootprint": 0, + "latency": 655 + }, + { + "caseID": "CCMODEL_UPDATE", + "receiptID": "0xcf6652ab02e110b03816ba739c83a600424e9ee0611c34544ca4a239081018be", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "createAsset", + "parameters": [ + "asset1", + 5 + ], + "timestamp": "2024-05-27T09:42:42.165Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 91443032771380, + "carbonFootprint": 0, + "latency": 5696 + }, + { + "caseID": "CCMODEL_UPDATE", + "receiptID": "0x76ea903dabc8a71125125ee782e22d06cebb3923cdeb0186236186145b299c2e", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "lockAsset", + "parameters": [ + "asset1" + ], + "timestamp": "2024-05-27T09:42:47.055Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 30088350292200, + "carbonFootprint": 0, + "latency": 806 + }, + { + "caseID": "CCMODEL_UPDATE", + "receiptID": "0x60fb968f395815fc788974d19ccb11fa5e361b74e9d9ae1bd2224b8f03be395f", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "deleteAsset", + "parameters": [ + "asset1" + ], + "timestamp": "2024-05-27T09:42:52.213Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 30965886922560, + "carbonFootprint": 0, + "latency": 5648 + }, + { + "caseID": "CCMODEL_UPDATE", + "receiptID": "0x13b53c3379a666e719caa33ea0161d08594e663f90e268f25017c2e7068290c8", + "blockchainID": "ETHEREUM", + "invocationType": "SEND", + "methodName": "createAsset", + "parameters": [ + "asset1", + 5 + ], + "timestamp": "2024-05-27T09:42:57.111Z", + "identity": "0x6a2ec8c50ba1a9ce47c52d1cb5b7136ee9d0ccc0", + "cost": 90827495125774, + "carbonFootprint": 0, + "latency": 751 + } +] \ No newline at end of file diff --git a/packages/cactus-plugin-cc-tx-visualization/src/test/solidity/LockAsset.json b/packages/cactus-plugin-ccmodel-hephaestus/src/test/solidity/lock-asset-contract/LockAsset.json similarity index 58% rename from packages/cactus-plugin-cc-tx-visualization/src/test/solidity/LockAsset.json rename to packages/cactus-plugin-ccmodel-hephaestus/src/test/solidity/lock-asset-contract/LockAsset.json index 50be30cea5..fda660818a 100644 --- a/packages/cactus-plugin-cc-tx-visualization/src/test/solidity/LockAsset.json +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/solidity/lock-asset-contract/LockAsset.json @@ -68,6 +68,44 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "string", + "name": "id", + "type": "string" + } + ], + "name": "isAssetLocked", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "id", + "type": "string" + } + ], + "name": "isPresent", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -95,27 +133,27 @@ "type": "function" } ], - "metadata": "{\"compiler\":{\"version\":\"0.8.7+commit.e28d00a7\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"id\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"size\",\"type\":\"uint256\"}],\"name\":\"createAsset\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"id\",\"type\":\"string\"}],\"name\":\"deleteAsset\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"id\",\"type\":\"string\"}],\"name\":\"getAsset\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"creator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isLock\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"size\",\"type\":\"uint256\"}],\"internalType\":\"struct Asset\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"id\",\"type\":\"string\"}],\"name\":\"lockAsset\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"id\",\"type\":\"string\"}],\"name\":\"unLockAsset\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"/Users/jasonwang/cactus-odap-merge/packages/cactus-plugin-ledger-connector-besu/src/test/solidity/hello-world-contract/lock-asset.sol\":\"LockAsset\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/jasonwang/cactus-odap-merge/packages/cactus-plugin-ledger-connector-besu/src/test/solidity/hello-world-contract/lock-asset.sol\":{\"keccak256\":\"0x878fc27f22785593c1b35005ecf333e1f93e6dcf932b3d6e2b24d6be790b996a\",\"urls\":[\"bzz-raw://d8be1567f5e11fb718d8849f4dc9b8a8e467135ecd04c5f796c938b7363daaf2\",\"dweb:/ipfs/QmQuteuiTygZxjDnLiq3GNgJNFmPSRqbE2Q9vm85WgVbox\"]}},\"version\":1}", - "bytecode": "608060405234801561001057600080fd5b50610475806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80635e82d0a61461005c578063cd5286d014610071578063db9cc410146100b5578063def60e0d146100c8578063e24aa37c146100db575b600080fd5b61006f61006a3660046103a1565b6100ee565b005b61008461007f3660046103a1565b610164565b6040805182516001600160a01b03168152602080840151151590820152918101519082015260600160405180910390f35b61006f6100c33660046103e3565b6101dc565b61006f6100d63660046103a1565b610266565b61006f6100e93660046103a1565b6102ad565b6000806000848460405161010392919061042f565b9081526020016040518091039020600101541190508061012257600080fd5b60016000848460405161013692919061042f565b9081526040519081900360200190208054911515600160a01b0260ff60a01b19909216919091179055505050565b60408051606081018252600080825260208201819052918101919091526000838360405161019392919061042f565b908152604080516020928190038301812060608201835280546001600160a01b0381168352600160a01b900460ff16151593820193909352600190920154908201529392505050565b600081116101e957600080fd5b80600084846040516101fc92919061042f565b908152602001604051809103902060010181905550336000848460405161022492919061042f565b90815260405190819003602001812080546001600160a01b03939093166001600160a01b0319909316929092179091556000908190610136908690869061042f565b6000806000848460405161027b92919061042f565b9081526020016040518091039020600101541190508061029a57600080fd5b600080848460405161013692919061042f565b600080600084846040516102c292919061042f565b908152602001604051809103902060010154119050806102e157600080fd5b60008084846040516102f492919061042f565b9081526040519081900360200190205460ff600160a01b9091041690508061031b57600080fd5b6000848460405161032d92919061042f565b90815260405190819003602001902080546001600160a81b0319168155600060019091015550505050565b60008083601f84011261036a57600080fd5b50813567ffffffffffffffff81111561038257600080fd5b60208301915083602082850101111561039a57600080fd5b9250929050565b600080602083850312156103b457600080fd5b823567ffffffffffffffff8111156103cb57600080fd5b6103d785828601610358565b90969095509350505050565b6000806000604084860312156103f857600080fd5b833567ffffffffffffffff81111561040f57600080fd5b61041b86828701610358565b909790965060209590950135949350505050565b818382376000910190815291905056fea26469706673582212203e656ee2af105d66466451b5ca09a2a5780b62c439dd43befb63a10687d2423b64736f6c63430008070033", - "deployedBytecode": "608060405234801561001057600080fd5b50600436106100575760003560e01c80635e82d0a61461005c578063cd5286d014610071578063db9cc410146100b5578063def60e0d146100c8578063e24aa37c146100db575b600080fd5b61006f61006a3660046103a1565b6100ee565b005b61008461007f3660046103a1565b610164565b6040805182516001600160a01b03168152602080840151151590820152918101519082015260600160405180910390f35b61006f6100c33660046103e3565b6101dc565b61006f6100d63660046103a1565b610266565b61006f6100e93660046103a1565b6102ad565b6000806000848460405161010392919061042f565b9081526020016040518091039020600101541190508061012257600080fd5b60016000848460405161013692919061042f565b9081526040519081900360200190208054911515600160a01b0260ff60a01b19909216919091179055505050565b60408051606081018252600080825260208201819052918101919091526000838360405161019392919061042f565b908152604080516020928190038301812060608201835280546001600160a01b0381168352600160a01b900460ff16151593820193909352600190920154908201529392505050565b600081116101e957600080fd5b80600084846040516101fc92919061042f565b908152602001604051809103902060010181905550336000848460405161022492919061042f565b90815260405190819003602001812080546001600160a01b03939093166001600160a01b0319909316929092179091556000908190610136908690869061042f565b6000806000848460405161027b92919061042f565b9081526020016040518091039020600101541190508061029a57600080fd5b600080848460405161013692919061042f565b600080600084846040516102c292919061042f565b908152602001604051809103902060010154119050806102e157600080fd5b60008084846040516102f492919061042f565b9081526040519081900360200190205460ff600160a01b9091041690508061031b57600080fd5b6000848460405161032d92919061042f565b90815260405190819003602001902080546001600160a81b0319168155600060019091015550505050565b60008083601f84011261036a57600080fd5b50813567ffffffffffffffff81111561038257600080fd5b60208301915083602082850101111561039a57600080fd5b9250929050565b600080602083850312156103b457600080fd5b823567ffffffffffffffff8111156103cb57600080fd5b6103d785828601610358565b90969095509350505050565b6000806000604084860312156103f857600080fd5b833567ffffffffffffffff81111561040f57600080fd5b61041b86828701610358565b909790965060209590950135949350505050565b818382376000910190815291905056fea26469706673582212203e656ee2af105d66466451b5ca09a2a5780b62c439dd43befb63a10687d2423b64736f6c63430008070033", - "sourceMap": "543:1053:0:-:0;;;;;;;;;;;;;;;;;;;", - "deployedSourceMap": "543:1053:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;946:154;;;;;;:::i;:::-;;:::i;:::-;;798:105;;;;;;:::i;:::-;;:::i;:::-;;;;1753:13:1;;-1:-1:-1;;;;;1749:39:1;1731:58;;1859:4;1847:17;;;1841:24;1834:32;1827:40;1805:20;;;1798:70;1912:17;;;1906:24;1884:20;;;1877:54;1719:2;1704:18;798:105:0;;;;;;;607:188;;;;;;:::i;:::-;;:::i;1144:157::-;;;;;;:::i;:::-;;:::i;1304:289::-;;;;;;:::i;:::-;;:::i;946:154::-;999:16;1034:1;1018:6;1025:2;;1018:10;;;;;;;:::i;:::-;;;;;;;;;;;;;:15;;;:17;999:36;;1051:11;1043:20;;;;;;1091:4;1071:6;1078:2;;1071:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:24;;;;;-1:-1:-1;;;1071:24:0;-1:-1:-1;;;;1071:24:0;;;;;;;;;-1:-1:-1;;;946:154:0:o;798:105::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;888:6:0;895:2;;888:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;881:17;;;;;;;-1:-1:-1;;;;;881:17:0;;;;-1:-1:-1;;;881:17:0;;;;;;;;;;;;;;;;;;;;;;888:10;798:105;-1:-1:-1;;;798:105:0:o;607:188::-;687:1;682:4;:6;674:15;;;;;;714:4;697:6;704:2;;697:10;;;;;;;:::i;:::-;;;;;;;;;;;;;:15;;:21;;;;747:10;726:6;733:2;;726:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:31;;-1:-1:-1;;;;;726:31:0;;;;-1:-1:-1;;;;;;726:31:0;;;;;;;;;;:18;;;;765:10;;772:2;;;;765:10;:::i;1144:157::-;1199:16;1234:1;1218:6;1225:2;;1218:10;;;;;;;:::i;:::-;;;;;;;;;;;;;:15;;;:17;1199:36;;1251:11;1243:20;;;;;;1291:5;1271:6;1278:2;;1271:10;;;;;;;:::i;1304:289::-;1360:16;1395:1;1379:6;1386:2;;1379:10;;;;;;;:::i;:::-;;;;;;;;;;;;;:15;;;:17;1360:36;;1412:11;1404:20;;;;;;1495:18;1516:6;1523:2;;1516:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:17;;-1:-1:-1;;;1516:17:0;;;;;-1:-1:-1;1516:17:0;1541:22;;;;;;1578:6;1585:2;;1578:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;1571:17;;-1:-1:-1;;;;;;1571:17:0;;;1578:10;1571:17;;;;;-1:-1:-1;;;;1304:289:0:o;14:348:1:-;66:8;76:6;130:3;123:4;115:6;111:17;107:27;97:55;;148:1;145;138:12;97:55;-1:-1:-1;171:20:1;;214:18;203:30;;200:50;;;246:1;243;236:12;200:50;283:4;275:6;271:17;259:29;;335:3;328:4;319:6;311;307:19;303:30;300:39;297:59;;;352:1;349;342:12;297:59;14:348;;;;;:::o;367:411::-;438:6;446;499:2;487:9;478:7;474:23;470:32;467:52;;;515:1;512;505:12;467:52;555:9;542:23;588:18;580:6;577:30;574:50;;;620:1;617;610:12;574:50;659:59;710:7;701:6;690:9;686:22;659:59;:::i;:::-;737:8;;633:85;;-1:-1:-1;367:411:1;-1:-1:-1;;;;367:411:1:o;783:479::-;863:6;871;879;932:2;920:9;911:7;907:23;903:32;900:52;;;948:1;945;938:12;900:52;988:9;975:23;1021:18;1013:6;1010:30;1007:50;;;1053:1;1050;1043:12;1007:50;1092:59;1143:7;1134:6;1123:9;1119:22;1092:59;:::i;:::-;1170:8;;1066:85;;-1:-1:-1;1252:2:1;1237:18;;;;1224:32;;783:479;-1:-1:-1;;;;783:479:1:o;1267:273::-;1452:6;1444;1439:3;1426:33;1408:3;1478:16;;1503:13;;;1478:16;1267:273;-1:-1:-1;1267:273:1:o", - "sourcePath": "/Users/jasonwang/cactus-odap-merge/packages/cactus-plugin-ledger-connector-besu/src/test/solidity/hello-world-contract/lock-asset.sol", + "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"id\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"size\",\"type\":\"uint256\"}],\"name\":\"createAsset\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"id\",\"type\":\"string\"}],\"name\":\"deleteAsset\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"id\",\"type\":\"string\"}],\"name\":\"getAsset\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"creator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isLock\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"size\",\"type\":\"uint256\"}],\"internalType\":\"struct Asset\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"id\",\"type\":\"string\"}],\"name\":\"isAssetLocked\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"id\",\"type\":\"string\"}],\"name\":\"isPresent\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"id\",\"type\":\"string\"}],\"name\":\"lockAsset\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"id\",\"type\":\"string\"}],\"name\":\"unLockAsset\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"/home/andre_9a/cactus/packages/cactus-plugin-satp-hermes/src/test/solidity/lock-asset-contract/lock-asset.sol\":\"LockAsset\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/home/andre_9a/cactus/packages/cactus-plugin-satp-hermes/src/test/solidity/lock-asset-contract/lock-asset.sol\":{\"keccak256\":\"0xde0438e010cd77bfc1516697230fbcec20e85bd7fdbc8df9225abb5c9dd6c7ed\",\"urls\":[\"bzz-raw://865f301eada0615be375c9313d3abce9458dcbb5311dedf805cad921accda557\",\"dweb:/ipfs/QmY1r6Z7PM8ypYy59rWqozy3Mkcv9nMd4xRcfpCbwN4LQK\"]}},\"version\":1}", + "bytecode": "608060405234801561001057600080fd5b506105f9806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063cd5286d01161005b578063cd5286d0146100d2578063db9cc41014610112578063def60e0d14610125578063e24aa37c1461013857600080fd5b80631ae4eb68146100825780635e82d0a6146100aa578063bc548275146100bf575b600080fd5b610095610090366004610525565b61014b565b60405190151581526020015b60405180910390f35b6100bd6100b8366004610525565b6101b5565b005b6100956100cd366004610525565b61022a565b6100e56100e0366004610525565b610259565b6040805182516001600160a01b0316815260208084015115159082015291810151908201526060016100a1565b6100bd610120366004610567565b6102d1565b6100bd610133366004610525565b6103bc565b6100bd610146366004610525565b610402565b600080600184846040516101609291906105b3565b9081526040519081900360200190205460ff1690508061017f57600080fd5b600084846040516101919291906105b3565b9081526040519081900360200190205460ff600160a01b9091041691505092915050565b6000600183836040516101c99291906105b3565b9081526040519081900360200190205460ff169050806101e857600080fd5b6001600084846040516101fc9291906105b3565b9081526040519081900360200190208054911515600160a01b0260ff60a01b19909216919091179055505050565b60006001838360405161023e9291906105b3565b9081526040519081900360200190205460ff16905092915050565b6040805160608101825260008082526020820181905291810191909152600083836040516102889291906105b3565b908152604080516020928190038301812060608201835280546001600160a01b0381168352600160a01b900460ff16151593820193909352600190920154908201529392505050565b600081116102de57600080fd5b80600084846040516102f19291906105b3565b90815260200160405180910390206001018190555033600084846040516103199291906105b3565b90815260405190819003602001812080546001600160a01b03939093166001600160a01b031990931692909217909155600090819061035b90869086906105b3565b9081526040519081900360200181208054921515600160a01b0260ff60a01b1990931692909217909155600190819061039790869086906105b3565b908152604051908190036020019020805491151560ff19909216919091179055505050565b6000600183836040516103d09291906105b3565b9081526040519081900360200190205460ff169050806103ef57600080fd5b60008084846040516101fc9291906105b3565b6000600183836040516104169291906105b3565b9081526040519081900360200190205460ff1690508061043557600080fd5b60008084846040516104489291906105b3565b9081526040519081900360200190205460ff600160a01b9091041690508061046f57600080fd5b600084846040516104819291906105b3565b90815260405190819003602001812080546001600160a81b031916815560006001918201819055916104b690879087906105b3565b908152604051908190036020019020805491151560ff1990921691909117905550505050565b60008083601f8401126104ee57600080fd5b50813567ffffffffffffffff81111561050657600080fd5b60208301915083602082850101111561051e57600080fd5b9250929050565b6000806020838503121561053857600080fd5b823567ffffffffffffffff81111561054f57600080fd5b61055b858286016104dc565b90969095509350505050565b60008060006040848603121561057c57600080fd5b833567ffffffffffffffff81111561059357600080fd5b61059f868287016104dc565b909790965060209590950135949350505050565b818382376000910190815291905056fea2646970667358221220256d00c6b6e97111d048c9a6a3069f078880240932a634dae7aec643dc6ade7664736f6c634300080f0033", + "deployedBytecode": "608060405234801561001057600080fd5b506004361061007d5760003560e01c8063cd5286d01161005b578063cd5286d0146100d2578063db9cc41014610112578063def60e0d14610125578063e24aa37c1461013857600080fd5b80631ae4eb68146100825780635e82d0a6146100aa578063bc548275146100bf575b600080fd5b610095610090366004610525565b61014b565b60405190151581526020015b60405180910390f35b6100bd6100b8366004610525565b6101b5565b005b6100956100cd366004610525565b61022a565b6100e56100e0366004610525565b610259565b6040805182516001600160a01b0316815260208084015115159082015291810151908201526060016100a1565b6100bd610120366004610567565b6102d1565b6100bd610133366004610525565b6103bc565b6100bd610146366004610525565b610402565b600080600184846040516101609291906105b3565b9081526040519081900360200190205460ff1690508061017f57600080fd5b600084846040516101919291906105b3565b9081526040519081900360200190205460ff600160a01b9091041691505092915050565b6000600183836040516101c99291906105b3565b9081526040519081900360200190205460ff169050806101e857600080fd5b6001600084846040516101fc9291906105b3565b9081526040519081900360200190208054911515600160a01b0260ff60a01b19909216919091179055505050565b60006001838360405161023e9291906105b3565b9081526040519081900360200190205460ff16905092915050565b6040805160608101825260008082526020820181905291810191909152600083836040516102889291906105b3565b908152604080516020928190038301812060608201835280546001600160a01b0381168352600160a01b900460ff16151593820193909352600190920154908201529392505050565b600081116102de57600080fd5b80600084846040516102f19291906105b3565b90815260200160405180910390206001018190555033600084846040516103199291906105b3565b90815260405190819003602001812080546001600160a01b03939093166001600160a01b031990931692909217909155600090819061035b90869086906105b3565b9081526040519081900360200181208054921515600160a01b0260ff60a01b1990931692909217909155600190819061039790869086906105b3565b908152604051908190036020019020805491151560ff19909216919091179055505050565b6000600183836040516103d09291906105b3565b9081526040519081900360200190205460ff169050806103ef57600080fd5b60008084846040516101fc9291906105b3565b6000600183836040516104169291906105b3565b9081526040519081900360200190205460ff1690508061043557600080fd5b60008084846040516104489291906105b3565b9081526040519081900360200190205460ff600160a01b9091041690508061046f57600080fd5b600084846040516104819291906105b3565b90815260405190819003602001812080546001600160a81b031916815560006001918201819055916104b690879087906105b3565b908152604051908190036020019020805491151560ff1990921691909117905550505050565b60008083601f8401126104ee57600080fd5b50813567ffffffffffffffff81111561050657600080fd5b60208301915083602082850101111561051e57600080fd5b9250929050565b6000806020838503121561053857600080fd5b823567ffffffffffffffff81111561054f57600080fd5b61055b858286016104dc565b90969095509350505050565b60008060006040848603121561057c57600080fd5b833567ffffffffffffffff81111561059357600080fd5b61059f868287016104dc565b909790965060209590950135949350505050565b818382376000910190815291905056fea2646970667358221220256d00c6b6e97111d048c9a6a3069f078880240932a634dae7aec643dc6ade7664736f6c634300080f0033", + "sourceMap": "543:1460:0:-:0;;;;;;;;;;;;;;;;;;;", + "deployedSourceMap": "543:1460:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1770:231;;;;;;:::i;:::-;;:::i;:::-;;;948:14:1;;941:22;923:41;;911:2;896:18;1770:231:0;;;;;;;;1011:144;;;;;;:::i;:::-;;:::i;:::-;;1665:101;;;;;;:::i;:::-;;:::i;865:103::-;;;;;;:::i;:::-;;:::i;:::-;;;;1183:13:1;;-1:-1:-1;;;;;1179:39:1;1161:58;;1289:4;1277:17;;;1271:24;1264:32;1257:40;1235:20;;;1228:70;1342:17;;;1336:24;1314:20;;;1307:54;1149:2;1134:18;865:103:0;975:392:1;643:218:0;;;;;;:::i;:::-;;:::i;1200:147::-;;;;;;:::i;:::-;;:::i;1351:310::-;;;;;;:::i;:::-;;:::i;1770:231::-;1834:4;1848:11;1862;1874:2;;1862:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;1862:15:0;1885;;;;;;1979:6;1986:2;;1979:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:17;;-1:-1:-1;;;1979:17:0;;;;;-1:-1:-1;;1770:231:0;;;;:::o;1011:144::-;1065:11;1079;1091:2;;1079:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;1079:15:0;1102;;;;;;1146:4;1126:6;1133:2;;1126:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:24;;;;;-1:-1:-1;;;1126:24:0;-1:-1:-1;;;;1126:24:0;;;;;;;;;-1:-1:-1;;;1011:144:0:o;1665:101::-;1725:4;1746:11;1758:2;;1746:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;1665:101:0;;;;:::o;865:103::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;953:6:0;960:2;;953:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;946:17;;;;;;;-1:-1:-1;;;;;946:17:0;;;;-1:-1:-1;;;946:17:0;;;;;;;;;;;;;;;;;;;;;;953:10;865:103;-1:-1:-1;;;865:103:0:o;643:218::-;723:1;718:4;:6;710:15;;;;;;750:4;733:6;740:2;;733:10;;;;;;;:::i;:::-;;;;;;;;;;;;;:15;;:21;;;;783:10;762:6;769:2;;762:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:31;;-1:-1:-1;;;;;762:31:0;;;;-1:-1:-1;;;;;;762:31:0;;;;;;;;;;:18;;;;801:10;;808:2;;;;801:10;:::i;:::-;;;;;;;;;;;;;;:25;;;;;-1:-1:-1;;;801:25:0;-1:-1:-1;;;;801:25:0;;;;;;;;;;-1:-1:-1;;;;834:15:0;;846:2;;;;834:15;:::i;:::-;;;;;;;;;;;;;;:22;;;;;-1:-1:-1;;834:22:0;;;;;;;;;-1:-1:-1;;;643:218:0:o;1200:147::-;1256:11;1270;1282:2;;1270:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;1270:15:0;1293;;;;;;1337:5;1317:6;1324:2;;1317:10;;;;;;;:::i;1351:310::-;1407:11;1421;1433:2;;1421:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;1421:15:0;1444;;;;;;1531:18;1552:6;1559:2;;1552:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:17;;-1:-1:-1;;;1552:17:0;;;;;-1:-1:-1;1552:17:0;1577:22;;;;;;1615:6;1622:2;;1615:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;1608:17;;-1:-1:-1;;;;;;1608:17:0;;;1615:10;1608:17;;;;;;;1615:10;1633:15;;1645:2;;;;1633:15;:::i;:::-;;;;;;;;;;;;;;:23;;;;;-1:-1:-1;;1633:23:0;;;;;;;;;-1:-1:-1;;;;1351:310:0:o;14:348:1:-;66:8;76:6;130:3;123:4;115:6;111:17;107:27;97:55;;148:1;145;138:12;97:55;-1:-1:-1;171:20:1;;214:18;203:30;;200:50;;;246:1;243;236:12;200:50;283:4;275:6;271:17;259:29;;335:3;328:4;319:6;311;307:19;303:30;300:39;297:59;;;352:1;349;342:12;297:59;14:348;;;;;:::o;367:411::-;438:6;446;499:2;487:9;478:7;474:23;470:32;467:52;;;515:1;512;505:12;467:52;555:9;542:23;588:18;580:6;577:30;574:50;;;620:1;617;610:12;574:50;659:59;710:7;701:6;690:9;686:22;659:59;:::i;:::-;737:8;;633:85;;-1:-1:-1;367:411:1;-1:-1:-1;;;;367:411:1:o;1372:479::-;1452:6;1460;1468;1521:2;1509:9;1500:7;1496:23;1492:32;1489:52;;;1537:1;1534;1527:12;1489:52;1577:9;1564:23;1610:18;1602:6;1599:30;1596:50;;;1642:1;1639;1632:12;1596:50;1681:59;1732:7;1723:6;1712:9;1708:22;1681:59;:::i;:::-;1759:8;;1655:85;;-1:-1:-1;1841:2:1;1826:18;;;;1813:32;;1372:479;-1:-1:-1;;;;1372:479:1:o;1856:273::-;2041:6;2033;2028:3;2015:33;1997:3;2067:16;;2092:13;;;2067:16;1856:273;-1:-1:-1;1856:273:1:o", + "sourcePath": "/home/andre_9a/cactus/packages/cactus-plugin-satp-hermes/src/test/solidity/lock-asset-contract/lock-asset.sol", "compiler": { "name": "solc", - "version": "0.8.7+commit.e28d00a7" + "version": "0.8.15+commit.e14f2714" }, "ast": { - "absolutePath": "/Users/jasonwang/cactus-odap-merge/packages/cactus-plugin-ledger-connector-besu/src/test/solidity/hello-world-contract/lock-asset.sol", + "absolutePath": "/home/andre_9a/cactus/packages/cactus-plugin-satp-hermes/src/test/solidity/lock-asset-contract/lock-asset.sol", "exportedSymbols": { "Asset": [ 8 ], "LockAsset": [ - 150 + 192 ] }, - "id": 151, + "id": 193, "nodeType": "SourceUnit", "nodes": [ { @@ -219,19 +257,20 @@ "name": "Asset", "nameLocation": "445:5:0", "nodeType": "StructDefinition", - "scope": 151, + "scope": 193, "src": "438:68:0", "visibility": "public" }, { "abstract": false, "baseContracts": [], + "canonicalName": "LockAsset", "contractDependencies": [], "contractKind": "contract", "fullyImplemented": true, - "id": 150, + "id": 192, "linearizedBaseContracts": [ - 150 + 192 ], "name": "LockAsset", "nameLocation": "552:9:0", @@ -242,10 +281,10 @@ "id": 13, "mutability": "mutable", "name": "assets", - "nameLocation": "597:6:0", + "nameLocation": "592:6:0", "nodeType": "VariableDeclaration", - "scope": 150, - "src": "571:32:0", + "scope": 192, + "src": "566:32:0", "stateVariable": true, "storageLocation": "default", "typeDescriptions": { @@ -258,14 +297,14 @@ "id": 9, "name": "string", "nodeType": "ElementaryTypeName", - "src": "580:6:0", + "src": "575:6:0", "typeDescriptions": { "typeIdentifier": "t_string_storage_ptr", "typeString": "string" } }, "nodeType": "Mapping", - "src": "571:25:0", + "src": "566:25:0", "typeDescriptions": { "typeIdentifier": "t_mapping$_t_string_memory_ptr_$_t_struct$_Asset_$8_storage_$", "typeString": "mapping(string => struct Asset)" @@ -278,10 +317,10 @@ "name": "Asset", "nodeType": "IdentifierPath", "referencedDeclaration": 8, - "src": "590:5:0" + "src": "585:5:0" }, "referencedDeclaration": 8, - "src": "590:5:0", + "src": "585:5:0", "typeDescriptions": { "typeIdentifier": "t_struct$_Asset_$8_storage_ptr", "typeString": "struct Asset" @@ -290,11 +329,57 @@ }, "visibility": "internal" }, + { + "constant": false, + "id": 17, + "mutability": "mutable", + "name": "assetExists", + "nameLocation": "627:11:0", + "nodeType": "VariableDeclaration", + "scope": 192, + "src": "602:36:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_string_memory_ptr_$_t_bool_$", + "typeString": "mapping(string => bool)" + }, + "typeName": { + "id": 16, + "keyType": { + "id": 14, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "611:6:0", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "nodeType": "Mapping", + "src": "602:24:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_string_memory_ptr_$_t_bool_$", + "typeString": "mapping(string => bool)" + }, + "valueType": { + "id": 15, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "621:4:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + }, + "visibility": "internal" + }, { "body": { - "id": 48, + "id": 58, "nodeType": "Block", - "src": "666:129:0", + "src": "702:159:0", "statements": [ { "expression": { @@ -304,18 +389,18 @@ "typeIdentifier": "t_uint256", "typeString": "uint256" }, - "id": 23, + "id": 27, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": { - "id": 21, + "id": 25, "name": "size", "nodeType": "Identifier", "overloadedDeclarations": [], - "referencedDeclaration": 17, - "src": "682:4:0", + "referencedDeclaration": 21, + "src": "718:4:0", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" @@ -325,21 +410,21 @@ "operator": ">", "rightExpression": { "hexValue": "30", - "id": 22, + "id": 26, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", - "src": "687:1:0", + "src": "723:1:0", "typeDescriptions": { "typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0" }, "value": "0" }, - "src": "682:6:0", + "src": "718:6:0", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" @@ -353,7 +438,7 @@ "typeString": "bool" } ], - "id": 20, + "id": 24, "name": "require", "nodeType": "Identifier", "overloadedDeclarations": [ @@ -361,13 +446,13 @@ 4294967278 ], "referencedDeclaration": 4294967278, - "src": "674:7:0", + "src": "710:7:0", "typeDescriptions": { "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", "typeString": "function (bool) pure" } }, - "id": 24, + "id": 28, "isConstant": false, "isLValue": false, "isPure": false, @@ -375,20 +460,20 @@ "lValueRequested": false, "names": [], "nodeType": "FunctionCall", - "src": "674:15:0", + "src": "710:15:0", "tryCall": false, "typeDescriptions": { "typeIdentifier": "t_tuple$__$", "typeString": "tuple()" } }, - "id": 25, + "id": 29, "nodeType": "ExpressionStatement", - "src": "674:15:0" + "src": "710:15:0" }, { "expression": { - "id": 31, + "id": 35, "isConstant": false, "isLValue": false, "isPure": false, @@ -396,25 +481,25 @@ "leftHandSide": { "expression": { "baseExpression": { - "id": 26, + "id": 30, "name": "assets", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 13, - "src": "697:6:0", + "src": "733:6:0", "typeDescriptions": { "typeIdentifier": "t_mapping$_t_string_memory_ptr_$_t_struct$_Asset_$8_storage_$", "typeString": "mapping(string memory => struct Asset storage ref)" } }, - "id": 28, + "id": 32, "indexExpression": { - "id": 27, + "id": 31, "name": "id", "nodeType": "Identifier", "overloadedDeclarations": [], - "referencedDeclaration": 15, - "src": "704:2:0", + "referencedDeclaration": 19, + "src": "740:2:0", "typeDescriptions": { "typeIdentifier": "t_string_calldata_ptr", "typeString": "string calldata" @@ -425,13 +510,13 @@ "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", - "src": "697:10:0", + "src": "733:10:0", "typeDescriptions": { "typeIdentifier": "t_struct$_Asset_$8_storage", "typeString": "struct Asset storage ref" } }, - "id": 29, + "id": 33, "isConstant": false, "isLValue": true, "isPure": false, @@ -439,7 +524,7 @@ "memberName": "size", "nodeType": "MemberAccess", "referencedDeclaration": 7, - "src": "697:15:0", + "src": "733:15:0", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" @@ -448,30 +533,30 @@ "nodeType": "Assignment", "operator": "=", "rightHandSide": { - "id": 30, + "id": 34, "name": "size", "nodeType": "Identifier", "overloadedDeclarations": [], - "referencedDeclaration": 17, - "src": "714:4:0", + "referencedDeclaration": 21, + "src": "750:4:0", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, - "src": "697:21:0", + "src": "733:21:0", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, - "id": 32, + "id": 36, "nodeType": "ExpressionStatement", - "src": "697:21:0" + "src": "733:21:0" }, { "expression": { - "id": 39, + "id": 43, "isConstant": false, "isLValue": false, "isPure": false, @@ -479,25 +564,25 @@ "leftHandSide": { "expression": { "baseExpression": { - "id": 33, + "id": 37, "name": "assets", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 13, - "src": "726:6:0", + "src": "762:6:0", "typeDescriptions": { "typeIdentifier": "t_mapping$_t_string_memory_ptr_$_t_struct$_Asset_$8_storage_$", "typeString": "mapping(string memory => struct Asset storage ref)" } }, - "id": 35, + "id": 39, "indexExpression": { - "id": 34, + "id": 38, "name": "id", "nodeType": "Identifier", "overloadedDeclarations": [], - "referencedDeclaration": 15, - "src": "733:2:0", + "referencedDeclaration": 19, + "src": "769:2:0", "typeDescriptions": { "typeIdentifier": "t_string_calldata_ptr", "typeString": "string calldata" @@ -508,13 +593,13 @@ "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", - "src": "726:10:0", + "src": "762:10:0", "typeDescriptions": { "typeIdentifier": "t_struct$_Asset_$8_storage", "typeString": "struct Asset storage ref" } }, - "id": 36, + "id": 40, "isConstant": false, "isLValue": true, "isPure": false, @@ -522,7 +607,7 @@ "memberName": "creator", "nodeType": "MemberAccess", "referencedDeclaration": 3, - "src": "726:18:0", + "src": "762:18:0", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" @@ -532,43 +617,43 @@ "operator": "=", "rightHandSide": { "expression": { - "id": 37, + "id": 41, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4294967281, - "src": "747:3:0", + "src": "783:3:0", "typeDescriptions": { "typeIdentifier": "t_magic_message", "typeString": "msg" } }, - "id": 38, + "id": 42, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberName": "sender", "nodeType": "MemberAccess", - "src": "747:10:0", + "src": "783:10:0", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" } }, - "src": "726:31:0", + "src": "762:31:0", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" } }, - "id": 40, + "id": 44, "nodeType": "ExpressionStatement", - "src": "726:31:0" + "src": "762:31:0" }, { "expression": { - "id": 46, + "id": 50, "isConstant": false, "isLValue": false, "isPure": false, @@ -576,25 +661,25 @@ "leftHandSide": { "expression": { "baseExpression": { - "id": 41, + "id": 45, "name": "assets", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 13, - "src": "765:6:0", + "src": "801:6:0", "typeDescriptions": { "typeIdentifier": "t_mapping$_t_string_memory_ptr_$_t_struct$_Asset_$8_storage_$", "typeString": "mapping(string memory => struct Asset storage ref)" } }, - "id": 43, + "id": 47, "indexExpression": { - "id": 42, + "id": 46, "name": "id", "nodeType": "Identifier", "overloadedDeclarations": [], - "referencedDeclaration": 15, - "src": "772:2:0", + "referencedDeclaration": 19, + "src": "808:2:0", "typeDescriptions": { "typeIdentifier": "t_string_calldata_ptr", "typeString": "string calldata" @@ -605,13 +690,13 @@ "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", - "src": "765:10:0", + "src": "801:10:0", "typeDescriptions": { "typeIdentifier": "t_struct$_Asset_$8_storage", "typeString": "struct Asset storage ref" } }, - "id": 44, + "id": 48, "isConstant": false, "isLValue": true, "isPure": false, @@ -619,7 +704,7 @@ "memberName": "isLock", "nodeType": "MemberAccess", "referencedDeclaration": 5, - "src": "765:17:0", + "src": "801:17:0", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" @@ -629,53 +714,125 @@ "operator": "=", "rightHandSide": { "hexValue": "66616c7365", - "id": 45, + "id": 49, "isConstant": false, "isLValue": false, "isPure": true, "kind": "bool", "lValueRequested": false, "nodeType": "Literal", - "src": "785:5:0", + "src": "821:5:0", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" }, "value": "false" }, - "src": "765:25:0", + "src": "801:25:0", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" } }, - "id": 47, + "id": 51, + "nodeType": "ExpressionStatement", + "src": "801:25:0" + }, + { + "expression": { + "id": 56, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 52, + "name": "assetExists", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17, + "src": "834:11:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_string_memory_ptr_$_t_bool_$", + "typeString": "mapping(string memory => bool)" + } + }, + "id": 54, + "indexExpression": { + "id": 53, + "name": "id", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 19, + "src": "846:2:0", + "typeDescriptions": { + "typeIdentifier": "t_string_calldata_ptr", + "typeString": "string calldata" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "834:15:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "74727565", + "id": 55, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "852:4:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + "src": "834:22:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 57, "nodeType": "ExpressionStatement", - "src": "765:25:0" + "src": "834:22:0" } ] }, "functionSelector": "db9cc410", - "id": 49, + "id": 59, "implemented": true, "kind": "function", "modifiers": [], "name": "createAsset", - "nameLocation": "616:11:0", + "nameLocation": "652:11:0", "nodeType": "FunctionDefinition", "parameters": { - "id": 18, + "id": 22, "nodeType": "ParameterList", "parameters": [ { "constant": false, - "id": 15, + "id": 19, "mutability": "mutable", "name": "id", - "nameLocation": "645:2:0", + "nameLocation": "681:2:0", "nodeType": "VariableDeclaration", - "scope": 49, - "src": "629:18:0", + "scope": 59, + "src": "665:18:0", "stateVariable": false, "storageLocation": "calldata", "typeDescriptions": { @@ -683,10 +840,10 @@ "typeString": "string" }, "typeName": { - "id": 14, + "id": 18, "name": "string", "nodeType": "ElementaryTypeName", - "src": "629:6:0", + "src": "665:6:0", "typeDescriptions": { "typeIdentifier": "t_string_storage_ptr", "typeString": "string" @@ -696,13 +853,13 @@ }, { "constant": false, - "id": 17, + "id": 21, "mutability": "mutable", "name": "size", - "nameLocation": "654:4:0", + "nameLocation": "690:4:0", "nodeType": "VariableDeclaration", - "scope": 49, - "src": "649:9:0", + "scope": 59, + "src": "685:9:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { @@ -710,10 +867,10 @@ "typeString": "uint256" }, "typeName": { - "id": 16, + "id": 20, "name": "uint", "nodeType": "ElementaryTypeName", - "src": "649:4:0", + "src": "685:4:0", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" @@ -722,48 +879,48 @@ "visibility": "internal" } ], - "src": "627:32:0" + "src": "663:32:0" }, "returnParameters": { - "id": 19, + "id": 23, "nodeType": "ParameterList", "parameters": [], - "src": "666:0:0" + "src": "702:0:0" }, - "scope": 150, - "src": "607:188:0", + "scope": 192, + "src": "643:218:0", "stateMutability": "nonpayable", "virtual": false, "visibility": "public" }, { "body": { - "id": 61, + "id": 71, "nodeType": "Block", - "src": "873:30:0", + "src": "938:30:0", "statements": [ { "expression": { "baseExpression": { - "id": 57, + "id": 67, "name": "assets", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 13, - "src": "888:6:0", + "src": "953:6:0", "typeDescriptions": { "typeIdentifier": "t_mapping$_t_string_memory_ptr_$_t_struct$_Asset_$8_storage_$", "typeString": "mapping(string memory => struct Asset storage ref)" } }, - "id": 59, + "id": 69, "indexExpression": { - "id": 58, + "id": 68, "name": "id", "nodeType": "Identifier", "overloadedDeclarations": [], - "referencedDeclaration": 51, - "src": "895:2:0", + "referencedDeclaration": 61, + "src": "960:2:0", "typeDescriptions": { "typeIdentifier": "t_string_calldata_ptr", "typeString": "string calldata" @@ -774,40 +931,40 @@ "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", - "src": "888:10:0", + "src": "953:10:0", "typeDescriptions": { "typeIdentifier": "t_struct$_Asset_$8_storage", "typeString": "struct Asset storage ref" } }, - "functionReturnParameters": 56, - "id": 60, + "functionReturnParameters": 66, + "id": 70, "nodeType": "Return", - "src": "881:17:0" + "src": "946:17:0" } ] }, "functionSelector": "cd5286d0", - "id": 62, + "id": 72, "implemented": true, "kind": "function", "modifiers": [], "name": "getAsset", - "nameLocation": "807:8:0", + "nameLocation": "874:8:0", "nodeType": "FunctionDefinition", "parameters": { - "id": 52, + "id": 62, "nodeType": "ParameterList", "parameters": [ { "constant": false, - "id": 51, + "id": 61, "mutability": "mutable", "name": "id", - "nameLocation": "832:2:0", + "nameLocation": "899:2:0", "nodeType": "VariableDeclaration", - "scope": 62, - "src": "816:18:0", + "scope": 72, + "src": "883:18:0", "stateVariable": false, "storageLocation": "calldata", "typeDescriptions": { @@ -815,10 +972,10 @@ "typeString": "string" }, "typeName": { - "id": 50, + "id": 60, "name": "string", "nodeType": "ElementaryTypeName", - "src": "816:6:0", + "src": "883:6:0", "typeDescriptions": { "typeIdentifier": "t_string_storage_ptr", "typeString": "string" @@ -827,21 +984,21 @@ "visibility": "internal" } ], - "src": "815:20:0" + "src": "882:20:0" }, "returnParameters": { - "id": 56, + "id": 66, "nodeType": "ParameterList", "parameters": [ { "constant": false, - "id": 55, + "id": 65, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", - "scope": 62, - "src": "857:12:0", + "scope": 72, + "src": "924:12:0", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": { @@ -849,17 +1006,17 @@ "typeString": "struct Asset" }, "typeName": { - "id": 54, + "id": 64, "nodeType": "UserDefinedTypeName", "pathNode": { - "id": 53, + "id": 63, "name": "Asset", "nodeType": "IdentifierPath", "referencedDeclaration": 8, - "src": "857:5:0" + "src": "924:5:0" }, "referencedDeclaration": 8, - "src": "857:5:0", + "src": "924:5:0", "typeDescriptions": { "typeIdentifier": "t_struct$_Asset_$8_storage_ptr", "typeString": "struct Asset" @@ -868,34 +1025,34 @@ "visibility": "internal" } ], - "src": "856:14:0" + "src": "923:14:0" }, - "scope": 150, - "src": "798:105:0", + "scope": 192, + "src": "865:103:0", "stateMutability": "view", "virtual": false, "visibility": "public" }, { "body": { - "id": 87, + "id": 94, "nodeType": "Block", - "src": "991:109:0", + "src": "1057:98:0", "statements": [ { "assignments": [ - 68 + 78 ], "declarations": [ { "constant": false, - "id": 68, + "id": 78, "mutability": "mutable", - "name": "assetExsist", - "nameLocation": "1004:11:0", + "name": "exists", + "nameLocation": "1070:6:0", "nodeType": "VariableDeclaration", - "scope": 87, - "src": "999:16:0", + "scope": 94, + "src": "1065:11:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { @@ -903,10 +1060,10 @@ "typeString": "bool" }, "typeName": { - "id": 67, + "id": 77, "name": "bool", "nodeType": "ElementaryTypeName", - "src": "999:4:0", + "src": "1065:4:0", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" @@ -915,106 +1072,57 @@ "visibility": "internal" } ], - "id": 75, + "id": 82, "initialValue": { - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 74, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "expression": { - "baseExpression": { - "id": 69, - "name": "assets", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 13, - "src": "1018:6:0", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_string_memory_ptr_$_t_struct$_Asset_$8_storage_$", - "typeString": "mapping(string memory => struct Asset storage ref)" - } - }, - "id": 71, - "indexExpression": { - "id": 70, - "name": "id", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 64, - "src": "1025:2:0", - "typeDescriptions": { - "typeIdentifier": "t_string_calldata_ptr", - "typeString": "string calldata" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "1018:10:0", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Asset_$8_storage", - "typeString": "struct Asset storage ref" - } - }, - "id": 72, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "size", - "nodeType": "MemberAccess", - "referencedDeclaration": 7, - "src": "1018:15:0", + "baseExpression": { + "id": 79, + "name": "assetExists", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17, + "src": "1079:11:0", "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" + "typeIdentifier": "t_mapping$_t_string_memory_ptr_$_t_bool_$", + "typeString": "mapping(string memory => bool)" } }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "hexValue": "30", - "id": 73, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "1034:1:0", + "id": 81, + "indexExpression": { + "id": 80, + "name": "id", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 74, + "src": "1091:2:0", "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" + "typeIdentifier": "t_string_calldata_ptr", + "typeString": "string calldata" + } }, - "src": "1018:17:0", + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "1079:15:0", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" } }, "nodeType": "VariableDeclarationStatement", - "src": "999:36:0" + "src": "1065:29:0" }, { "expression": { "arguments": [ { - "id": 77, - "name": "assetExsist", + "id": 84, + "name": "exists", "nodeType": "Identifier", "overloadedDeclarations": [], - "referencedDeclaration": 68, - "src": "1051:11:0", + "referencedDeclaration": 78, + "src": "1110:6:0", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" @@ -1028,7 +1136,7 @@ "typeString": "bool" } ], - "id": 76, + "id": 83, "name": "require", "nodeType": "Identifier", "overloadedDeclarations": [ @@ -1036,13 +1144,13 @@ 4294967278 ], "referencedDeclaration": 4294967278, - "src": "1043:7:0", + "src": "1102:7:0", "typeDescriptions": { "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", "typeString": "function (bool) pure" } }, - "id": 78, + "id": 85, "isConstant": false, "isLValue": false, "isPure": false, @@ -1050,20 +1158,20 @@ "lValueRequested": false, "names": [], "nodeType": "FunctionCall", - "src": "1043:20:0", + "src": "1102:15:0", "tryCall": false, "typeDescriptions": { "typeIdentifier": "t_tuple$__$", "typeString": "tuple()" } }, - "id": 79, + "id": 86, "nodeType": "ExpressionStatement", - "src": "1043:20:0" + "src": "1102:15:0" }, { "expression": { - "id": 85, + "id": 92, "isConstant": false, "isLValue": false, "isPure": false, @@ -1071,25 +1179,25 @@ "leftHandSide": { "expression": { "baseExpression": { - "id": 80, + "id": 87, "name": "assets", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 13, - "src": "1071:6:0", + "src": "1126:6:0", "typeDescriptions": { "typeIdentifier": "t_mapping$_t_string_memory_ptr_$_t_struct$_Asset_$8_storage_$", "typeString": "mapping(string memory => struct Asset storage ref)" } }, - "id": 82, + "id": 89, "indexExpression": { - "id": 81, + "id": 88, "name": "id", "nodeType": "Identifier", "overloadedDeclarations": [], - "referencedDeclaration": 64, - "src": "1078:2:0", + "referencedDeclaration": 74, + "src": "1133:2:0", "typeDescriptions": { "typeIdentifier": "t_string_calldata_ptr", "typeString": "string calldata" @@ -1100,13 +1208,13 @@ "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", - "src": "1071:10:0", + "src": "1126:10:0", "typeDescriptions": { "typeIdentifier": "t_struct$_Asset_$8_storage", "typeString": "struct Asset storage ref" } }, - "id": 83, + "id": 90, "isConstant": false, "isLValue": true, "isPure": false, @@ -1114,7 +1222,7 @@ "memberName": "isLock", "nodeType": "MemberAccess", "referencedDeclaration": 5, - "src": "1071:17:0", + "src": "1126:17:0", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" @@ -1124,53 +1232,53 @@ "operator": "=", "rightHandSide": { "hexValue": "74727565", - "id": 84, + "id": 91, "isConstant": false, "isLValue": false, "isPure": true, "kind": "bool", "lValueRequested": false, "nodeType": "Literal", - "src": "1091:4:0", + "src": "1146:4:0", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" }, "value": "true" }, - "src": "1071:24:0", + "src": "1126:24:0", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" } }, - "id": 86, + "id": 93, "nodeType": "ExpressionStatement", - "src": "1071:24:0" + "src": "1126:24:0" } ] }, "functionSelector": "5e82d0a6", - "id": 88, + "id": 95, "implemented": true, "kind": "function", "modifiers": [], "name": "lockAsset", - "nameLocation": "955:9:0", + "nameLocation": "1020:9:0", "nodeType": "FunctionDefinition", "parameters": { - "id": 65, + "id": 75, "nodeType": "ParameterList", "parameters": [ { "constant": false, - "id": 64, + "id": 74, "mutability": "mutable", "name": "id", - "nameLocation": "981:2:0", + "nameLocation": "1046:2:0", "nodeType": "VariableDeclaration", - "scope": 88, - "src": "965:18:0", + "scope": 95, + "src": "1030:18:0", "stateVariable": false, "storageLocation": "calldata", "typeDescriptions": { @@ -1178,10 +1286,10 @@ "typeString": "string" }, "typeName": { - "id": 63, + "id": 73, "name": "string", "nodeType": "ElementaryTypeName", - "src": "965:6:0", + "src": "1030:6:0", "typeDescriptions": { "typeIdentifier": "t_string_storage_ptr", "typeString": "string" @@ -1190,40 +1298,40 @@ "visibility": "internal" } ], - "src": "964:20:0" + "src": "1029:20:0" }, "returnParameters": { - "id": 66, + "id": 76, "nodeType": "ParameterList", "parameters": [], - "src": "991:0:0" + "src": "1057:0:0" }, - "scope": 150, - "src": "946:154:0", + "scope": 192, + "src": "1011:144:0", "stateMutability": "nonpayable", "virtual": false, "visibility": "public" }, { "body": { - "id": 113, + "id": 117, "nodeType": "Block", - "src": "1191:110:0", + "src": "1248:99:0", "statements": [ { "assignments": [ - 94 + 101 ], "declarations": [ { "constant": false, - "id": 94, + "id": 101, "mutability": "mutable", - "name": "assetExsist", - "nameLocation": "1204:11:0", + "name": "exists", + "nameLocation": "1261:6:0", "nodeType": "VariableDeclaration", - "scope": 113, - "src": "1199:16:0", + "scope": 117, + "src": "1256:11:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { @@ -1231,10 +1339,10 @@ "typeString": "bool" }, "typeName": { - "id": 93, + "id": 100, "name": "bool", "nodeType": "ElementaryTypeName", - "src": "1199:4:0", + "src": "1256:4:0", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" @@ -1243,106 +1351,57 @@ "visibility": "internal" } ], - "id": 101, + "id": 105, "initialValue": { - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" + "baseExpression": { + "id": 102, + "name": "assetExists", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17, + "src": "1270:11:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_string_memory_ptr_$_t_bool_$", + "typeString": "mapping(string memory => bool)" + } + }, + "id": 104, + "indexExpression": { + "id": 103, + "name": "id", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 97, + "src": "1282:2:0", + "typeDescriptions": { + "typeIdentifier": "t_string_calldata_ptr", + "typeString": "string calldata" + } }, - "id": 100, "isConstant": false, - "isLValue": false, + "isLValue": true, "isPure": false, "lValueRequested": false, - "leftExpression": { - "expression": { - "baseExpression": { - "id": 95, - "name": "assets", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 13, - "src": "1218:6:0", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_string_memory_ptr_$_t_struct$_Asset_$8_storage_$", - "typeString": "mapping(string memory => struct Asset storage ref)" - } - }, - "id": 97, - "indexExpression": { - "id": 96, - "name": "id", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 90, - "src": "1225:2:0", - "typeDescriptions": { - "typeIdentifier": "t_string_calldata_ptr", - "typeString": "string calldata" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "1218:10:0", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Asset_$8_storage", - "typeString": "struct Asset storage ref" - } - }, - "id": 98, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "size", - "nodeType": "MemberAccess", - "referencedDeclaration": 7, - "src": "1218:15:0", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "hexValue": "30", - "id": 99, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "1234:1:0", - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "1218:17:0", + "nodeType": "IndexAccess", + "src": "1270:15:0", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" } }, "nodeType": "VariableDeclarationStatement", - "src": "1199:36:0" + "src": "1256:29:0" }, { "expression": { "arguments": [ { - "id": 103, - "name": "assetExsist", + "id": 107, + "name": "exists", "nodeType": "Identifier", "overloadedDeclarations": [], - "referencedDeclaration": 94, - "src": "1251:11:0", + "referencedDeclaration": 101, + "src": "1301:6:0", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" @@ -1356,7 +1415,7 @@ "typeString": "bool" } ], - "id": 102, + "id": 106, "name": "require", "nodeType": "Identifier", "overloadedDeclarations": [ @@ -1364,13 +1423,13 @@ 4294967278 ], "referencedDeclaration": 4294967278, - "src": "1243:7:0", + "src": "1293:7:0", "typeDescriptions": { "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", "typeString": "function (bool) pure" } }, - "id": 104, + "id": 108, "isConstant": false, "isLValue": false, "isPure": false, @@ -1378,20 +1437,20 @@ "lValueRequested": false, "names": [], "nodeType": "FunctionCall", - "src": "1243:20:0", + "src": "1293:15:0", "tryCall": false, "typeDescriptions": { "typeIdentifier": "t_tuple$__$", "typeString": "tuple()" } }, - "id": 105, + "id": 109, "nodeType": "ExpressionStatement", - "src": "1243:20:0" + "src": "1293:15:0" }, { "expression": { - "id": 111, + "id": 115, "isConstant": false, "isLValue": false, "isPure": false, @@ -1399,25 +1458,25 @@ "leftHandSide": { "expression": { "baseExpression": { - "id": 106, + "id": 110, "name": "assets", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 13, - "src": "1271:6:0", + "src": "1317:6:0", "typeDescriptions": { "typeIdentifier": "t_mapping$_t_string_memory_ptr_$_t_struct$_Asset_$8_storage_$", "typeString": "mapping(string memory => struct Asset storage ref)" } }, - "id": 108, + "id": 112, "indexExpression": { - "id": 107, + "id": 111, "name": "id", "nodeType": "Identifier", "overloadedDeclarations": [], - "referencedDeclaration": 90, - "src": "1278:2:0", + "referencedDeclaration": 97, + "src": "1324:2:0", "typeDescriptions": { "typeIdentifier": "t_string_calldata_ptr", "typeString": "string calldata" @@ -1428,13 +1487,13 @@ "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", - "src": "1271:10:0", + "src": "1317:10:0", "typeDescriptions": { "typeIdentifier": "t_struct$_Asset_$8_storage", "typeString": "struct Asset storage ref" } }, - "id": 109, + "id": 113, "isConstant": false, "isLValue": true, "isPure": false, @@ -1442,7 +1501,7 @@ "memberName": "isLock", "nodeType": "MemberAccess", "referencedDeclaration": 5, - "src": "1271:17:0", + "src": "1317:17:0", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" @@ -1452,53 +1511,53 @@ "operator": "=", "rightHandSide": { "hexValue": "66616c7365", - "id": 110, + "id": 114, "isConstant": false, "isLValue": false, "isPure": true, "kind": "bool", "lValueRequested": false, "nodeType": "Literal", - "src": "1291:5:0", + "src": "1337:5:0", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" }, "value": "false" }, - "src": "1271:25:0", + "src": "1317:25:0", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" } }, - "id": 112, + "id": 116, "nodeType": "ExpressionStatement", - "src": "1271:25:0" + "src": "1317:25:0" } ] }, "functionSelector": "def60e0d", - "id": 114, + "id": 118, "implemented": true, "kind": "function", "modifiers": [], "name": "unLockAsset", - "nameLocation": "1153:11:0", + "nameLocation": "1209:11:0", "nodeType": "FunctionDefinition", "parameters": { - "id": 91, + "id": 98, "nodeType": "ParameterList", "parameters": [ { "constant": false, - "id": 90, + "id": 97, "mutability": "mutable", "name": "id", - "nameLocation": "1181:2:0", + "nameLocation": "1237:2:0", "nodeType": "VariableDeclaration", - "scope": 114, - "src": "1165:18:0", + "scope": 118, + "src": "1221:18:0", "stateVariable": false, "storageLocation": "calldata", "typeDescriptions": { @@ -1506,10 +1565,10 @@ "typeString": "string" }, "typeName": { - "id": 89, + "id": 96, "name": "string", "nodeType": "ElementaryTypeName", - "src": "1165:6:0", + "src": "1221:6:0", "typeDescriptions": { "typeIdentifier": "t_string_storage_ptr", "typeString": "string" @@ -1518,40 +1577,40 @@ "visibility": "internal" } ], - "src": "1164:20:0" + "src": "1220:20:0" }, "returnParameters": { - "id": 92, + "id": 99, "nodeType": "ParameterList", "parameters": [], - "src": "1191:0:0" + "src": "1248:0:0" }, - "scope": 150, - "src": "1144:157:0", + "scope": 192, + "src": "1200:147:0", "stateMutability": "nonpayable", "virtual": false, "visibility": "public" }, { "body": { - "id": 148, + "id": 155, "nodeType": "Block", - "src": "1352:241:0", + "src": "1399:262:0", "statements": [ { "assignments": [ - 120 + 124 ], "declarations": [ { "constant": false, - "id": 120, + "id": 124, "mutability": "mutable", - "name": "assetExsist", - "nameLocation": "1365:11:0", + "name": "exists", + "nameLocation": "1412:6:0", "nodeType": "VariableDeclaration", - "scope": 148, - "src": "1360:16:0", + "scope": 155, + "src": "1407:11:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { @@ -1559,10 +1618,10 @@ "typeString": "bool" }, "typeName": { - "id": 119, + "id": 123, "name": "bool", "nodeType": "ElementaryTypeName", - "src": "1360:4:0", + "src": "1407:4:0", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" @@ -1571,106 +1630,57 @@ "visibility": "internal" } ], - "id": 127, + "id": 128, "initialValue": { - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 126, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "expression": { - "baseExpression": { - "id": 121, - "name": "assets", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 13, - "src": "1379:6:0", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_string_memory_ptr_$_t_struct$_Asset_$8_storage_$", - "typeString": "mapping(string memory => struct Asset storage ref)" - } - }, - "id": 123, - "indexExpression": { - "id": 122, - "name": "id", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 116, - "src": "1386:2:0", - "typeDescriptions": { - "typeIdentifier": "t_string_calldata_ptr", - "typeString": "string calldata" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "1379:10:0", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Asset_$8_storage", - "typeString": "struct Asset storage ref" - } - }, - "id": 124, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "size", - "nodeType": "MemberAccess", - "referencedDeclaration": 7, - "src": "1379:15:0", + "baseExpression": { + "id": 125, + "name": "assetExists", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17, + "src": "1421:11:0", "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" + "typeIdentifier": "t_mapping$_t_string_memory_ptr_$_t_bool_$", + "typeString": "mapping(string memory => bool)" } }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "hexValue": "30", - "id": 125, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "1395:1:0", + "id": 127, + "indexExpression": { + "id": 126, + "name": "id", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 120, + "src": "1433:2:0", "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" + "typeIdentifier": "t_string_calldata_ptr", + "typeString": "string calldata" + } }, - "src": "1379:17:0", + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "1421:15:0", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" } }, "nodeType": "VariableDeclarationStatement", - "src": "1360:36:0" + "src": "1407:29:0" }, { "expression": { "arguments": [ { - "id": 129, - "name": "assetExsist", + "id": 130, + "name": "exists", "nodeType": "Identifier", "overloadedDeclarations": [], - "referencedDeclaration": 120, - "src": "1412:11:0", + "referencedDeclaration": 124, + "src": "1452:6:0", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" @@ -1684,7 +1694,7 @@ "typeString": "bool" } ], - "id": 128, + "id": 129, "name": "require", "nodeType": "Identifier", "overloadedDeclarations": [ @@ -1692,13 +1702,13 @@ 4294967278 ], "referencedDeclaration": 4294967278, - "src": "1404:7:0", + "src": "1444:7:0", "typeDescriptions": { "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", "typeString": "function (bool) pure" } }, - "id": 130, + "id": 131, "isConstant": false, "isLValue": false, "isPure": false, @@ -1706,31 +1716,31 @@ "lValueRequested": false, "names": [], "nodeType": "FunctionCall", - "src": "1404:20:0", + "src": "1444:15:0", "tryCall": false, "typeDescriptions": { "typeIdentifier": "t_tuple$__$", "typeString": "tuple()" } }, - "id": 131, + "id": 132, "nodeType": "ExpressionStatement", - "src": "1404:20:0" + "src": "1444:15:0" }, { "assignments": [ - 133 + 134 ], "declarations": [ { "constant": false, - "id": 133, + "id": 134, "mutability": "mutable", "name": "assetIsLocked", - "nameLocation": "1500:13:0", + "nameLocation": "1536:13:0", "nodeType": "VariableDeclaration", - "scope": 148, - "src": "1495:18:0", + "scope": 155, + "src": "1531:18:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { @@ -1738,10 +1748,10 @@ "typeString": "bool" }, "typeName": { - "id": 132, + "id": 133, "name": "bool", "nodeType": "ElementaryTypeName", - "src": "1495:4:0", + "src": "1531:4:0", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" @@ -1750,29 +1760,29 @@ "visibility": "internal" } ], - "id": 138, + "id": 139, "initialValue": { "expression": { "baseExpression": { - "id": 134, + "id": 135, "name": "assets", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 13, - "src": "1516:6:0", + "src": "1552:6:0", "typeDescriptions": { "typeIdentifier": "t_mapping$_t_string_memory_ptr_$_t_struct$_Asset_$8_storage_$", "typeString": "mapping(string memory => struct Asset storage ref)" } }, - "id": 136, + "id": 137, "indexExpression": { - "id": 135, + "id": 136, "name": "id", "nodeType": "Identifier", "overloadedDeclarations": [], - "referencedDeclaration": 116, - "src": "1523:2:0", + "referencedDeclaration": 120, + "src": "1559:2:0", "typeDescriptions": { "typeIdentifier": "t_string_calldata_ptr", "typeString": "string calldata" @@ -1783,13 +1793,13 @@ "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", - "src": "1516:10:0", + "src": "1552:10:0", "typeDescriptions": { "typeIdentifier": "t_struct$_Asset_$8_storage", "typeString": "struct Asset storage ref" } }, - "id": 137, + "id": 138, "isConstant": false, "isLValue": true, "isPure": false, @@ -1797,25 +1807,25 @@ "memberName": "isLock", "nodeType": "MemberAccess", "referencedDeclaration": 5, - "src": "1516:17:0", + "src": "1552:17:0", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" } }, "nodeType": "VariableDeclarationStatement", - "src": "1495:38:0" + "src": "1531:38:0" }, { "expression": { "arguments": [ { - "id": 140, + "id": 141, "name": "assetIsLocked", "nodeType": "Identifier", "overloadedDeclarations": [], - "referencedDeclaration": 133, - "src": "1549:13:0", + "referencedDeclaration": 134, + "src": "1585:13:0", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" @@ -1829,7 +1839,7 @@ "typeString": "bool" } ], - "id": 139, + "id": 140, "name": "require", "nodeType": "Identifier", "overloadedDeclarations": [ @@ -1837,13 +1847,13 @@ 4294967278 ], "referencedDeclaration": 4294967278, - "src": "1541:7:0", + "src": "1577:7:0", "typeDescriptions": { "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", "typeString": "function (bool) pure" } }, - "id": 141, + "id": 142, "isConstant": false, "isLValue": false, "isPure": false, @@ -1851,20 +1861,20 @@ "lValueRequested": false, "names": [], "nodeType": "FunctionCall", - "src": "1541:22:0", + "src": "1577:22:0", "tryCall": false, "typeDescriptions": { "typeIdentifier": "t_tuple$__$", "typeString": "tuple()" } }, - "id": 142, + "id": 143, "nodeType": "ExpressionStatement", - "src": "1541:22:0" + "src": "1577:22:0" }, { "expression": { - "id": 146, + "id": 147, "isConstant": false, "isLValue": false, "isPure": false, @@ -1872,28 +1882,28 @@ "nodeType": "UnaryOperation", "operator": "delete", "prefix": true, - "src": "1571:17:0", + "src": "1608:17:0", "subExpression": { "baseExpression": { - "id": 143, + "id": 144, "name": "assets", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 13, - "src": "1578:6:0", + "src": "1615:6:0", "typeDescriptions": { "typeIdentifier": "t_mapping$_t_string_memory_ptr_$_t_struct$_Asset_$8_storage_$", "typeString": "mapping(string memory => struct Asset storage ref)" } }, - "id": 145, + "id": 146, "indexExpression": { - "id": 144, + "id": 145, "name": "id", "nodeType": "Identifier", "overloadedDeclarations": [], - "referencedDeclaration": 116, - "src": "1585:2:0", + "referencedDeclaration": 120, + "src": "1622:2:0", "typeDescriptions": { "typeIdentifier": "t_string_calldata_ptr", "typeString": "string calldata" @@ -1904,7 +1914,7 @@ "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", - "src": "1578:10:0", + "src": "1615:10:0", "typeDescriptions": { "typeIdentifier": "t_struct$_Asset_$8_storage", "typeString": "struct Asset storage ref" @@ -1915,33 +1925,105 @@ "typeString": "tuple()" } }, - "id": 147, + "id": 148, "nodeType": "ExpressionStatement", - "src": "1571:17:0" + "src": "1608:17:0" + }, + { + "expression": { + "id": 153, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 149, + "name": "assetExists", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17, + "src": "1633:11:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_string_memory_ptr_$_t_bool_$", + "typeString": "mapping(string memory => bool)" + } + }, + "id": 151, + "indexExpression": { + "id": 150, + "name": "id", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 120, + "src": "1645:2:0", + "typeDescriptions": { + "typeIdentifier": "t_string_calldata_ptr", + "typeString": "string calldata" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "1633:15:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "66616c7365", + "id": 152, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1651:5:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + }, + "src": "1633:23:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 154, + "nodeType": "ExpressionStatement", + "src": "1633:23:0" } ] }, "functionSelector": "e24aa37c", - "id": 149, + "id": 156, "implemented": true, "kind": "function", "modifiers": [], "name": "deleteAsset", - "nameLocation": "1313:11:0", + "nameLocation": "1360:11:0", "nodeType": "FunctionDefinition", "parameters": { - "id": 117, + "id": 121, "nodeType": "ParameterList", "parameters": [ { "constant": false, - "id": 116, + "id": 120, "mutability": "mutable", "name": "id", - "nameLocation": "1341:2:0", + "nameLocation": "1388:2:0", "nodeType": "VariableDeclaration", - "scope": 149, - "src": "1325:18:0", + "scope": 156, + "src": "1372:18:0", "stateVariable": false, "storageLocation": "calldata", "typeDescriptions": { @@ -1949,10 +2031,10 @@ "typeString": "string" }, "typeName": { - "id": 115, + "id": 119, "name": "string", "nodeType": "ElementaryTypeName", - "src": "1325:6:0", + "src": "1372:6:0", "typeDescriptions": { "typeIdentifier": "t_string_storage_ptr", "typeString": "string" @@ -1961,45 +2043,460 @@ "visibility": "internal" } ], - "src": "1324:20:0" + "src": "1371:20:0" }, "returnParameters": { - "id": 118, + "id": 122, "nodeType": "ParameterList", "parameters": [], - "src": "1352:0:0" + "src": "1399:0:0" }, - "scope": 150, - "src": "1304:289:0", + "scope": 192, + "src": "1351:310:0", "stateMutability": "nonpayable", "virtual": false, "visibility": "public" + }, + { + "body": { + "id": 167, + "nodeType": "Block", + "src": "1731:35:0", + "statements": [ + { + "expression": { + "baseExpression": { + "id": 163, + "name": "assetExists", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17, + "src": "1746:11:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_string_memory_ptr_$_t_bool_$", + "typeString": "mapping(string memory => bool)" + } + }, + "id": 165, + "indexExpression": { + "id": 164, + "name": "id", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 158, + "src": "1758:2:0", + "typeDescriptions": { + "typeIdentifier": "t_string_calldata_ptr", + "typeString": "string calldata" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "1746:15:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "functionReturnParameters": 162, + "id": 166, + "nodeType": "Return", + "src": "1739:22:0" + } + ] + }, + "functionSelector": "bc548275", + "id": 168, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "isPresent", + "nameLocation": "1674:9:0", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 159, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 158, + "mutability": "mutable", + "name": "id", + "nameLocation": "1700:2:0", + "nodeType": "VariableDeclaration", + "scope": 168, + "src": "1684:18:0", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_string_calldata_ptr", + "typeString": "string" + }, + "typeName": { + "id": 157, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "1684:6:0", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "src": "1683:20:0" + }, + "returnParameters": { + "id": 162, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 161, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 168, + "src": "1725:4:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 160, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "1725:4:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "1724:6:0" + }, + "scope": 192, + "src": "1665:101:0", + "stateMutability": "view", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 190, + "nodeType": "Block", + "src": "1840:161:0", + "statements": [ + { + "assignments": [ + 176 + ], + "declarations": [ + { + "constant": false, + "id": 176, + "mutability": "mutable", + "name": "exists", + "nameLocation": "1853:6:0", + "nodeType": "VariableDeclaration", + "scope": 190, + "src": "1848:11:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 175, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "1848:4:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "id": 180, + "initialValue": { + "baseExpression": { + "id": 177, + "name": "assetExists", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17, + "src": "1862:11:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_string_memory_ptr_$_t_bool_$", + "typeString": "mapping(string memory => bool)" + } + }, + "id": 179, + "indexExpression": { + "id": 178, + "name": "id", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 170, + "src": "1874:2:0", + "typeDescriptions": { + "typeIdentifier": "t_string_calldata_ptr", + "typeString": "string calldata" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "1862:15:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "1848:29:0" + }, + { + "expression": { + "arguments": [ + { + "id": 182, + "name": "exists", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 176, + "src": "1893:6:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 181, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 4294967278, + 4294967278 + ], + "referencedDeclaration": 4294967278, + "src": "1885:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 183, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1885:15:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 184, + "nodeType": "ExpressionStatement", + "src": "1885:15:0" + }, + { + "expression": { + "expression": { + "baseExpression": { + "id": 185, + "name": "assets", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13, + "src": "1979:6:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_string_memory_ptr_$_t_struct$_Asset_$8_storage_$", + "typeString": "mapping(string memory => struct Asset storage ref)" + } + }, + "id": 187, + "indexExpression": { + "id": 186, + "name": "id", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 170, + "src": "1986:2:0", + "typeDescriptions": { + "typeIdentifier": "t_string_calldata_ptr", + "typeString": "string calldata" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "1979:10:0", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Asset_$8_storage", + "typeString": "struct Asset storage ref" + } + }, + "id": 188, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "isLock", + "nodeType": "MemberAccess", + "referencedDeclaration": 5, + "src": "1979:17:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "functionReturnParameters": 174, + "id": 189, + "nodeType": "Return", + "src": "1972:24:0" + } + ] + }, + "functionSelector": "1ae4eb68", + "id": 191, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "isAssetLocked", + "nameLocation": "1779:13:0", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 171, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 170, + "mutability": "mutable", + "name": "id", + "nameLocation": "1809:2:0", + "nodeType": "VariableDeclaration", + "scope": 191, + "src": "1793:18:0", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_string_calldata_ptr", + "typeString": "string" + }, + "typeName": { + "id": 169, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "1793:6:0", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "src": "1792:20:0" + }, + "returnParameters": { + "id": 174, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 173, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 191, + "src": "1834:4:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 172, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "1834:4:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "1833:6:0" + }, + "scope": 192, + "src": "1770:231:0", + "stateMutability": "view", + "virtual": false, + "visibility": "public" } ], - "scope": 151, - "src": "543:1053:0", + "scope": 193, + "src": "543:1460:0", "usedErrors": [] } ], - "src": "413:1184:0" + "src": "413:1591:0" }, "functionHashes": { "createAsset(string,uint256)": "db9cc410", "deleteAsset(string)": "e24aa37c", "getAsset(string)": "cd5286d0", + "isAssetLocked(string)": "1ae4eb68", + "isPresent(string)": "bc548275", "lockAsset(string)": "5e82d0a6", "unLockAsset(string)": "def60e0d" }, "gasEstimates": { "creation": { - "codeDepositCost": "228200", - "executionCost": "269", - "totalCost": "228469" + "codeDepositCost": "305800", + "executionCost": "343", + "totalCost": "306143" }, "external": { "createAsset(string,uint256)": "infinite", "deleteAsset(string)": "infinite", "getAsset(string)": "infinite", + "isAssetLocked(string)": "infinite", + "isPresent(string)": "infinite", "lockAsset(string)": "infinite", "unLockAsset(string)": "infinite" } diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/solidity/lock-asset-contract/lock-asset.sol b/packages/cactus-plugin-ccmodel-hephaestus/src/test/solidity/lock-asset-contract/lock-asset.sol new file mode 100644 index 0000000000..a3139b7ba9 --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/solidity/lock-asset-contract/lock-asset.sol @@ -0,0 +1,70 @@ +// ***************************************************************************** +// IMPORTANT: If you update this code then make sure to recompile +// it and update the .json file as well so that they +// remain in sync for consistent test executions. +// With that said, there shouldn't be any reason to recompile this, like ever... +// ***************************************************************************** + +pragma solidity >=0.7.0; +struct Asset{ + address creator; + bool isLock; + uint size; +} + +contract LockAsset { + mapping (string => Asset) assets; + mapping (string => bool) assetExists; + + function createAsset( string calldata id, uint size) public{ + require(size>0); + assets[id].size= size; + assets[id].creator = msg.sender; + assets[id].isLock = false; + assetExists[id] = true; + } + + function getAsset(string calldata id) public view returns (Asset memory) { + return assets[id]; + } + + //Don't care if it is already locked + function lockAsset(string calldata id) public { + bool exists = assetExists[id]; + require(exists); + + assets[id].isLock = true; + } + + //Don't care if it is already unlocked + function unLockAsset(string calldata id) public { + bool exists = assetExists[id]; + require(exists); + + assets[id].isLock = false; + } + + function deleteAsset(string calldata id) public { + bool exists = assetExists[id]; + require(exists); + + //an asset could only be deleted if it is already locked + bool assetIsLocked = assets[id].isLock; + require(assetIsLocked); + + delete assets[id]; + assetExists[id] = false; + } + + function isPresent(string calldata id) public view returns (bool) { + return assetExists[id]; + } + + function isAssetLocked(string calldata id) public view returns (bool) { + bool exists = assetExists[id]; + require(exists); + + //an asset could only be deleted if it is already locked + return assets[id].isLock; + } +} diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/fabric-contracts/lock-asset/chaincode-typescript/.gitignore b/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/fabric-contracts/lock-asset/chaincode-typescript/.gitignore new file mode 100644 index 0000000000..79bfe1a3e0 --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/fabric-contracts/lock-asset/chaincode-typescript/.gitignore @@ -0,0 +1,16 @@ +# +# SPDX-License-Identifier: Apache-2.0 +# + + +# Coverage directory used by tools like istanbul +coverage + +# Dependency directories +node_modules/ +jspm_packages/ +package-lock.json + +# Compiled TypeScript files +dist + diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/fabric-contracts/lock-asset/chaincode-typescript/package.json b/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/fabric-contracts/lock-asset/chaincode-typescript/package.json new file mode 100644 index 0000000000..7e2b5a65e6 --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/fabric-contracts/lock-asset/chaincode-typescript/package.json @@ -0,0 +1,62 @@ +{ + "name": "asset-transfer-basic", + "version": "1.0.0", + "description": "Asset Transfer Basic contract implemented in TypeScript", + "main": "dist/index.js", + "typings": "dist/index.d.ts", + "engines": { + "node": ">=12", + "npm": ">=5" + }, + "scripts": { + "lint": "tslint -c tslint.json 'src/**/*.ts'", + "pretest": "npm run lint", + "test": "nyc mocha -r ts-node/register src/**/*.spec.ts", + "start": "fabric-chaincode-node start", + "build": "tsc", + "build:watch": "tsc -w", + "prepublishOnly": "npm run build" + }, + "engineStrict": true, + "author": "Hyperledger", + "license": "Apache-2.0", + "dependencies": { + "fabric-contract-api": "2.2.2", + "fabric-shim": "2.2.2" + }, + "devDependencies": { + "@types/chai": "4.3.0", + "@types/mocha": "5.2.7", + "@types/node": "18.11.9", + "@types/sinon": "5.0.7", + "@types/sinon-chai": "3.2.8", + "chai": "4.3.6", + "mocha": "5.2.0", + "nyc": "14.1.1", + "sinon": "7.5.0", + "sinon-chai": "3.7.0", + "ts-node": "7.0.1", + "tslint": "5.20.1", + "typescript": "5.3.3" + }, + "nyc": { + "extension": [ + ".ts", + ".tsx" + ], + "exclude": [ + "coverage/**", + "dist/**" + ], + "reporter": [ + "text-summary", + "html" + ], + "all": true, + "check-coverage": true, + "statements": 100, + "branches": 100, + "functions": 100, + "lines": 100 + } +} diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/fabric-contracts/lock-asset/chaincode-typescript/src/asset.ts b/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/fabric-contracts/lock-asset/chaincode-typescript/src/asset.ts new file mode 100644 index 0000000000..1e5f4dec06 --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/fabric-contracts/lock-asset/chaincode-typescript/src/asset.ts @@ -0,0 +1,23 @@ +/* + SPDX-License-Identifier: Apache-2.0 +*/ + +import { Object, Property } from "fabric-contract-api"; + +@Object() +export class Asset { + @Property() + public docType?: string; + + @Property() + public ID: string; + + @Property() + public isLocked: boolean; + + @Property() + public size: number; + + @Property() + public owner: string; +} diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/fabric-contracts/lock-asset/chaincode-typescript/src/assetTransfer.ts b/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/fabric-contracts/lock-asset/chaincode-typescript/src/assetTransfer.ts new file mode 100644 index 0000000000..8789a15b11 --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/fabric-contracts/lock-asset/chaincode-typescript/src/assetTransfer.ts @@ -0,0 +1,201 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + */ + +import { + Context, + Contract, + Info, + Returns, + Transaction, +} from "fabric-contract-api"; +import { Asset } from "./asset"; + +@Info({ + title: "AssetTransfer", + description: "Smart contract for trading assets", +}) +export class AssetTransferContract extends Contract { + @Transaction() + public async InitLedger(ctx: Context): Promise { + const assets: Asset[] = [ + { + ID: "asset1", + size: 5, + isLocked: false, + owner: "owner1", + }, + { + ID: "asset2", + size: 5, + isLocked: false, + owner: "owner2", + }, + ]; + + for (const asset of assets) { + asset.docType = "asset"; + await ctx.stub.putState(asset.ID, Buffer.from(JSON.stringify(asset))); + console.info(`Asset ${asset.ID} initialized`); + } + } + + // CreateAsset issues a new asset to the world state with given details. + @Transaction() + public async CreateAsset( + ctx: Context, + id: string, + size: number, + owner: string, + ): Promise { + const asset: Asset = { + ID: id, + size: size, + isLocked: false, + owner: owner, + }; + await ctx.stub.putState(id, Buffer.from(JSON.stringify(asset))); + } + + // ReadAsset returns the asset stored in the world state with given id. + @Transaction(false) + public async ReadAsset(ctx: Context, id: string): Promise { + const assetJSON = await ctx.stub.getState(id); // get the asset from chaincode state + if (!assetJSON || assetJSON.length === 0) { + throw new Error(`The asset ${id} does not exist`); + } + return assetJSON.toString(); + } + + // UpdateAsset updates an existing asset in the world state with provided parameters. + @Transaction() + public async UpdateAsset( + ctx: Context, + id: string, + size: number, + owner: string, + ): Promise { + const exists = await this.AssetExists(ctx, id); + if (!exists) { + throw new Error(`The asset ${id} does not exist`); + } + + if (this.IsAssetLocked(ctx, id)) { + throw new Error(`The asset ${id} is locked`); + } + + // overwriting original asset with new asset + const assetString = await this.ReadAsset(ctx, id); + const asset: Asset = JSON.parse(assetString); + asset.size = size; + asset.owner = owner; + return ctx.stub.putState(id, Buffer.from(JSON.stringify(asset))); + } + + // TransferAsset changes the owner of an asset with given ID in the world state. + @Transaction() + public async TransferAsset( + ctx: Context, + id: string, + newOwner: string, + ): Promise { + const assetString = await this.ReadAsset(ctx, id); + const asset: Asset = JSON.parse(assetString); + asset.owner = newOwner; + return ctx.stub.putState(id, Buffer.from(JSON.stringify(asset))); + } + + // DeleteAsset deletes a given asset from the world state. + @Transaction() + public async DeleteAsset(ctx: Context, id: string): Promise { + const exists = await this.AssetExists(ctx, id); + if (!exists) { + throw new Error(`The asset ${id} does not exist`); + } + + return ctx.stub.deleteState(id); + } + + // AssetExists returns true when asset with given ID exists in world state. + @Transaction(false) + @Returns("boolean") + public async AssetExists(ctx: Context, id: string): Promise { + const assetJSON = await ctx.stub.getState(id); + return assetJSON && assetJSON.length > 0; + } + + // IsAssetLocked returns true when asset with given ID is locked in world state. + @Transaction(false) + @Returns("boolean") + public async IsAssetLocked(ctx: Context, id: string): Promise { + const assetJSON = await ctx.stub.getState(id); + + if (assetJSON && assetJSON.length > 0) { + const asset = JSON.parse(assetJSON.toString()); + return asset.isLocked; + } else { + throw new Error(`The asset ${id} does not exist`); + } + } + + @Transaction(false) + @Returns("boolean") + public async LockAsset(ctx: Context, id: string): Promise { + const exists = await this.AssetExists(ctx, id); + + if (!exists) { + throw new Error(`The asset ${id} does not exist`); + } + + // if (this.IsAssetLocked(ctx, id)) { + // throw new Error(`The asset ${id} is already locked`); + // } + + const assetString = await this.ReadAsset(ctx, id); + const asset: Asset = JSON.parse(assetString); + asset.isLocked = true; + await ctx.stub.putState(id, Buffer.from(JSON.stringify(asset))); + return true; + } + + @Transaction(false) + @Returns("boolean") + public async UnlockAsset(ctx: Context, id: string): Promise { + const exists = await this.AssetExists(ctx, id); + + if (!exists) { + throw new Error(`The asset ${id} does not exist`); + } + + const assetString = await this.ReadAsset(ctx, id); + const asset: Asset = JSON.parse(assetString); + asset.isLocked = false; + await ctx.stub.putState(id, Buffer.from(JSON.stringify(asset))); + return true; + } + + // GetAllAssets returns all assets found in the world state. + @Transaction(false) + @Returns("string") + public async GetAllAssets(ctx: Context): Promise { + const allResults = []; + // range query with empty string for startKey and endKey does an open-ended query of all assets in the chaincode namespace. + const iterator = await ctx.stub.getStateByRange("", ""); + let result = await iterator.next(); + while (!result.done) { + const strValue = Buffer.from(result.value.value.toString()).toString( + "utf8", + ); + let record; + try { + record = JSON.parse(strValue); + } catch (err) { + console.log(err); + record = strValue; + } + allResults.push({ Key: result.value.key, Record: record }); + result = await iterator.next(); + } + return JSON.stringify(allResults); + } +} diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/fabric-contracts/lock-asset/chaincode-typescript/src/index.ts b/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/fabric-contracts/lock-asset/chaincode-typescript/src/index.ts new file mode 100644 index 0000000000..020a09f410 --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/fabric-contracts/lock-asset/chaincode-typescript/src/index.ts @@ -0,0 +1,9 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + */ + +import { AssetTransferContract } from "./assetTransfer"; + +export { AssetTransferContract } from "./assetTransfer"; + +export const contracts: any[] = [AssetTransferContract]; diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/fabric-contracts/lock-asset/chaincode-typescript/tsconfig.json b/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/fabric-contracts/lock-asset/chaincode-typescript/tsconfig.json new file mode 100644 index 0000000000..80d8e12d8c --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/fabric-contracts/lock-asset/chaincode-typescript/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "outDir": "dist", + "target": "es2017", + "moduleResolution": "node", + "module": "commonjs", + "declaration": true, + "sourceMap": true + }, + "include": [ + "./src/**/*" + ], + "exclude": [ + "./src/**/*.spec.ts" + ] +} diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/basic-mock-test.test.ts b/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/basic-mock-test.test.ts new file mode 100644 index 0000000000..c411b7e24f --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/basic-mock-test.test.ts @@ -0,0 +1,125 @@ +import "jest-extended"; +import { LoggerProvider, LogLevelDesc } from "@hyperledger/cactus-common"; +import { + Containers, + pruneDockerAllIfGithubAction, +} from "@hyperledger/cactus-test-tooling"; +import { IPluginCcModelHephaestusOptions } from "../../../main/typescript"; +import { CcModelHephaestus } from "../../../main/typescript/plugin-ccmodel-hephaestus"; +import { v4 as uuidv4 } from "uuid"; +import { + FabricContractInvocationType, + RunTxReqWithTxId, +} from "@hyperledger/cactus-plugin-ledger-connector-fabric"; +import { ReplaySubject } from "rxjs"; + +const testCase = "simulate basic transaction without connectors"; +const logLevel: LogLevelDesc = "TRACE"; +const log = LoggerProvider.getOrCreate({ + level: logLevel, + label: "Hephaestus", +}); + +let fabricReplaySubject: ReplaySubject; +let hephaestusOptions: IPluginCcModelHephaestusOptions; +let hephaestus: CcModelHephaestus; + +beforeAll(async () => { + pruneDockerAllIfGithubAction({ logLevel }) + .then(() => { + log.info("Pruning throw OK"); + }) + .catch(async () => { + await Containers.logDiagnostics({ logLevel }); + fail("Pruning didn't throw OK"); + }); + fabricReplaySubject = new ReplaySubject(); + + hephaestusOptions = { + instanceId: uuidv4(), + logLevel: logLevel, + fabricTxObservable: fabricReplaySubject.asObservable(), + }; + + hephaestus = new CcModelHephaestus(hephaestusOptions); +}); + +test(testCase, async () => { + hephaestus.setCaseId("basic-TEST"); + expect(hephaestus).toBeTruthy(); + log.info("hephaestus plugin is ok"); + + expect(hephaestus.numberUnprocessedReceipts).toEqual(0); + expect(hephaestus.numberEventsLog).toEqual(0); + + const txSim1: RunTxReqWithTxId = { + request: { + signingCredential: { + keychainId: "keychainId", + keychainRef: "person 1", + }, + channelName: "channelName", + contractName: "contractName", + invocationType: FabricContractInvocationType.Send, + methodName: "methodName", + params: ["0", "2"], + }, + transactionId: "txID1", + timestamp: new Date(), + }; + fabricReplaySubject.next(txSim1); + log.debug(txSim1); + + await new Promise((f) => setTimeout(f, 3000)); + + // only monitoring the last 1000 miliseconds + // txSim1 will not be monitored + hephaestus.monitorTransactions(1000); + + const txSim2: RunTxReqWithTxId = { + request: { + signingCredential: { + keychainId: "keychainId", + keychainRef: "person 1", + }, + channelName: "channelName", + contractName: "contractName", + invocationType: FabricContractInvocationType.Send, + methodName: "methodName2", + params: ["0", "2"], + }, + transactionId: "txID1", + timestamp: new Date(), + }; + fabricReplaySubject.next(txSim2); + log.debug(txSim2); + + expect(hephaestus.numberUnprocessedReceipts).toEqual(1); + expect(hephaestus.numberEventsLog).toEqual(0); + + await hephaestus.txReceiptToCrossChainEventLogEntry(); + + expect(hephaestus.numberUnprocessedReceipts).toEqual(0); + expect(hephaestus.numberEventsLog).toEqual(1); + + const logNameCsv = await hephaestus.persistCrossChainLogCsv( + "example-dummy-basic-test", + ); + expect(logNameCsv).toBeTruthy(); + + const logNameJson = await hephaestus.persistCrossChainLogJson( + "example-dummy-basic-test", + ); + expect(logNameJson).toBeTruthy(); +}); + +afterAll(async () => { + await pruneDockerAllIfGithubAction({ logLevel }) + .then(() => { + log.info("Pruning throw OK"); + }) + .catch(async () => { + await Containers.logDiagnostics({ logLevel }); + fail("Pruning didn't throw OK"); + }); +}); diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/cross-chain-model-conformance-checking.test.ts b/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/cross-chain-model-conformance-checking.test.ts new file mode 100644 index 0000000000..b3560e3fe4 --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/cross-chain-model-conformance-checking.test.ts @@ -0,0 +1,467 @@ +/* + * Copyright 2020-2022 Hyperledger Cactus Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +////////////////////////////////// +// Constants +////////////////////////////////// + +const testLogLevel: LogLevelDesc = "info"; + +import "jest-extended"; +import express from "express"; +import bodyParser from "body-parser"; +import http from "http"; +import Web3 from "web3"; +import { v4 as uuidv4 } from "uuid"; +import { Server as SocketIoServer } from "socket.io"; +import { AddressInfo } from "net"; +import { PluginRegistry } from "@hyperledger/cactus-core"; +import { Configuration, Constants } from "@hyperledger/cactus-core-api"; +import { + IListenOptions, + Logger, + LoggerProvider, + Servers, + LogLevelDesc, +} from "@hyperledger/cactus-common"; +import { + Containers, + pruneDockerAllIfGithubAction, +} from "@hyperledger/cactus-test-tooling"; +import { + GethTestLedger, + WHALE_ACCOUNT_ADDRESS, +} from "@hyperledger/cactus-test-geth-ledger"; +import { + EthContractInvocationType, + PluginLedgerConnectorEthereum, + Web3SigningCredentialType, + DefaultApi as EthereumApi, +} from "@hyperledger/cactus-plugin-ledger-connector-ethereum"; +import { PluginKeychainMemory } from "@hyperledger/cactus-plugin-keychain-memory"; +import { Account } from "web3-core"; +import LockAssetContractJson from "../../solidity/lock-asset-contract/LockAsset.json"; +import { IPluginCcModelHephaestusOptions } from "../../../main/typescript"; +import { CcModelHephaestus } from "../../../main/typescript/plugin-ccmodel-hephaestus"; +import { CrossChainModelType } from "../../../main/typescript/models/crosschain-model"; + +const log: Logger = LoggerProvider.getOrCreate({ + label: "cross-chain-model-conformance-checking.test", + level: testLogLevel, +}); +log.info("Test started"); + +const containerImageName = "ghcr.io/hyperledger/cacti-geth-all-in-one"; +const containerImageVersion = "2023-07-27-2a8c48ed6"; + +describe("Test cross-chain model serialization and conformance checking", () => { + const keychainEntryKey = uuidv4(); + let testEthAccount: Account, + web3: InstanceType, + addressInfo, + address: string, + port: number, + apiHost: string, + apiConfig, + ledger: GethTestLedger, + apiClient: EthereumApi, + connector: PluginLedgerConnectorEthereum, + rpcApiHttpHost: string, + keychainPlugin: PluginKeychainMemory; + + const expressApp = express(); + expressApp.use(bodyParser.json({ limit: "250mb" })); + const server = http.createServer(expressApp); + const wsApi = new SocketIoServer(server, { + path: Constants.SocketIoConnectionPathV1, + }); + + let hephaestus: CcModelHephaestus; + let hephaestusOptions: IPluginCcModelHephaestusOptions; + + ////////////////////////////////// + // Environment Setup + ////////////////////////////////// + + beforeAll(async () => { + pruneDockerAllIfGithubAction({ logLevel: testLogLevel }) + .then(() => { + log.info("Pruning throw OK"); + }) + .catch(async () => { + await Containers.logDiagnostics({ logLevel: testLogLevel }); + fail("Pruning didn't throw OK"); + }); + + ledger = new GethTestLedger({ + containerImageName, + containerImageVersion, + }); + await ledger.start(); + + const listenOptions: IListenOptions = { + hostname: "127.0.0.1", + port: 0, + server, + }; + addressInfo = (await Servers.listen(listenOptions)) as AddressInfo; + ({ address, port } = addressInfo); + apiHost = `http://${address}:${port}`; + + apiConfig = new Configuration({ basePath: apiHost }); + apiClient = new EthereumApi(apiConfig); + rpcApiHttpHost = await ledger.getRpcApiHttpHost(); + web3 = new Web3(rpcApiHttpHost); + testEthAccount = web3.eth.accounts.create(); + + log.info("Create PluginKeychainMemory..."); + const keychainEntryValue = testEthAccount.privateKey; + keychainPlugin = new PluginKeychainMemory({ + instanceId: uuidv4(), + keychainId: uuidv4(), + backend: new Map([[keychainEntryKey, keychainEntryValue]]), + logLevel: testLogLevel, + }); + + keychainPlugin.set( + LockAssetContractJson.contractName, + JSON.stringify(LockAssetContractJson), + ); + + log.info("Create PluginLedgerConnectorEthereum..."); + connector = new PluginLedgerConnectorEthereum({ + rpcApiHttpHost: rpcApiHttpHost, + logLevel: testLogLevel, + instanceId: uuidv4(), + pluginRegistry: new PluginRegistry({ plugins: [keychainPlugin] }), + }); + + await connector.getOrCreateWebServices(); + await connector.registerWebServices(expressApp, wsApi); + + log.info("Deploy Contract..."); + const deployOut = await apiClient.deployContract({ + contract: { + contractName: LockAssetContractJson.contractName, + keychainId: keychainPlugin.getKeychainId(), + }, + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + }); + expect(deployOut).toBeTruthy(); + expect(deployOut.data).toBeTruthy(); + expect(deployOut.data.transactionReceipt).toBeTruthy(); + expect(deployOut.data.transactionReceipt.contractAddress).toBeTruthy(); + log.info("contract deployed successfully"); + + const initTransferValue = web3.utils.toWei("5000", "ether"); + await apiClient.runTransactionV1({ + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + transactionConfig: { + from: WHALE_ACCOUNT_ADDRESS, + to: testEthAccount.address, + value: initTransferValue, + }, + }); + const balance = await web3.eth.getBalance(testEthAccount.address); + expect(balance).toBeTruthy(); + expect(balance.toString()).toBe(initTransferValue); + + hephaestusOptions = { + instanceId: uuidv4(), + logLevel: testLogLevel, + ethTxObservable: connector.getTxSubjectObservable(), + }; + + hephaestus = new CcModelHephaestus(hephaestusOptions); + expect(hephaestus).toBeTruthy(); + log.info("hephaestus plugin initialized successfully"); + }); + + test("Monitor Ethereum transactions and create cross-chain model", async () => { + hephaestus.setCaseId("ETHEREUM_MONITORING"); + hephaestus.monitorTransactions(); + + const numberOfCases = 3; + const txsPerCase = 3; + let caseNumber = 1; + + while (numberOfCases >= caseNumber) { + const createResEth = await apiClient.invokeContractV1({ + contract: { + contractName: LockAssetContractJson.contractName, + keychainId: keychainPlugin.getKeychainId(), + }, + invocationType: EthContractInvocationType.Send, + methodName: "createAsset", + params: ["asset1", 5], + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + }); + expect(createResEth).toBeTruthy(); + expect(createResEth.data).toBeTruthy(); + + const lockResEth = await apiClient.invokeContractV1({ + contract: { + contractName: LockAssetContractJson.contractName, + keychainId: keychainPlugin.getKeychainId(), + }, + invocationType: EthContractInvocationType.Send, + methodName: "lockAsset", + params: ["asset1"], + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + }); + expect(lockResEth).toBeTruthy(); + expect(lockResEth.data).toBeTruthy(); + expect(lockResEth.status).toBe(200); + + const deleteResEth = await apiClient.invokeContractV1({ + contract: { + contractName: LockAssetContractJson.contractName, + keychainId: keychainPlugin.getKeychainId(), + }, + invocationType: EthContractInvocationType.Send, + methodName: "deleteAsset", + params: ["asset1"], + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + }); + expect(deleteResEth).toBeTruthy(); + expect(deleteResEth.data).toBeTruthy(); + expect(deleteResEth.status).toBe(200); + + caseNumber++; + } + + const totalTxs = txsPerCase * numberOfCases; + + expect(hephaestus.numberUnprocessedReceipts).toEqual(totalTxs); + expect(hephaestus.numberEventsLog).toEqual(0); + + await hephaestus.txReceiptToCrossChainEventLogEntry(); + + expect(hephaestus.numberUnprocessedReceipts).toEqual(0); + expect(hephaestus.numberEventsLog).toEqual(totalTxs); + + const model = await hephaestus.createModel(); + expect(model).toBeTruthy(); + expect(hephaestus.ccModel.getModel(CrossChainModelType.PetriNet)) + .toBeTruthy; + + hephaestus.setIsModeling(false); + }); + + test("Check confomity of unmodeled transactions", async () => { + const createResEth = await apiClient.invokeContractV1({ + contract: { + contractName: LockAssetContractJson.contractName, + keychainId: keychainPlugin.getKeychainId(), + }, + invocationType: EthContractInvocationType.Send, + methodName: "createAsset", + params: ["asset2", 10], + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + }); + expect(createResEth).toBeTruthy(); + expect(createResEth.data).toBeTruthy(); + + const lockResEth = await apiClient.invokeContractV1({ + contract: { + contractName: LockAssetContractJson.contractName, + keychainId: keychainPlugin.getKeychainId(), + }, + invocationType: EthContractInvocationType.Send, + methodName: "lockAsset", + params: ["asset2"], + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + }); + expect(lockResEth).toBeTruthy(); + expect(lockResEth.data).toBeTruthy(); + expect(lockResEth.status).toBe(200); + + const deleteResEth = await apiClient.invokeContractV1({ + contract: { + contractName: LockAssetContractJson.contractName, + keychainId: keychainPlugin.getKeychainId(), + }, + invocationType: EthContractInvocationType.Send, + methodName: "deleteAsset", + params: ["asset2"], + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + }); + expect(deleteResEth).toBeTruthy(); + expect(deleteResEth.data).toBeTruthy(); + expect(deleteResEth.status).toBe(200); + + expect(hephaestus.numberEventsUncheckedLog).toEqual(0); + expect(hephaestus.numberUnprocessedReceipts).toEqual(3); + + await hephaestus.txReceiptToCrossChainEventLogEntry(); + expect(hephaestus.numberEventsUncheckedLog).toEqual(3); + expect(hephaestus.numberUnprocessedReceipts).toEqual(0); + + const serializedCCModel = hephaestus.getModel(CrossChainModelType.PetriNet); + expect(serializedCCModel).toBeTruthy(); + + const conformanceDetails = await hephaestus.checkConformance( + serializedCCModel!, + ); + expect(conformanceDetails).toBeTruthy(); + console.log(conformanceDetails); + + expect(hephaestus.numberUnprocessedReceipts).toEqual(0); + expect(hephaestus.numberEventsUncheckedLog).toEqual(0); + + const tree = hephaestus.convertModelToProcessTree(); + expect(tree).toBeTruthy(); + expect( + hephaestus.ccModel.getModel(CrossChainModelType.ProcessTree), + ).toBeTruthy(); + console.log(hephaestus.ccModel.getModel(CrossChainModelType.ProcessTree)); + }); + + test("Check confomity of unmodeled transactions that should not conform", async () => { + const createResEth = await apiClient.invokeContractV1({ + contract: { + contractName: LockAssetContractJson.contractName, + keychainId: keychainPlugin.getKeychainId(), + }, + invocationType: EthContractInvocationType.Send, + methodName: "createAsset", + params: ["asset3", 10], + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + }); + expect(createResEth).toBeTruthy(); + expect(createResEth.data).toBeTruthy(); + + const lockResEth = await apiClient.invokeContractV1({ + contract: { + contractName: LockAssetContractJson.contractName, + keychainId: keychainPlugin.getKeychainId(), + }, + invocationType: EthContractInvocationType.Send, + methodName: "lockAsset", + params: ["asset3"], + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + }); + expect(lockResEth).toBeTruthy(); + expect(lockResEth.data).toBeTruthy(); + expect(lockResEth.status).toBe(200); + + const deleteResEth = await apiClient.invokeContractV1({ + contract: { + contractName: LockAssetContractJson.contractName, + keychainId: keychainPlugin.getKeychainId(), + }, + invocationType: EthContractInvocationType.Send, + methodName: "deleteAsset", + params: ["asset3"], + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + }); + expect(deleteResEth).toBeTruthy(); + expect(deleteResEth.data).toBeTruthy(); + expect(deleteResEth.status).toBe(200); + + const getResEth = await apiClient.invokeContractV1({ + contract: { + contractName: LockAssetContractJson.contractName, + keychainId: keychainPlugin.getKeychainId(), + }, + invocationType: EthContractInvocationType.Send, + methodName: "getAsset", + params: ["asset3"], + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + }); + expect(getResEth).toBeTruthy(); + expect(getResEth.data).toBeTruthy(); + expect(getResEth.status).toBe(200); + + expect(hephaestus.numberEventsUncheckedLog).toEqual(0); + expect(hephaestus.numberUnprocessedReceipts).toEqual(4); + + await hephaestus.txReceiptToCrossChainEventLogEntry(); + expect(hephaestus.numberEventsUncheckedLog).toEqual(4); + expect(hephaestus.numberUnprocessedReceipts).toEqual(0); + + const serializedCCModel = hephaestus.getModel(CrossChainModelType.PetriNet); + expect(serializedCCModel).toBeTruthy(); + + const conformanceDetails = await hephaestus.checkConformance( + serializedCCModel!, + ); + expect(conformanceDetails).toBeTruthy(); + console.log(conformanceDetails); + + expect(hephaestus.numberUnprocessedReceipts).toEqual(0); + expect(hephaestus.numberEventsUncheckedLog).toEqual(0); + expect(hephaestus.numberEventsNonConformanceLog).toEqual(4); + + const tree = hephaestus.convertModelToProcessTree(); + expect(tree).toBeTruthy(); + expect(hephaestus.getModel(CrossChainModelType.ProcessTree)).toBeTruthy(); + console.log(hephaestus.getModel(CrossChainModelType.ProcessTree)); + }); + + afterAll(async () => { + log.info("Shutdown connector..."); + await connector.shutdown(); + + log.info("Stop and destroy the test ledger..."); + await ledger.stop(); + await ledger.destroy(); + + log.info("Shutdown server..."); + await Servers.shutdown(server); + + log.info("Prune docker..."); + const pruning = pruneDockerAllIfGithubAction({ logLevel: testLogLevel }); + await expect(pruning).resolves.toBeTruthy(); + }); +}); diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/cross-chain-model-periodic-update.test.ts b/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/cross-chain-model-periodic-update.test.ts new file mode 100644 index 0000000000..b9517fd912 --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/cross-chain-model-periodic-update.test.ts @@ -0,0 +1,282 @@ +/* + * Copyright 2020-2022 Hyperledger Cactus Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +////////////////////////////////// +// Constants +////////////////////////////////// + +const testLogLevel: LogLevelDesc = "info"; + +import "jest-extended"; +import express from "express"; +import bodyParser from "body-parser"; +import http from "http"; +import Web3 from "web3"; +import { v4 as uuidv4 } from "uuid"; +import { Server as SocketIoServer } from "socket.io"; +import { AddressInfo } from "net"; +import { PluginRegistry } from "@hyperledger/cactus-core"; +import { Configuration, Constants } from "@hyperledger/cactus-core-api"; +import { + IListenOptions, + Logger, + LoggerProvider, + Servers, + LogLevelDesc, +} from "@hyperledger/cactus-common"; +import { + Containers, + pruneDockerAllIfGithubAction, +} from "@hyperledger/cactus-test-tooling"; +import { + GethTestLedger, + WHALE_ACCOUNT_ADDRESS, +} from "@hyperledger/cactus-test-geth-ledger"; +import { + EthContractInvocationType, + PluginLedgerConnectorEthereum, + Web3SigningCredentialType, + DefaultApi as EthereumApi, +} from "@hyperledger/cactus-plugin-ledger-connector-ethereum"; +import { PluginKeychainMemory } from "@hyperledger/cactus-plugin-keychain-memory"; +import { Account } from "web3-core"; +import LockAssetContractJson from "../../solidity/lock-asset-contract/LockAsset.json"; +import { IPluginCcModelHephaestusOptions } from "../../../main/typescript"; +import { CcModelHephaestus } from "../../../main/typescript/plugin-ccmodel-hephaestus"; +import { CrossChainModelType } from "../../../main/typescript/models/crosschain-model"; + +const log: Logger = LoggerProvider.getOrCreate({ + label: "cross-chain-model-periodic-update.test", + level: testLogLevel, +}); +log.info("Test started"); + +const containerImageName = "ghcr.io/hyperledger/cacti-geth-all-in-one"; +const containerImageVersion = "2023-07-27-2a8c48ed6"; + +describe("Test the periodic update of the cross-chain model", () => { + const keychainEntryKey = uuidv4(); + let testEthAccount: Account, + web3: InstanceType, + addressInfo, + address: string, + port: number, + apiHost: string, + apiConfig, + ledger: GethTestLedger, + apiClient: EthereumApi, + connector: PluginLedgerConnectorEthereum, + rpcApiHttpHost: string, + keychainPlugin: PluginKeychainMemory; + + const expressApp = express(); + expressApp.use(bodyParser.json({ limit: "250mb" })); + const server = http.createServer(expressApp); + const wsApi = new SocketIoServer(server, { + path: Constants.SocketIoConnectionPathV1, + }); + + let hephaestus: CcModelHephaestus; + let hephaestusOptions: IPluginCcModelHephaestusOptions; + const fileName = "example-dummy-periodic-update"; + + ////////////////////////////////// + // Environment Setup + ////////////////////////////////// + + beforeAll(async () => { + pruneDockerAllIfGithubAction({ logLevel: testLogLevel }) + .then(() => { + log.info("Pruning throw OK"); + }) + .catch(async () => { + await Containers.logDiagnostics({ logLevel: testLogLevel }); + fail("Pruning didn't throw OK"); + }); + + ledger = new GethTestLedger({ + containerImageName, + containerImageVersion, + }); + await ledger.start(); + + const listenOptions: IListenOptions = { + hostname: "127.0.0.1", + port: 0, + server, + }; + addressInfo = (await Servers.listen(listenOptions)) as AddressInfo; + ({ address, port } = addressInfo); + apiHost = `http://${address}:${port}`; + + apiConfig = new Configuration({ basePath: apiHost }); + apiClient = new EthereumApi(apiConfig); + rpcApiHttpHost = await ledger.getRpcApiHttpHost(); + web3 = new Web3(rpcApiHttpHost); + testEthAccount = web3.eth.accounts.create(); + + log.info("Create PluginKeychainMemory..."); + const keychainEntryValue = testEthAccount.privateKey; + keychainPlugin = new PluginKeychainMemory({ + instanceId: uuidv4(), + keychainId: uuidv4(), + backend: new Map([[keychainEntryKey, keychainEntryValue]]), + logLevel: testLogLevel, + }); + + keychainPlugin.set( + LockAssetContractJson.contractName, + JSON.stringify(LockAssetContractJson), + ); + + log.info("Create PluginLedgerConnectorEthereum..."); + connector = new PluginLedgerConnectorEthereum({ + rpcApiHttpHost: rpcApiHttpHost, + logLevel: testLogLevel, + instanceId: uuidv4(), + pluginRegistry: new PluginRegistry({ plugins: [keychainPlugin] }), + }); + + await connector.getOrCreateWebServices(); + await connector.registerWebServices(expressApp, wsApi); + + log.info("Deploy Contract..."); + const deployOut = await apiClient.deployContract({ + contract: { + contractName: LockAssetContractJson.contractName, + keychainId: keychainPlugin.getKeychainId(), + }, + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + }); + expect(deployOut).toBeTruthy(); + expect(deployOut.data).toBeTruthy(); + expect(deployOut.data.transactionReceipt).toBeTruthy(); + expect(deployOut.data.transactionReceipt.contractAddress).toBeTruthy(); + log.info("contract deployed successfully"); + + const initTransferValue = web3.utils.toWei("5000", "ether"); + await apiClient.runTransactionV1({ + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + transactionConfig: { + from: WHALE_ACCOUNT_ADDRESS, + to: testEthAccount.address, + value: initTransferValue, + }, + }); + const balance = await web3.eth.getBalance(testEthAccount.address); + expect(balance).toBeTruthy(); + expect(balance.toString()).toBe(initTransferValue); + + hephaestusOptions = { + instanceId: uuidv4(), + logLevel: testLogLevel, + ethTxObservable: connector.getTxSubjectObservable(), + }; + + hephaestus = new CcModelHephaestus(hephaestusOptions); + expect(hephaestus).toBeTruthy(); + log.info("hephaestus plugin initialized successfully"); + }); + + test("update cross-chain model across 10 cases", async () => { + hephaestus.setCaseId("CCMODEL_UPDATE"); + hephaestus.monitorTransactions(); + + await hephaestus.periodicCCModelUpdate(fileName, 10000); + + const numberOfCases = 10; + const txsPerCase = 3; + let caseNumber = 1; + + while (numberOfCases >= caseNumber) { + const createResEth = await apiClient.invokeContractV1({ + contract: { + contractName: LockAssetContractJson.contractName, + keychainId: keychainPlugin.getKeychainId(), + }, + invocationType: EthContractInvocationType.Send, + methodName: "createAsset", + params: ["asset1", 5], + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + }); + expect(createResEth).toBeTruthy(); + expect(createResEth.data).toBeTruthy(); + + const lockResEth = await apiClient.invokeContractV1({ + contract: { + contractName: LockAssetContractJson.contractName, + keychainId: keychainPlugin.getKeychainId(), + }, + invocationType: EthContractInvocationType.Send, + methodName: "lockAsset", + params: ["asset1"], + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + }); + expect(lockResEth).toBeTruthy(); + expect(lockResEth.data).toBeTruthy(); + expect(lockResEth.status).toBe(200); + + const deleteResEth = await apiClient.invokeContractV1({ + contract: { + contractName: LockAssetContractJson.contractName, + keychainId: keychainPlugin.getKeychainId(), + }, + invocationType: EthContractInvocationType.Send, + methodName: "deleteAsset", + params: ["asset1"], + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + }); + expect(deleteResEth).toBeTruthy(); + expect(deleteResEth.data).toBeTruthy(); + expect(deleteResEth.status).toBe(200); + + caseNumber++; + } + + const totalTxs = txsPerCase * numberOfCases; + + await hephaestus.stopPeriodicCCModelUpdate(fileName); + expect(hephaestus.numberUnprocessedReceipts).toEqual(0); + expect(hephaestus.numberEventsLog).toEqual(totalTxs); + + console.log(hephaestus.ccModel.getModel(CrossChainModelType.PetriNet)); + }); + + afterAll(async () => { + log.info("Shutdown connector..."); + await connector.shutdown(); + + log.info("Stop and destroy the test ledger..."); + await ledger.stop(); + await ledger.destroy(); + + log.info("Shutdown server..."); + await Servers.shutdown(server); + + log.info("Prune docker..."); + const pruning = pruneDockerAllIfGithubAction({ logLevel: testLogLevel }); + await expect(pruning).resolves.toBeTruthy(); + }); +}); diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/cross-chain-model-serialization.test.ts b/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/cross-chain-model-serialization.test.ts new file mode 100644 index 0000000000..18cf5da629 --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/cross-chain-model-serialization.test.ts @@ -0,0 +1,288 @@ +/* + * Copyright 2020-2022 Hyperledger Cactus Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +////////////////////////////////// +// Constants +////////////////////////////////// + +const testLogLevel: LogLevelDesc = "info"; + +import "jest-extended"; +import express from "express"; +import bodyParser from "body-parser"; +import http from "http"; +import Web3 from "web3"; +import { v4 as uuidv4 } from "uuid"; +import { Server as SocketIoServer } from "socket.io"; +import { AddressInfo } from "net"; +import { PluginRegistry } from "@hyperledger/cactus-core"; +import { Configuration, Constants } from "@hyperledger/cactus-core-api"; +import { + IListenOptions, + Logger, + LoggerProvider, + Servers, + LogLevelDesc, +} from "@hyperledger/cactus-common"; +import { + Containers, + pruneDockerAllIfGithubAction, +} from "@hyperledger/cactus-test-tooling"; +import { + GethTestLedger, + WHALE_ACCOUNT_ADDRESS, +} from "@hyperledger/cactus-test-geth-ledger"; +import { + EthContractInvocationType, + PluginLedgerConnectorEthereum, + Web3SigningCredentialType, + DefaultApi as EthereumApi, +} from "@hyperledger/cactus-plugin-ledger-connector-ethereum"; +import { PluginKeychainMemory } from "@hyperledger/cactus-plugin-keychain-memory"; +import { Account } from "web3-core"; +import LockAssetContractJson from "../../solidity/lock-asset-contract/LockAsset.json"; +import { IPluginCcModelHephaestusOptions } from "../../../main/typescript"; +import { CcModelHephaestus } from "../../../main/typescript/plugin-ccmodel-hephaestus"; +import { CrossChainModelType } from "../../../main/typescript/models/crosschain-model"; + +const log: Logger = LoggerProvider.getOrCreate({ + label: "cross-chain-model-serialization.test", + level: testLogLevel, +}); +log.info("Test started"); + +const containerImageName = "ghcr.io/hyperledger/cacti-geth-all-in-one"; +const containerImageVersion = "2023-07-27-2a8c48ed6"; + +describe("Test cross-chain model serialization", () => { + const keychainEntryKey = uuidv4(); + let testEthAccount: Account, + web3: InstanceType, + addressInfo, + address: string, + port: number, + apiHost: string, + apiConfig, + ledger: GethTestLedger, + apiClient: EthereumApi, + connector: PluginLedgerConnectorEthereum, + rpcApiHttpHost: string, + keychainPlugin: PluginKeychainMemory; + + const expressApp = express(); + expressApp.use(bodyParser.json({ limit: "250mb" })); + const server = http.createServer(expressApp); + const wsApi = new SocketIoServer(server, { + path: Constants.SocketIoConnectionPathV1, + }); + + let hephaestus: CcModelHephaestus; + let hephaestusOptions: IPluginCcModelHephaestusOptions; + + ////////////////////////////////// + // Environment Setup + ////////////////////////////////// + + beforeAll(async () => { + pruneDockerAllIfGithubAction({ logLevel: testLogLevel }) + .then(() => { + log.info("Pruning throw OK"); + }) + .catch(async () => { + await Containers.logDiagnostics({ logLevel: testLogLevel }); + fail("Pruning didn't throw OK"); + }); + + ledger = new GethTestLedger({ + containerImageName, + containerImageVersion, + }); + await ledger.start(); + + const listenOptions: IListenOptions = { + hostname: "127.0.0.1", + port: 0, + server, + }; + addressInfo = (await Servers.listen(listenOptions)) as AddressInfo; + ({ address, port } = addressInfo); + apiHost = `http://${address}:${port}`; + + apiConfig = new Configuration({ basePath: apiHost }); + apiClient = new EthereumApi(apiConfig); + rpcApiHttpHost = await ledger.getRpcApiHttpHost(); + web3 = new Web3(rpcApiHttpHost); + testEthAccount = web3.eth.accounts.create(); + + log.info("Create PluginKeychainMemory..."); + const keychainEntryValue = testEthAccount.privateKey; + keychainPlugin = new PluginKeychainMemory({ + instanceId: uuidv4(), + keychainId: uuidv4(), + backend: new Map([[keychainEntryKey, keychainEntryValue]]), + logLevel: testLogLevel, + }); + + keychainPlugin.set( + LockAssetContractJson.contractName, + JSON.stringify(LockAssetContractJson), + ); + + log.info("Create PluginLedgerConnectorEthereum..."); + connector = new PluginLedgerConnectorEthereum({ + rpcApiHttpHost: rpcApiHttpHost, + logLevel: testLogLevel, + instanceId: uuidv4(), + pluginRegistry: new PluginRegistry({ plugins: [keychainPlugin] }), + }); + + await connector.getOrCreateWebServices(); + await connector.registerWebServices(expressApp, wsApi); + + log.info("Deploy Contract..."); + const deployOut = await apiClient.deployContract({ + contract: { + contractName: LockAssetContractJson.contractName, + keychainId: keychainPlugin.getKeychainId(), + }, + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + }); + expect(deployOut).toBeTruthy(); + expect(deployOut.data).toBeTruthy(); + expect(deployOut.data.transactionReceipt).toBeTruthy(); + expect(deployOut.data.transactionReceipt.contractAddress).toBeTruthy(); + log.info("contract deployed successfully"); + + const initTransferValue = web3.utils.toWei("5000", "ether"); + await apiClient.runTransactionV1({ + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + transactionConfig: { + from: WHALE_ACCOUNT_ADDRESS, + to: testEthAccount.address, + value: initTransferValue, + }, + }); + const balance = await web3.eth.getBalance(testEthAccount.address); + expect(balance).toBeTruthy(); + expect(balance.toString()).toBe(initTransferValue); + + hephaestusOptions = { + instanceId: uuidv4(), + logLevel: testLogLevel, + ethTxObservable: connector.getTxSubjectObservable(), + }; + + hephaestus = new CcModelHephaestus(hephaestusOptions); + expect(hephaestus).toBeTruthy(); + log.info("hephaestus plugin initialized successfully"); + }); + + test("Monitor Ethereum transactions and create cross-chain model", async () => { + hephaestus.setCaseId("ETHEREUM_MONITORING"); + hephaestus.monitorTransactions(); + + const numberOfCases = 3; + const txsPerCase = 3; + let caseNumber = 1; + + while (numberOfCases >= caseNumber) { + const createResEth = await apiClient.invokeContractV1({ + contract: { + contractName: LockAssetContractJson.contractName, + keychainId: keychainPlugin.getKeychainId(), + }, + invocationType: EthContractInvocationType.Send, + methodName: "createAsset", + params: ["asset1", 5], + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + }); + expect(createResEth).toBeTruthy(); + expect(createResEth.data).toBeTruthy(); + + const lockResEth = await apiClient.invokeContractV1({ + contract: { + contractName: LockAssetContractJson.contractName, + keychainId: keychainPlugin.getKeychainId(), + }, + invocationType: EthContractInvocationType.Send, + methodName: "lockAsset", + params: ["asset1"], + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + }); + expect(lockResEth).toBeTruthy(); + expect(lockResEth.data).toBeTruthy(); + expect(lockResEth.status).toBe(200); + + const deleteResEth = await apiClient.invokeContractV1({ + contract: { + contractName: LockAssetContractJson.contractName, + keychainId: keychainPlugin.getKeychainId(), + }, + invocationType: EthContractInvocationType.Send, + methodName: "deleteAsset", + params: ["asset1"], + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + }); + expect(deleteResEth).toBeTruthy(); + expect(deleteResEth.data).toBeTruthy(); + expect(deleteResEth.status).toBe(200); + + caseNumber++; + } + + const totalTxs = txsPerCase * numberOfCases; + + expect(hephaestus.numberUnprocessedReceipts).toEqual(totalTxs); + expect(hephaestus.numberEventsLog).toEqual(0); + + await hephaestus.txReceiptToCrossChainEventLogEntry(); + + expect(hephaestus.numberUnprocessedReceipts).toEqual(0); + expect(hephaestus.numberEventsLog).toEqual(totalTxs); + + const model = await hephaestus.createModel(); + + expect(model).toBeTruthy(); + expect(hephaestus.ccModel.getModel(CrossChainModelType.PetriNet)) + .toBeTruthy; + console.log(hephaestus.ccModel.getModel(CrossChainModelType.PetriNet)); + }); + + afterAll(async () => { + log.info("Shutdown connector..."); + await connector.shutdown(); + + log.info("Stop and destroy the test ledger..."); + await ledger.stop(); + await ledger.destroy(); + + log.info("Shutdown server..."); + await Servers.shutdown(server); + + log.info("Prune docker..."); + const pruning = pruneDockerAllIfGithubAction({ logLevel: testLogLevel }); + await expect(pruning).resolves.toBeTruthy(); + }); +}); diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/monitor-4-besu-events.test.ts b/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/monitor-4-besu-events.test.ts new file mode 100644 index 0000000000..a5e52a411c --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/monitor-4-besu-events.test.ts @@ -0,0 +1,244 @@ +import "jest-extended"; +import { LogLevelDesc, LoggerProvider } from "@hyperledger/cactus-common"; +import LockAssetContractJson from "../../solidity/lock-asset-contract/LockAsset.json"; +import { PluginRegistry } from "@hyperledger/cactus-core"; +import { PluginKeychainMemory } from "@hyperledger/cactus-plugin-keychain-memory"; +import { v4 as uuidv4 } from "uuid"; +import { + BesuTestLedger, + pruneDockerAllIfGithubAction, + Containers, +} from "@hyperledger/cactus-test-tooling"; +import { + Web3SigningCredentialType, + PluginLedgerConnectorBesu, + EthContractInvocationType, + ReceiptType, + IPluginLedgerConnectorBesuOptions, +} from "@hyperledger/cactus-plugin-ledger-connector-besu"; +import Web3 from "web3"; +import { Account } from "web3-core"; + +import { CcModelHephaestus } from "../../../main/typescript/plugin-ccmodel-hephaestus"; +import { IPluginCcModelHephaestusOptions } from "../../../main/typescript"; + +const logLevel: LogLevelDesc = "INFO"; + +let besuLedger: BesuTestLedger; +let contractName: string; + +let rpcApiHttpHost: string; +let rpcApiWsHost: string; +let web3: Web3; +let firstHighNetWorthAccount: string; +let connector: PluginLedgerConnectorBesu; +let besuKeyPair: { privateKey: string }; +let testEthAccount: Account; +let keychainPlugin: PluginKeychainMemory; +const BESU_ASSET_ID = uuidv4(); + +let hephaestus: CcModelHephaestus; +let hephaestusOptions: IPluginCcModelHephaestusOptions; + +const log = LoggerProvider.getOrCreate({ + level: logLevel, + label: "monitor-4-besu-events.test", +}); + +beforeAll(async () => { + pruneDockerAllIfGithubAction({ logLevel }) + .then(() => { + log.info("Pruning throw OK"); + }) + .catch(async () => { + await Containers.logDiagnostics({ logLevel }); + fail("Pruning didn't throw OK"); + }); + + { + besuLedger = new BesuTestLedger(); + await besuLedger.start(); + + rpcApiHttpHost = await besuLedger.getRpcApiHttpHost(); + rpcApiWsHost = await besuLedger.getRpcApiWsHost(); + web3 = new Web3(rpcApiHttpHost); + firstHighNetWorthAccount = besuLedger.getGenesisAccountPubKey(); + + testEthAccount = await besuLedger.createEthTestAccount(); + + besuKeyPair = { + privateKey: besuLedger.getGenesisAccountPrivKey(), + }; + + contractName = "LockAsset"; + + const keychainEntryValue = besuKeyPair.privateKey; + const keychainEntryKey = uuidv4(); + keychainPlugin = new PluginKeychainMemory({ + instanceId: uuidv4(), + keychainId: uuidv4(), + + backend: new Map([[keychainEntryKey, keychainEntryValue]]), + logLevel, + }); + keychainPlugin.set( + LockAssetContractJson.contractName, + JSON.stringify(LockAssetContractJson), + ); + + const pluginRegistry = new PluginRegistry({ + plugins: [keychainPlugin], + }); + + const options: IPluginLedgerConnectorBesuOptions = { + instanceId: uuidv4(), + rpcApiHttpHost, + rpcApiWsHost, + pluginRegistry, + logLevel, + }; + connector = new PluginLedgerConnectorBesu(options); + pluginRegistry.add(connector); + + await connector.transact({ + web3SigningCredential: { + ethAccount: firstHighNetWorthAccount, + secret: besuKeyPair.privateKey, + type: Web3SigningCredentialType.PrivateKeyHex, + }, + consistencyStrategy: { + blockConfirmations: 0, + receiptType: ReceiptType.NodeTxPoolAck, + }, + transactionConfig: { + from: firstHighNetWorthAccount, + to: testEthAccount.address, + value: 10e9, + gas: 1000000, + }, + }); + const balance = await web3.eth.getBalance(testEthAccount.address); + expect(balance).toBeTruthy(); + expect(parseInt(balance, 10)).toBeGreaterThan(10e9); + + log.info("Connector initialized"); + + const deployOut = await connector.deployContract({ + keychainId: keychainPlugin.getKeychainId(), + contractName: LockAssetContractJson.contractName, + contractAbi: LockAssetContractJson.abi, + constructorArgs: [], + web3SigningCredential: { + ethAccount: firstHighNetWorthAccount, + secret: besuKeyPair.privateKey, + type: Web3SigningCredentialType.PrivateKeyHex, + }, + bytecode: LockAssetContractJson.bytecode, + gas: 1000000, + }); + expect(deployOut).toBeTruthy(); + expect(deployOut.transactionReceipt).toBeTruthy(); + expect(deployOut.transactionReceipt.contractAddress).toBeTruthy(); + log.info("Contract Deployed successfully"); + + hephaestusOptions = { + instanceId: uuidv4(), + logLevel: logLevel, + besuTxObservable: connector.getTxSubjectObservable(), + }; + + hephaestus = new CcModelHephaestus(hephaestusOptions); + expect(hephaestus).toBeTruthy(); + log.info("hephaestus plugin initialized successfully"); + } +}); + +test("monitor Besu transactions", async () => { + hephaestus.setCaseId("BESU_MONITORING"); + hephaestus.monitorTransactions(); + + const { success: createResBesu } = await connector.invokeContract({ + contractName, + keychainId: keychainPlugin.getKeychainId(), + invocationType: EthContractInvocationType.Send, + methodName: "createAsset", + params: [BESU_ASSET_ID, 10], + signingCredential: { + ethAccount: firstHighNetWorthAccount, + secret: besuKeyPair.privateKey, + type: Web3SigningCredentialType.PrivateKeyHex, + }, + gas: 1000000, + }); + expect(createResBesu).toBeTruthy(); + + const { success: lockResBesu } = await connector.invokeContract({ + contractName, + keychainId: keychainPlugin.getKeychainId(), + invocationType: EthContractInvocationType.Send, + methodName: "lockAsset", + params: [BESU_ASSET_ID], + signingCredential: { + ethAccount: testEthAccount.address, + secret: besuKeyPair.privateKey, + type: Web3SigningCredentialType.PrivateKeyHex, + }, + gas: 1000000, + }); + expect(lockResBesu).toBeTruthy(); + + const { success: isPresentResBesu } = await connector.invokeContract({ + contractName, + keychainId: keychainPlugin.getKeychainId(), + invocationType: EthContractInvocationType.Send, + methodName: "isPresent", + params: [BESU_ASSET_ID], + signingCredential: { + ethAccount: testEthAccount.address, + secret: besuKeyPair.privateKey, + type: Web3SigningCredentialType.PrivateKeyHex, + }, + gas: 1000000, + }); + expect(isPresentResBesu).toBeTruthy(); + + const { success: deleteResBesu } = await connector.invokeContract({ + contractName, + keychainId: keychainPlugin.getKeychainId(), + invocationType: EthContractInvocationType.Send, + methodName: "deleteAsset", + params: [BESU_ASSET_ID], + signingCredential: { + ethAccount: testEthAccount.address, + secret: besuKeyPair.privateKey, + type: Web3SigningCredentialType.PrivateKeyHex, + }, + gas: 1000000, + }); + expect(deleteResBesu).toBeTruthy(); + + expect(hephaestus.numberUnprocessedReceipts).toEqual(4); + expect(hephaestus.numberEventsLog).toEqual(0); + + await hephaestus.txReceiptToCrossChainEventLogEntry(); + + expect(hephaestus.numberUnprocessedReceipts).toEqual(0); + expect(hephaestus.numberEventsLog).toEqual(4); + + await hephaestus.persistCrossChainLogCsv("example-dummy-besu-4-events"); + await hephaestus.persistCrossChainLogJson("example-dummy-besu-4-events"); +}); + +afterAll(async () => { + await besuLedger.stop(); + await besuLedger.destroy(); + + await pruneDockerAllIfGithubAction({ logLevel }) + .then(() => { + log.info("Pruning throw OK"); + }) + .catch(async () => { + await Containers.logDiagnostics({ logLevel }); + fail("Pruning didn't throw OK"); + }); +}); diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/monitor-4-ethereum-events.test.ts b/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/monitor-4-ethereum-events.test.ts new file mode 100644 index 0000000000..ef8860bf7c --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/monitor-4-ethereum-events.test.ts @@ -0,0 +1,293 @@ +/* + * Copyright 2020-2022 Hyperledger Cactus Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +////////////////////////////////// +// Constants +////////////////////////////////// + +const testLogLevel: LogLevelDesc = "info"; + +import "jest-extended"; +import express from "express"; +import bodyParser from "body-parser"; +import http from "http"; +import Web3 from "web3"; +import { v4 as uuidv4 } from "uuid"; +import { Server as SocketIoServer } from "socket.io"; +import { AddressInfo } from "net"; +import { PluginRegistry } from "@hyperledger/cactus-core"; +import { Configuration, Constants } from "@hyperledger/cactus-core-api"; +import { + IListenOptions, + Logger, + LoggerProvider, + Servers, + LogLevelDesc, +} from "@hyperledger/cactus-common"; +import { + Containers, + pruneDockerAllIfGithubAction, +} from "@hyperledger/cactus-test-tooling"; +import { + GethTestLedger, + WHALE_ACCOUNT_ADDRESS, +} from "@hyperledger/cactus-test-geth-ledger"; +import { + EthContractInvocationType, + PluginLedgerConnectorEthereum, + Web3SigningCredentialType, + DefaultApi as EthereumApi, +} from "@hyperledger/cactus-plugin-ledger-connector-ethereum"; +import { PluginKeychainMemory } from "@hyperledger/cactus-plugin-keychain-memory"; +import { Account } from "web3-core"; +import LockAssetContractJson from "../../solidity/lock-asset-contract/LockAsset.json"; +import { IPluginCcModelHephaestusOptions } from "../../../main/typescript"; +import { CcModelHephaestus } from "../../../main/typescript/plugin-ccmodel-hephaestus"; + +const log: Logger = LoggerProvider.getOrCreate({ + label: "monitor-4-ethereum-events.test", + level: testLogLevel, +}); +log.info("Test started"); + +const containerImageName = "ghcr.io/hyperledger/cacti-geth-all-in-one"; +const containerImageVersion = "2023-07-27-2a8c48ed6"; + +describe("Ethereum contract deploy and invoke while monitoring", () => { + const keychainEntryKey = uuidv4(); + let testEthAccount: Account, + web3: InstanceType, + addressInfo, + address: string, + port: number, + apiHost: string, + apiConfig, + ledger: GethTestLedger, + apiClient: EthereumApi, + connector: PluginLedgerConnectorEthereum, + rpcApiHttpHost: string, + keychainPlugin: PluginKeychainMemory; + + const expressApp = express(); + expressApp.use(bodyParser.json({ limit: "250mb" })); + const server = http.createServer(expressApp); + const wsApi = new SocketIoServer(server, { + path: Constants.SocketIoConnectionPathV1, + }); + + let hephaestus: CcModelHephaestus; + let hephaestusOptions: IPluginCcModelHephaestusOptions; + + ////////////////////////////////// + // Environment Setup + ////////////////////////////////// + + beforeAll(async () => { + pruneDockerAllIfGithubAction({ logLevel: testLogLevel }) + .then(() => { + log.info("Pruning throw OK"); + }) + .catch(async () => { + await Containers.logDiagnostics({ logLevel: testLogLevel }); + fail("Pruning didn't throw OK"); + }); + + ledger = new GethTestLedger({ + containerImageName, + containerImageVersion, + }); + await ledger.start(); + + const listenOptions: IListenOptions = { + hostname: "127.0.0.1", + port: 0, + server, + }; + addressInfo = (await Servers.listen(listenOptions)) as AddressInfo; + ({ address, port } = addressInfo); + apiHost = `http://${address}:${port}`; + + apiConfig = new Configuration({ basePath: apiHost }); + apiClient = new EthereumApi(apiConfig); + rpcApiHttpHost = await ledger.getRpcApiHttpHost(); + web3 = new Web3(rpcApiHttpHost); + testEthAccount = web3.eth.accounts.create(); + + log.info("Create PluginKeychainMemory..."); + const keychainEntryValue = testEthAccount.privateKey; + keychainPlugin = new PluginKeychainMemory({ + instanceId: uuidv4(), + keychainId: uuidv4(), + backend: new Map([[keychainEntryKey, keychainEntryValue]]), + logLevel: testLogLevel, + }); + + keychainPlugin.set( + LockAssetContractJson.contractName, + JSON.stringify(LockAssetContractJson), + ); + + log.info("Create PluginLedgerConnectorEthereum..."); + connector = new PluginLedgerConnectorEthereum({ + rpcApiHttpHost: rpcApiHttpHost, + logLevel: testLogLevel, + instanceId: uuidv4(), + pluginRegistry: new PluginRegistry({ plugins: [keychainPlugin] }), + }); + + await connector.getOrCreateWebServices(); + await connector.registerWebServices(expressApp, wsApi); + + log.info("Deploy Contract..."); + const deployOut = await apiClient.deployContract({ + contract: { + contractName: LockAssetContractJson.contractName, + keychainId: keychainPlugin.getKeychainId(), + }, + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + }); + expect(deployOut).toBeTruthy(); + expect(deployOut.data).toBeTruthy(); + expect(deployOut.data.transactionReceipt).toBeTruthy(); + expect(deployOut.data.transactionReceipt.contractAddress).toBeTruthy(); + log.info("contract deployed successfully"); + + const initTransferValue = web3.utils.toWei("5000", "ether"); + await apiClient.runTransactionV1({ + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + transactionConfig: { + from: WHALE_ACCOUNT_ADDRESS, + to: testEthAccount.address, + value: initTransferValue, + }, + }); + const balance = await web3.eth.getBalance(testEthAccount.address); + expect(balance).toBeTruthy(); + expect(balance.toString()).toBe(initTransferValue); + + hephaestusOptions = { + instanceId: uuidv4(), + logLevel: testLogLevel, + ethTxObservable: connector.getTxSubjectObservable(), + }; + + hephaestus = new CcModelHephaestus(hephaestusOptions); + expect(hephaestus).toBeTruthy(); + log.info("hephaestus plugin initialized successfully"); + }); + + test("monitor Ethereum transactions", async () => { + hephaestus.setCaseId("ETHEREUM_MONITORING"); + hephaestus.monitorTransactions(); + + const createResEth = await apiClient.invokeContractV1({ + contract: { + contractName: LockAssetContractJson.contractName, + keychainId: keychainPlugin.getKeychainId(), + }, + invocationType: EthContractInvocationType.Send, + methodName: "createAsset", + params: ["asset1", 5], + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + }); + expect(createResEth).toBeTruthy(); + expect(createResEth.data).toBeTruthy(); + + const lockResEth = await apiClient.invokeContractV1({ + contract: { + contractName: LockAssetContractJson.contractName, + keychainId: keychainPlugin.getKeychainId(), + }, + invocationType: EthContractInvocationType.Send, + methodName: "lockAsset", + params: ["asset1"], + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + }); + expect(lockResEth).toBeTruthy(); + expect(lockResEth.data).toBeTruthy(); + expect(lockResEth.status).toBe(200); + + const isPresentResEth = await apiClient.invokeContractV1({ + contract: { + contractName: LockAssetContractJson.contractName, + keychainId: keychainPlugin.getKeychainId(), + }, + invocationType: EthContractInvocationType.Send, + methodName: "isPresent", + params: ["asset1", "owner1"], + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + }); + expect(isPresentResEth).toBeTruthy(); + expect(isPresentResEth.data).toBeTruthy(); + expect(isPresentResEth.status).toBe(200); + + const deleteResEth = await apiClient.invokeContractV1({ + contract: { + contractName: LockAssetContractJson.contractName, + keychainId: keychainPlugin.getKeychainId(), + }, + invocationType: EthContractInvocationType.Send, + methodName: "deleteAsset", + params: ["asset1", "owner1"], + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + }); + expect(deleteResEth).toBeTruthy(); + expect(deleteResEth.data).toBeTruthy(); + expect(deleteResEth.status).toBe(200); + + expect(hephaestus.numberUnprocessedReceipts).toEqual(4); + expect(hephaestus.numberEventsLog).toEqual(0); + + await hephaestus.txReceiptToCrossChainEventLogEntry(); + + expect(hephaestus.numberUnprocessedReceipts).toEqual(0); + expect(hephaestus.numberEventsLog).toEqual(4); + + await hephaestus.persistCrossChainLogCsv("example-dummy-ethereum-4-events"); + await hephaestus.persistCrossChainLogJson( + "example-dummy-ethereum-4-events", + ); + }); + + afterAll(async () => { + log.info("Shutdown connector..."); + await connector.shutdown(); + + log.info("Stop and destroy the test ledger..."); + await ledger.stop(); + await ledger.destroy(); + + log.info("Shutdown server..."); + await Servers.shutdown(server); + + log.info("Prune docker..."); + const pruning = pruneDockerAllIfGithubAction({ logLevel: testLogLevel }); + await expect(pruning).resolves.toBeTruthy(); + }); +}); diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/monitor-4-fabric-events.test.ts b/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/monitor-4-fabric-events.test.ts new file mode 100644 index 0000000000..f305c7529c --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/monitor-4-fabric-events.test.ts @@ -0,0 +1,364 @@ +import "jest-extended"; +import { + IListenOptions, + LogLevelDesc, + LoggerProvider, + Servers, +} from "@hyperledger/cactus-common"; +import { PluginRegistry } from "@hyperledger/cactus-core"; +import { PluginKeychainMemory } from "@hyperledger/cactus-plugin-keychain-memory"; +import { DiscoveryOptions } from "fabric-network"; +import bodyParser from "body-parser"; +import path from "path"; +import http, { Server } from "http"; +import fs from "fs-extra"; +import { + Configuration, + DefaultEventHandlerStrategy, + FabricSigningCredential, + IPluginLedgerConnectorFabricOptions, + PluginLedgerConnectorFabric, + DefaultApi as FabricApi, + FileBase64, + ChainCodeProgrammingLanguage, + FabricContractInvocationType, +} from "@hyperledger/cactus-plugin-ledger-connector-fabric"; +import { + Containers, + FABRIC_25_LTS_AIO_FABRIC_VERSION, + FABRIC_25_LTS_AIO_IMAGE_VERSION, + FABRIC_25_LTS_FABRIC_SAMPLES_ENV_INFO_ORG_1, + FABRIC_25_LTS_FABRIC_SAMPLES_ENV_INFO_ORG_2, + FabricTestLedgerV1, + pruneDockerAllIfGithubAction, +} from "@hyperledger/cactus-test-tooling"; +import express from "express"; +import { AddressInfo } from "net"; +import { v4 as uuidv4 } from "uuid"; +import { CcModelHephaestus } from "../../../main/typescript/plugin-ccmodel-hephaestus"; +import { IPluginCcModelHephaestusOptions } from "../../../main/typescript"; + +let server: Server; + +let fabricSigningCredential: FabricSigningCredential; +const logLevel: LogLevelDesc = "INFO"; + +let fabricLedger: FabricTestLedgerV1; +let contractName: string; +let channelName: string; + +let config: Configuration; +let apiClient: FabricApi; + +let fabricConnector: PluginLedgerConnectorFabric; +const FABRIC_ASSET_ID = uuidv4(); + +let hephaestus: CcModelHephaestus; +let hephaestusOptions: IPluginCcModelHephaestusOptions; + +const log = LoggerProvider.getOrCreate({ + level: logLevel, + label: "monitor-4-fabric-events.test", +}); + +beforeAll(async () => { + pruneDockerAllIfGithubAction({ logLevel }) + .then(() => { + log.info("Pruning throw OK"); + }) + .catch(async () => { + await Containers.logDiagnostics({ logLevel }); + fail("Pruning didn't throw OK"); + }); + + { + fabricLedger = new FabricTestLedgerV1({ + emitContainerLogs: true, + publishAllPorts: true, + imageName: "ghcr.io/hyperledger/cactus-fabric2-all-in-one", + imageVersion: FABRIC_25_LTS_AIO_IMAGE_VERSION, + envVars: new Map([["FABRIC_VERSION", FABRIC_25_LTS_AIO_FABRIC_VERSION]]), + logLevel, + }); + + await fabricLedger.start(); + log.info("Fabric Ledger started"); + + const channelId = "mychannel"; + channelName = channelId; + + const connectionProfile = await fabricLedger.getConnectionProfileOrg1(); + expect(connectionProfile).not.toBeUndefined(); + const enrollAdminOut = await fabricLedger.enrollAdmin(); + const adminWallet = enrollAdminOut[1]; + const [userIdentity] = await fabricLedger.enrollUser(adminWallet); + const sshConfig = await fabricLedger.getSshConfig(); + log.info("admin enrolled"); + + const keychainInstanceId = uuidv4(); + const keychainId = uuidv4(); + const keychainEntryKey = "user1"; + const keychainEntryValue = JSON.stringify(userIdentity); + + const keychainPlugin = new PluginKeychainMemory({ + instanceId: keychainInstanceId, + keychainId, + logLevel, + backend: new Map([ + [keychainEntryKey, keychainEntryValue], + ["some-other-entry-key", "some-other-entry-value"], + ]), + }); + + const pluginRegistry = new PluginRegistry({ plugins: [keychainPlugin] }); + + const discoveryOptions: DiscoveryOptions = { + enabled: true, + asLocalhost: true, + }; + + const pluginOptions: IPluginLedgerConnectorFabricOptions = { + instanceId: uuidv4(), + dockerBinary: "/usr/local/bin/docker", + peerBinary: "/fabric-samples/bin/peer", + goBinary: "/usr/local/go/bin/go", + pluginRegistry, + cliContainerEnv: FABRIC_25_LTS_FABRIC_SAMPLES_ENV_INFO_ORG_1, + sshConfig, + logLevel, + connectionProfile, + discoveryOptions, + eventHandlerOptions: { + strategy: DefaultEventHandlerStrategy.NetworkScopeAllfortx, + commitTimeout: 300, + }, + }; + fabricConnector = new PluginLedgerConnectorFabric(pluginOptions); + + const expressApp = express(); + expressApp.use(bodyParser.json({ limit: "250mb" })); + server = http.createServer(expressApp); + const listenOptions: IListenOptions = { + hostname: "127.0.0.1", + port: 0, + server, + }; + const addressInfo = (await Servers.listen(listenOptions)) as AddressInfo; + const { address, port } = addressInfo; + const apiUrl = `http://${address}:${port}`; + + await fabricConnector.getOrCreateWebServices(); + await fabricConnector.registerWebServices(expressApp); + + config = new Configuration({ basePath: apiUrl }); + + apiClient = new FabricApi(config); + + // deploy contracts ... + contractName = "basic-asset-transfer-2"; + const contractRelPath = + "../fabric-contracts/lock-asset/chaincode-typescript"; + + const contractDir = path.join(__dirname, contractRelPath); + + // ├── package.json + // ├── src + // │ ├── assetTransfer.ts + // │ ├── asset.ts + // │ ├── index.ts + // │ └── ITraceableContract.ts + // ├── tsconfig.json + // -------- + const sourceFiles: FileBase64[] = []; + { + const filename = "./tsconfig.json"; + const relativePath = "./"; + const filePath = path.join(contractDir, relativePath, filename); + const buffer = await fs.readFile(filePath); + sourceFiles.push({ + body: buffer.toString("base64"), + filepath: relativePath, + filename, + }); + } + { + const filename = "./package.json"; + const relativePath = "./"; + const filePath = path.join(contractDir, relativePath, filename); + const buffer = await fs.readFile(filePath); + sourceFiles.push({ + body: buffer.toString("base64"), + filepath: relativePath, + filename, + }); + } + { + const filename = "./index.ts"; + const relativePath = "./src/"; + const filePath = path.join(contractDir, relativePath, filename); + const buffer = await fs.readFile(filePath); + sourceFiles.push({ + body: buffer.toString("base64"), + filepath: relativePath, + filename, + }); + } + { + const filename = "./asset.ts"; + const relativePath = "./src/"; + const filePath = path.join(contractDir, relativePath, filename); + const buffer = await fs.readFile(filePath); + sourceFiles.push({ + body: buffer.toString("base64"), + filepath: relativePath, + filename, + }); + } + { + const filename = "./assetTransfer.ts"; + const relativePath = "./src/"; + const filePath = path.join(contractDir, relativePath, filename); + const buffer = await fs.readFile(filePath); + sourceFiles.push({ + body: buffer.toString("base64"), + filepath: relativePath, + filename, + }); + } + + const res = await apiClient.deployContractV1({ + channelId, + ccVersion: "1.0.0", + sourceFiles, + ccName: contractName, + targetOrganizations: [ + FABRIC_25_LTS_FABRIC_SAMPLES_ENV_INFO_ORG_1, + FABRIC_25_LTS_FABRIC_SAMPLES_ENV_INFO_ORG_2, + ], + caFile: + FABRIC_25_LTS_FABRIC_SAMPLES_ENV_INFO_ORG_1.ORDERER_TLS_ROOTCERT_FILE, + ccLabel: "basic-asset-transfer-2", + ccLang: ChainCodeProgrammingLanguage.Typescript, + ccSequence: 1, + orderer: "orderer.example.com:7050", + ordererTLSHostnameOverride: "orderer.example.com", + connTimeout: 60, + }); + + const { packageIds, lifecycle, success } = res.data; + expect(res.status).toBe(200); + expect(success).toBe(true); + expect(lifecycle).not.toBeUndefined(); + + const { + approveForMyOrgList, + installList, + queryInstalledList, + commit, + packaging, + queryCommitted, + } = lifecycle; + + expect(packageIds).toBeTruthy(); + expect(packageIds).toBeArray(); + + expect(approveForMyOrgList).toBeTruthy(); + expect(approveForMyOrgList).toBeArray(); + + expect(installList).toBeTruthy(); + expect(installList).toBeArray(); + expect(queryInstalledList).toBeTruthy(); + expect(queryInstalledList).toBeArray(); + + expect(commit).toBeTruthy(); + expect(packaging).toBeTruthy(); + expect(queryCommitted).toBeTruthy(); + log.info("Contract deployed"); + + fabricSigningCredential = { + keychainId, + keychainRef: keychainEntryKey, + }; + + hephaestusOptions = { + instanceId: uuidv4(), + logLevel: logLevel, + fabricTxObservable: fabricConnector.getTxSubjectObservable(), + }; + + hephaestus = new CcModelHephaestus(hephaestusOptions); + expect(hephaestus).toBeTruthy(); + log.info("hephaestus plugin initialized successfully"); + } +}); + +test("monitor Fabric transactions", async () => { + hephaestus.setCaseId("FABRIC_MONITORING"); + hephaestus.monitorTransactions(); + + const createResFabric = await apiClient.runTransactionV1({ + contractName, + channelName, + params: [FABRIC_ASSET_ID, "10", "owner1"], + methodName: "CreateAsset", + invocationType: FabricContractInvocationType.Send, + signingCredential: fabricSigningCredential, + }); + expect(createResFabric).toBeTruthy(); + + const transferResFabric = await apiClient.runTransactionV1({ + contractName, + channelName, + params: [FABRIC_ASSET_ID, "owner2"], + methodName: "TransferAsset", + invocationType: FabricContractInvocationType.Send, + signingCredential: fabricSigningCredential, + }); + expect(transferResFabric).toBeTruthy(); + + const transferBackResFabric = await apiClient.runTransactionV1({ + contractName, + channelName, + params: [FABRIC_ASSET_ID, "owner1"], + methodName: "TransferAsset", + invocationType: FabricContractInvocationType.Send, + signingCredential: fabricSigningCredential, + }); + expect(transferBackResFabric).toBeTruthy(); + + const deleteResFabric = await apiClient.runTransactionV1({ + contractName, + channelName, + params: [FABRIC_ASSET_ID], + methodName: "DeleteAsset", + invocationType: FabricContractInvocationType.Send, + signingCredential: fabricSigningCredential, + }); + expect(deleteResFabric).toBeTruthy(); + + expect(hephaestus.numberUnprocessedReceipts).toEqual(4); + expect(hephaestus.numberEventsLog).toEqual(0); + + await hephaestus.txReceiptToCrossChainEventLogEntry(); + + expect(hephaestus.numberUnprocessedReceipts).toEqual(0); + expect(hephaestus.numberEventsLog).toEqual(4); + + await hephaestus.persistCrossChainLogCsv("example-dummy-fabric-4-events"); + await hephaestus.persistCrossChainLogJson("example-dummy-fabric-4-events"); +}); + +afterAll(async () => { + await fabricLedger.stop(); + await fabricLedger.destroy(); + await Servers.shutdown(server); + + await pruneDockerAllIfGithubAction({ logLevel }) + .then(() => { + log.info("Pruning throw OK"); + }) + .catch(async () => { + await Containers.logDiagnostics({ logLevel }); + fail("Pruning didn't throw OK"); + }); +}); diff --git a/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/monitor-besu-ethereum-fabric-events.test.ts b/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/monitor-besu-ethereum-fabric-events.test.ts new file mode 100644 index 0000000000..5e7e998814 --- /dev/null +++ b/packages/cactus-plugin-ccmodel-hephaestus/src/test/typescript/integration/monitor-besu-ethereum-fabric-events.test.ts @@ -0,0 +1,705 @@ +import "jest-extended"; +import { + IListenOptions, + LogLevelDesc, + LoggerProvider, + Servers, +} from "@hyperledger/cactus-common"; +import { Server as SocketIoServer } from "socket.io"; +import { PluginRegistry } from "@hyperledger/cactus-core"; +import { Configuration, Constants } from "@hyperledger/cactus-core-api"; +import { PluginKeychainMemory } from "@hyperledger/cactus-plugin-keychain-memory"; +import { DiscoveryOptions } from "fabric-network"; +import bodyParser from "body-parser"; +import path from "path"; +import http, { Server } from "http"; +import fs from "fs-extra"; +import { + Web3SigningCredentialType as Web3SigningCredentialTypeBesu, + PluginLedgerConnectorBesu, + EthContractInvocationType as EthContractInvocationTypeBesu, + ReceiptType, + IPluginLedgerConnectorBesuOptions, +} from "@hyperledger/cactus-plugin-ledger-connector-besu"; +import { + GethTestLedger, + WHALE_ACCOUNT_ADDRESS, +} from "@hyperledger/cactus-test-geth-ledger"; +import { + EthContractInvocationType, + PluginLedgerConnectorEthereum, + Web3SigningCredentialType, + DefaultApi as EthereumApi, +} from "@hyperledger/cactus-plugin-ledger-connector-ethereum"; +import { + Configuration as ConfigurationFabric, + DefaultEventHandlerStrategy, + FabricSigningCredential, + IPluginLedgerConnectorFabricOptions, + PluginLedgerConnectorFabric, + DefaultApi as FabricApi, + FileBase64, + ChainCodeProgrammingLanguage, + FabricContractInvocationType, +} from "@hyperledger/cactus-plugin-ledger-connector-fabric"; +import { + BesuTestLedger, + Containers, + FABRIC_25_LTS_AIO_FABRIC_VERSION, + FABRIC_25_LTS_AIO_IMAGE_VERSION, + FABRIC_25_LTS_FABRIC_SAMPLES_ENV_INFO_ORG_1, + FABRIC_25_LTS_FABRIC_SAMPLES_ENV_INFO_ORG_2, + FabricTestLedgerV1, + pruneDockerAllIfGithubAction, +} from "@hyperledger/cactus-test-tooling"; +import Web3 from "web3"; +import { Account } from "web3-core"; +import express from "express"; +import { AddressInfo } from "net"; +import { v4 as uuidv4 } from "uuid"; +import { CcModelHephaestus } from "../../../main/typescript/plugin-ccmodel-hephaestus"; +import { IPluginCcModelHephaestusOptions } from "../../../main/typescript"; +import LockAssetContractJson from "../../solidity/lock-asset-contract/LockAsset.json"; + +const logLevel: LogLevelDesc = "INFO"; + +let fabricServer: Server; +let fabricSigningCredential: FabricSigningCredential; +let fabricLedger: FabricTestLedgerV1; +let fabricContractName: string; +let channelName: string; +let config: ConfigurationFabric; +let fabricApiClient: FabricApi; +let fabricConnector: PluginLedgerConnectorFabric; +const FABRIC_ASSET_ID = uuidv4(); + +let besuLedger: BesuTestLedger; +let besuContractName: string; +let rpcApiHttpHostBesu: string; +let rpcApiWsHost: string; +let web3Besu: Web3; +let firstHighNetWorthAccount: string; +let besuConnector: PluginLedgerConnectorBesu; +let besuKeyPair: { privateKey: string }; +let testEthAccountBesu: Account; +let keychainPluginBesu: PluginKeychainMemory; +const BESU_ASSET_ID = uuidv4(); + +const containerImageName = "ghcr.io/hyperledger/cacti-geth-all-in-one"; +const containerImageVersion = "2023-07-27-2a8c48ed6"; +const keychainEntryKey = uuidv4(); +let testEthAccount: Account; +let web3Eth: InstanceType; +let addressInfo; +let address: string; +let port: number; +let apiHost: string; +let apiConfig; +let ethereumLedger: GethTestLedger; +let ethereumApiClient: EthereumApi; +let ethereumConnector: PluginLedgerConnectorEthereum; +let rpcApiHttpHostEthereum: string; +let keychainPluginEthereum: PluginKeychainMemory; +const expressAppEthereum = express(); +expressAppEthereum.use(bodyParser.json({ limit: "250mb" })); +const ethereumServer = http.createServer(expressAppEthereum); +const wsApi = new SocketIoServer(ethereumServer, { + path: Constants.SocketIoConnectionPathV1, +}); + +let hephaestus: CcModelHephaestus; +let hephaestusOptions: IPluginCcModelHephaestusOptions; + +const log = LoggerProvider.getOrCreate({ + level: logLevel, + label: "monitor-besu-ethereum-fabric-events.test.test", +}); + +beforeAll(async () => { + pruneDockerAllIfGithubAction({ logLevel }) + .then(() => { + log.info("Pruning throw OK"); + }) + .catch(async () => { + await Containers.logDiagnostics({ logLevel }); + fail("Pruning didn't throw OK"); + }); + + { + fabricLedger = new FabricTestLedgerV1({ + emitContainerLogs: true, + publishAllPorts: true, + imageName: "ghcr.io/hyperledger/cactus-fabric2-all-in-one", + imageVersion: FABRIC_25_LTS_AIO_IMAGE_VERSION, + envVars: new Map([["FABRIC_VERSION", FABRIC_25_LTS_AIO_FABRIC_VERSION]]), + logLevel, + }); + + await fabricLedger.start(); + log.info("Fabric Ledger started"); + + const channelId = "mychannel"; + channelName = channelId; + + const connectionProfile = await fabricLedger.getConnectionProfileOrg1(); + expect(connectionProfile).not.toBeUndefined(); + const enrollAdminOut = await fabricLedger.enrollAdmin(); + const adminWallet = enrollAdminOut[1]; + const [userIdentity] = await fabricLedger.enrollUser(adminWallet); + const sshConfig = await fabricLedger.getSshConfig(); + log.info("admin enrolled"); + + const keychainInstanceId = uuidv4(); + const keychainId = uuidv4(); + const keychainEntryKey = "user1"; + const keychainEntryValue = JSON.stringify(userIdentity); + + const keychainPluginFabric = new PluginKeychainMemory({ + instanceId: keychainInstanceId, + keychainId, + logLevel, + backend: new Map([ + [keychainEntryKey, keychainEntryValue], + ["some-other-entry-key", "some-other-entry-value"], + ]), + }); + + const pluginRegistry = new PluginRegistry({ + plugins: [keychainPluginFabric], + }); + + const discoveryOptions: DiscoveryOptions = { + enabled: true, + asLocalhost: true, + }; + + const pluginOptions: IPluginLedgerConnectorFabricOptions = { + instanceId: uuidv4(), + dockerBinary: "/usr/local/bin/docker", + peerBinary: "/fabric-samples/bin/peer", + goBinary: "/usr/local/go/bin/go", + pluginRegistry, + cliContainerEnv: FABRIC_25_LTS_FABRIC_SAMPLES_ENV_INFO_ORG_1, + sshConfig, + logLevel, + connectionProfile, + discoveryOptions, + eventHandlerOptions: { + strategy: DefaultEventHandlerStrategy.NetworkScopeAllfortx, + commitTimeout: 300, + }, + }; + fabricConnector = new PluginLedgerConnectorFabric(pluginOptions); + + const expressAppFabric = express(); + expressAppFabric.use(bodyParser.json({ limit: "250mb" })); + fabricServer = http.createServer(expressAppFabric); + const listenOptions: IListenOptions = { + hostname: "127.0.0.1", + port: 0, + server: fabricServer, + }; + const addressInfo = (await Servers.listen(listenOptions)) as AddressInfo; + const { address, port } = addressInfo; + const apiUrl = `http://${address}:${port}`; + + await fabricConnector.getOrCreateWebServices(); + await fabricConnector.registerWebServices(expressAppFabric); + + config = new ConfigurationFabric({ basePath: apiUrl }); + + fabricApiClient = new FabricApi(config); + + // deploy contracts ... + fabricContractName = "basic-asset-transfer-2"; + const contractRelPath = + "../fabric-contracts/lock-asset/chaincode-typescript"; + + const contractDir = path.join(__dirname, contractRelPath); + + // ├── package.json + // ├── src + // │ ├── assetTransfer.ts + // │ ├── asset.ts + // │ ├── index.ts + // │ └── ITraceableContract.ts + // ├── tsconfig.json + // -------- + const sourceFiles: FileBase64[] = []; + { + const filename = "./tsconfig.json"; + const relativePath = "./"; + const filePath = path.join(contractDir, relativePath, filename); + const buffer = await fs.readFile(filePath); + sourceFiles.push({ + body: buffer.toString("base64"), + filepath: relativePath, + filename, + }); + } + { + const filename = "./package.json"; + const relativePath = "./"; + const filePath = path.join(contractDir, relativePath, filename); + const buffer = await fs.readFile(filePath); + sourceFiles.push({ + body: buffer.toString("base64"), + filepath: relativePath, + filename, + }); + } + { + const filename = "./index.ts"; + const relativePath = "./src/"; + const filePath = path.join(contractDir, relativePath, filename); + const buffer = await fs.readFile(filePath); + sourceFiles.push({ + body: buffer.toString("base64"), + filepath: relativePath, + filename, + }); + } + { + const filename = "./asset.ts"; + const relativePath = "./src/"; + const filePath = path.join(contractDir, relativePath, filename); + const buffer = await fs.readFile(filePath); + sourceFiles.push({ + body: buffer.toString("base64"), + filepath: relativePath, + filename, + }); + } + { + const filename = "./assetTransfer.ts"; + const relativePath = "./src/"; + const filePath = path.join(contractDir, relativePath, filename); + const buffer = await fs.readFile(filePath); + sourceFiles.push({ + body: buffer.toString("base64"), + filepath: relativePath, + filename, + }); + } + + const res = await fabricApiClient.deployContractV1({ + channelId, + ccVersion: "1.0.0", + sourceFiles, + ccName: fabricContractName, + targetOrganizations: [ + FABRIC_25_LTS_FABRIC_SAMPLES_ENV_INFO_ORG_1, + FABRIC_25_LTS_FABRIC_SAMPLES_ENV_INFO_ORG_2, + ], + caFile: + FABRIC_25_LTS_FABRIC_SAMPLES_ENV_INFO_ORG_1.ORDERER_TLS_ROOTCERT_FILE, + ccLabel: "basic-asset-transfer-2", + ccLang: ChainCodeProgrammingLanguage.Typescript, + ccSequence: 1, + orderer: "orderer.example.com:7050", + ordererTLSHostnameOverride: "orderer.example.com", + connTimeout: 60, + }); + + const { packageIds, lifecycle, success } = res.data; + expect(res.status).toBe(200); + expect(success).toBe(true); + expect(lifecycle).not.toBeUndefined(); + + const { + approveForMyOrgList, + installList, + queryInstalledList, + commit, + packaging, + queryCommitted, + } = lifecycle; + + expect(packageIds).toBeTruthy(); + expect(packageIds).toBeArray(); + + expect(approveForMyOrgList).toBeTruthy(); + expect(approveForMyOrgList).toBeArray(); + + expect(installList).toBeTruthy(); + expect(installList).toBeArray(); + expect(queryInstalledList).toBeTruthy(); + expect(queryInstalledList).toBeArray(); + + expect(commit).toBeTruthy(); + expect(packaging).toBeTruthy(); + expect(queryCommitted).toBeTruthy(); + log.info("Contract deployed"); + + fabricSigningCredential = { + keychainId, + keychainRef: keychainEntryKey, + }; + } + { + besuLedger = new BesuTestLedger(); + await besuLedger.start(); + + rpcApiHttpHostBesu = await besuLedger.getRpcApiHttpHost(); + rpcApiWsHost = await besuLedger.getRpcApiWsHost(); + web3Besu = new Web3(rpcApiHttpHostBesu); + firstHighNetWorthAccount = besuLedger.getGenesisAccountPubKey(); + + testEthAccountBesu = await besuLedger.createEthTestAccount(); + + besuKeyPair = { + privateKey: besuLedger.getGenesisAccountPrivKey(), + }; + + besuContractName = "LockAsset"; + + const keychainEntryValue = besuKeyPair.privateKey; + const keychainEntryKey = uuidv4(); + keychainPluginBesu = new PluginKeychainMemory({ + instanceId: uuidv4(), + keychainId: uuidv4(), + + backend: new Map([[keychainEntryKey, keychainEntryValue]]), + logLevel, + }); + keychainPluginBesu.set( + LockAssetContractJson.contractName, + JSON.stringify(LockAssetContractJson), + ); + + const pluginRegistry = new PluginRegistry({ + plugins: [keychainPluginBesu], + }); + + const options: IPluginLedgerConnectorBesuOptions = { + instanceId: uuidv4(), + rpcApiHttpHost: rpcApiHttpHostBesu, + rpcApiWsHost, + pluginRegistry, + logLevel, + }; + besuConnector = new PluginLedgerConnectorBesu(options); + pluginRegistry.add(besuConnector); + + await besuConnector.transact({ + web3SigningCredential: { + ethAccount: firstHighNetWorthAccount, + secret: besuKeyPair.privateKey, + type: Web3SigningCredentialTypeBesu.PrivateKeyHex, + }, + consistencyStrategy: { + blockConfirmations: 0, + receiptType: ReceiptType.NodeTxPoolAck, + }, + transactionConfig: { + from: firstHighNetWorthAccount, + to: testEthAccountBesu.address, + value: 10e9, + gas: 1000000, + }, + }); + const balance = await web3Besu.eth.getBalance(testEthAccountBesu.address); + expect(balance).toBeTruthy(); + expect(parseInt(balance, 10)).toBeGreaterThan(10e9); + + log.info("Connector initialized"); + + const deployOut = await besuConnector.deployContract({ + keychainId: keychainPluginBesu.getKeychainId(), + contractName: LockAssetContractJson.contractName, + contractAbi: LockAssetContractJson.abi, + constructorArgs: [], + web3SigningCredential: { + ethAccount: firstHighNetWorthAccount, + secret: besuKeyPair.privateKey, + type: Web3SigningCredentialTypeBesu.PrivateKeyHex, + }, + bytecode: LockAssetContractJson.bytecode, + gas: 1000000, + }); + expect(deployOut).toBeTruthy(); + expect(deployOut.transactionReceipt).toBeTruthy(); + expect(deployOut.transactionReceipt.contractAddress).toBeTruthy(); + log.info("Contract Deployed successfully"); + } + { + ethereumLedger = new GethTestLedger({ + containerImageName, + containerImageVersion, + }); + await ethereumLedger.start(); + + const listenOptions: IListenOptions = { + hostname: "127.0.0.1", + port: 0, + server: ethereumServer, + }; + addressInfo = (await Servers.listen(listenOptions)) as AddressInfo; + ({ address, port } = addressInfo); + apiHost = `http://${address}:${port}`; + + apiConfig = new Configuration({ basePath: apiHost }); + ethereumApiClient = new EthereumApi(apiConfig); + rpcApiHttpHostEthereum = await ethereumLedger.getRpcApiHttpHost(); + web3Eth = new Web3(rpcApiHttpHostEthereum); + testEthAccount = web3Eth.eth.accounts.create(); + + log.info("Create PluginKeychainMemory..."); + const keychainEntryValue = testEthAccount.privateKey; + keychainPluginEthereum = new PluginKeychainMemory({ + instanceId: uuidv4(), + keychainId: uuidv4(), + backend: new Map([[keychainEntryKey, keychainEntryValue]]), + logLevel, + }); + + keychainPluginEthereum.set( + LockAssetContractJson.contractName, + JSON.stringify(LockAssetContractJson), + ); + + log.info("Create PluginLedgerConnectorEthereum..."); + ethereumConnector = new PluginLedgerConnectorEthereum({ + rpcApiHttpHost: rpcApiHttpHostEthereum, + logLevel, + instanceId: uuidv4(), + pluginRegistry: new PluginRegistry({ plugins: [keychainPluginEthereum] }), + }); + + await ethereumConnector.getOrCreateWebServices(); + await ethereumConnector.registerWebServices(expressAppEthereum, wsApi); + + log.info("Deploy Contract..."); + const deployOut = await ethereumApiClient.deployContract({ + contract: { + contractName: LockAssetContractJson.contractName, + keychainId: keychainPluginEthereum.getKeychainId(), + }, + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + }); + expect(deployOut).toBeTruthy(); + expect(deployOut.data).toBeTruthy(); + expect(deployOut.data.transactionReceipt).toBeTruthy(); + expect(deployOut.data.transactionReceipt.contractAddress).toBeTruthy(); + log.info("contract deployed successfully"); + + const initTransferValue = web3Eth.utils.toWei("5000", "ether"); + await ethereumApiClient.runTransactionV1({ + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + transactionConfig: { + from: WHALE_ACCOUNT_ADDRESS, + to: testEthAccount.address, + value: initTransferValue, + }, + }); + const balance = await web3Eth.eth.getBalance(testEthAccount.address); + expect(balance).toBeTruthy(); + expect(balance.toString()).toBe(initTransferValue); + } + { + hephaestusOptions = { + instanceId: uuidv4(), + logLevel: logLevel, + besuTxObservable: besuConnector.getTxSubjectObservable(), + ethTxObservable: ethereumConnector.getTxSubjectObservable(), + fabricTxObservable: fabricConnector.getTxSubjectObservable(), + }; + + hephaestus = new CcModelHephaestus(hephaestusOptions); + expect(hephaestus).toBeTruthy(); + log.info("hephaestus plugin initialized successfully"); + } +}); + +test("Monitor Besu, Ethereum and Fabric transactions", async () => { + hephaestus.setCaseId("BESU_ETHEREUM_FABRIC_MONITORING_3_CASES"); + hephaestus.monitorTransactions(); + + const numberOfCases = 3; + const txsPerCase = 9; + let caseNumber = 1; + + while (numberOfCases >= caseNumber) { + hephaestus.setCaseId("BESU_ETHEREUM_FABRIC_" + caseNumber); + { + const { success: createResBesu } = await besuConnector.invokeContract({ + contractName: besuContractName, + keychainId: keychainPluginBesu.getKeychainId(), + invocationType: EthContractInvocationTypeBesu.Send, + methodName: "createAsset", + params: [BESU_ASSET_ID, 10], + signingCredential: { + ethAccount: firstHighNetWorthAccount, + secret: besuKeyPair.privateKey, + type: Web3SigningCredentialTypeBesu.PrivateKeyHex, + }, + gas: 1000000, + }); + expect(createResBesu).toBeTruthy(); + + const { success: lockResBesu } = await besuConnector.invokeContract({ + contractName: besuContractName, + keychainId: keychainPluginBesu.getKeychainId(), + invocationType: EthContractInvocationTypeBesu.Send, + methodName: "lockAsset", + params: [BESU_ASSET_ID], + signingCredential: { + ethAccount: testEthAccountBesu.address, + secret: besuKeyPair.privateKey, + type: Web3SigningCredentialTypeBesu.PrivateKeyHex, + }, + gas: 1000000, + }); + expect(lockResBesu).toBeTruthy(); + + const { success: deleteResBesu } = await besuConnector.invokeContract({ + contractName: besuContractName, + keychainId: keychainPluginBesu.getKeychainId(), + invocationType: EthContractInvocationTypeBesu.Send, + methodName: "deleteAsset", + params: [BESU_ASSET_ID], + signingCredential: { + ethAccount: testEthAccountBesu.address, + secret: besuKeyPair.privateKey, + type: Web3SigningCredentialTypeBesu.PrivateKeyHex, + }, + gas: 1000000, + }); + expect(deleteResBesu).toBeTruthy(); + } + { + const createResEth = await ethereumApiClient.invokeContractV1({ + contract: { + contractName: LockAssetContractJson.contractName, + keychainId: keychainPluginEthereum.getKeychainId(), + }, + invocationType: EthContractInvocationType.Send, + methodName: "createAsset", + params: ["asset1", 5], + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + }); + expect(createResEth).toBeTruthy(); + expect(createResEth.data).toBeTruthy(); + + const lockResEth = await ethereumApiClient.invokeContractV1({ + contract: { + contractName: LockAssetContractJson.contractName, + keychainId: keychainPluginEthereum.getKeychainId(), + }, + invocationType: EthContractInvocationType.Send, + methodName: "lockAsset", + params: ["asset1"], + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + }); + expect(lockResEth).toBeTruthy(); + expect(lockResEth.data).toBeTruthy(); + expect(lockResEth.status).toBe(200); + + const deleteResEth = await ethereumApiClient.invokeContractV1({ + contract: { + contractName: LockAssetContractJson.contractName, + keychainId: keychainPluginEthereum.getKeychainId(), + }, + invocationType: EthContractInvocationType.Send, + methodName: "deleteAsset", + params: ["asset1", "owner1"], + web3SigningCredential: { + ethAccount: WHALE_ACCOUNT_ADDRESS, + secret: "", + type: Web3SigningCredentialType.GethKeychainPassword, + }, + }); + expect(deleteResEth).toBeTruthy(); + expect(deleteResEth.data).toBeTruthy(); + expect(deleteResEth.status).toBe(200); + } + { + const createResFabric = await fabricApiClient.runTransactionV1({ + contractName: fabricContractName, + channelName, + params: [FABRIC_ASSET_ID, "10", "owner1"], + methodName: "CreateAsset", + invocationType: FabricContractInvocationType.Send, + signingCredential: fabricSigningCredential, + }); + expect(createResFabric).toBeTruthy(); + + const transferResFabric = await fabricApiClient.runTransactionV1({ + contractName: fabricContractName, + channelName, + params: [FABRIC_ASSET_ID, "owner2"], + methodName: "TransferAsset", + invocationType: FabricContractInvocationType.Send, + signingCredential: fabricSigningCredential, + }); + expect(transferResFabric).toBeTruthy(); + + const deleteResFabric = await fabricApiClient.runTransactionV1({ + contractName: fabricContractName, + channelName, + params: [FABRIC_ASSET_ID], + methodName: "DeleteAsset", + invocationType: FabricContractInvocationType.Send, + signingCredential: fabricSigningCredential, + }); + expect(deleteResFabric).toBeTruthy(); + } + + caseNumber++; + } + + const totalTxs = txsPerCase * numberOfCases; + expect(hephaestus.numberUnprocessedReceipts).toEqual(totalTxs); + expect(hephaestus.numberEventsLog).toEqual(0); + + await hephaestus.txReceiptToCrossChainEventLogEntry(); + + expect(hephaestus.numberUnprocessedReceipts).toEqual(0); + expect(hephaestus.numberEventsLog).toEqual(totalTxs); + + await hephaestus.persistCrossChainLogCsv( + "example-dummy-besu-ethereum-fabric-events", + ); + await hephaestus.persistCrossChainLogJson( + "example-dummy-besu-ethereum-fabric-events", + ); +}); + +afterAll(async () => { + await fabricLedger.stop(); + await fabricLedger.destroy(); + await Servers.shutdown(fabricServer); + + await besuLedger.stop(); + await besuLedger.destroy(); + + await ethereumConnector.shutdown(); + await ethereumLedger.stop(); + await ethereumLedger.destroy(); + await Servers.shutdown(ethereumServer); + + await pruneDockerAllIfGithubAction({ logLevel }) + .then(() => { + log.info("Pruning throw OK"); + }) + .catch(async () => { + await Containers.logDiagnostics({ logLevel }); + fail("Pruning didn't throw OK"); + }); +}); diff --git a/packages/cactus-plugin-cc-tx-visualization/tsconfig.json b/packages/cactus-plugin-ccmodel-hephaestus/tsconfig.json similarity index 62% rename from packages/cactus-plugin-cc-tx-visualization/tsconfig.json rename to packages/cactus-plugin-ccmodel-hephaestus/tsconfig.json index 937bea6bb9..8ab9da859c 100644 --- a/packages/cactus-plugin-cc-tx-visualization/tsconfig.json +++ b/packages/cactus-plugin-ccmodel-hephaestus/tsconfig.json @@ -5,11 +5,14 @@ "outDir": "./dist/lib/", "declarationDir": "dist/types", "rootDir": "./src", - "tsBuildInfoFile": "../../.build-cache/cactus-plugin-cc-tx-visualization.tsbuildinfo" + "tsBuildInfoFile": "../../.build-cache/cactus-plugin-ccmodel-hephaestus.tsbuildinfo" }, "include": [ "./src", - "./src/test/solidity/*.json", + "./src/test/solidity/lock-asset-contract/*.json", + ], + "exclude":[ + "./src/test/typescript/fabric-contracts/lock-asset/chaincode-typescript/**/*.ts" ], "references": [ { diff --git a/packages/cactus-plugin-ledger-connector-besu/src/main/json/openapi.json b/packages/cactus-plugin-ledger-connector-besu/src/main/json/openapi.json index 0c19a63ae7..73f3a57fcc 100644 --- a/packages/cactus-plugin-ledger-connector-besu/src/main/json/openapi.json +++ b/packages/cactus-plugin-ledger-connector-besu/src/main/json/openapi.json @@ -772,18 +772,6 @@ ], "additionalProperties": false, "properties": { - "caseID": { - "type": "string", - "nullable": false - }, - "cost": { - "type": "number", - "nullable": false - }, - "carbonFootprint": { - "type": "string", - "nullable": false - }, "contractName": { "type": "string", "nullable": false diff --git a/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/generated/openapi/typescript-axios/api.ts b/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/generated/openapi/typescript-axios/api.ts index 653b3b877b..cc33fe0a58 100644 --- a/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/generated/openapi/typescript-axios/api.ts +++ b/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/generated/openapi/typescript-axios/api.ts @@ -653,24 +653,6 @@ export interface GetTransactionV1Response { * @interface InvokeContractV1Request */ export interface InvokeContractV1Request { - /** - * - * @type {string} - * @memberof InvokeContractV1Request - */ - 'caseID'?: string; - /** - * - * @type {number} - * @memberof InvokeContractV1Request - */ - 'cost'?: number; - /** - * - * @type {string} - * @memberof InvokeContractV1Request - */ - 'carbonFootprint'?: string; /** * * @type {string} diff --git a/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/plugin-ledger-connector-besu.ts b/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/plugin-ledger-connector-besu.ts index bcdbe0b311..fe9d58891a 100644 --- a/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/plugin-ledger-connector-besu.ts +++ b/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/plugin-ledger-connector-besu.ts @@ -35,7 +35,6 @@ import { IPluginWebService, ICactusPlugin, ICactusPluginOptions, - LedgerType, } from "@hyperledger/cactus-core-api"; import { @@ -102,13 +101,13 @@ import { GetOpenApiSpecV1Endpoint, IGetOpenApiSpecV1EndpointOptions, } from "./web-services/get-open-api-spec-v1-endpoint"; +import { Observable, ReplaySubject } from "rxjs"; -//cc-tx-viz -import * as amqp from "amqp-ts"; -import { - BesuV2TxReceipt, - IsVisualizable, -} from "@hyperledger/cactus-plugin-cc-tx-visualization/src/main/typescript/models/transaction-receipt"; +export interface RunTransactionV1Exchange { + request: InvokeContractV1Request; + response: RunTransactionResponse; + timestamp: Date; +} export const E_KEYCHAIN_NOT_FOUND = "cactus.connector.besu.keychain_not_found"; @@ -119,10 +118,6 @@ export interface IPluginLedgerConnectorBesuOptions pluginRegistry: PluginRegistry; prometheusExporter?: PrometheusExporter; logLevel?: LogLevelDesc; - collectTransactionReceipts?: boolean; - persistMessages?: boolean; - queueId?: string; - eventProvider?: string; } export class PluginLedgerConnectorBesu @@ -134,7 +129,7 @@ export class PluginLedgerConnectorBesu RunTransactionResponse >, ICactusPlugin, - IPluginWebService //, IsVisualizable //cc-tx-viz + IPluginWebService { private readonly instanceId: string; public prometheusExporter: PrometheusExporter; @@ -146,18 +141,14 @@ export class PluginLedgerConnectorBesu private contracts: { [name: string]: Contract; } = {}; + private endpoints: IWebServiceEndpoint[] | undefined; private httpServer: Server | SecureServer | null = null; - public transactionReceipts: any[] = []; - public collectTransactionReceipts: boolean; + private txSubject: ReplaySubject = + new ReplaySubject(); - private amqpConnection: amqp.Connection | undefined; - private amqpQueue: amqp.Queue | undefined; - private amqpExchange: amqp.Exchange | undefined; - public readonly persistMessages: boolean | undefined; - public readonly queueId: string | undefined; - public readonly eventProvider: string | undefined; + public static readonly CLASS_NAME = "PluginLedgerConnectorBesu"; public get className(): string { return PluginLedgerConnectorBesu.CLASS_NAME; @@ -188,29 +179,8 @@ export class PluginLedgerConnectorBesu this.prometheusExporter, `${fnTag} options.prometheusExporter`, ); - this.prometheusExporter.startMetricsCollection(); - //Visualization part - this.collectTransactionReceipts = - options.collectTransactionReceipts || false; - if (this.collectTransactionReceipts) { - this.eventProvider = options.eventProvider || "amqp://localhost"; - this.log.debug("Initializing connection to RabbitMQ"); - this.amqpConnection = new amqp.Connection(this.eventProvider); - this.log.info("Connection to RabbitMQ server initialized"); - const queue = options.queueId || "cc-tx-viz-queue"; - this.queueId = queue; - this.persistMessages = options.persistMessages || false; - this.amqpExchange = this.amqpConnection.declareExchange( - `cc-tx-viz-exchange`, - "direct", - { durable: this.persistMessages }, - ); - this.amqpQueue = this.amqpConnection.declareQueue(this.queueId, { - durable: this.persistMessages, - }); - this.amqpQueue.bind(this.amqpExchange); - } + this.prometheusExporter.startMetricsCollection(); } public getOpenApiSpec(): unknown { @@ -227,15 +197,14 @@ export class PluginLedgerConnectorBesu return res; } - public closeConnection(): Promise { - this.log.info("Closing Amqp connection"); - return this.amqpConnection?.close(); - } - public getInstanceId(): string { return this.instanceId; } + public getTxSubjectObservable(): Observable { + return this.txSubject.asObservable(); + } + public async onPluginInit(): Promise { this.web3Quorum = Web3JsQuorum(this.web3); } @@ -414,7 +383,7 @@ export class PluginLedgerConnectorBesu req: InvokeContractV1Request, ): Promise { const fnTag = `${this.className}#invokeContract()`; - const startTimeToTransaction = new Date(); + const contractName = req.contractName; let contractInstance: Contract; @@ -445,6 +414,7 @@ export class PluginLedgerConnectorBesu const web3SigningCredential = req.signingCredential as | Web3SigningCredentialPrivateKeyHex | Web3SigningCredentialCactusKeychainRef; + const receipt = await this.transact({ transactionConfig: { data: `0x${contractJSON.bytecode}`, @@ -460,6 +430,7 @@ export class PluginLedgerConnectorBesu web3SigningCredential, privateTransactionConfig: req.privateTransactionConfig, }); + const address = { address: receipt.transactionReceipt.contractAddress, }; @@ -482,6 +453,7 @@ export class PluginLedgerConnectorBesu `${fnTag} Cannot invoke a contract without contract instance, the keychainId param is needed`, ); } + contractInstance = this.contracts[contractName]; if (req.contractAbi != undefined) { let abi; @@ -590,47 +562,16 @@ export class PluginLedgerConnectorBesu const out = await this.transact(txReq); const success = out.transactionReceipt.status; const data = { success, out }; - const endTimeToTransaction = new Date(); - this.log.debug( - `EVAL-${this.className}-ISSUE-TRANSACTION:${ - endTimeToTransaction.getTime() - startTimeToTransaction.getTime() - }`, - ); - if (this.collectTransactionReceipts) { - const startTimeBesuReceipt = new Date(); - const extendedReceipt: BesuV2TxReceipt = { - caseID: req.caseID || "BESU_TBD", - blockchainID: LedgerType.Besu2X, - invocationType: req.invocationType, - methodName: req.methodName, - parameters: req.params, - timestamp: new Date(), - contractName: req.contractName, - status: out.transactionReceipt.status, - transactionHash: out.transactionReceipt.transactionHash, - transactionIndex: out.transactionReceipt.transactionIndex, - blockNumber: out.transactionReceipt.blockNumber, - blockHash: out.transactionReceipt.blockHash, - gasPrice: req.gasPrice, - gas: req.gas, - from: out.transactionReceipt.from, - to: out.transactionReceipt.to, - value: req.value, - gasUsed: out.transactionReceipt.gasUsed, - keychainID: req.keychainId, - signingCredentials: req.signingCredential, - }; - const txReceipt = new amqp.Message(extendedReceipt); - this.amqpQueue?.send(txReceipt); - const endTimeBesuReceipt = new Date(); - this.log.debug(`Sent transaction receipt to queue ${this.queueId}`); - this.log.debug( - `EVAL-${this.className}-GENERATE-AND-CAPTURE-RECEIPT:${ - endTimeBesuReceipt.getTime() - startTimeBesuReceipt.getTime() - }`, - ); - } + // create RunTransactionV1Exchange for transaction monitoring + const receiptData: RunTransactionV1Exchange = { + request: req, + response: out, + timestamp: new Date(), + }; + this.log.debug(`RunTransactionV1Exchange created ${receiptData}`); + this.txSubject.next(receiptData); + return data; } else { throw new Error( diff --git a/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/public-api.ts b/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/public-api.ts index d36a10beb9..fd879cc175 100755 --- a/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/public-api.ts +++ b/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/public-api.ts @@ -2,6 +2,7 @@ export { E_KEYCHAIN_NOT_FOUND, IPluginLedgerConnectorBesuOptions, PluginLedgerConnectorBesu, + RunTransactionV1Exchange, } from "./plugin-ledger-connector-besu"; export { PluginFactoryLedgerConnector } from "./plugin-factory-ledger-connector"; diff --git a/packages/cactus-plugin-ledger-connector-ethereum/src/main/typescript/plugin-ledger-connector-ethereum.ts b/packages/cactus-plugin-ledger-connector-ethereum/src/main/typescript/plugin-ledger-connector-ethereum.ts index 551baf07fb..d455d23aa9 100644 --- a/packages/cactus-plugin-ledger-connector-ethereum/src/main/typescript/plugin-ledger-connector-ethereum.ts +++ b/packages/cactus-plugin-ledger-connector-ethereum/src/main/typescript/plugin-ledger-connector-ethereum.ts @@ -88,6 +88,13 @@ import { Web3StringReturnFormat, convertWeb3ReceiptStatusToBool, } from "./types/util-types"; +import { Observable, ReplaySubject } from "rxjs"; + +export interface RunTransactionV1Exchange { + request: InvokeContractV1Request; + response: RunTransactionResponse; + timestamp: Date; +} // Used when waiting for WS requests to be send correctly before disconnecting const waitForWsProviderRequestsTimeout = 5 * 1000; // 5s @@ -150,6 +157,9 @@ export class PluginLedgerConnectorEthereum private watchBlocksSubscriptions: Map = new Map(); + private txSubject: ReplaySubject = + new ReplaySubject(); + public get className(): string { return PluginLedgerConnectorEthereum.CLASS_NAME; } @@ -235,6 +245,10 @@ export class PluginLedgerConnectorEthereum return this.instanceId; } + public getTxSubjectObservable(): Observable { + return this.txSubject.asObservable(); + } + private async removeWatchBlocksSubscriptionForSocket(socketId: string) { try { const subscription = this.watchBlocksSubscriptions.get(socketId); @@ -655,6 +669,16 @@ export class PluginLedgerConnectorEthereum }); const success = out.transactionReceipt.status; const data = { success, out }; + + // create RunTransactionV1Exchange for transaction monitoring + const receiptData: RunTransactionV1Exchange = { + request: req, + response: out, + timestamp: new Date(), + }; + this.log.debug(`RunTransactionV1Exchange created ${receiptData}`); + this.txSubject.next(receiptData); + return data; } else { throw new Error( diff --git a/packages/cactus-plugin-ledger-connector-ethereum/src/main/typescript/public-api.ts b/packages/cactus-plugin-ledger-connector-ethereum/src/main/typescript/public-api.ts index 56d5b0cfbb..cd2e9f7194 100755 --- a/packages/cactus-plugin-ledger-connector-ethereum/src/main/typescript/public-api.ts +++ b/packages/cactus-plugin-ledger-connector-ethereum/src/main/typescript/public-api.ts @@ -3,6 +3,7 @@ export * from "./generated/openapi/typescript-axios"; export { PluginLedgerConnectorEthereum, IPluginLedgerConnectorEthereumOptions, + RunTransactionV1Exchange, } from "./plugin-ledger-connector-ethereum"; export * from "./sign-utils"; diff --git a/packages/cactus-plugin-ledger-connector-fabric/package.json b/packages/cactus-plugin-ledger-connector-fabric/package.json index 7073f236e6..b2cd7fea97 100644 --- a/packages/cactus-plugin-ledger-connector-fabric/package.json +++ b/packages/cactus-plugin-ledger-connector-fabric/package.json @@ -60,7 +60,6 @@ "@hyperledger/cactus-core": "2.0.0-alpha.2", "@hyperledger/cactus-core-api": "2.0.0-alpha.2", "axios": "1.6.0", - "amqp-ts": "1.8.0", "bl": "5.0.0", "bn.js": "4.12.0", "elliptic": "6.5.4", diff --git a/packages/cactus-plugin-ledger-connector-fabric/src/main/json/openapi.json b/packages/cactus-plugin-ledger-connector-fabric/src/main/json/openapi.json index 3b78f65bcf..5fbf93276c 100644 --- a/packages/cactus-plugin-ledger-connector-fabric/src/main/json/openapi.json +++ b/packages/cactus-plugin-ledger-connector-fabric/src/main/json/openapi.json @@ -414,18 +414,6 @@ "nullable": false } }, - "cost":{ - "type": "number", - "nullable": false - }, - "carbonFootprint":{ - "type": "string", - "nullable": false - }, - "caseID":{ - "type": "string", - "nullable": false - }, "transientData": { "type": "object", "nullable": true diff --git a/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/generated/openapi/typescript-axios/api.ts b/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/generated/openapi/typescript-axios/api.ts index 8336a2a363..062222a01e 100644 --- a/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/generated/openapi/typescript-axios/api.ts +++ b/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/generated/openapi/typescript-axios/api.ts @@ -1030,24 +1030,6 @@ export interface RunTransactionRequest { * @memberof RunTransactionRequest */ 'endorsingOrgs'?: Array; - /** - * - * @type {number} - * @memberof RunTransactionRequest - */ - cost?: number; - /** - * - * @type {string} - * @memberof RunTransactionRequest - */ - carbonFootprint?: string; - /** - * - * @type {string} - * @memberof RunTransactionRequest - */ - caseID?: string; /** * * @type {object} diff --git a/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/plugin-ledger-connector-fabric.ts b/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/plugin-ledger-connector-fabric.ts index 6c5d66d269..f0875e3ac2 100644 --- a/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/plugin-ledger-connector-fabric.ts +++ b/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/plugin-ledger-connector-fabric.ts @@ -1,4 +1,3 @@ -/* eslint-disable prettier/prettier */ import fs from "fs"; import path from "path"; import { v4 as uuidv4 } from "uuid"; @@ -44,7 +43,6 @@ import { IWebServiceEndpoint, ICactusPlugin, ICactusPluginOptions, - LedgerType, } from "@hyperledger/cactus-core-api"; import { @@ -139,20 +137,22 @@ import { getTransactionReceiptByTxID, IGetTransactionReceiptByTxIDOptions, } from "./common/get-transaction-receipt-by-tx-id"; - import { GetBlockEndpointV1 } from "./get-block/get-block-endpoint-v1"; import { querySystemChainCode } from "./common/query-system-chain-code"; import { isSshExecOk } from "./common/is-ssh-exec-ok"; import { asBuffer, assertFabricFunctionIsAvailable } from "./common/utils"; import { findAndReplaceFabricLoggingSpec } from "./common/find-and-replace-fabric-logging-spec"; import { deployContractGoSourceImplFabricV256 } from "./deploy-contract-go-source/deploy-contract-go-source-impl-fabric-v2-5-6"; +import { Observable, ReplaySubject } from "rxjs"; const { loadFromConfig } = require("fabric-network/lib/impl/ccp/networkconfig"); assertFabricFunctionIsAvailable(loadFromConfig, "loadFromConfig"); -//cc-tx-viz -import * as amqp from "amqp-ts"; -import {FabricV2TxReceipt, IsVisualizable} from "@hyperledger/cactus-plugin-cc-tx-visualization/src/main/typescript/models/transaction-receipt"; +export interface RunTxReqWithTxId { + request: RunTransactionRequest; + transactionId: string; + timestamp: Date; +} /** * Constant value holding the default $GOPATH in the Fabric CLI container as @@ -191,12 +191,6 @@ export interface IPluginLedgerConnectorFabricOptions vaultConfig?: IVaultConfig; webSocketConfig?: IWebSocketConfig; signCallback?: SignPayloadCallback; - - //cc-tx-viz - collectTransactionReceipts?: boolean; - persistMessages?: boolean; - queueId?: string; - eventProvider?: string; } export class PluginLedgerConnectorFabric @@ -207,7 +201,6 @@ export class PluginLedgerConnectorFabric RunTransactionRequest, RunTransactionResponse >, - IsVisualizable, ICactusPlugin, IPluginWebService { @@ -224,15 +217,7 @@ export class PluginLedgerConnectorFabric private readonly certStore: CertDatastore; private readonly sshDebugOn: boolean; private runningWatchBlocksMonitors = new Set(); - - //cc-tx-viz - private amqpConnection: amqp.Connection | undefined; - private amqpQueue: amqp.Queue | undefined; - private amqpExchange: amqp.Exchange | undefined; - public readonly collectTransactionReceipts: boolean; - public readonly persistMessages: boolean | undefined; - public readonly queueId: string | undefined; - public readonly eventProvider: string | undefined; + private txSubject: ReplaySubject = new ReplaySubject(); public get className(): string { return PluginLedgerConnectorFabric.CLASS_NAME; @@ -246,7 +231,7 @@ export class PluginLedgerConnectorFabric constructor(public readonly opts: IPluginLedgerConnectorFabricOptions) { const fnTag = `${this.className}#constructor()`; Checks.truthy(opts, `${fnTag} arg options`); - //Checks.truthy(opts.instanceId, `${fnTag} options.instanceId`); + Checks.truthy(opts.instanceId, `${fnTag} options.instanceId`); Checks.truthy(opts.peerBinary, `${fnTag} options.peerBinary`); Checks.truthy(opts.pluginRegistry, `${fnTag} options.pluginRegistry`); Checks.truthy(opts.connectionProfile, `${fnTag} options.connectionProfile`); @@ -291,27 +276,6 @@ export class PluginLedgerConnectorFabric } this.signCallback = opts.signCallback; - - //cc-tx-viz - // Visualization part - this.collectTransactionReceipts = opts.collectTransactionReceipts || false; - if (this.collectTransactionReceipts) { - this.eventProvider = opts.eventProvider || "amqp://localhost"; - this.log.debug("Initializing connection to RabbitMQ"); - this.amqpConnection = new amqp.Connection(this.eventProvider); - this.log.info("Connection to RabbitMQ server initialized"); - const queue = this.opts.queueId || "cc-tx-viz-queue"; - this.queueId = queue; - this.persistMessages = this.opts.persistMessages || false; - this.amqpExchange = this.amqpConnection.declareExchange(`cc-tx-viz-exchange`, "direct", {durable: this.persistMessages}); - this.amqpQueue = this.amqpConnection.declareQueue(this.queueId, {durable: this.persistMessages}); - this.amqpQueue.bind(this.amqpExchange); - } - } - - public closeConnection(): Promise { - this.log.info("Closing Amqp connection"); - return this.amqpConnection?.close(); } public getOpenApiSpec(): unknown { @@ -332,11 +296,6 @@ export class PluginLedgerConnectorFabric this.log.debug(`getPrometheusExporterMetrics() response: %o`, res); return res; } - - //TODO returns Promise - public async getTransactionReceiptsList(): Promise { - //returns list - } public getInstanceId(): string { return this.instanceId; @@ -346,6 +305,10 @@ export class PluginLedgerConnectorFabric return `@hyperledger/cactus-plugin-ledger-connector-fabric`; } + public getTxSubjectObservable(): Observable { + return this.txSubject.asObservable(); + } + public async onPluginInit(): Promise { return; } @@ -1173,15 +1136,8 @@ export class PluginLedgerConnectorFabric public async transact( req: RunTransactionRequest, ): Promise { - //start transaction time - // const startTx = performance.now(); - - //start tx const fnTag = `${this.className}#transact()`; this.log.debug("%s ENTER", fnTag); - - //cc-tx-viz - const startTimeFabricReceipt = new Date(); const { channelName, @@ -1249,33 +1205,10 @@ export class PluginLedgerConnectorFabric } const transientMap = this.toTransientMap(req.transientData); - - //cc-tx-viz - /* - const transientMap: TransientMap = transientData as TransientMap; - - try { - //Obtains and parses each component of transient data - for (const key in transientMap) { - transientMap[key] = Buffer.from( - JSON.stringify(transientMap[key]), - ); - } - } catch (ex) { - this.log.error(`Building transient map crashed: `, ex); - throw new Error( - `${fnTag} Unable to build the transient map: ${ex.message}`, - ); - } - */ - const transactionProposal = await contract.createTransaction(fnName); transactionProposal.setEndorsingPeers(endorsingTargets); out = await transactionProposal.setTransient(transientMap).submit(); - - //cc-tx-viz - //transactionId = transactionProposal.getTransactionId(); - //success = true; + transactionId = transactionProposal.getTransactionId(); break; } default: { @@ -1283,74 +1216,18 @@ export class PluginLedgerConnectorFabric throw new Error(`${fnTag} unknown ${message}`); } } - //cc-tx-viz - /* - const endTimeFabricReceipt = new Date(); - this.log.debug(`EVAL-${this.className}-ISSUE-TRANSACTION:${endTimeFabricReceipt.getTime()-startTimeFabricReceipt.getTime()}`); - - // if we don't want to collect reads, than add condition && transactionId !== "" - if (this.collectTransactionReceipts) { - const startTimeFabricReceipt = new Date(); - const txParams = req.params; - //getTransactionReceiptByTxID requires 2 params in req.params => channelName and txID - req.params = []; - req.params[0] = req.channelName; - req.params[1] = transactionId; - //req.params get are stored in the basicTxReceipt rwsetWriteData - if (transactionId) { - const basicTxReceipt = await this.getTransactionReceiptByTxID(req); - const extendedReceipt: FabricV2TxReceipt={ - caseID: req.caseID || "FABRIC_TBD", - transactionID: transactionId, - blockchainID: LedgerType.Fabric2, - invocationType: req.invocationType, - methodName: req.methodName, - parameters: txParams, - timestamp: new Date(), - channelName: req.channelName, - contractName: req.contractName, - signingCredentials: req.signingCredential, - endorsingParties: req.endorsingParties, - endorsingPeers: req.endorsingPeers, - gatewayOptions: req.gatewayOptions, - transactionCreator: basicTxReceipt.transactionCreator, - transientData: req.transientData, - blockMetaData: basicTxReceipt.blockMetaData, - chainCodeName: basicTxReceipt.chainCodeName, - blockNumber: basicTxReceipt.blockNumber, - chainCodeVersion: basicTxReceipt.chainCodeVersion, - responseStatus: basicTxReceipt.responseStatus, - }; - const txReceipt = new amqp.Message(extendedReceipt); - this.amqpQueue?.send(txReceipt); - this.log.debug(`Sent extended transaction receipt to queue ${this.queueId}`); - } else { - const extendedReceipt: FabricV2TxReceipt={ - caseID: req.caseID || "FABRIC_TBD", - transactionID: undefined, - blockchainID: LedgerType.Fabric2, - invocationType: req.invocationType, - methodName: req.methodName, - parameters: txParams, - timestamp: new Date(), - channelName: req.channelName, - contractName: req.contractName, - signingCredentials: req.signingCredential, - endorsingParties: req.endorsingParties, - endorsingPeers: req.endorsingPeers, - gatewayOptions: req.gatewayOptions, - }; - const txReceipt = new amqp.Message(extendedReceipt); - this.amqpQueue?.send(txReceipt); - this.log.debug(`Sent simple transaction receipt to queue ${this.queueId}`); - } - const endTimeFabricReceipt = new Date(); - this.log.debug(`EVAL-${this.className}-GENERATE-AND-CAPTURE-RECEIPT:${endTimeFabricReceipt.getTime()-startTimeFabricReceipt.getTime()}`); - } + // create RunTxReqWithTxId for transaction monitoring + const receiptData: RunTxReqWithTxId = { + request: req, + transactionId: transactionId == "" ? uuidv4() : transactionId, + timestamp: new Date(), + }; + this.log.debug( + `RunTxReqWithTxId created with ID: ${receiptData.transactionId}`, + ); + this.txSubject.next(receiptData); - const outUtf8 = out.toString("utf-8"); - */ const res: RunTransactionResponse = { functionOutput: this.convertToTransactionResponseType( out, @@ -1360,10 +1237,12 @@ export class PluginLedgerConnectorFabric }; gateway.disconnect(); this.log.debug(`transact() response: %o`, res); + this.prometheusExporter.addCurrentTransaction(); + return res; } catch (ex) { this.log.error(`transact() crashed: `, ex); - throw new Error(`${fnTag} Unable to run transaction: ${ex}`); + throw new Error(`${fnTag} Unable to run transaction: ${ex.message}`); } } @@ -1400,7 +1279,7 @@ export class PluginLedgerConnectorFabric return new FabricCAServices(caUrl, tlsOptions, caName); } catch (ex) { this.log.error(`createCaClient() Failure:`, ex); - throw new Error(`${fnTag} Inner Exception: ${ex}`); + throw new Error(`${fnTag} Inner Exception: ${ex?.message}`); } } @@ -1436,7 +1315,7 @@ export class PluginLedgerConnectorFabric return [x509Identity, wallet]; } catch (ex) { this.log.error(`enrollAdmin() Failure:`, ex); - throw new Error(`${fnTag} Exception: ${ex}`); + throw new Error(`${fnTag} Exception: ${ex?.message}`); } } /** diff --git a/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/public-api.ts b/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/public-api.ts index 50172d9cf8..8910d64904 100755 --- a/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/public-api.ts +++ b/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/public-api.ts @@ -9,6 +9,7 @@ export { PluginLedgerConnectorFabric, IPluginLedgerConnectorFabricOptions, SignPayloadCallback, + RunTxReqWithTxId, } from "./plugin-ledger-connector-fabric"; import { IPluginFactoryOptions } from "@hyperledger/cactus-core-api"; diff --git a/packages/cactus-plugin-ledger-connector-fabric/src/test/typescript/integration/fabric-v2-2-x/run-transaction-endpoint-v1.test.ts b/packages/cactus-plugin-ledger-connector-fabric/src/test/typescript/integration/fabric-v2-2-x/run-transaction-endpoint-v1.test.ts index d46ca0c437..a1933710c4 100644 --- a/packages/cactus-plugin-ledger-connector-fabric/src/test/typescript/integration/fabric-v2-2-x/run-transaction-endpoint-v1.test.ts +++ b/packages/cactus-plugin-ledger-connector-fabric/src/test/typescript/integration/fabric-v2-2-x/run-transaction-endpoint-v1.test.ts @@ -35,6 +35,8 @@ import { FabricSigningCredential, } from "../../../../main/typescript/public-api"; +import { K_CACTUS_FABRIC_TOTAL_TX_COUNT } from "../../../../main/typescript/prometheus-exporter/metrics"; + import { IPluginLedgerConnectorFabricOptions } from "../../../../main/typescript/plugin-ledger-connector-fabric"; import { DiscoveryOptions } from "fabric-network"; import { Configuration } from "@hyperledger/cactus-core-api"; @@ -229,6 +231,25 @@ describe(testCase, () => { expect(asset277.Owner).toEqual(assetOwner); } + { + const res = await apiClient.getPrometheusMetricsV1(); + const promMetricsOutput = + "# HELP " + + K_CACTUS_FABRIC_TOTAL_TX_COUNT + + " Total transactions executed\n" + + "# TYPE " + + K_CACTUS_FABRIC_TOTAL_TX_COUNT + + " gauge\n" + + K_CACTUS_FABRIC_TOTAL_TX_COUNT + + '{type="' + + K_CACTUS_FABRIC_TOTAL_TX_COUNT + + '"} 3'; + expect(res).toBeTruthy(); + expect(res.data).toBeTruthy(); + expect(res.status).toEqual(200); + expect(res.data.includes(promMetricsOutput)).toBeTrue(); + } + { const req: RunTransactionRequest = { signingCredential, diff --git a/packages/cactus-test-tooling/src/main/typescript/public-api.ts b/packages/cactus-test-tooling/src/main/typescript/public-api.ts index bf22dc90b4..1380f8fb59 100755 --- a/packages/cactus-test-tooling/src/main/typescript/public-api.ts +++ b/packages/cactus-test-tooling/src/main/typescript/public-api.ts @@ -202,5 +202,3 @@ export { FABRIC_25_LTS_FABRIC_SAMPLES__ORDERER_TLS_ROOTCERT_FILE_ORG_2, IFabricOrgEnvInfo, } from "./fabric/fabric-samples-env-constants"; - -export { RabbitMQTestServer } from "./rabbitmq-test-server/rabbit-mq-test-server"; \ No newline at end of file diff --git a/packages/cactus-test-tooling/src/main/typescript/rabbitmq-test-server/rabbit-mq-test-server.ts b/packages/cactus-test-tooling/src/main/typescript/rabbitmq-test-server/rabbit-mq-test-server.ts deleted file mode 100644 index 727f137c69..0000000000 --- a/packages/cactus-test-tooling/src/main/typescript/rabbitmq-test-server/rabbit-mq-test-server.ts +++ /dev/null @@ -1,251 +0,0 @@ -import type { EventEmitter } from "events"; -import { Optional } from "typescript-optional"; -import { RuntimeError } from "run-time-error"; -import type { Container, ContainerInfo } from "dockerode"; -import Docker from "dockerode"; -import { Logger, Checks, Bools } from "@hyperledger/cactus-common"; -import type { LogLevelDesc } from "@hyperledger/cactus-common"; -import { LoggerProvider } from "@hyperledger/cactus-common"; -import { Containers } from "../common/containers"; -import { Config as SshConfig } from "node-ssh"; - -export interface IRabbitMQTestServerOptions { - readonly publishAllPorts: boolean; - readonly port: number; - readonly logLevel?: LogLevelDesc; - readonly imageName?: string; - readonly imageTag?: string; - readonly emitContainerLogs?: boolean; - readonly envVars?: Map; -} - -export class RabbitMQTestServer { - public static readonly CLASS_NAME = "RabbitMQTestServer"; - - public readonly logLevel: LogLevelDesc; - public readonly imageName: string; - public readonly imageTag: string; - public readonly imageFqn: string; - public readonly log: Logger; - public readonly emitContainerLogs: boolean; - public readonly publishAllPorts: boolean; - public readonly envVars: Map; - public readonly port: number; - private _containerId: Optional; - - public get containerId(): Optional { - return this._containerId; - } - - public get container(): Optional { - const docker = new Docker(); - return this.containerId.isPresent() - ? Optional.ofNonNull(docker.getContainer(this.containerId.get())) - : Optional.empty(); - } - - public get className(): string { - return RabbitMQTestServer.CLASS_NAME; - } - - constructor(public readonly opts: IRabbitMQTestServerOptions) { - const fnTag = `${this.className}#constructor()`; - Checks.truthy(opts, `${fnTag} arg options`); - - this.publishAllPorts = opts.publishAllPorts; - this._containerId = Optional.empty(); - this.imageName = opts.imageName || "rabbitmq"; - this.port = opts.port || 5672; - this.imageTag = opts.imageTag || "3.9-management"; - this.imageFqn = `${this.imageName}:${this.imageTag}`; - this.envVars = opts.envVars || new Map(); - this.emitContainerLogs = Bools.isBooleanStrict(opts.emitContainerLogs) - ? (opts.emitContainerLogs as boolean) - : true; - - this.logLevel = opts.logLevel || "INFO"; - - const level = this.logLevel; - const label = this.className; - this.log = LoggerProvider.getOrCreate({ level, label }); - - this.log.debug(`Created instance of ${this.className} OK`); - } - public getContainerImageName(): string { - return `${this.imageName}:${this.imageTag}`; - } - public async start(omitPull = false): Promise { - const startTime = new Date(); - const docker = new Docker(); - if (this.containerId.isPresent()) { - this.log.warn(`Container ID provided. Will not start new one.`); - const container = docker.getContainer(this.containerId.get()); - return container; - } - if (!omitPull) { - this.log.debug(`Pulling image ${this.imageFqn}...`); - await Containers.pullImage(this.imageFqn); - this.log.debug(`Pulled image ${this.imageFqn} OK`); - } - - const dockerEnvVars: string[] = new Array(...this.envVars).map( - (pairs) => `${pairs[0]}=${pairs[1]}`, - ); - - // TODO: dynamically expose ports for custom port mapping - const createOptions = { - Env: dockerEnvVars, - - /* - Healthcheck: { - Test: ["CMD-SHELL", `rabbitmq-diagnostics -q ping`], - Interval: 1000000000, // 1 second - Timeout: 3000000000, // 3 seconds - Retries: 10, - StartPeriod: 1000000000, // 1 second - }, - */ - - ExposedPorts: { - "5672/tcp": {}, // Default port for RabbitMQ - "7235/tcp": {}, // Default port for RabbitMQ - }, - HostConfig: { - AutoRemove: true, - PublishAllPorts: this.publishAllPorts, - Privileged: false, - PortBindings: { - "5672/tcp": [{ HostPort: "5672" }], - "7235/tcp": [{ HostPort: "7235" }], - }, - }, - }; - - this.log.debug(`Starting ${this.imageFqn} with options: `, createOptions); - - return new Promise((resolve, reject) => { - const eventEmitter: EventEmitter = docker.run( - this.imageFqn, - [], - [], - createOptions, - {}, - (err: Error) => { - if (err) { - const errorMessage = `Failed to start container ${this.imageFqn}`; - const exception = new RuntimeError(errorMessage, err); - this.log.error(exception); - reject(exception); - } - }, - ); - - eventEmitter.once("start", async (container: Container) => { - const { id } = container; - this.log.debug(`Started ${this.imageFqn} successfully. ID=${id}`); - this._containerId = Optional.ofNonNull(id); - - if (this.emitContainerLogs) { - const logOptions = { follow: true, stderr: true, stdout: true }; - const logStream = await container.logs(logOptions); - logStream.on("data", (data: Buffer) => { - const fnTag = `[${this.imageFqn}]`; - this.log.debug(`${fnTag} %o`, data.toString("utf-8")); - }); - } - this.log.debug(`Registered container log stream callbacks OK`); - - try { - this.log.debug(`Starting to wait for healthcheck... `); - await this.waitForHealthCheck(); - this.log.debug(`Healthcheck passed OK`); - const finalTime = new Date(); - this.log.debug( - `EVAL-SETUP-INIT-RABBIT-MQ-SERVER:${ - finalTime.getTime() - startTime.getTime() - }`, - ); - resolve(container); - } catch (ex) { - this.log.error(ex); - reject(ex); - } - }); - }); - } - - public async waitForHealthCheck(timeoutMs = 180000): Promise { - const fnTag = "FabricTestLedgerV1#waitForHealthCheck()"; - const startedAt = Date.now(); - let reachable = false; - do { - try { - const { State } = await this.getContainerInfo(); - reachable = State === "running"; - } catch (ex) { - reachable = false; - if (Date.now() >= startedAt + timeoutMs) { - throw new Error(`${fnTag} timed out (${timeoutMs}ms) -> ${ex.stack}`); - } - } - await new Promise((resolve2) => setTimeout(resolve2, 1000)); - } while (!reachable); - } - public async stop(): Promise { - return Containers.stop(this.container.get()); - } - - public async destroy(): Promise { - if (!this.container.get()) { - return; - } - return this.container.get().remove(); - } - - public async getContainerIpAddress(): Promise { - const containerInfo = await this.getContainerInfo(); - return Containers.getContainerInternalIp(containerInfo); - } - - // TODO - public async getSshConfig(): Promise { - const fnTag = "RabbitMQTestServer#getSshConfig()"; - if (!this.container) { - throw new Error(`${fnTag} - invalid state no container instance set`); - } - const filePath = "/etc/hyperledger/cactus/fabric-aio-image.key"; - const privateKey = await Containers.pullFile( - (this.container as unknown) as Container, - filePath, - ); - const containerInfo = await this.getContainerInfo(); - const port = await Containers.getPublicPort(22, containerInfo); - const sshConfig: SshConfig = { - host: "localhost", - privateKey, - username: "root", - port, - }; - return sshConfig; - } - - protected async getContainerInfo(): Promise { - const fnTag = `${this.className}#getContainerInfo()`; - const docker = new Docker(); - const image = this.getContainerImageName(); - const containerInfos = await docker.listContainers({}); - - let aContainerInfo; - if (this.containerId !== undefined) { - aContainerInfo = containerInfos.find( - (ci) => ci.Id == this.containerId.get(), - ); - } - - if (aContainerInfo) { - return aContainerInfo; - } else { - throw new Error(`${fnTag} no image "${image}"`); - } - } -} diff --git a/packages/cactus-test-tooling/src/main/typescript/socketio-test-setup-helpers/socketio-test-setup-helpers.ts b/packages/cactus-test-tooling/src/main/typescript/socketio-test-setup-helpers/socketio-test-setup-helpers.ts index 6ab025f3fa..dfbb33ac09 100644 --- a/packages/cactus-test-tooling/src/main/typescript/socketio-test-setup-helpers/socketio-test-setup-helpers.ts +++ b/packages/cactus-test-tooling/src/main/typescript/socketio-test-setup-helpers/socketio-test-setup-helpers.ts @@ -80,7 +80,7 @@ export function connectTestClient(socket: ClientSocket): Promise { socket.on("connect_timeout", errorHandlerFactory("connect_timeout")); socket.on("connect", () => { - //socket.removeAllListeners(); + socket.removeAllListeners(); resolve(socket); }); }); diff --git a/tsconfig.json b/tsconfig.json index 76b86f4e04..888bc52f26 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -134,7 +134,7 @@ "path": "./packages/cactus-test-verifier-client/tsconfig.json" }, { - "path": "./packages/cactus-plugin-cc-tx-visualization/tsconfig.json" + "path": "./packages/cactus-plugin-ccmodel-hephaestus/tsconfig.json" }, { "path": "./examples/cactus-example-carbon-accounting-backend/tsconfig.json" @@ -157,9 +157,6 @@ { "path": "./examples/cactus-example-tcs-huawei/tsconfig.json" }, - { - "path": "./packages/cactus-plugin-satp-hermes/tsconfig.json" - }, { "path": "./examples/cactus-example-electricity-trade/tsconfig.json" }, @@ -169,9 +166,6 @@ { "path": "./examples/cactus-example-discounted-asset-trade-client/tsconfig.json" }, - { - "path": "./examples/cactus-example-cbdc-bridging-frontend/tsconfig.json" - }, { "path": "./extensions/cactus-plugin-object-store-ipfs/tsconfig.json" }, diff --git a/yarn.lock b/yarn.lock index 9d2043bf7b..0565b0c7d5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -41,9 +41,9 @@ __metadata: linkType: hard "@adobe/css-tools@npm:^4.0.1": - version: 4.2.0 - resolution: "@adobe/css-tools@npm:4.2.0" - checksum: 10/d6d2b48963bef725a0043b7d39c5fb12d6e42b52b8bebd746e80e1732f5160529f00fb184c0d3eb9446765727ccc8997ea8f121c54c7d33d1eb577d0feb54b6c + version: 4.3.3 + resolution: "@adobe/css-tools@npm:4.3.3" + checksum: 10/0e77057efb4e18182560855503066b75edca98671be327d3f8a7ae89ec3da6821e693114b55225909fca00d7e7ed8422f3d79d71fe95dd4d5df1f2026a9fda02 languageName: node linkType: hard @@ -1146,13 +1146,13 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.21.4, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.8.3": - version: 7.22.13 - resolution: "@babel/code-frame@npm:7.22.13" +"@babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.24.6, @babel/code-frame@npm:^7.8.3": + version: 7.24.6 + resolution: "@babel/code-frame@npm:7.24.6" dependencies: - "@babel/highlight": "npm:^7.22.13" - chalk: "npm:^2.4.2" - checksum: 10/bf6ae6ba3a510adfda6a211b4a89b0f1c98ca1352b745c077d113f3b568141e0d44ce750b9ac2a80143ba5c8c4080c50fcfc1aa11d86e194ea6785f62520eb5a + "@babel/highlight": "npm:^7.24.6" + picocolors: "npm:^1.0.0" + checksum: 10/e9b70af2a9c7c734ac36c2e6e1da640a6e0a483bfba7cf620226a1226a2e6d64961324b02d786e06ce72f0aa329e190dfc49128367a2368b69e2219ffddcdcc5 languageName: node linkType: hard @@ -1165,13 +1165,13 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.22.10": - version: 7.22.10 - resolution: "@babel/code-frame@npm:7.22.10" +"@babel/code-frame@npm:^7.21.4, @babel/code-frame@npm:^7.22.13": + version: 7.22.13 + resolution: "@babel/code-frame@npm:7.22.13" dependencies: - "@babel/highlight": "npm:^7.22.10" + "@babel/highlight": "npm:^7.22.13" chalk: "npm:^2.4.2" - checksum: 10/53620d831c8f2230a7d2fbe833c01c071740a642317c960d45cda9b0b2d0492e152e00ab45aad8b55329ba5de647354b95f42b546fb905c0b7acf78d3f2d3ecd + checksum: 10/bf6ae6ba3a510adfda6a211b4a89b0f1c98ca1352b745c077d113f3b568141e0d44ce750b9ac2a80143ba5c8c4080c50fcfc1aa11d86e194ea6785f62520eb5a languageName: node linkType: hard @@ -1229,6 +1229,13 @@ __metadata: languageName: node linkType: hard +"@babel/compat-data@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/compat-data@npm:7.24.6" + checksum: 10/c355141e4649ef6efa413d71cfc1efb183be46b8fc945fc17e3c7f4313b4b566af575a4183450697916cd6b8c7f180e315986b5d7f07e7b7afd0786594754f7d + languageName: node + linkType: hard + "@babel/core@npm:7.22.5": version: 7.22.5 resolution: "@babel/core@npm:7.22.5" @@ -1275,49 +1282,26 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.1.0": - version: 7.23.2 - resolution: "@babel/core@npm:7.23.2" +"@babel/core@npm:^7.1.0, @babel/core@npm:^7.11.1, @babel/core@npm:^7.16.0, @babel/core@npm:^7.7.2, @babel/core@npm:^7.8.0": + version: 7.24.6 + resolution: "@babel/core@npm:7.24.6" dependencies: "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.22.13" - "@babel/generator": "npm:^7.23.0" - "@babel/helper-compilation-targets": "npm:^7.22.15" - "@babel/helper-module-transforms": "npm:^7.23.0" - "@babel/helpers": "npm:^7.23.2" - "@babel/parser": "npm:^7.23.0" - "@babel/template": "npm:^7.22.15" - "@babel/traverse": "npm:^7.23.2" - "@babel/types": "npm:^7.23.0" + "@babel/code-frame": "npm:^7.24.6" + "@babel/generator": "npm:^7.24.6" + "@babel/helper-compilation-targets": "npm:^7.24.6" + "@babel/helper-module-transforms": "npm:^7.24.6" + "@babel/helpers": "npm:^7.24.6" + "@babel/parser": "npm:^7.24.6" + "@babel/template": "npm:^7.24.6" + "@babel/traverse": "npm:^7.24.6" + "@babel/types": "npm:^7.24.6" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10/b69d7008695b2ac7a3a2db83c5c712fbb79f7031c4480f6351cde327930e38873003d1d021059b729a1d0cb48093f1d384c64269b78f6189f50051fe4f64dc2d - languageName: node - linkType: hard - -"@babel/core@npm:^7.11.1, @babel/core@npm:^7.16.0, @babel/core@npm:^7.7.2, @babel/core@npm:^7.8.0": - version: 7.22.11 - resolution: "@babel/core@npm:7.22.11" - dependencies: - "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.22.10" - "@babel/generator": "npm:^7.22.10" - "@babel/helper-compilation-targets": "npm:^7.22.10" - "@babel/helper-module-transforms": "npm:^7.22.9" - "@babel/helpers": "npm:^7.22.11" - "@babel/parser": "npm:^7.22.11" - "@babel/template": "npm:^7.22.5" - "@babel/traverse": "npm:^7.22.11" - "@babel/types": "npm:^7.22.11" - convert-source-map: "npm:^1.7.0" - debug: "npm:^4.1.0" - gensync: "npm:^1.0.0-beta.2" - json5: "npm:^2.2.3" - semver: "npm:^6.3.1" - checksum: 10/3d46373e7ce9731f7160329ecf5fb1fcf2b3614e05514ad4eb2004f4a528c424d95c1f780cc7b17a59a5ad7e564947e15538a6c324cc4490b6f70b078d04599f + checksum: 10/49cd61b99984f0197f657690ec250fb68897de16180116ed0d4f66341eddd85757fd7ec20ba4fcf255990568515f3dd55248c30f1f831cbfaa1da4602a000e4e languageName: node linkType: hard @@ -1391,16 +1375,16 @@ __metadata: linkType: hard "@babel/eslint-parser@npm:^7.16.3": - version: 7.22.15 - resolution: "@babel/eslint-parser@npm:7.22.15" + version: 7.24.6 + resolution: "@babel/eslint-parser@npm:7.24.6" dependencies: "@nicolo-ribaudo/eslint-scope-5-internals": "npm:5.1.1-v1" eslint-visitor-keys: "npm:^2.1.0" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.11.0 - eslint: ^7.5.0 || ^8.0.0 - checksum: 10/daaac4a15125d139f1036015ab282a3742ee5cec3d1c281696a4960bdbc96664c15edd4c6ce2dcf3c24f7521ef9a1b7ad170a741b19a75c33e92df4b9924797a + eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 + checksum: 10/90fa462eb2fdfe9028f0285a3b6a645452890244d515121ac40ea26897f128d4308da357785cc017577904aa5ccd9c1173db1b38c307db3fcd1e9e97c99c6ed8 languageName: node linkType: hard @@ -1451,18 +1435,6 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.22.10": - version: 7.22.10 - resolution: "@babel/generator@npm:7.22.10" - dependencies: - "@babel/types": "npm:^7.22.10" - "@jridgewell/gen-mapping": "npm:^0.3.2" - "@jridgewell/trace-mapping": "npm:^0.3.17" - jsesc: "npm:^2.5.1" - checksum: 10/b0df0265694a4baa8e824f1c065769ebd83678a78b5ef16bc75b8471e27d17f7a68d3658d8ce401d3fbbe8bc2e4e9f1d9506c89931d3fc125ff32dfdea1c0f7e - languageName: node - linkType: hard - "@babel/generator@npm:^7.22.5": version: 7.22.5 resolution: "@babel/generator@npm:7.22.5" @@ -1499,7 +1471,19 @@ __metadata: languageName: node linkType: hard -"@babel/helper-annotate-as-pure@npm:7.22.5, @babel/helper-annotate-as-pure@npm:^7.18.6, @babel/helper-annotate-as-pure@npm:^7.22.5": +"@babel/generator@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/generator@npm:7.24.6" + dependencies: + "@babel/types": "npm:^7.24.6" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^2.5.1" + checksum: 10/247002f1246c3cb825497dc7ce55dc1d10c5f0486f546d1c087aeed7e38df6eb7837758fdfa2ae1234c26c60f883756fd79b7b3f0443771bd79bdfbb0dde8cd4 + languageName: node + linkType: hard + +"@babel/helper-annotate-as-pure@npm:7.22.5, @babel/helper-annotate-as-pure@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-annotate-as-pure@npm:7.22.5" dependencies: @@ -1517,6 +1501,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-annotate-as-pure@npm:^7.18.6, @babel/helper-annotate-as-pure@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-annotate-as-pure@npm:7.24.6" + dependencies: + "@babel/types": "npm:^7.24.6" + checksum: 10/1fc1790a67bb36419e272e79f087e32a6f3a9f3ed1f69400bd089a696523b4c92635a9cf1ce9af889cf095337553532a11bdf046ffe47a61cb7f435e77aeab4a + languageName: node + linkType: hard + "@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.22.5" @@ -1526,6 +1519,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.24.6" + dependencies: + "@babel/types": "npm:^7.24.6" + checksum: 10/4d30748f6f25be81309430babe92ec017718dc13fc790ab2a990dc5ac01099d56e37114e8bdf3ee7466fb61dadc94e08221ca31da08fb0f22ef54a26965a9340 + languageName: node + linkType: hard + "@babel/helper-compilation-targets@npm:^7.16.7": version: 7.16.7 resolution: "@babel/helper-compilation-targets@npm:7.16.7" @@ -1554,19 +1556,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.22.10, @babel/helper-compilation-targets@npm:^7.22.6": - version: 7.22.10 - resolution: "@babel/helper-compilation-targets@npm:7.22.10" - dependencies: - "@babel/compat-data": "npm:^7.22.9" - "@babel/helper-validator-option": "npm:^7.22.5" - browserslist: "npm:^4.21.9" - lru-cache: "npm:^5.1.1" - semver: "npm:^6.3.1" - checksum: 10/974085237b34b3d5e7eb0ec62454e1855fce3e5285cdd9461f01e0058ffaefab2491305be2b218f6e9a0f3f1e7f3edcb2067932a9f5545c39c6a9079328e5931 - languageName: node - linkType: hard - "@babel/helper-compilation-targets@npm:^7.22.15": version: 7.22.15 resolution: "@babel/helper-compilation-targets@npm:7.22.15" @@ -1595,6 +1584,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-compilation-targets@npm:^7.22.6": + version: 7.22.10 + resolution: "@babel/helper-compilation-targets@npm:7.22.10" + dependencies: + "@babel/compat-data": "npm:^7.22.9" + "@babel/helper-validator-option": "npm:^7.22.5" + browserslist: "npm:^4.21.9" + lru-cache: "npm:^5.1.1" + semver: "npm:^6.3.1" + checksum: 10/974085237b34b3d5e7eb0ec62454e1855fce3e5285cdd9461f01e0058ffaefab2491305be2b218f6e9a0f3f1e7f3edcb2067932a9f5545c39c6a9079328e5931 + languageName: node + linkType: hard + "@babel/helper-compilation-targets@npm:^7.22.9": version: 7.22.9 resolution: "@babel/helper-compilation-targets@npm:7.22.9" @@ -1623,22 +1625,35 @@ __metadata: languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.21.0, @babel/helper-create-class-features-plugin@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/helper-create-class-features-plugin@npm:7.22.15" +"@babel/helper-compilation-targets@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-compilation-targets@npm:7.24.6" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-environment-visitor": "npm:^7.22.5" - "@babel/helper-function-name": "npm:^7.22.5" - "@babel/helper-member-expression-to-functions": "npm:^7.22.15" - "@babel/helper-optimise-call-expression": "npm:^7.22.5" - "@babel/helper-replace-supers": "npm:^7.22.9" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" - "@babel/helper-split-export-declaration": "npm:^7.22.6" + "@babel/compat-data": "npm:^7.24.6" + "@babel/helper-validator-option": "npm:^7.24.6" + browserslist: "npm:^4.22.2" + lru-cache: "npm:^5.1.1" + semver: "npm:^6.3.1" + checksum: 10/28f34f2c9e0ec047360c4dca8d4fb99009e868f9c1acad0ca125f2f9990790897216155d44935209c6e4c4e0318f5a9a46304771d75823add7400e3079945314 + languageName: node + linkType: hard + +"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.21.0, @babel/helper-create-class-features-plugin@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-create-class-features-plugin@npm:7.24.6" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.24.6" + "@babel/helper-environment-visitor": "npm:^7.24.6" + "@babel/helper-function-name": "npm:^7.24.6" + "@babel/helper-member-expression-to-functions": "npm:^7.24.6" + "@babel/helper-optimise-call-expression": "npm:^7.24.6" + "@babel/helper-replace-supers": "npm:^7.24.6" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.6" + "@babel/helper-split-export-declaration": "npm:^7.24.6" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/000d29f1df397b7fdcb97ad0e9a442781787e5cb0456a9b8da690d13e03549a716bf74348029d3bd3fa4837b35d143a535cad1006f9d552063799ecdd96df672 + checksum: 10/f4c2bfccb9c6e80ec9f96ad2ad4b492c8b41c695f6df3c45e7a5962c8e60e7aabffbe30019de7d09a9a50579c49a56faaf316af932ccd7812833e28199b11f0a languageName: node linkType: hard @@ -1686,6 +1701,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-create-regexp-features-plugin@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.24.6" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.24.6" + regexpu-core: "npm:^5.3.1" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/74e717c71d7c007cc81537566c70b28ac75403afb499db2b1b988904dcda0a09a958c4c4b7d74821d0932e73f1c56227f6371ed751b16ae679aa8a2e4a271d64 + languageName: node + linkType: hard + "@babel/helper-define-polyfill-provider@npm:^0.4.2": version: 0.4.2 resolution: "@babel/helper-define-polyfill-provider@npm:0.4.2" @@ -1701,9 +1729,9 @@ __metadata: languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.4.3": - version: 0.4.3 - resolution: "@babel/helper-define-polyfill-provider@npm:0.4.3" +"@babel/helper-define-polyfill-provider@npm:^0.6.1, @babel/helper-define-polyfill-provider@npm:^0.6.2": + version: 0.6.2 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.2" dependencies: "@babel/helper-compilation-targets": "npm:^7.22.6" "@babel/helper-plugin-utils": "npm:^7.22.5" @@ -1712,7 +1740,7 @@ __metadata: resolve: "npm:^1.14.2" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/9ab9d6a2cfaffc44f8b7ad661b642b03f31597282557686b7f4c64f67acd3c5844d4eac028e63d238819bcec0549ddef7dc0539d10966ace96f4c61e97b33138 + checksum: 10/bb32ec12024d3f16e70641bc125d2534a97edbfdabbc9f69001ec9c4ce46f877c7a224c566aa6c8c510c3b0def2e43dc4433bf6a40896ba5ce0cef4ea5ccbcff languageName: node linkType: hard @@ -1746,6 +1774,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-environment-visitor@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-environment-visitor@npm:7.24.6" + checksum: 10/9c2b3f1ee7ba46b61b0482efab6d37f5c76f0ea4e9d9775df44a89644729c3a50101040a0233543ec6c3f416d8e548d337f310ff3e164f847945507428ee39e5 + languageName: node + linkType: hard + "@babel/helper-function-name@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-function-name@npm:7.22.5" @@ -1766,6 +1801,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-function-name@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-function-name@npm:7.24.6" + dependencies: + "@babel/template": "npm:^7.24.6" + "@babel/types": "npm:^7.24.6" + checksum: 10/66c0669c16f9fd8b977303c3bd233f962a803de409f4a1db43d965c7cd3ddc12a07b82eb8e06624d76237726407b33fc6d6987a1e40e0c32fc1fc2c5be49340b + languageName: node + linkType: hard + "@babel/helper-hoist-variables@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-hoist-variables@npm:7.22.5" @@ -1775,12 +1820,12 @@ __metadata: languageName: node linkType: hard -"@babel/helper-member-expression-to-functions@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/helper-member-expression-to-functions@npm:7.22.15" +"@babel/helper-hoist-variables@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-hoist-variables@npm:7.24.6" dependencies: - "@babel/types": "npm:^7.22.15" - checksum: 10/2f10bd39605539d5a30580d8da7e24d90788960cd22c93e640dfd95f8edf5c9d9d2f664e4dfc08a3cf2f14c4976178b638db7433321a20e8f90c33968e4465c6 + "@babel/types": "npm:^7.24.6" + checksum: 10/4819b574393a5214aff6ae02a6e5250ace2564f8bcdb28d580ffec57bbb2092425e8f39563d75cfa268940a01fd425bad503c0b92717c12426f15cf6847855d3 languageName: node linkType: hard @@ -1793,12 +1838,21 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-module-imports@npm:7.22.5" +"@babel/helper-member-expression-to-functions@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-member-expression-to-functions@npm:7.24.6" dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 10/d8296447c0cdc3c02417ba32864da3374e53bd2763a6c404aae118987c222c47238d9d1f4fd2a88250a85e0a68eff38d878c491b00c56d9bd20e809f91eb41b4 + "@babel/types": "npm:^7.24.6" + checksum: 10/49198b0ceb7fdbc01135206fec4e5740f1f41d8e84d20815ae07bf96f8d7204f81cafb52d800461e8de4212a4d3c42a36531f6b39e564b4efa8d2079491cb607 + languageName: node + linkType: hard + +"@babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-module-imports@npm:7.24.6" + dependencies: + "@babel/types": "npm:^7.24.6" + checksum: 10/38c4432191219a10fe39178e148b295a353a802d3601ed219df6979d322b8179a57f37ee8c0d645f1304023a6b96c4aee351bf7cabe8036b294bfe3b9496ab43 languageName: node linkType: hard @@ -1829,6 +1883,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-imports@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-module-imports@npm:7.22.5" + dependencies: + "@babel/types": "npm:^7.22.5" + checksum: 10/d8296447c0cdc3c02417ba32864da3374e53bd2763a6c404aae118987c222c47238d9d1f4fd2a88250a85e0a68eff38d878c491b00c56d9bd20e809f91eb41b4 + languageName: node + linkType: hard + "@babel/helper-module-transforms@npm:^7.16.7": version: 7.17.6 resolution: "@babel/helper-module-transforms@npm:7.17.6" @@ -1892,9 +1955,9 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/helper-module-transforms@npm:7.23.0" +"@babel/helper-module-transforms@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/helper-module-transforms@npm:7.23.3" dependencies: "@babel/helper-environment-visitor": "npm:^7.22.20" "@babel/helper-module-imports": "npm:^7.22.15" @@ -1903,22 +1966,22 @@ __metadata: "@babel/helper-validator-identifier": "npm:^7.22.20" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/d72fe444f7b6c5aadaac8f393298d603eedd48e5dead67273a48e5c83a677cbccbd8a12a06c5bf5d97924666083279158a4bd0e799d28b86cbbfacba9e41f598 + checksum: 10/583fa580f8e50e6f45c4f46aa76a8e49c2528deb84e25f634d66461b9a0e2420e13979b0a607b67aef67eaf8db8668eb9edc038b4514b16e3879fe09e8fd294b languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/helper-module-transforms@npm:7.23.3" +"@babel/helper-module-transforms@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-module-transforms@npm:7.24.6" dependencies: - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-module-imports": "npm:^7.22.15" - "@babel/helper-simple-access": "npm:^7.22.5" - "@babel/helper-split-export-declaration": "npm:^7.22.6" - "@babel/helper-validator-identifier": "npm:^7.22.20" + "@babel/helper-environment-visitor": "npm:^7.24.6" + "@babel/helper-module-imports": "npm:^7.24.6" + "@babel/helper-simple-access": "npm:^7.24.6" + "@babel/helper-split-export-declaration": "npm:^7.24.6" + "@babel/helper-validator-identifier": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/583fa580f8e50e6f45c4f46aa76a8e49c2528deb84e25f634d66461b9a0e2420e13979b0a607b67aef67eaf8db8668eb9edc038b4514b16e3879fe09e8fd294b + checksum: 10/e162d0c1d876006d6989eadb9868be688784ea16a719cdce5df22541eac9547bebb137dc4d64f4d0349265b52a3633074a09c33785709e5c198696590d46402d languageName: node linkType: hard @@ -1931,6 +1994,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-optimise-call-expression@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-optimise-call-expression@npm:7.24.6" + dependencies: + "@babel/types": "npm:^7.24.6" + checksum: 10/0f5e062bff683c8a8af5b20846f3a2ca2eda1c181fb1530f8fe5a13ea9fcb5166116e7d0bf3dbc48fb49bac32e68084c69fe7b35bfe8030ab3e4adb84cda064b + languageName: node + linkType: hard + "@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.16.7, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": version: 7.16.7 resolution: "@babel/helper-plugin-utils@npm:7.16.7" @@ -1952,6 +2024,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-plugin-utils@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-plugin-utils@npm:7.24.6" + checksum: 10/0ac0a7a19959fb2f880ea87650475a4960232e98825d9a50f4aa56e5750a70fc799b48cf570af63a06b810d0128e758e801865762b51a8348067e37751a38478 + languageName: node + linkType: hard + "@babel/helper-remap-async-to-generator@npm:^7.18.9, @babel/helper-remap-async-to-generator@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-remap-async-to-generator@npm:7.22.5" @@ -1966,19 +2045,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-remap-async-to-generator@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-remap-async-to-generator@npm:7.22.20" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-wrap-function": "npm:^7.22.20" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/2fe6300a6f1b58211dffa0aed1b45d4958506d096543663dba83bd9251fe8d670fa909143a65b45e72acb49e7e20fbdb73eae315d9ddaced467948c3329986e7 - languageName: node - linkType: hard - "@babel/helper-remap-async-to-generator@npm:^7.22.9": version: 7.22.17 resolution: "@babel/helper-remap-async-to-generator@npm:7.22.17" @@ -1992,16 +2058,16 @@ __metadata: languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-replace-supers@npm:7.22.20" +"@babel/helper-remap-async-to-generator@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-remap-async-to-generator@npm:7.24.6" dependencies: - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-member-expression-to-functions": "npm:^7.22.15" - "@babel/helper-optimise-call-expression": "npm:^7.22.5" + "@babel/helper-annotate-as-pure": "npm:^7.24.6" + "@babel/helper-environment-visitor": "npm:^7.24.6" + "@babel/helper-wrap-function": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/617666f57b0f94a2f430ee66b67c8f6fa94d4c22400f622947580d8f3638ea34b71280af59599ed4afbb54ae6e2bdd4f9083fe0e341184a4bb0bd26ef58d3017 + checksum: 10/35733c4d3b86f00b4509d0bd9550894aa26669c44ffda4b667faf0515d67fa892ced093737a3bfd579e51e5c6d36e152bc6f6903fa57fba01f53bb65aa187071 languageName: node linkType: hard @@ -2032,6 +2098,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-replace-supers@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-replace-supers@npm:7.24.6" + dependencies: + "@babel/helper-environment-visitor": "npm:^7.24.6" + "@babel/helper-member-expression-to-functions": "npm:^7.24.6" + "@babel/helper-optimise-call-expression": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/3456b9fee029229a69c47ee301e2f45ad22fe9a6788ff9921b5c5e798d110b9258b736d1a3cbf9af1223feaaf764547f204397b36605c9e96a7c3929823fcea8 + languageName: node + linkType: hard + "@babel/helper-simple-access@npm:^7.16.7": version: 7.16.7 resolution: "@babel/helper-simple-access@npm:7.16.7" @@ -2059,7 +2138,25 @@ __metadata: languageName: node linkType: hard -"@babel/helper-skip-transparent-expression-wrappers@npm:^7.20.0, @babel/helper-skip-transparent-expression-wrappers@npm:^7.22.5": +"@babel/helper-simple-access@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-simple-access@npm:7.24.6" + dependencies: + "@babel/types": "npm:^7.24.6" + checksum: 10/4649d08f3e5eb30240f49ef7951b12d02ae4c30e6bef7b1b79ade587ff0b73223f3be840f6144b49c6b1a4a9dece890ada279b0844345ea8c011fb064fa2b9a3 + languageName: node + linkType: hard + +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.20.0, @babel/helper-skip-transparent-expression-wrappers@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.24.6" + dependencies: + "@babel/types": "npm:^7.24.6" + checksum: 10/697a161c8d485314b5f063e5cbb803e87e9f860b082bf31bf17b2fc5fef232e1853cce6908c8d29fef3509e62626ae9db00d994e611fc0b119e3f285f53c65f1 + languageName: node + linkType: hard + +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.22.5" dependencies: @@ -2104,6 +2201,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-split-export-declaration@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-split-export-declaration@npm:7.24.6" + dependencies: + "@babel/types": "npm:^7.24.6" + checksum: 10/48ded9611f87a23bc962c9cd576cc653bd78eab3d9987d3b1c18571481d0d17d7d29397a5c07a1f5e182ef1a1c6f420b9934975bf57e8d7cbcb8d8853cc21d6c + languageName: node + linkType: hard + "@babel/helper-string-parser@npm:^7.19.4": version: 7.19.4 resolution: "@babel/helper-string-parser@npm:7.19.4" @@ -2125,6 +2231,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-string-parser@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-string-parser@npm:7.24.6" + checksum: 10/a24631e13850eb24a5e88fba4d1b86115a79f6d4a0b3a96641fdcdc4a6d706d7e09f17ae77fa26bc72a8a7253bc83b535a2e2865a78185ed1f957b299ea6c59c + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.16.7": version: 7.16.7 resolution: "@babel/helper-validator-identifier@npm:7.16.7" @@ -2167,6 +2280,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-identifier@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-validator-identifier@npm:7.24.6" + checksum: 10/7e725ef0684291ca3306d5174a5d1cd9072ad58ba444cfa50aaf92a5c59dd723fa15031733ac598bb6b066cb62c2472e14cd82325522348977a72e99aa21b97a + languageName: node + linkType: hard + "@babel/helper-validator-option@npm:^7.16.7": version: 7.16.7 resolution: "@babel/helper-validator-option@npm:7.16.7" @@ -2202,6 +2322,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-option@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-validator-option@npm:7.24.6" + checksum: 10/5defb2da74e1cac9497016f4e41698aeed75ec7a5e9dc07e777cdb67ef73cd2e27bd2bf8a3ab8d37e0b93a6a45524a9728f03e263afdef452436cf74794bde87 + languageName: node + linkType: hard + "@babel/helper-wrap-function@npm:^7.22.17": version: 7.22.17 resolution: "@babel/helper-wrap-function@npm:7.22.17" @@ -2213,17 +2340,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-wrap-function@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-wrap-function@npm:7.22.20" - dependencies: - "@babel/helper-function-name": "npm:^7.22.5" - "@babel/template": "npm:^7.22.15" - "@babel/types": "npm:^7.22.19" - checksum: 10/b22e4666dec3d401bdf8ebd01d448bb3733617dae5aa6fbd1b684a22a35653cca832edd876529fd139577713b44fb89b4f5e52b7315ab218620f78b8a8ae23de - languageName: node - linkType: hard - "@babel/helper-wrap-function@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-wrap-function@npm:7.22.5" @@ -2236,6 +2352,17 @@ __metadata: languageName: node linkType: hard +"@babel/helper-wrap-function@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-wrap-function@npm:7.24.6" + dependencies: + "@babel/helper-function-name": "npm:^7.24.6" + "@babel/template": "npm:^7.24.6" + "@babel/types": "npm:^7.24.6" + checksum: 10/8f0c6f4113df22aeb0b27838348d10dbe195bfd2ad9565497916638c3a80cb0c13cd1080a080b058e74e5d03b20dd35010433af7b9fff8f91358bf5274bc89e1 + languageName: node + linkType: hard + "@babel/helpers@npm:^7.17.2": version: 7.17.2 resolution: "@babel/helpers@npm:7.17.2" @@ -2258,17 +2385,6 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.22.11": - version: 7.22.11 - resolution: "@babel/helpers@npm:7.22.11" - dependencies: - "@babel/template": "npm:^7.22.5" - "@babel/traverse": "npm:^7.22.11" - "@babel/types": "npm:^7.22.11" - checksum: 10/5af97344f666418150354cf28a7946ba772bac604add51f1e9547d4e4d5301466cd3bbd37bb0e099884807587523da6f8b19e53bc3d40a7f1e8340711a0d5452 - languageName: node - linkType: hard - "@babel/helpers@npm:^7.22.5": version: 7.22.15 resolution: "@babel/helpers@npm:7.22.15" @@ -2291,17 +2407,6 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.23.2": - version: 7.23.2 - resolution: "@babel/helpers@npm:7.23.2" - dependencies: - "@babel/template": "npm:^7.22.15" - "@babel/traverse": "npm:^7.23.2" - "@babel/types": "npm:^7.23.0" - checksum: 10/d66d949d41513f19e62e43a9426e283d46bc9a3c72f1e3dd136568542382edd411047403458aaa0ae3adf7c14d23e0e9a1126092bb56e72ba796a6dd7e4c082a - languageName: node - linkType: hard - "@babel/helpers@npm:^7.23.9": version: 7.23.9 resolution: "@babel/helpers@npm:7.23.9" @@ -2313,6 +2418,16 @@ __metadata: languageName: node linkType: hard +"@babel/helpers@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helpers@npm:7.24.6" + dependencies: + "@babel/template": "npm:^7.24.6" + "@babel/types": "npm:^7.24.6" + checksum: 10/9043f7140651e89246d0653c7198832e644865038dc18c117c492d450f237514764d1476faa1ba7466b83b348891f10f564b0c5615d86d6833fb275ead7fb259 + languageName: node + linkType: hard + "@babel/highlight@npm:7.0.0-beta.51": version: 7.0.0-beta.51 resolution: "@babel/highlight@npm:7.0.0-beta.51" @@ -2346,17 +2461,6 @@ __metadata: languageName: node linkType: hard -"@babel/highlight@npm:^7.22.10": - version: 7.22.10 - resolution: "@babel/highlight@npm:7.22.10" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.22.5" - chalk: "npm:^2.4.2" - js-tokens: "npm:^4.0.0" - checksum: 10/faea6aa09ea7bc02d4d51aabdd1303b00aa2587933a08310d7502f29140bc8bcb32a74387d81dc08e97edd04f891e266623b90043ea4502e052dcbfd7e423a3c - languageName: node - linkType: hard - "@babel/highlight@npm:^7.22.13": version: 7.22.13 resolution: "@babel/highlight@npm:7.22.13" @@ -2390,6 +2494,18 @@ __metadata: languageName: node linkType: hard +"@babel/highlight@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/highlight@npm:7.24.6" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.24.6" + chalk: "npm:^2.4.2" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10/e11cd39ceb01c9b5e4f2684a45caefe7b2d7bb74997c30922e6b4063a6f16aff88356091350f0af01f044e1a198579a6b5c4161a84d0a6090e63a41167569daf + languageName: node + linkType: hard + "@babel/parser@npm:7.0.0-beta.51": version: 7.0.0-beta.51 resolution: "@babel/parser@npm:7.0.0-beta.51" @@ -2426,7 +2542,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.20.7, @babel/parser@npm:^7.22.11, @babel/parser@npm:^7.23.0": +"@babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.0": version: 7.23.0 resolution: "@babel/parser@npm:7.23.0" bin: @@ -2462,6 +2578,27 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/parser@npm:7.24.6" + bin: + parser: ./bin/babel-parser.js + checksum: 10/48af4251d030623a8fbf22979fc718bd9dead6ba6a64cae717270c6c809faaf303d137d82593912291ee761130c4731f0c25feb54629ba3fa4edcc496690cb44 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.24.6" + dependencies: + "@babel/helper-environment-visitor": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/6db8f337ca2c7330ff2712ca7f853434dd7b3328714d5c3c27a09180f39ec7832ff49c2901b62493f391ffb9a4b24c5018bb67c5db1e9c405c47b58cad70904b + languageName: node + linkType: hard + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.22.5": version: 7.22.15 resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.22.15" @@ -2473,6 +2610,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.24.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/385a930f2809349040eb9dca45d6af6e7ae8517bb98d791731a61aa3ebde342ac684bed1f961b3d9f2344d88d1ef2eafe0e866cd01adf7ee1e866c14e510648c + languageName: node + linkType: hard + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.22.5": version: 7.22.15 resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.22.15" @@ -2486,6 +2634,31 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.24.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.6" + "@babel/plugin-transform-optional-chaining": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.13.0 + checksum: 10/14dac1a0696727907d714f196baf09b34725210d70ddced73e8818cde17368b53bd1d0972a396ccd031e2d890b3162a0cd521837bdef1c32a7d6fea4bc333edd + languageName: node + linkType: hard + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.24.6" + dependencies: + "@babel/helper-environment-visitor": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/5740206ccf35ff711eda0cff3b9b10c46b72c9e9d58cc195fa52c27463f09d8203c5d3bd0fb014fad6536320982d2aa5ccb496d5fdab222e18b0ab4972e9da79 + languageName: node + linkType: hard + "@babel/plugin-proposal-async-generator-functions@npm:7.20.7": version: 7.20.7 resolution: "@babel/plugin-proposal-async-generator-functions@npm:7.20.7" @@ -2513,17 +2686,15 @@ __metadata: linkType: hard "@babel/plugin-proposal-decorators@npm:^7.16.4": - version: 7.23.2 - resolution: "@babel/plugin-proposal-decorators@npm:7.23.2" + version: 7.24.6 + resolution: "@babel/plugin-proposal-decorators@npm:7.24.6" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-replace-supers": "npm:^7.22.20" - "@babel/helper-split-export-declaration": "npm:^7.22.6" - "@babel/plugin-syntax-decorators": "npm:^7.22.10" + "@babel/helper-create-class-features-plugin": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/plugin-syntax-decorators": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/392440bad262e54246ee22da4c50774cd72cda4b62818a94b99e13cbb6e06f074a8858d0253909990fa680d94e434ff194383bfe5481c82a866408b091cb9307 + checksum: 10/82e8853e9e8a463d52aaea16fd8203df71af97974788f479b1484f2a7ef1ceb2244b3c36ff968bcac3cf0a6693906778ca328836f8d3414d685e4228ecdf1852 languageName: node linkType: hard @@ -2670,14 +2841,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-decorators@npm:^7.22.10": - version: 7.22.10 - resolution: "@babel/plugin-syntax-decorators@npm:7.22.10" +"@babel/plugin-syntax-decorators@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-syntax-decorators@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/983caa82f5a9cbb55196cd9ff3a6e2cf11e6eba5c11fc5fecb4ef7229ca05af08a5eeab0c668e5cd9fae62c01b038ec1906ced09fd7cb6dde94f0b8824e231c6 + checksum: 10/0f4be727760cef4663ebe51a1f6c1659da1a0bb85a41745ba4ca1550d56239e055e0e475ec7559a4c71575db7ac668d205149cce52b442bed84c44338c15a23b languageName: node linkType: hard @@ -2703,14 +2874,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-flow@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-syntax-flow@npm:7.22.5" +"@babel/plugin-syntax-flow@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-syntax-flow@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/84c8c40fcfe8e78cecdd6fb90e8f97f419e3f3b27a33de8324ae97d5ce1b87cdd98a636fa21a68d4d2c37c7d63f3a279bb84b6956b849921affed6b806b6ffe7 + checksum: 10/1431cf1b8d29582303f4d46b9c3466c451415ee08c39f52c3b65b5829d8d8da785989e290a7b316b25a9ebeaf7f0861e370eeba52300d38669545bce8c3c22e6 languageName: node linkType: hard @@ -2725,6 +2896,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-import-assertions@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.24.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/ea73a9aed80e786eee859b6f1f389e29993a6c9ce35d1fde904c04ef2f9c48c7156356995d688a6f49121a9aa335f539f119e1f301e17c757b921f75c13452a3 + languageName: node + linkType: hard + "@babel/plugin-syntax-import-attributes@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-syntax-import-attributes@npm:7.22.5" @@ -2736,6 +2918,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-import-attributes@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.24.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/cd8a3aa480444b05fc792160d24628a34a57a265737ad5fef3034456bae9a3f7597ac4505106b29f7f086616f41941c95fd04540cb3da693518c6e5a7878f267 + languageName: node + linkType: hard + "@babel/plugin-syntax-import-meta@npm:^7.10.4, @babel/plugin-syntax-import-meta@npm:^7.8.3": version: 7.10.4 resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" @@ -2769,14 +2962,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-syntax-jsx@npm:7.22.5" +"@babel/plugin-syntax-jsx@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-syntax-jsx@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/8829d30c2617ab31393d99cec2978e41f014f4ac6f01a1cecf4c4dd8320c3ec12fdc3ce121126b2d8d32f6887e99ca1a0bad53dedb1e6ad165640b92b24980ce + checksum: 10/68e90ec17c20c9f663006b8efe8af33782e36e1ef1b415c52345fe5102ccd06116d02f05601142c4665f0471ba926eac4926738f9c41dfd6af1705446c8af7c2 languageName: node linkType: hard @@ -2879,14 +3072,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-syntax-typescript@npm:7.22.5" +"@babel/plugin-syntax-typescript@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-syntax-typescript@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/8ab7718fbb026d64da93681a57797d60326097fd7cb930380c8bffd9eb101689e90142c760a14b51e8e69c88a73ba3da956cb4520a3b0c65743aee5c71ef360a + checksum: 10/29dc4528a3a34a7c7fdaf21c097d4251c1dc31170327729b517a94ad93ed33230cc309b9b180404f82f829538be6155902aeda0b05773fbe4d5cb6e4b0f4191d languageName: node linkType: hard @@ -2924,17 +3117,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.22.10": - version: 7.23.2 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.23.2" +"@babel/plugin-transform-arrow-functions@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.24.6" dependencies: - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-remap-async-to-generator": "npm:^7.22.20" - "@babel/plugin-syntax-async-generators": "npm:^7.8.4" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e1abae0edcda7304d7c17702ac25a127578791b89c4f767d60589249fa3e50ec33f8c9ff39d3d8d41f00b29947654eaddd4fd586e04c4d598122db745fab2868 + checksum: 10/ae67650ff6bc080a8ac407d6a0300b8c42e629d6b6cdf673091321fb3f93ac5b914667964931f02b422fde64f24483df73c05e9adda204aa63a77465cd379238 languageName: node linkType: hard @@ -2952,6 +3142,20 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-async-generator-functions@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.24.6" + dependencies: + "@babel/helper-environment-visitor": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/helper-remap-async-to-generator": "npm:^7.24.6" + "@babel/plugin-syntax-async-generators": "npm:^7.8.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/01025f77001aaa8b7df02283a95d3b076cac3e2bd519878e0ac3462a5a45eb18ef82b406a5b3b83c05187d2985e2ba909cbbe98e303417a49f4357cee7cd1f6d + languageName: node + linkType: hard + "@babel/plugin-transform-async-to-generator@npm:7.22.5, @babel/plugin-transform-async-to-generator@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-async-to-generator@npm:7.22.5" @@ -2965,6 +3169,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-async-to-generator@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.24.6" + dependencies: + "@babel/helper-module-imports": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/helper-remap-async-to-generator": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/b10945afa13d4fc9f780b5420e938fa1259e7352498d9fafbad12d91733f9d8df2c11f1d46a61c4eaea6ec12461ee56b0d707e81c78cb0e12fe32c2774f3f377 + languageName: node + linkType: hard + "@babel/plugin-transform-block-scoped-functions@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.22.5" @@ -2976,14 +3193,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.22.10": - version: 7.23.0 - resolution: "@babel/plugin-transform-block-scoping@npm:7.23.0" +"@babel/plugin-transform-block-scoped-functions@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/9f60c71a0b72c7bdc0734ab363cf8ad40c4366456d9429ab3f2caedf6566c12f1ae8190478827222e93c60855b6c746a2c0e24381646fe7220d4666c332dc090 + checksum: 10/8479b49e7aff3b49a7b66ffc058c896f7553f192d74ee7d158d73e67c5a89b7250cd2dbc46db77409a80c787b9ebd73704bd52100e995207cdb00189c2c87dd0 languageName: node linkType: hard @@ -2998,6 +3215,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-block-scoping@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-block-scoping@npm:7.24.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/40affbc3fbf4d6664b8d59452f37980e37333847ab0927fe46928e9c68b8f3016aaf529c21d5672807f80015860dd025f3f862b1ebc378a734d3e8014f59f2b4 + languageName: node + linkType: hard + "@babel/plugin-transform-class-properties@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-class-properties@npm:7.22.5" @@ -3010,6 +3238,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-class-properties@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-class-properties@npm:7.24.6" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/dee84706aed7086e83ef9358f6a1a5f2a4b640a8176352c107eada2b2206c0174b22181892cfe88723e5762545a8b35f8e4dd71b917155e907e6d7f8f4383532 + languageName: node + linkType: hard + "@babel/plugin-transform-class-static-block@npm:^7.22.5": version: 7.22.11 resolution: "@babel/plugin-transform-class-static-block@npm:7.22.11" @@ -3023,6 +3263,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-class-static-block@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-class-static-block@npm:7.24.6" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.12.0 + checksum: 10/aa7fe118d508c57d5e35b646da18a1029bf49cf0820517deb2de7f1ceb472b55aacfbd48202615c14cdaa3809a89d01bcb414e26d3de1aa2e3648852cff4c705 + languageName: node + linkType: hard + "@babel/plugin-transform-classes@npm:^7.22.6": version: 7.22.15 resolution: "@babel/plugin-transform-classes@npm:7.22.15" @@ -3042,6 +3295,24 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-classes@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-classes@npm:7.24.6" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.24.6" + "@babel/helper-compilation-targets": "npm:^7.24.6" + "@babel/helper-environment-visitor": "npm:^7.24.6" + "@babel/helper-function-name": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/helper-replace-supers": "npm:^7.24.6" + "@babel/helper-split-export-declaration": "npm:^7.24.6" + globals: "npm:^11.1.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/7bd9350695b82b48d4e795497f05c9223ba6e0a9ff7506e21c09731510d4d5af1023e278416aa14d66a1fdb565b7e7db02e2f26e71604a00db3891fcdfb619d3 + languageName: node + linkType: hard + "@babel/plugin-transform-computed-properties@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-computed-properties@npm:7.22.5" @@ -3054,14 +3325,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.22.10": - version: 7.22.10 - resolution: "@babel/plugin-transform-destructuring@npm:7.22.10" +"@babel/plugin-transform-computed-properties@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-computed-properties@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/template": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/36cec1b8e3ecfc77753fe31698cc2441678ee4f70cf042202c3589a3b0079b04934f2d7d2f1c3d811ce6e3b2fe68fa1f4b6b6910555250987fce209d841cc686 + checksum: 10/11d46525969069ed44dc4bd083397ab9b924624e53c962bf7a034dd0b9b99e9571c30ba5ce7759f68f8d616d7abc2cb1ec01296e65c30a081e573ea1a888a023 languageName: node linkType: hard @@ -3076,6 +3348,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-destructuring@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-destructuring@npm:7.24.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/0ae192d749b48ea836eb9f062425b255e550e1b9f9d47db2c80aa203c7a03557d21806c8bab915015457cc38b1dbafd61fa09c7b6753ab95d95b2e0d493e1db7 + languageName: node + linkType: hard + "@babel/plugin-transform-destructuring@npm:^7.5.0": version: 7.17.3 resolution: "@babel/plugin-transform-destructuring@npm:7.17.3" @@ -3099,6 +3382,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-dotall-regex@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.24.6" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/823732fade680b43ae6d41c416c515cff9d52eb2a501a4152a63901b8df32d74886f3ab6f01ba7ebe6c6a39c47d4c28ac48d6e831019e058578e23b543f6d1bd + languageName: node + linkType: hard + "@babel/plugin-transform-dotall-regex@npm:^7.4.4": version: 7.16.7 resolution: "@babel/plugin-transform-dotall-regex@npm:7.16.7" @@ -3122,6 +3417,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-duplicate-keys@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.24.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/fdeaa118735b9f0fdcfd6c0af9f51a3d37d42a354018fdf20d58e8a1960ecc0060dbb21054b516f794d113213e03fdfcd74ea36d94b4f0609bce1dd5a3a6c7ec + languageName: node + linkType: hard + "@babel/plugin-transform-dynamic-import@npm:^7.22.5": version: 7.22.11 resolution: "@babel/plugin-transform-dynamic-import@npm:7.22.11" @@ -3134,6 +3440,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-dynamic-import@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.24.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/c104b5bc05e3f2c6bcd484551486dd543b49b3af370761a8a7bf360390e3a229a1b4ef2f4928c058b887efe60a35f7be7bf401040cdfb027eec7cb7ec46ce6f9 + languageName: node + linkType: hard + "@babel/plugin-transform-exponentiation-operator@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.22.5" @@ -3146,6 +3464,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-exponentiation-operator@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.24.6" + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/8b59853c0548115e5b32acd876bddb4f990d71c5fc8ed0d8c428da456a8d9f4cc4133dc9fbedd9fade3eb334405e42c4968192738a7cb7b1f73b4e21df8eb05e + languageName: node + linkType: hard + "@babel/plugin-transform-export-namespace-from@npm:^7.22.5": version: 7.22.11 resolution: "@babel/plugin-transform-export-namespace-from@npm:7.22.11" @@ -3158,15 +3488,27 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-export-namespace-from@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.24.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/49d8f3ef9d0f76f656842875e4a1bbfc151b4b7882f8890edfbbb409df389d70d235c206eb30a5ad556c0ae8a8b3805f43fbae5ca2a3d4cd259477272d3d580f + languageName: node + linkType: hard + "@babel/plugin-transform-flow-strip-types@npm:^7.16.0": - version: 7.22.5 - resolution: "@babel/plugin-transform-flow-strip-types@npm:7.22.5" + version: 7.24.6 + resolution: "@babel/plugin-transform-flow-strip-types@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-flow": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/plugin-syntax-flow": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/0657042178061517cd5641a9a5eed1251aa1d8cf93a4111568ae663773854a1e8f6af167ecae042237d261389751dc5ee32ba12a15e65e41af29d04150005cab + checksum: 10/2c7da70304b231244bcd14f833270052f28934b4fd7f849702157377cbeae89bc9b2b0869e40c4c485b6327653fc43bf76b037821cd028ac85ec5e737948d774 languageName: node linkType: hard @@ -3181,6 +3523,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-for-of@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-for-of@npm:7.24.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/76d61d26ef6a7444b6fc99110e1190917aa813bf29b0b04dcbf17d705e6024c73af63a38b0dc82a31a4611a4241fec8381af67d925c0f824f70320086f8696e2 + languageName: node + linkType: hard + "@babel/plugin-transform-function-name@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-function-name@npm:7.22.5" @@ -3194,6 +3548,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-function-name@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-function-name@npm:7.24.6" + dependencies: + "@babel/helper-compilation-targets": "npm:^7.24.6" + "@babel/helper-function-name": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/fb96863c30fd76da14eeb64f19e340c2cf28980cf3961be3fff4df2278ad4b97cbaac2137e9ea0b36b3a51f3c723815dd590545344ba02482e99cec8aab2a4e5 + languageName: node + linkType: hard + "@babel/plugin-transform-json-strings@npm:^7.22.5": version: 7.22.11 resolution: "@babel/plugin-transform-json-strings@npm:7.22.11" @@ -3206,6 +3573,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-json-strings@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-json-strings@npm:7.24.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/plugin-syntax-json-strings": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/417772d7b1e4c35f2dcc658141163bcb607d583abc3ab54932a0ce430d7cf7fdd81f44d7e2ccb40280bdec699b9f46ebdf23e480106d72f8399c69bfcb2b9432 + languageName: node + linkType: hard + "@babel/plugin-transform-literals@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-literals@npm:7.22.5" @@ -3217,6 +3596,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-literals@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-literals@npm:7.24.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/29e467f05a9bb82df8c281e3ca67629e38f8f475708454bcd5b59e73e957897f1bb795ff09a1253d666aeb3e872c50b0c465f79f28c3aadfe1a290d813a8d4ee + languageName: node + linkType: hard + "@babel/plugin-transform-logical-assignment-operators@npm:^7.22.5": version: 7.22.11 resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.22.11" @@ -3229,6 +3619,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-logical-assignment-operators@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.24.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/5ee614e959a9b32bd322266b052fa30f5fa1f89d9f367aa346f0aca7ae6da656820379165531df4cb195b2036589753a277324693703ae9d5ef22529d5b52eb7 + languageName: node + linkType: hard + "@babel/plugin-transform-member-expression-literals@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-member-expression-literals@npm:7.22.5" @@ -3240,6 +3642,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-member-expression-literals@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.24.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/7d5cfd042e628999aec908f7f4b5b40403f57eeb87a772bd2299bc0f6a82237521b9b0f61c247c0d84d43bdb4ff2d85938a4843c7875a3b9d96ef10263d7f5d4 + languageName: node + linkType: hard + "@babel/plugin-transform-modules-amd@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-modules-amd@npm:7.22.5" @@ -3252,16 +3665,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.22.11": - version: 7.23.0 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.23.0" +"@babel/plugin-transform-modules-amd@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-modules-amd@npm:7.24.6" dependencies: - "@babel/helper-module-transforms": "npm:^7.23.0" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-simple-access": "npm:^7.22.5" + "@babel/helper-module-transforms": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/65085c8f2578b0c272b3969b78e54430ea3217fca8de7a21ded845a74ddf2d97aee284559da102d826fcb8aed5a79d09536a6e4610d868f539d7bc382eb319ff + checksum: 10/7c01c4e8b1ae80ab2f293273be9ffa52d1f9a6096e65e748b7649047a3b7f1744c1165490e85f6d62849bb1a86da1f644e7b99a40015f9c986783b3456bb8de4 languageName: node linkType: hard @@ -3278,6 +3690,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-commonjs@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.6" + dependencies: + "@babel/helper-module-transforms": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/helper-simple-access": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/ac6b0614bdaa9bb60d028d7b30ceae0d63fae55ddf5dca7b87f24ff0d0fa0512972799c835e2b025f0ef6976b3af6a3425d686e5e4bccfb8bf3f8f5665aac0b8 + languageName: node + linkType: hard + "@babel/plugin-transform-modules-systemjs@npm:^7.22.5": version: 7.22.11 resolution: "@babel/plugin-transform-modules-systemjs@npm:7.22.11" @@ -3292,6 +3717,20 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-systemjs@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.24.6" + dependencies: + "@babel/helper-hoist-variables": "npm:^7.24.6" + "@babel/helper-module-transforms": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/helper-validator-identifier": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/b1cad402424dce18cda43ab6cc98d4f063c2213bd75dde729d083a511551d5cc6edaa578439ab3097ab0e65727dd5c4dadb9f7157ed129b245a13eed3e7ffc16 + languageName: node + linkType: hard + "@babel/plugin-transform-modules-umd@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-modules-umd@npm:7.22.5" @@ -3304,6 +3743,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-umd@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-modules-umd@npm:7.24.6" + dependencies: + "@babel/helper-module-transforms": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/817c93a4170714e4c38167d3f25bdd62864abd344bccec51402b9f8e71b6aa979b8c63b4d4061f0ad7d29f8637f1e2b3785a4596515f19578dac9bc46644685a + languageName: node + linkType: hard + "@babel/plugin-transform-named-capturing-groups-regex@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.22.5" @@ -3316,6 +3767,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.24.6" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/87b6dd96610dc5eb97347762ac49e66c6ab59a56f46848f69d8045adb51c14839f499c7d59f6367e453ac4c675b2772c738e3d9af6730f03519b59843b9a3626 + languageName: node + linkType: hard + "@babel/plugin-transform-new-target@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-new-target@npm:7.22.5" @@ -3327,6 +3790,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-new-target@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-new-target@npm:7.24.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/1f6ecbbae2fdc6123fef575b76527db82ca4bc7f598bc98292243ab30490b453eefd768608a889616eb56ff1e7d1f22eab8df76da13b59a35782e6f5d8902516 + languageName: node + linkType: hard + "@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.5": version: 7.22.11 resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.22.11" @@ -3339,6 +3813,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.24.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/e4499bbd58ff6919f8dc2bf952c624631d9b94db055aaf1fa33e19da5ef7c1d7cc1e81ee9753af6a1d6cdb995e6bab3ad0035c7f08098c9e092639b45e063d51 + languageName: node + linkType: hard + "@babel/plugin-transform-numeric-separator@npm:^7.22.5": version: 7.22.11 resolution: "@babel/plugin-transform-numeric-separator@npm:7.22.11" @@ -3351,6 +3837,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-numeric-separator@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.24.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/ccc5e4eb6ef5320e4116b6132ad429b89e5c7839c55452688313ac0d1e49a05a3ffb031a39321a97bce5da6c04d310210a78db562c9535154bfd549c7d294ac0 + languageName: node + linkType: hard + "@babel/plugin-transform-object-rest-spread@npm:^7.22.5": version: 7.22.15 resolution: "@babel/plugin-transform-object-rest-spread@npm:7.22.15" @@ -3366,6 +3864,20 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-object-rest-spread@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.6" + dependencies: + "@babel/helper-compilation-targets": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" + "@babel/plugin-transform-parameters": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/74d11df04244d530bbd47a8fe8a35195f0616364bbe5c38cc87b62a824b515e1322002187dbebf9c92e34ba73a88202c7e07275b98b13615144e46f478c33462 + languageName: node + linkType: hard + "@babel/plugin-transform-object-super@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-object-super@npm:7.22.5" @@ -3378,6 +3890,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-object-super@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-object-super@npm:7.24.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/helper-replace-supers": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/41579a84341c6064ce38e34ea59c3dc743073f3afaa77b5cbca3b6133530a236c4d02ff5a52089510514fe1c0ce46cacbb8486e42992f5ce691732061154269a + languageName: node + linkType: hard + "@babel/plugin-transform-optional-catch-binding@npm:^7.22.5": version: 7.22.11 resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.22.11" @@ -3390,16 +3914,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.22.10": - version: 7.23.0 - resolution: "@babel/plugin-transform-optional-chaining@npm:7.23.0" +"@babel/plugin-transform-optional-catch-binding@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" - "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/fb1103c6489b91df06c483a97fc12515c2f3840f573cbecb27959307c0a838fdd1502a34ada43805c4fb7f7dab3d1c0d1ab8428775d098af6778a7b00f494c27 + checksum: 10/5c57af63003c30c7141cc5a21a8963ccd6cded45be91f15cceb89a6f9ef403f2f88f990e980e3c6f7c084b861b460dd6f9e81dc44efb049405337f3fe7d6ff00 languageName: node linkType: hard @@ -3416,6 +3939,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-optional-chaining@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.6" + "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/fb5deb31b237102ada066197fde3f3b07fd2cee8e79dc8e3752e0a44ef49174af5bd23120793b6552d83bd2e2807a6b124133a5d563f6e9ff60468bcb21b3cec + languageName: node + linkType: hard + "@babel/plugin-transform-parameters@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-transform-parameters@npm:7.16.7" @@ -3438,6 +3974,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-parameters@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-parameters@npm:7.24.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/c885f6c92fef0541fbf721f7bd3807be9f57af08ee67ad94124b55ce838e17b10c1374cff61108bf8083e7162c75cc2bde004ecf791e6db8ec2e84efb8e4daf9 + languageName: node + linkType: hard + "@babel/plugin-transform-private-methods@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-private-methods@npm:7.22.5" @@ -3450,6 +3997,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-private-methods@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-private-methods@npm:7.24.6" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/83faa699d3aa39315d5f0928b910e597c09c0be1c66d925e0f470f5568a7a8d70521b63b445f6c5b3a3a8a60c889ea22214e08ba26a38c707c5ade1b8b503328 + languageName: node + linkType: hard + "@babel/plugin-transform-private-property-in-object@npm:^7.22.5": version: 7.22.11 resolution: "@babel/plugin-transform-private-property-in-object@npm:7.22.11" @@ -3464,6 +4023,20 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-private-property-in-object@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.24.6" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.24.6" + "@babel/helper-create-class-features-plugin": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/f92e071614722bb7d61172ea9bdc40b99903170bdd7576b8c5ccfd40134344fd91d3c9eaf5ada588adff9090af4cca0003c7ff0ba88a814c803338dc578de6e1 + languageName: node + linkType: hard + "@babel/plugin-transform-property-literals@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-property-literals@npm:7.22.5" @@ -3475,36 +4048,47 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-property-literals@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-property-literals@npm:7.24.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/5f609bb1e4b41f075057e314fe1e407687c3c287d78286950c31ee04bb7e3bb31cb6b35f7407f163eb28e9fa938a255a9a68627b7eba69a03eedf76593e200f0 + languageName: node + linkType: hard + "@babel/plugin-transform-react-constant-elements@npm:^7.12.1": - version: 7.22.5 - resolution: "@babel/plugin-transform-react-constant-elements@npm:7.22.5" + version: 7.24.6 + resolution: "@babel/plugin-transform-react-constant-elements@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/0f2fc4d0a4025975f6cb4e1e80be1fe2e14546d86341beed8dbbbf9357b56908574e89476bd693431966c15b31f9c30f735636232058cf7812ca46b687d053be + checksum: 10/e7b0823e4ba0b4f1a2dd7ff98f6341a6adfba6d7b69a6642f2ac67e4d8e672ef0c99a545861de195fd87cb69b2386d2cad3ab26531b8222b3e14787ce512d599 languageName: node linkType: hard -"@babel/plugin-transform-react-display-name@npm:^7.16.0, @babel/plugin-transform-react-display-name@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-react-display-name@npm:7.22.5" +"@babel/plugin-transform-react-display-name@npm:^7.16.0, @babel/plugin-transform-react-display-name@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-react-display-name@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/a12bfd1e4e93055efca3ace3c34722571bda59d9740dca364d225d9c6e3ca874f134694d21715c42cc63d79efd46db9665bd4a022998767f9245f1e29d5d204d + checksum: 10/09f0bf9c5206db251e20459f509c554303c7f38a6b862cffe9e45581dba8b6d8285833847512e6d9e1326f384f341deaace05ae072c7b28a7008476e31e441cd languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-development@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-react-jsx-development@npm:7.22.5" +"@babel/plugin-transform-react-jsx-development@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-react-jsx-development@npm:7.24.6" dependencies: - "@babel/plugin-transform-react-jsx": "npm:^7.22.5" + "@babel/plugin-transform-react-jsx": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/36bc3ff0b96bb0ef4723070a50cfdf2e72cfd903a59eba448f9fe92fea47574d6f22efd99364413719e1f3fb3c51b6c9b2990b87af088f8486a84b2a5f9e4560 + checksum: 10/9fb99b70ccebaba9f39360cf2b3ac7d94b641fd87cd6ac43ff925694526f67682c9ecb2ba02af4e412bf3d6b4cfd9b44db9de60c2dee525b039b855eea64a797 languageName: node linkType: hard @@ -3530,18 +4114,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-jsx@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-react-jsx@npm:7.22.5" +"@babel/plugin-transform-react-jsx@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-react-jsx@npm:7.24.6" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-module-imports": "npm:^7.22.5" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-jsx": "npm:^7.22.5" - "@babel/types": "npm:^7.22.5" + "@babel/helper-annotate-as-pure": "npm:^7.24.6" + "@babel/helper-module-imports": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/plugin-syntax-jsx": "npm:^7.24.6" + "@babel/types": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/6be5db99b170c937c71fbe68dc64804bb041729d2f95b376ab5e7bc51c34a790f28753b14384160e87cabacf5e1b1aa3379a1a430a60b1fd6b031ba58955f5a6 + checksum: 10/268184de2f4e934e9ce3ae78a277d6d721f60f037585c2575c3768ea5a2e8d6d6e5d475719f373bc38bfa5c24a74d68614010ec3d5709647719b963399760a29 languageName: node linkType: hard @@ -3560,19 +4144,19 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-pure-annotations@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.22.5" +"@babel/plugin-transform-react-pure-annotations@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.24.6" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-annotate-as-pure": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/092021c4f404e267002099ec20b3f12dd730cb90b0d83c5feed3dc00dbe43b9c42c795a18e7c6c7d7bddea20c7dd56221b146aec81b37f2e7eb5137331c61120 + checksum: 10/4afccbe68c8a9b5dca4cec8183ff168d5ed419dc619603f8bdaa4cf35cd27b54d8704b35458bb6fd3fa7764bc7559b4049e825b30194f9f3bc55b19e4d3502f0 languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.22.10, @babel/plugin-transform-regenerator@npm:^7.22.5": +"@babel/plugin-transform-regenerator@npm:^7.22.5": version: 7.22.10 resolution: "@babel/plugin-transform-regenerator@npm:7.22.10" dependencies: @@ -3584,6 +4168,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-regenerator@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-regenerator@npm:7.24.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.6" + regenerator-transform: "npm:^0.15.2" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/ef75aac5ad34a77c645e3c53e9efc230c8b237764e6907c24bd667c77e2cdcd80bcc7f9fac481c6e6d3107ad0b2dfa51e09d25d0892a9e6639379727bbcf74ae + languageName: node + linkType: hard + "@babel/plugin-transform-reserved-words@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-reserved-words@npm:7.22.5" @@ -3595,6 +4191,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-reserved-words@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-reserved-words@npm:7.24.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/aa1d490a35e01ad66353f0d0dfe41244960f2efeebed1ac86de7214b9b265a00580e1a4220e99588a7a6e0d2764a5e477741463b6d1a66ac22a057a77db14d9c + languageName: node + linkType: hard + "@babel/plugin-transform-runtime@npm:7.22.9": version: 7.22.9 resolution: "@babel/plugin-transform-runtime@npm:7.22.9" @@ -3612,18 +4219,18 @@ __metadata: linkType: hard "@babel/plugin-transform-runtime@npm:^7.16.4": - version: 7.23.2 - resolution: "@babel/plugin-transform-runtime@npm:7.23.2" - dependencies: - "@babel/helper-module-imports": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" - babel-plugin-polyfill-corejs2: "npm:^0.4.6" - babel-plugin-polyfill-corejs3: "npm:^0.8.5" - babel-plugin-polyfill-regenerator: "npm:^0.5.3" + version: 7.24.6 + resolution: "@babel/plugin-transform-runtime@npm:7.24.6" + dependencies: + "@babel/helper-module-imports": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + babel-plugin-polyfill-corejs2: "npm:^0.4.10" + babel-plugin-polyfill-corejs3: "npm:^0.10.1" + babel-plugin-polyfill-regenerator: "npm:^0.6.1" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/536c444c494a43c1de4eec8297242199a7e778a82f64a8203a15bec46af17757ad59b520ee1fb414a03100ae743b8a2ca8527b6c0e4cc3e05be9ac1361260a44 + checksum: 10/19f28b9a82bbf6b5b81ce44f956cec1a0c41a0c9dfb89aac0665f99eacef8b40ca56315211a652820a7586ff8ef3e583a610a853891c82ba2c495e0f94c5855d languageName: node linkType: hard @@ -3638,6 +4245,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-shorthand-properties@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.24.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/c2fa1f5d50f168056e2986920dbed6c66f31cb8e6ca862223491a18d1ca9466509769478e3f811f4f7de10debf7c42058a4c52ce0125b505bfa5eae2cba592b0 + languageName: node + linkType: hard + "@babel/plugin-transform-spread@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-spread@npm:7.22.5" @@ -3650,6 +4268,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-spread@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-spread@npm:7.24.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/3c33a8c6598ba30f77a33dbcc269a7f95ef8195262c8b57e858a930bdb4c3f2a5e09683c2187eecb1a1890e5882bc6cbf08765258068cfc26fea4f223ec89f08 + languageName: node + linkType: hard + "@babel/plugin-transform-sticky-regex@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-sticky-regex@npm:7.22.5" @@ -3661,6 +4291,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-sticky-regex@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.24.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/abfff67b11f2bd6acfa516ec5710fe4082d93dce39536efb195b579f60521b281aa546e6283c57a0f011d194cf9ce8d06b55446e507f8b6f967d2fcae4108f2b + languageName: node + linkType: hard + "@babel/plugin-transform-template-literals@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-template-literals@npm:7.22.5" @@ -3672,6 +4313,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-template-literals@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-template-literals@npm:7.24.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/94431a6403ff7db25e28a251b97b3f48c4ad42b6980e2dcde94e405cce44560794ba8901924bbd617fc1fa671d8371f1445f50c6bf192752a5df03733202a02b + languageName: node + linkType: hard + "@babel/plugin-transform-typeof-symbol@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-typeof-symbol@npm:7.22.5" @@ -3683,21 +4335,32 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-typescript@npm:^7.22.11": - version: 7.22.11 - resolution: "@babel/plugin-transform-typescript@npm:7.22.11" +"@babel/plugin-transform-typeof-symbol@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.6" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-create-class-features-plugin": "npm:^7.22.11" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-typescript": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/4404bf514cc9d24602e0a15cef699d29645d92d1b4359d70a1037c6b88fa201c6042c79f06e5f3519250b2856621b278da7af1fcbf5b2aada9373de67e688970 + checksum: 10/50755df3f0e8915e920b4c87c946b4e5f59fe48ed77e27fb0297a33db97ef947aab90727d9708686b4e324ca9be7c34a44193e1dac9244338de2ab0bcc8cc9e5 languageName: node linkType: hard -"@babel/plugin-transform-unicode-escapes@npm:^7.22.10, @babel/plugin-transform-unicode-escapes@npm:^7.22.5": +"@babel/plugin-transform-typescript@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-typescript@npm:7.24.6" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.24.6" + "@babel/helper-create-class-features-plugin": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/plugin-syntax-typescript": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/6bd05b928d9026093502194d1baf6a77025fe89ba7f700831ab59402f5b9ab561ba0053802da195423ce56161bc1af0b0d1d434205b72eff2ba2754ded6ddf8e + languageName: node + linkType: hard + +"@babel/plugin-transform-unicode-escapes@npm:^7.22.5": version: 7.22.10 resolution: "@babel/plugin-transform-unicode-escapes@npm:7.22.10" dependencies: @@ -3708,6 +4371,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-escapes@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.24.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/6778e32a1ed1b7a424e47d57fa09e88c9f8b116bc50292cc9a97252c5c8713083e0a3462ac51ff010f3b0fddd9ae2927b098c74395187d9c6857e3b852dec3a3 + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-property-regex@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.22.5" @@ -3720,6 +4394,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-property-regex@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.24.6" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/3f51141c5713d4213be1e43e6c28eea4f8af916ccf5ba729885a01915339965ab9e01d6091e26c91e917af3a0e7134ebaff55e7e9c3209d61f8396ff6d413274 + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-regex@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-unicode-regex@npm:7.22.5" @@ -3732,6 +4418,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-regex@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.24.6" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/dccdd3724b9f65b67d14779c79c3758c9044f4eee1ae966126d8b0f0176b6b8fb156e22b229f1f0e8a3fd5f6175efec04dcfa44051fc0bacc16712a477f9130c + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-sets-regex@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.22.5" @@ -3744,6 +4442,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-sets-regex@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.24.6" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/c140a43e06b103ca6ef7dbc14b2f68bc6157756008df9ee5f4a4d9a014b22d5d6c61c592f6ad902a98021b289f3e5fd80d743645f8d7862332ee0384836b9809 + languageName: node + linkType: hard + "@babel/preset-env@npm:7.22.9": version: 7.22.9 resolution: "@babel/preset-env@npm:7.22.9" @@ -3835,23 +4545,25 @@ __metadata: linkType: hard "@babel/preset-env@npm:^7.11.0, @babel/preset-env@npm:^7.12.1, @babel/preset-env@npm:^7.16.4": - version: 7.22.10 - resolution: "@babel/preset-env@npm:7.22.10" - dependencies: - "@babel/compat-data": "npm:^7.22.9" - "@babel/helper-compilation-targets": "npm:^7.22.10" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-validator-option": "npm:^7.22.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.22.5" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.22.5" + version: 7.24.6 + resolution: "@babel/preset-env@npm:7.24.6" + dependencies: + "@babel/compat-data": "npm:^7.24.6" + "@babel/helper-compilation-targets": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/helper-validator-option": "npm:^7.24.6" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.24.6" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.24.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.24.6" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.24.6" "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators": "npm:^7.8.4" "@babel/plugin-syntax-class-properties": "npm:^7.12.13" "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" - "@babel/plugin-syntax-import-assertions": "npm:^7.22.5" - "@babel/plugin-syntax-import-attributes": "npm:^7.22.5" + "@babel/plugin-syntax-import-assertions": "npm:^7.24.6" + "@babel/plugin-syntax-import-attributes": "npm:^7.24.6" "@babel/plugin-syntax-import-meta": "npm:^7.10.4" "@babel/plugin-syntax-json-strings": "npm:^7.8.3" "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" @@ -3863,64 +4575,63 @@ __metadata: "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" - "@babel/plugin-transform-arrow-functions": "npm:^7.22.5" - "@babel/plugin-transform-async-generator-functions": "npm:^7.22.10" - "@babel/plugin-transform-async-to-generator": "npm:^7.22.5" - "@babel/plugin-transform-block-scoped-functions": "npm:^7.22.5" - "@babel/plugin-transform-block-scoping": "npm:^7.22.10" - "@babel/plugin-transform-class-properties": "npm:^7.22.5" - "@babel/plugin-transform-class-static-block": "npm:^7.22.5" - "@babel/plugin-transform-classes": "npm:^7.22.6" - "@babel/plugin-transform-computed-properties": "npm:^7.22.5" - "@babel/plugin-transform-destructuring": "npm:^7.22.10" - "@babel/plugin-transform-dotall-regex": "npm:^7.22.5" - "@babel/plugin-transform-duplicate-keys": "npm:^7.22.5" - "@babel/plugin-transform-dynamic-import": "npm:^7.22.5" - "@babel/plugin-transform-exponentiation-operator": "npm:^7.22.5" - "@babel/plugin-transform-export-namespace-from": "npm:^7.22.5" - "@babel/plugin-transform-for-of": "npm:^7.22.5" - "@babel/plugin-transform-function-name": "npm:^7.22.5" - "@babel/plugin-transform-json-strings": "npm:^7.22.5" - "@babel/plugin-transform-literals": "npm:^7.22.5" - "@babel/plugin-transform-logical-assignment-operators": "npm:^7.22.5" - "@babel/plugin-transform-member-expression-literals": "npm:^7.22.5" - "@babel/plugin-transform-modules-amd": "npm:^7.22.5" - "@babel/plugin-transform-modules-commonjs": "npm:^7.22.5" - "@babel/plugin-transform-modules-systemjs": "npm:^7.22.5" - "@babel/plugin-transform-modules-umd": "npm:^7.22.5" - "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.22.5" - "@babel/plugin-transform-new-target": "npm:^7.22.5" - "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.22.5" - "@babel/plugin-transform-numeric-separator": "npm:^7.22.5" - "@babel/plugin-transform-object-rest-spread": "npm:^7.22.5" - "@babel/plugin-transform-object-super": "npm:^7.22.5" - "@babel/plugin-transform-optional-catch-binding": "npm:^7.22.5" - "@babel/plugin-transform-optional-chaining": "npm:^7.22.10" - "@babel/plugin-transform-parameters": "npm:^7.22.5" - "@babel/plugin-transform-private-methods": "npm:^7.22.5" - "@babel/plugin-transform-private-property-in-object": "npm:^7.22.5" - "@babel/plugin-transform-property-literals": "npm:^7.22.5" - "@babel/plugin-transform-regenerator": "npm:^7.22.10" - "@babel/plugin-transform-reserved-words": "npm:^7.22.5" - "@babel/plugin-transform-shorthand-properties": "npm:^7.22.5" - "@babel/plugin-transform-spread": "npm:^7.22.5" - "@babel/plugin-transform-sticky-regex": "npm:^7.22.5" - "@babel/plugin-transform-template-literals": "npm:^7.22.5" - "@babel/plugin-transform-typeof-symbol": "npm:^7.22.5" - "@babel/plugin-transform-unicode-escapes": "npm:^7.22.10" - "@babel/plugin-transform-unicode-property-regex": "npm:^7.22.5" - "@babel/plugin-transform-unicode-regex": "npm:^7.22.5" - "@babel/plugin-transform-unicode-sets-regex": "npm:^7.22.5" + "@babel/plugin-transform-arrow-functions": "npm:^7.24.6" + "@babel/plugin-transform-async-generator-functions": "npm:^7.24.6" + "@babel/plugin-transform-async-to-generator": "npm:^7.24.6" + "@babel/plugin-transform-block-scoped-functions": "npm:^7.24.6" + "@babel/plugin-transform-block-scoping": "npm:^7.24.6" + "@babel/plugin-transform-class-properties": "npm:^7.24.6" + "@babel/plugin-transform-class-static-block": "npm:^7.24.6" + "@babel/plugin-transform-classes": "npm:^7.24.6" + "@babel/plugin-transform-computed-properties": "npm:^7.24.6" + "@babel/plugin-transform-destructuring": "npm:^7.24.6" + "@babel/plugin-transform-dotall-regex": "npm:^7.24.6" + "@babel/plugin-transform-duplicate-keys": "npm:^7.24.6" + "@babel/plugin-transform-dynamic-import": "npm:^7.24.6" + "@babel/plugin-transform-exponentiation-operator": "npm:^7.24.6" + "@babel/plugin-transform-export-namespace-from": "npm:^7.24.6" + "@babel/plugin-transform-for-of": "npm:^7.24.6" + "@babel/plugin-transform-function-name": "npm:^7.24.6" + "@babel/plugin-transform-json-strings": "npm:^7.24.6" + "@babel/plugin-transform-literals": "npm:^7.24.6" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.6" + "@babel/plugin-transform-member-expression-literals": "npm:^7.24.6" + "@babel/plugin-transform-modules-amd": "npm:^7.24.6" + "@babel/plugin-transform-modules-commonjs": "npm:^7.24.6" + "@babel/plugin-transform-modules-systemjs": "npm:^7.24.6" + "@babel/plugin-transform-modules-umd": "npm:^7.24.6" + "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.24.6" + "@babel/plugin-transform-new-target": "npm:^7.24.6" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.24.6" + "@babel/plugin-transform-numeric-separator": "npm:^7.24.6" + "@babel/plugin-transform-object-rest-spread": "npm:^7.24.6" + "@babel/plugin-transform-object-super": "npm:^7.24.6" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.6" + "@babel/plugin-transform-optional-chaining": "npm:^7.24.6" + "@babel/plugin-transform-parameters": "npm:^7.24.6" + "@babel/plugin-transform-private-methods": "npm:^7.24.6" + "@babel/plugin-transform-private-property-in-object": "npm:^7.24.6" + "@babel/plugin-transform-property-literals": "npm:^7.24.6" + "@babel/plugin-transform-regenerator": "npm:^7.24.6" + "@babel/plugin-transform-reserved-words": "npm:^7.24.6" + "@babel/plugin-transform-shorthand-properties": "npm:^7.24.6" + "@babel/plugin-transform-spread": "npm:^7.24.6" + "@babel/plugin-transform-sticky-regex": "npm:^7.24.6" + "@babel/plugin-transform-template-literals": "npm:^7.24.6" + "@babel/plugin-transform-typeof-symbol": "npm:^7.24.6" + "@babel/plugin-transform-unicode-escapes": "npm:^7.24.6" + "@babel/plugin-transform-unicode-property-regex": "npm:^7.24.6" + "@babel/plugin-transform-unicode-regex": "npm:^7.24.6" + "@babel/plugin-transform-unicode-sets-regex": "npm:^7.24.6" "@babel/preset-modules": "npm:0.1.6-no-external-plugins" - "@babel/types": "npm:^7.22.10" - babel-plugin-polyfill-corejs2: "npm:^0.4.5" - babel-plugin-polyfill-corejs3: "npm:^0.8.3" - babel-plugin-polyfill-regenerator: "npm:^0.5.2" + babel-plugin-polyfill-corejs2: "npm:^0.4.10" + babel-plugin-polyfill-corejs3: "npm:^0.10.4" + babel-plugin-polyfill-regenerator: "npm:^0.6.1" core-js-compat: "npm:^3.31.0" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/887cc41e6df54342ffb41b42248f584b2f220e653fc70c683e3d7cc1aa6964b9694d7d6846694647e681f440cd7f2e4454c8a9ee5bce3f523c2e22a99278f2fd + checksum: 10/4a6f57dffd1b39e540e6e557acd00fb035ffbfe7963d0c76bf3d3354b76e2f9cdb902a156b73a2203f9c2d7a693d6a0de887699ec25c92c7d3d620befed17918 languageName: node linkType: hard @@ -3953,33 +4664,33 @@ __metadata: linkType: hard "@babel/preset-react@npm:^7.12.5, @babel/preset-react@npm:^7.16.0": - version: 7.22.5 - resolution: "@babel/preset-react@npm:7.22.5" + version: 7.24.6 + resolution: "@babel/preset-react@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-validator-option": "npm:^7.22.5" - "@babel/plugin-transform-react-display-name": "npm:^7.22.5" - "@babel/plugin-transform-react-jsx": "npm:^7.22.5" - "@babel/plugin-transform-react-jsx-development": "npm:^7.22.5" - "@babel/plugin-transform-react-pure-annotations": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/helper-validator-option": "npm:^7.24.6" + "@babel/plugin-transform-react-display-name": "npm:^7.24.6" + "@babel/plugin-transform-react-jsx": "npm:^7.24.6" + "@babel/plugin-transform-react-jsx-development": "npm:^7.24.6" + "@babel/plugin-transform-react-pure-annotations": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/7c78b1bca3f2de9cb863b50cf0a5378d5e80b1b2e7573b9daabf09c0517d197aa7ff7fcd7daeb4a51e148743ab5dbd24c7b34422c86a256baf0e10e13400fe98 + checksum: 10/9229aadac11471759aa872d339f9a8f8f1fe323866878bf812f69207d01fbe8c3655a5790a724fa07dd7e4ef4035462461df313784931ab91eee0b2341975b8e languageName: node linkType: hard "@babel/preset-typescript@npm:^7.16.0": - version: 7.22.11 - resolution: "@babel/preset-typescript@npm:7.22.11" + version: 7.24.6 + resolution: "@babel/preset-typescript@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-validator-option": "npm:^7.22.5" - "@babel/plugin-syntax-jsx": "npm:^7.22.5" - "@babel/plugin-transform-modules-commonjs": "npm:^7.22.11" - "@babel/plugin-transform-typescript": "npm:^7.22.11" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/helper-validator-option": "npm:^7.24.6" + "@babel/plugin-syntax-jsx": "npm:^7.24.6" + "@babel/plugin-transform-modules-commonjs": "npm:^7.24.6" + "@babel/plugin-transform-typescript": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/b5da0fb7dbaf191bc32dae0eba4d89c8999e53ab22055c762f97fff5172c97c7ff784353abcc7145d611773da5e36b7cd491f6e0ef7fa82dcb2315b74be4ad0a + checksum: 10/e4c88dd07403c79679547e0e603d9313d9756ac5d14c33f863a29fcd9e06370058664ccc16f8cbfb281e3e00b5b574be8f91e8a9c0aafd62450743a84cbcd087 languageName: node linkType: hard @@ -4008,21 +4719,21 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.16.3, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7": - version: 7.23.2 - resolution: "@babel/runtime@npm:7.23.2" +"@babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.16.3, @babel/runtime@npm:^7.23.2": + version: 7.24.6 + resolution: "@babel/runtime@npm:7.24.6" dependencies: regenerator-runtime: "npm:^0.14.0" - checksum: 10/abdcbdd590c7e31762e1bdab94dd466823c8bcedd3ff2fde85eeb94dac7cccaef151ac37c428bda7018ededd27c9a82b4dfeb621f978ad934232475a902f8e3a + checksum: 10/6c4e12731cd9206a883c19d48fa04f6aaaf7ee83f049b22631e6521b866edc20832b4d5db30aa86d8ae799c4dcf57761fe8a4af2bf7e233245c079c1dafb5668 languageName: node linkType: hard -"@babel/runtime@npm:^7.23.4": - version: 7.23.5 - resolution: "@babel/runtime@npm:7.23.5" +"@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7": + version: 7.23.2 + resolution: "@babel/runtime@npm:7.23.2" dependencies: regenerator-runtime: "npm:^0.14.0" - checksum: 10/0f1669f639af30a0a2948ffcefa2c61935f337b0777bd94f8d7bc66bba8e7d4499e725caeb0449540d9c6d67399b733c4e719babb43ce9a0f33095aa01b42b37 + checksum: 10/abdcbdd590c7e31762e1bdab94dd466823c8bcedd3ff2fde85eeb94dac7cccaef151ac37c428bda7018ededd27c9a82b4dfeb621f978ad934232475a902f8e3a languageName: node linkType: hard @@ -4120,6 +4831,17 @@ __metadata: languageName: node linkType: hard +"@babel/template@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/template@npm:7.24.6" + dependencies: + "@babel/code-frame": "npm:^7.24.6" + "@babel/parser": "npm:^7.24.6" + "@babel/types": "npm:^7.24.6" + checksum: 10/e4641733dfb29b15f1b7f1a81579b3131d854d5aa2dc37a8b827e4eb6839c752cba45570934041b9f3dcf0edde8328f5313b092eaa6c7a342020b59d355f8bf5 + languageName: node + linkType: hard + "@babel/traverse@npm:>=7.23.2": version: 7.23.2 resolution: "@babel/traverse@npm:7.23.2" @@ -4159,14 +4881,14 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.12.6, @babel/types@npm:^7.22.11, @babel/types@npm:^7.22.19, @babel/types@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/types@npm:7.23.0" +"@babel/types@npm:^7.12.6, @babel/types@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/types@npm:7.24.6" dependencies: - "@babel/helper-string-parser": "npm:^7.22.5" - "@babel/helper-validator-identifier": "npm:^7.22.20" + "@babel/helper-string-parser": "npm:^7.24.6" + "@babel/helper-validator-identifier": "npm:^7.24.6" to-fast-properties: "npm:^2.0.0" - checksum: 10/ca5b896a26c91c5672254725c4c892a35567d2122afc47bd5331d1611a7f9230c19fc9ef591a5a6f80bf0d80737e104a9ac205c96447c74bee01d4319db58001 + checksum: 10/34552539cdc740513650cb3c7754f77a55cc5253dff9d45afd52292d366eb1c099939d5db066e458abcf4c9a7dedfe43467445f9c2208b3cb64866762dee5e9d languageName: node linkType: hard @@ -4191,17 +4913,6 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.22.10": - version: 7.22.10 - resolution: "@babel/types@npm:7.22.10" - dependencies: - "@babel/helper-string-parser": "npm:^7.22.5" - "@babel/helper-validator-identifier": "npm:^7.22.5" - to-fast-properties: "npm:^2.0.0" - checksum: 10/b11f8d13f3418276df654b5276443f95742484c3c83e74f90f92bff01315118507a082edf1e74903b284106447660c31e5f29678730f647fb25e766ce47c56f0 - languageName: node - linkType: hard - "@babel/types@npm:^7.22.15, @babel/types@npm:^7.22.17": version: 7.22.17 resolution: "@babel/types@npm:7.22.17" @@ -4224,6 +4935,17 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.23.0": + version: 7.23.0 + resolution: "@babel/types@npm:7.23.0" + dependencies: + "@babel/helper-string-parser": "npm:^7.22.5" + "@babel/helper-validator-identifier": "npm:^7.22.20" + to-fast-properties: "npm:^2.0.0" + checksum: 10/ca5b896a26c91c5672254725c4c892a35567d2122afc47bd5331d1611a7f9230c19fc9ef591a5a6f80bf0d80737e104a9ac205c96447c74bee01d4319db58001 + languageName: node + linkType: hard + "@babel/types@npm:^7.23.6": version: 7.23.6 resolution: "@babel/types@npm:7.23.6" @@ -5251,9 +5973,9 @@ __metadata: linkType: hard "@csstools/normalize.css@npm:*": - version: 12.0.0 - resolution: "@csstools/normalize.css@npm:12.0.0" - checksum: 10/d3c3ebeba561da21e2fc62425356dc3d9cc976f23f258d7c8d40343b97385ee243c0688effce6fd37ab4b8ef59793e1d3447749b3b1c9f500df7dfb87a1b4e24 + version: 12.1.1 + resolution: "@csstools/normalize.css@npm:12.1.1" + checksum: 10/aa4d1b9a77c1ecba0a60e11371d944615c64b465abfb6fe7aea237d8bebd34dc47036f2570d7038a8633755ebd3ed09ec02326fbb7570b5bf7b80aa142c0ef4b languageName: node linkType: hard @@ -5571,6 +6293,15 @@ __metadata: languageName: node linkType: hard +"@emotion/is-prop-valid@npm:^1.2.2": + version: 1.2.2 + resolution: "@emotion/is-prop-valid@npm:1.2.2" + dependencies: + "@emotion/memoize": "npm:^0.8.1" + checksum: 10/0fa3960abfbe845d40cc230ab8c9408e1f33d3c03b321980359911c7212133cdcb0344d249e9dab23342b304567eece7a10ec44b986f7230e0640ba00049dceb + languageName: node + linkType: hard + "@emotion/memoize@npm:^0.8.1": version: 0.8.1 resolution: "@emotion/memoize@npm:0.8.1" @@ -5600,13 +6331,13 @@ __metadata: linkType: hard "@emotion/react@npm:^11.11.1": - version: 11.11.1 - resolution: "@emotion/react@npm:11.11.1" + version: 11.11.4 + resolution: "@emotion/react@npm:11.11.4" dependencies: "@babel/runtime": "npm:^7.18.3" "@emotion/babel-plugin": "npm:^11.11.0" "@emotion/cache": "npm:^11.11.0" - "@emotion/serialize": "npm:^1.1.2" + "@emotion/serialize": "npm:^1.1.3" "@emotion/use-insertion-effect-with-fallbacks": "npm:^1.0.1" "@emotion/utils": "npm:^1.2.1" "@emotion/weak-memoize": "npm:^0.3.1" @@ -5616,7 +6347,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/dfc140718d0a8051a74e51c379226d9de6b19f6a5dd595fb282ef72f4413695a2d012ba919f1e9eeff761c6659e6f7398da8e0e36eb7997a4fdf54cef88644ae + checksum: 10/e7da3a1ddc1d72a4179010bdfd17423c13b1a77bf83a8b18271e919fd382d08c62dc2313ed5347acfd1ef85bb1bae8932597647a986e8a1ea1462552716cd495 languageName: node linkType: hard @@ -5646,6 +6377,19 @@ __metadata: languageName: node linkType: hard +"@emotion/serialize@npm:^1.1.4": + version: 1.1.4 + resolution: "@emotion/serialize@npm:1.1.4" + dependencies: + "@emotion/hash": "npm:^0.9.1" + "@emotion/memoize": "npm:^0.8.1" + "@emotion/unitless": "npm:^0.8.1" + "@emotion/utils": "npm:^1.2.1" + csstype: "npm:^3.0.2" + checksum: 10/11fc4f960226778e9a5f86310b739703986d13b2de3e89a16d788126ce312b2c8c174a2947c9bfc80cb124b331c36feeac44193f81150616d94b1ba19a92d70a + languageName: node + linkType: hard + "@emotion/sheet@npm:^1.2.2": version: 1.2.2 resolution: "@emotion/sheet@npm:1.2.2" @@ -5653,7 +6397,7 @@ __metadata: languageName: node linkType: hard -"@emotion/styled@npm:11.11.0, @emotion/styled@npm:^11.11.0": +"@emotion/styled@npm:11.11.0": version: 11.11.0 resolution: "@emotion/styled@npm:11.11.0" dependencies: @@ -5673,6 +6417,26 @@ __metadata: languageName: node linkType: hard +"@emotion/styled@npm:^11.11.0": + version: 11.11.5 + resolution: "@emotion/styled@npm:11.11.5" + dependencies: + "@babel/runtime": "npm:^7.18.3" + "@emotion/babel-plugin": "npm:^11.11.0" + "@emotion/is-prop-valid": "npm:^1.2.2" + "@emotion/serialize": "npm:^1.1.4" + "@emotion/use-insertion-effect-with-fallbacks": "npm:^1.0.1" + "@emotion/utils": "npm:^1.2.1" + peerDependencies: + "@emotion/react": ^11.0.0-rc.0 + react: ">=16.8.0" + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/a936787ef80d73066840391522d88280424de0abb56bec83d17e14bdc5a515e77e343dd171f7caae1405462e3f71815b5480dcc4e1eff5e8ff4a020f5c39341e + languageName: node + linkType: hard + "@emotion/unitless@npm:^0.8.1": version: 0.8.1 resolution: "@emotion/unitless@npm:0.8.1" @@ -6234,7 +6998,14 @@ __metadata: languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.4.0, @eslint-community/regexpp@npm:^4.5.1": +"@eslint-community/regexpp@npm:^4.4.0": + version: 4.10.0 + resolution: "@eslint-community/regexpp@npm:4.10.0" + checksum: 10/8c36169c815fc5d726078e8c71a5b592957ee60d08c6470f9ce0187c8046af1a00afbda0a065cc40ff18d5d83f82aed9793c6818f7304a74a7488dc9f3ecbd42 + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.5.1": version: 4.6.2 resolution: "@eslint-community/regexpp@npm:4.6.2" checksum: 10/59ea2fa13a70996a8cebbd5a9f4499c92bceeff872286ef2fb34948fcfb9d3467692371d9cc116e7d613f2c18086a1c8337c9d461ccdf213f0dc47f6f6d2fbb6 @@ -6248,23 +7019,6 @@ __metadata: languageName: node linkType: hard -"@eslint/eslintrc@npm:^2.1.2": - version: 2.1.2 - resolution: "@eslint/eslintrc@npm:2.1.2" - dependencies: - ajv: "npm:^6.12.4" - debug: "npm:^4.3.2" - espree: "npm:^9.6.0" - globals: "npm:^13.19.0" - ignore: "npm:^5.2.0" - import-fresh: "npm:^3.2.1" - js-yaml: "npm:^4.1.0" - minimatch: "npm:^3.1.2" - strip-json-comments: "npm:^3.1.1" - checksum: 10/fa25638f2666cac6810f98ee7d0f4b912f191806467c1b40d72bac759fffef0b3357f12a1869817286837b258e4de3517e0c7408520e156ca860fc53a1fbaed9 - languageName: node - linkType: hard - "@eslint/eslintrc@npm:^2.1.4": version: 2.1.4 resolution: "@eslint/eslintrc@npm:2.1.4" @@ -6282,13 +7036,6 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:8.48.0": - version: 8.48.0 - resolution: "@eslint/js@npm:8.48.0" - checksum: 10/55f6c58b046772c2bcb479366e23d9bd6fe9a32e2143729a593b6482d134debfb90bf49186ebd5884dcbab27c29f0baa2a47a3239afbae3622561eb82deed193 - languageName: node - linkType: hard - "@eslint/js@npm:8.57.0": version: 8.57.0 resolution: "@eslint/js@npm:8.57.0" @@ -7117,25 +7864,6 @@ __metadata: languageName: node linkType: hard -"@floating-ui/core@npm:^1.4.1": - version: 1.4.1 - resolution: "@floating-ui/core@npm:1.4.1" - dependencies: - "@floating-ui/utils": "npm:^0.1.1" - checksum: 10/2a2dd8a2ae443e63cb9c822785891b1194ad3a402b8252054a3c238763eab86a2f09ab89096fa7d1667e3cb7d2ff2f28b7ab07d5e5ee56544e825e5bd4665570 - languageName: node - linkType: hard - -"@floating-ui/dom@npm:^1.5.1": - version: 1.5.1 - resolution: "@floating-ui/dom@npm:1.5.1" - dependencies: - "@floating-ui/core": "npm:^1.4.1" - "@floating-ui/utils": "npm:^0.1.1" - checksum: 10/3af542d549e394feb0c74f39ef01d87debb5295b49b8852ad481a055503e5dc61768880710c83de6e49a2c100cad8671298d3c73293cb63a13e23068f0612224 - languageName: node - linkType: hard - "@floating-ui/dom@npm:^1.6.1": version: 1.6.3 resolution: "@floating-ui/dom@npm:1.6.3" @@ -7146,18 +7874,6 @@ __metadata: languageName: node linkType: hard -"@floating-ui/react-dom@npm:^2.0.4": - version: 2.0.4 - resolution: "@floating-ui/react-dom@npm:2.0.4" - dependencies: - "@floating-ui/dom": "npm:^1.5.1" - peerDependencies: - react: ">=16.8.0" - react-dom: ">=16.8.0" - checksum: 10/4240a718502c797fd2e174cd06dcd7321a6eda9c8966dbaf61864b9e16445e95649a59bfe7c19ee13f68c11f3693724d7970c7e618089a3d3915bd343639cfae - languageName: node - linkType: hard - "@floating-ui/react-dom@npm:^2.0.8": version: 2.0.8 resolution: "@floating-ui/react-dom@npm:2.0.8" @@ -7170,13 +7886,6 @@ __metadata: languageName: node linkType: hard -"@floating-ui/utils@npm:^0.1.1": - version: 0.1.1 - resolution: "@floating-ui/utils@npm:0.1.1" - checksum: 10/ba1a6d073f8af4290f9d0ecf2ca73f97a742ed9bae060bf4aec604db5642a6cc7aa38041c2c1a1ffb0dd1c99549bbfde3dc61202ad7cb91a963d2b2eea747719 - languageName: node - linkType: hard - "@floating-ui/utils@npm:^0.2.0, @floating-ui/utils@npm:^0.2.1": version: 0.2.1 resolution: "@floating-ui/utils@npm:0.2.1" @@ -7428,17 +8137,6 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.10": - version: 0.11.11 - resolution: "@humanwhocodes/config-array@npm:0.11.11" - dependencies: - "@humanwhocodes/object-schema": "npm:^1.2.1" - debug: "npm:^4.1.1" - minimatch: "npm:^3.0.5" - checksum: 10/4aad64bc4c68ec99a72c91ad9a8a9070e8da47e8fc4f51eefa2eaf56f4b0cae17dfc3ff82eb9268298f687b5bb3b68669ff542203c77bcd400dc27924d56cad6 - languageName: node - linkType: hard - "@humanwhocodes/config-array@npm:^0.11.14": version: 0.11.14 resolution: "@humanwhocodes/config-array@npm:0.11.14" @@ -7457,13 +8155,6 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^1.2.1": - version: 1.2.1 - resolution: "@humanwhocodes/object-schema@npm:1.2.1" - checksum: 10/b48a8f87fcd5fdc4ac60a31a8bf710d19cc64556050575e6a35a4a48a8543cf8cde1598a65640ff2cdfbfd165b38f9db4fa3782bea7848eb585cc3db824002e6 - languageName: node - linkType: hard - "@humanwhocodes/object-schema@npm:^2.0.2": version: 2.0.2 resolution: "@humanwhocodes/object-schema@npm:2.0.2" @@ -8428,6 +9119,33 @@ __metadata: languageName: unknown linkType: soft +"@hyperledger/cactus-plugin-ccmodel-hephaestus@workspace:packages/cactus-plugin-ccmodel-hephaestus": + version: 0.0.0-use.local + resolution: "@hyperledger/cactus-plugin-ccmodel-hephaestus@workspace:packages/cactus-plugin-ccmodel-hephaestus" + dependencies: + "@hyperledger/cactus-common": "npm:2.0.0-alpha.2" + "@hyperledger/cactus-core": "npm:2.0.0-alpha.2" + "@hyperledger/cactus-core-api": "npm:2.0.0-alpha.2" + "@hyperledger/cactus-plugin-keychain-memory": "npm:2.0.0-alpha.2" + "@hyperledger/cactus-plugin-ledger-connector-besu": "npm:2.0.0-alpha.2" + "@hyperledger/cactus-plugin-ledger-connector-ethereum": "npm:2.0.0-alpha.2" + "@hyperledger/cactus-plugin-ledger-connector-fabric": "npm:2.0.0-alpha.2" + "@hyperledger/cactus-test-geth-ledger": "npm:2.0.0-alpha.2" + "@hyperledger/cactus-test-tooling": "npm:2.0.0-alpha.2" + "@types/express": "npm:4.17.8" + "@types/uuid": "npm:8.3.0" + body-parser: "npm:1.19.0" + express: "npm:4.17.1" + fabric-network: "npm:2.2.20" + run-time-error-cjs: "npm:1.4.0" + socket.io: "npm:4.5.4" + typescript-optional: "npm:2.0.1" + uuid: "npm:8.3.2" + web3: "npm:1.6.1" + web3-core: "npm:1.6.1" + languageName: unknown + linkType: soft + "@hyperledger/cactus-plugin-consortium-manual@npm:2.0.0-alpha.2, @hyperledger/cactus-plugin-consortium-manual@workspace:packages/cactus-plugin-consortium-manual": version: 0.0.0-use.local resolution: "@hyperledger/cactus-plugin-consortium-manual@workspace:packages/cactus-plugin-consortium-manual" @@ -10519,6 +11237,17 @@ __metadata: languageName: node linkType: hard +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.5 + resolution: "@jridgewell/gen-mapping@npm:0.3.5" + dependencies: + "@jridgewell/set-array": "npm:^1.2.1" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10/81587b3c4dd8e6c60252122937cea0c637486311f4ed208b52b62aae2e7a87598f63ec330e6cd0984af494bfb16d3f0d60d3b21d7e5b4aedd2602ff3fe9d32e2 + languageName: node + linkType: hard + "@jridgewell/resolve-uri@npm:3.1.0": version: 3.1.0 resolution: "@jridgewell/resolve-uri@npm:3.1.0" @@ -10533,6 +11262,13 @@ __metadata: languageName: node linkType: hard +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 10/97106439d750a409c22c8bff822d648f6a71f3aa9bc8e5129efdc36343cd3096ddc4eeb1c62d2fe48e9bdd4db37b05d4646a17114ecebd3bbcacfa2de51c3c1d + languageName: node + linkType: hard + "@jridgewell/set-array@npm:^1.0.1": version: 1.1.2 resolution: "@jridgewell/set-array@npm:1.1.2" @@ -10540,6 +11276,13 @@ __metadata: languageName: node linkType: hard +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 10/832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10 + languageName: node + linkType: hard + "@jridgewell/source-map@npm:^0.3.3": version: 0.3.5 resolution: "@jridgewell/source-map@npm:0.3.5" @@ -10611,6 +11354,16 @@ __metadata: languageName: node linkType: hard +"@jridgewell/trace-mapping@npm:^0.3.20, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 10/dced32160a44b49d531b80a4a2159dceab6b3ddf0c8e95a0deae4b0e894b172defa63d5ac52a19c2068e1fe7d31ea4ba931fbeec103233ecb4208953967120fc + languageName: node + linkType: hard + "@jridgewell/trace-mapping@npm:^0.3.9": version: 0.3.13 resolution: "@jridgewell/trace-mapping@npm:0.3.13" @@ -11092,16 +11845,16 @@ __metadata: languageName: node linkType: hard -"@mui/base@npm:5.0.0-beta.25": - version: 5.0.0-beta.25 - resolution: "@mui/base@npm:5.0.0-beta.25" +"@mui/base@npm:5.0.0-beta.36": + version: 5.0.0-beta.36 + resolution: "@mui/base@npm:5.0.0-beta.36" dependencies: - "@babel/runtime": "npm:^7.23.4" - "@floating-ui/react-dom": "npm:^2.0.4" - "@mui/types": "npm:^7.2.10" - "@mui/utils": "npm:^5.14.19" + "@babel/runtime": "npm:^7.23.9" + "@floating-ui/react-dom": "npm:^2.0.8" + "@mui/types": "npm:^7.2.13" + "@mui/utils": "npm:^5.15.9" "@popperjs/core": "npm:^2.11.8" - clsx: "npm:^2.0.0" + clsx: "npm:^2.1.0" prop-types: "npm:^15.8.1" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 @@ -11110,18 +11863,18 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/93cecb438ec9d5bac2440a65c295fbd2cde6aa7f1264005b0c9ef76c1332b77111f7b688209364b97344642bee0e71f2bd3b3b14039921f68a8b7111d3a513e4 + checksum: 10/32be203df3ffa2e36095d37295adae7870489fb2ed82a156c10f9ea4a51c3d06b0c3415e8503b110aa2ee98d3d86d6c1c50e190e85130aa1c1db694afa56ab7a languageName: node linkType: hard -"@mui/base@npm:5.0.0-beta.36": - version: 5.0.0-beta.36 - resolution: "@mui/base@npm:5.0.0-beta.36" +"@mui/base@npm:5.0.0-beta.40": + version: 5.0.0-beta.40 + resolution: "@mui/base@npm:5.0.0-beta.40" dependencies: "@babel/runtime": "npm:^7.23.9" "@floating-ui/react-dom": "npm:^2.0.8" - "@mui/types": "npm:^7.2.13" - "@mui/utils": "npm:^5.15.9" + "@mui/types": "npm:^7.2.14" + "@mui/utils": "npm:^5.15.14" "@popperjs/core": "npm:^2.11.8" clsx: "npm:^2.1.0" prop-types: "npm:^15.8.1" @@ -11132,14 +11885,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/32be203df3ffa2e36095d37295adae7870489fb2ed82a156c10f9ea4a51c3d06b0c3415e8503b110aa2ee98d3d86d6c1c50e190e85130aa1c1db694afa56ab7a - languageName: node - linkType: hard - -"@mui/core-downloads-tracker@npm:^5.14.19": - version: 5.14.19 - resolution: "@mui/core-downloads-tracker@npm:5.14.19" - checksum: 10/e71c886f12bbd83791638545017c0b8439c3c6b51125979fea105f938f2f5b109629d4deddd38448c05b8be10b3249334324f1505c1306c52a2b8d315a1005c3 + checksum: 10/ebee3d9e1136710dcb2af5828acc6bd8d54f6b124785d011585c2665a48dc66e35ccb344d5ebc7fd8bfd776cccb8ea434911f151a62bee193677ee9dc67fc7fc languageName: node linkType: hard @@ -11150,6 +11896,13 @@ __metadata: languageName: node linkType: hard +"@mui/core-downloads-tracker@npm:^5.15.19": + version: 5.15.19 + resolution: "@mui/core-downloads-tracker@npm:5.15.19" + checksum: 10/32dd442d72a4cf4abea0e5c0a325707c3f8aba16b7b40ed674da2c068ed10d686f1941240e527407d685e00ed12931c331d99265e1ed570630c856ffbe291c23 + languageName: node + linkType: hard + "@mui/icons-material@npm:5.15.10": version: 5.15.10 resolution: "@mui/icons-material@npm:5.15.10" @@ -11167,10 +11920,10 @@ __metadata: linkType: hard "@mui/icons-material@npm:^5.14.19": - version: 5.14.19 - resolution: "@mui/icons-material@npm:5.14.19" + version: 5.15.19 + resolution: "@mui/icons-material@npm:5.15.19" dependencies: - "@babel/runtime": "npm:^7.23.4" + "@babel/runtime": "npm:^7.23.9" peerDependencies: "@mui/material": ^5.0.0 "@types/react": ^17.0.0 || ^18.0.0 @@ -11178,7 +11931,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/648a44af9a18a39062126d80268d0d4816d408d253d46f097cf8ad525e37dad8301a7727942f4908a15c432de361dabe29de0595f3771cf8acf7da311374441e + checksum: 10/f2d47ed7ffba7e28d24feb4160b65f814135ed3b96e10aa13949707a6e41e39695badd04c822c4e937892ea630a3640ddd0ff7b073f75def3f28bad2c9e5271b languageName: node linkType: hard @@ -11216,18 +11969,18 @@ __metadata: linkType: hard "@mui/material@npm:^5.14.19": - version: 5.14.19 - resolution: "@mui/material@npm:5.14.19" - dependencies: - "@babel/runtime": "npm:^7.23.4" - "@mui/base": "npm:5.0.0-beta.25" - "@mui/core-downloads-tracker": "npm:^5.14.19" - "@mui/system": "npm:^5.14.19" - "@mui/types": "npm:^7.2.10" - "@mui/utils": "npm:^5.14.19" - "@types/react-transition-group": "npm:^4.4.9" - clsx: "npm:^2.0.0" - csstype: "npm:^3.1.2" + version: 5.15.19 + resolution: "@mui/material@npm:5.15.19" + dependencies: + "@babel/runtime": "npm:^7.23.9" + "@mui/base": "npm:5.0.0-beta.40" + "@mui/core-downloads-tracker": "npm:^5.15.19" + "@mui/system": "npm:^5.15.15" + "@mui/types": "npm:^7.2.14" + "@mui/utils": "npm:^5.15.14" + "@types/react-transition-group": "npm:^4.4.10" + clsx: "npm:^2.1.0" + csstype: "npm:^3.1.3" prop-types: "npm:^15.8.1" react-is: "npm:^18.2.0" react-transition-group: "npm:^4.4.5" @@ -11244,16 +11997,16 @@ __metadata: optional: true "@types/react": optional: true - checksum: 10/9b89bf20e5086801d8737d906d4c84023e04883a67186c4f523748740a90bee495a8c93ba7bc1272fdc0f9ee9951e2ebff149ecd63697abfba06dbfe9787f5fa + checksum: 10/92618aaefc85b4d4a6012dba48fe4b4936db45c1afd3436b148c81d8b8d0a001c57fd654bd101f94077979f1cf4e3ad5a7e5dd24a6f1b666f3d2e23d75a63f84 languageName: node linkType: hard -"@mui/private-theming@npm:^5.14.19": - version: 5.14.19 - resolution: "@mui/private-theming@npm:5.14.19" +"@mui/private-theming@npm:^5.15.14": + version: 5.15.14 + resolution: "@mui/private-theming@npm:5.15.14" dependencies: - "@babel/runtime": "npm:^7.23.4" - "@mui/utils": "npm:^5.14.19" + "@babel/runtime": "npm:^7.23.9" + "@mui/utils": "npm:^5.15.14" prop-types: "npm:^15.8.1" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 @@ -11261,7 +12014,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/248687351477c7794a002dd0c4ae68216b5794591407e0b4751eede8fe35db94c163642365578938dc66fbeb7a6c771c811ab2f7fa4b2bc60f663dc826084ca0 + checksum: 10/6a14311ed53ee4adccfe0ba93275b43773d22fdd10c0d4ba680b9368fc0616a5e0f38f29d2080bcd7e4ed79123047e5f245c403d3fd822e960a97762be65218d languageName: node linkType: hard @@ -11282,13 +12035,13 @@ __metadata: languageName: node linkType: hard -"@mui/styled-engine@npm:^5.14.19": - version: 5.14.19 - resolution: "@mui/styled-engine@npm:5.14.19" +"@mui/styled-engine@npm:^5.15.14": + version: 5.15.14 + resolution: "@mui/styled-engine@npm:5.15.14" dependencies: - "@babel/runtime": "npm:^7.23.4" + "@babel/runtime": "npm:^7.23.9" "@emotion/cache": "npm:^11.11.0" - csstype: "npm:^3.1.2" + csstype: "npm:^3.1.3" prop-types: "npm:^15.8.1" peerDependencies: "@emotion/react": ^11.4.1 @@ -11299,7 +12052,7 @@ __metadata: optional: true "@emotion/styled": optional: true - checksum: 10/210da24bcb47c8b911b0f4174ecd77ced2aa5eba442861b474fe575384d736edc9553b707be35a086ae514503c26dbfa5541a352db65fa7de970c6251365214b + checksum: 10/2a5e03bb20502aef94cfb908898c50abb769192deb32d7f4237039683ce5266104cdc4055a7f0a8342aa62447d52b7439a4f2d0dda0fa6709c227c3621468cab languageName: node linkType: hard @@ -11324,17 +12077,17 @@ __metadata: languageName: node linkType: hard -"@mui/system@npm:^5.14.19": - version: 5.14.19 - resolution: "@mui/system@npm:5.14.19" +"@mui/system@npm:^5.15.15": + version: 5.15.15 + resolution: "@mui/system@npm:5.15.15" dependencies: - "@babel/runtime": "npm:^7.23.4" - "@mui/private-theming": "npm:^5.14.19" - "@mui/styled-engine": "npm:^5.14.19" - "@mui/types": "npm:^7.2.10" - "@mui/utils": "npm:^5.14.19" - clsx: "npm:^2.0.0" - csstype: "npm:^3.1.2" + "@babel/runtime": "npm:^7.23.9" + "@mui/private-theming": "npm:^5.15.14" + "@mui/styled-engine": "npm:^5.15.14" + "@mui/types": "npm:^7.2.14" + "@mui/utils": "npm:^5.15.14" + clsx: "npm:^2.1.0" + csstype: "npm:^3.1.3" prop-types: "npm:^15.8.1" peerDependencies: "@emotion/react": ^11.5.0 @@ -11348,7 +12101,7 @@ __metadata: optional: true "@types/react": optional: true - checksum: 10/68fddc614aae5dba86db134ae1b2ab7540d61e4008068ccd3c1cfa20d9f54508b9cf3ce68d2d1a4c7de237c9314206da291e987d323fa1425a12e5b36f2bc488 + checksum: 10/90a84ad0bc1b401b6e53b13fe9cfe8a34668e84885d391abf5ab80b3cd0f37370be25cb40af253cdd468746386282fed24964315933fcb28d2d6e62de0db7bf1 languageName: node linkType: hard @@ -11380,35 +12133,35 @@ __metadata: languageName: node linkType: hard -"@mui/types@npm:^7.2.10": - version: 7.2.10 - resolution: "@mui/types@npm:7.2.10" +"@mui/types@npm:^7.2.13": + version: 7.2.13 + resolution: "@mui/types@npm:7.2.13" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 peerDependenciesMeta: "@types/react": optional: true - checksum: 10/83067cd1da9c79f7ee82f171ba718435d8aa12c6e72c4d5d24bee9e310416ccb91cb86cb0502f463e683e9707d90befc5112509fe7af54cacd39f8556b150f9b + checksum: 10/a35bff025f715073329bd7cbe11ef4ce331ea377adffc0c5cd264bea47283590ce928d1fdbbc27506d1d462151325c81e71f2378ac4335feef3042010bbf3fcd languageName: node linkType: hard -"@mui/types@npm:^7.2.13": - version: 7.2.13 - resolution: "@mui/types@npm:7.2.13" +"@mui/types@npm:^7.2.14": + version: 7.2.14 + resolution: "@mui/types@npm:7.2.14" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 peerDependenciesMeta: "@types/react": optional: true - checksum: 10/a35bff025f715073329bd7cbe11ef4ce331ea377adffc0c5cd264bea47283590ce928d1fdbbc27506d1d462151325c81e71f2378ac4335feef3042010bbf3fcd + checksum: 10/b10cca8f63ea522be4f7c185acd1f4d031947e53824cbf9dc5649c165bcfa8a2749e83fd0bd1809b8e2698f58638ab2b4ce03550095989189d14434ea5c6c0b6 languageName: node linkType: hard -"@mui/utils@npm:^5.14.19": - version: 5.14.19 - resolution: "@mui/utils@npm:5.14.19" +"@mui/utils@npm:^5.15.14": + version: 5.15.14 + resolution: "@mui/utils@npm:5.15.14" dependencies: - "@babel/runtime": "npm:^7.23.4" + "@babel/runtime": "npm:^7.23.9" "@types/prop-types": "npm:^15.7.11" prop-types: "npm:^15.8.1" react-is: "npm:^18.2.0" @@ -11418,7 +12171,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/1abbcfef21fc71805af1a4d653d9adeec252ebe4892715a0c6c49246c6cfa84f46c82e033679ab50eb2cf3ef391d9eb622c48aa78f152032aa99a996eac98806 + checksum: 10/b3cbe2d0aa7ec65969752dababc39fc6e0b8bb1a9cf8b9bac42ca40e3dd3eaa59b79765bd259019318acc7421d64b9f421bc67e776a581d7c9da6a1c0c50bfbc languageName: node linkType: hard @@ -12447,14 +13200,12 @@ __metadata: linkType: hard "@pmmmwh/react-refresh-webpack-plugin@npm:^0.5.3": - version: 0.5.11 - resolution: "@pmmmwh/react-refresh-webpack-plugin@npm:0.5.11" + version: 0.5.13 + resolution: "@pmmmwh/react-refresh-webpack-plugin@npm:0.5.13" dependencies: ansi-html-community: "npm:^0.0.8" - common-path-prefix: "npm:^3.0.0" core-js-pure: "npm:^3.23.3" error-stack-parser: "npm:^2.0.6" - find-up: "npm:^5.0.0" html-entities: "npm:^2.1.0" loader-utils: "npm:^2.0.4" schema-utils: "npm:^3.0.0" @@ -12465,7 +13216,7 @@ __metadata: sockjs-client: ^1.4.0 type-fest: ">=0.17.0 <5.0.0" webpack: ">=4.43.0 <6.0.0" - webpack-dev-server: 3.x || 4.x + webpack-dev-server: 3.x || 4.x || 5.x webpack-hot-middleware: 2.x webpack-plugin-serve: 0.x || 1.x peerDependenciesMeta: @@ -12481,7 +13232,7 @@ __metadata: optional: true webpack-plugin-serve: optional: true - checksum: 10/ee7eff63ef930c8ec37b341d12f180598a5173938a5b8d1d7c53306eab10b3f3f23adcba4824e5a93ddcd0cf185a90baa0b6f483f27a320dd86ad61941940eb6 + checksum: 10/fe25c2e4d9b3af1329c1bf091e43f276ef258f7e7d7a54ff28b3092ffba8ab1a27907195dde33e63078d9c138b3a12bd6fa5638cf1ce22a345491905964ed559 languageName: node linkType: hard @@ -13217,9 +13968,9 @@ __metadata: linkType: hard "@rushstack/eslint-patch@npm:^1.1.0": - version: 1.3.3 - resolution: "@rushstack/eslint-patch@npm:1.3.3" - checksum: 10/411c93510a00f0a52ba88f03810ca72ff09809102aeac5fd74dfd3c99afde06158ac94e24f5262bf437cdd7ac6b0dd03335b1e96ce795fe079f968f6c81d09a1 + version: 1.10.3 + resolution: "@rushstack/eslint-patch@npm:1.10.3" + checksum: 10/e1986178618bfb5fb636a54c420a7c359879d7aed6a0e456333a92fdc93e0e7a9a914114284308317cdc75e522c0696f760cd6d0b77409ed8b9633e75f096628 languageName: node linkType: hard @@ -14490,16 +15241,16 @@ __metadata: languageName: node linkType: hard -"@types/babel__core@npm:^7.0.0": - version: 7.20.2 - resolution: "@types/babel__core@npm:7.20.2" +"@types/babel__core@npm:^7.0.0, @types/babel__core@npm:^7.20.5": + version: 7.20.5 + resolution: "@types/babel__core@npm:7.20.5" dependencies: "@babel/parser": "npm:^7.20.7" "@babel/types": "npm:^7.20.7" "@types/babel__generator": "npm:*" "@types/babel__template": "npm:*" "@types/babel__traverse": "npm:*" - checksum: 10/78aede009117ff6c95ef36db19e27ad15ecdcb5cfc9ad57d43caa5d2f44127105691a3e6e8d1806fd305484db8a74fdec5640e88da452c511f6351353f7ac0c8 + checksum: 10/c32838d280b5ab59d62557f9e331d3831f8e547ee10b4f85cb78753d97d521270cebfc73ce501e9fb27fe71884d1ba75e18658692c2f4117543f0fc4e3e118b3 languageName: node linkType: hard @@ -14516,19 +15267,6 @@ __metadata: languageName: node linkType: hard -"@types/babel__core@npm:^7.20.5": - version: 7.20.5 - resolution: "@types/babel__core@npm:7.20.5" - dependencies: - "@babel/parser": "npm:^7.20.7" - "@babel/types": "npm:^7.20.7" - "@types/babel__generator": "npm:*" - "@types/babel__template": "npm:*" - "@types/babel__traverse": "npm:*" - checksum: 10/c32838d280b5ab59d62557f9e331d3831f8e547ee10b4f85cb78753d97d521270cebfc73ce501e9fb27fe71884d1ba75e18658692c2f4117543f0fc4e3e118b3 - languageName: node - linkType: hard - "@types/babel__generator@npm:*": version: 7.6.4 resolution: "@types/babel__generator@npm:7.6.4" @@ -14558,11 +15296,11 @@ __metadata: linkType: hard "@types/babel__traverse@npm:^7.0.4": - version: 7.20.1 - resolution: "@types/babel__traverse@npm:7.20.1" + version: 7.20.6 + resolution: "@types/babel__traverse@npm:7.20.6" dependencies: "@babel/types": "npm:^7.20.7" - checksum: 10/8f18d1488adf296f50d01e2386797c56a607cde2cfc3c7c55cea34d760aed9386c81ea808a151a0efb11d99e0083c138c5733d3f214471a30abed055bede39d8 + checksum: 10/63d13a3789aa1e783b87a8b03d9fb2c2c90078de7782422feff1631b8c2a25db626e63a63ac5a1465d47359201c73069dacb4b52149d17c568187625da3064ae languageName: node linkType: hard @@ -14862,12 +15600,12 @@ __metadata: linkType: hard "@types/eslint@npm:^7.29.0 || ^8.4.1": - version: 8.44.2 - resolution: "@types/eslint@npm:8.44.2" + version: 8.56.10 + resolution: "@types/eslint@npm:8.56.10" dependencies: "@types/estree": "npm:*" "@types/json-schema": "npm:*" - checksum: 10/9fe07d4fba1ab9d53d0da404c5774c056deb4bb37a3712a11d35f40ec4389d5d8cc46f19387cf79a3054754e1b71f5dbb796ee6f7411449e9f2399aff8a94def + checksum: 10/0cdd914b944ebba51c35827d3ef95bc3e16eb82b4c2741f6437fa57cdb00a4407c77f89c220afe9e4c9566982ec8a0fb9b97c956ac3bd4623a3b6af32eed8424 languageName: node linkType: hard @@ -14894,7 +15632,7 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:1.0.5": +"@types/estree@npm:1.0.5, @types/estree@npm:^1.0.5": version: 1.0.5 resolution: "@types/estree@npm:1.0.5" checksum: 10/7de6d928dd4010b0e20c6919e1a6c27b61f8d4567befa89252055fad503d587ecb9a1e3eab1b1901f923964d7019796db810b7fd6430acb26c32866d126fd408 @@ -15010,6 +15748,18 @@ __metadata: languageName: node linkType: hard +"@types/express@npm:4.17.8": + version: 4.17.8 + resolution: "@types/express@npm:4.17.8" + dependencies: + "@types/body-parser": "npm:*" + "@types/express-serve-static-core": "npm:*" + "@types/qs": "npm:*" + "@types/serve-static": "npm:*" + checksum: 10/ca265de4f9deb7eea2babd66d7f4069ca49202b69db48fb2e805998a8574ac1d186989de7920e66d4a97740228205f62f8c5821283756cf55bb2115ca2f5b901 + languageName: node + linkType: hard + "@types/express@npm:^4.17.13": version: 4.17.17 resolution: "@types/express@npm:4.17.17" @@ -15059,11 +15809,11 @@ __metadata: linkType: hard "@types/graceful-fs@npm:^4.1.2": - version: 4.1.6 - resolution: "@types/graceful-fs@npm:4.1.6" + version: 4.1.9 + resolution: "@types/graceful-fs@npm:4.1.9" dependencies: "@types/node": "npm:*" - checksum: 10/c3070ccdc9ca0f40df747bced1c96c71a61992d6f7c767e8fd24bb6a3c2de26e8b84135ede000b7e79db530a23e7e88dcd9db60eee6395d0f4ce1dae91369dd4 + checksum: 10/79d746a8f053954bba36bd3d94a90c78de995d126289d656fb3271dd9f1229d33f678da04d10bce6be440494a5a73438e2e363e92802d16b8315b051036c5256 languageName: node linkType: hard @@ -15188,12 +15938,12 @@ __metadata: linkType: hard "@types/jest@npm:*": - version: 29.5.10 - resolution: "@types/jest@npm:29.5.10" + version: 29.5.12 + resolution: "@types/jest@npm:29.5.12" dependencies: expect: "npm:^29.0.0" pretty-format: "npm:^29.0.0" - checksum: 10/f31cdc9cf840a3bc2230148bb5cba1e0369e3180ae75d85804038905300dd8cfa1d989a4dbbd909633c04568d0c1a9251b2ee5c4197309ec033403dd2a08ea42 + checksum: 10/312e8dcf92cdd5a5847d6426f0940829bca6fe6b5a917248f3d7f7ef5d85c9ce78ef05e47d2bbabc40d41a930e0e36db2d443d2610a9e3db9062da2d5c904211 languageName: node linkType: hard @@ -15253,9 +16003,9 @@ __metadata: linkType: hard "@types/json-schema@npm:^7.0.4, @types/json-schema@npm:^7.0.5": - version: 7.0.13 - resolution: "@types/json-schema@npm:7.0.13" - checksum: 10/24000f93d34b3848053b8eb36bbbcfb6b465f691d61186ddac9596b6f1fb105ae84a8be63c0c0f3b6d8f7eb6f891f6cdf3c34910aefc756a1971164c4262de1a + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 10/1a3c3e06236e4c4aab89499c428d585527ce50c24fe8259e8b3926d3df4cfbbbcf306cfc73ddfb66cbafc973116efd15967020b0f738f63e09e64c7d260519e7 languageName: node linkType: hard @@ -15682,9 +16432,9 @@ __metadata: linkType: hard "@types/q@npm:^1.5.1": - version: 1.5.5 - resolution: "@types/q@npm:1.5.5" - checksum: 10/37bb27dbd602650577052a3c1ee749b0d027caa6ff06ea307f3f2012ee64fa5740e9bf5fe548c8377f319797a5ecb28a602fb2be977339bc9e035f42d91601a3 + version: 1.5.8 + resolution: "@types/q@npm:1.5.8" + checksum: 10/eaa21cd2cf562956433937e728301ee8c63fe6dd91718cd4a1005744ec5a70c4ebe8e45e26af83ecbe45aa12ef0bf1646e42dac868780d1f3a99044547035706 languageName: node linkType: hard @@ -15709,7 +16459,7 @@ __metadata: languageName: node linkType: hard -"@types/react-dom@npm:18.2.17, @types/react-dom@npm:^18.0.0, @types/react-dom@npm:^18.2.17": +"@types/react-dom@npm:18.2.17": version: 18.2.17 resolution: "@types/react-dom@npm:18.2.17" dependencies: @@ -15718,21 +16468,21 @@ __metadata: languageName: node linkType: hard -"@types/react-transition-group@npm:^4.4.10": - version: 4.4.10 - resolution: "@types/react-transition-group@npm:4.4.10" +"@types/react-dom@npm:^18.0.0, @types/react-dom@npm:^18.2.17": + version: 18.3.0 + resolution: "@types/react-dom@npm:18.3.0" dependencies: "@types/react": "npm:*" - checksum: 10/b429f3bd54d9aea6c0395943ce2dda6b76fb458e902365bd91fd99bf72064fb5d59e2b74e78d10f2871908501d350da63e230d81bda2b616c967cab8dc51bd16 + checksum: 10/6ff53f5a7b7fba952a68e114d3b542ebdc1e87a794234785ebab0bcd9bde7fb4885f21ebaf93d26dc0a1b5b93287f42cad68b78ae04dddf6b20da7aceff0beaf languageName: node linkType: hard -"@types/react-transition-group@npm:^4.4.9": - version: 4.4.9 - resolution: "@types/react-transition-group@npm:4.4.9" +"@types/react-transition-group@npm:^4.4.10": + version: 4.4.10 + resolution: "@types/react-transition-group@npm:4.4.10" dependencies: "@types/react": "npm:*" - checksum: 10/74ed0985380544bd1d63d8865a452a859ed7122b35dd2cf919fa7d1f31936345671995d36c89263456f27dbb5940eac8d4607be969e27187102eecff1cc64ba3 + checksum: 10/b429f3bd54d9aea6c0395943ce2dda6b76fb458e902365bd91fd99bf72064fb5d59e2b74e78d10f2871908501d350da63e230d81bda2b616c967cab8dc51bd16 languageName: node linkType: hard @@ -15770,13 +16520,12 @@ __metadata: linkType: hard "@types/react@npm:^18.2.39": - version: 18.2.39 - resolution: "@types/react@npm:18.2.39" + version: 18.3.3 + resolution: "@types/react@npm:18.3.3" dependencies: "@types/prop-types": "npm:*" - "@types/scheduler": "npm:*" csstype: "npm:^3.0.2" - checksum: 10/870f7774c676ae0f3ab6339a62b3315f5a296e89412358b15a5249a61e781a8807a2253ef7ad2ec98e7a5bea1e8c3ddd95b02226d6b8ac4a085da59b4a496564 + checksum: 10/68e203b7f1f91d6cf21f33fc7af9d6d228035a26c83f514981e54aa3da695d0ec6af10c277c6336de1dd76c4adbe9563f3a21f80c4462000f41e5f370b46e96c languageName: node linkType: hard @@ -15894,7 +16643,14 @@ __metadata: languageName: node linkType: hard -"@types/semver@npm:^7.3.12, @types/semver@npm:^7.5.0": +"@types/semver@npm:^7.3.12": + version: 7.5.8 + resolution: "@types/semver@npm:7.5.8" + checksum: 10/3496808818ddb36deabfe4974fd343a78101fa242c4690044ccdc3b95dcf8785b494f5d628f2f47f38a702f8db9c53c67f47d7818f2be1b79f2efb09692e1178 + languageName: node + linkType: hard + +"@types/semver@npm:^7.5.0": version: 7.5.0 resolution: "@types/semver@npm:7.5.0" checksum: 10/8fbfbf79e9c14c3c20160a42145a146cba44d9763d0fac78358b394dc36e41bc2590bc4f0129c6fcbbc9b30f12ea1ba821bfe84b29dc80897f315cc7dd251393 @@ -16124,9 +16880,9 @@ __metadata: linkType: hard "@types/trusted-types@npm:^2.0.2": - version: 2.0.3 - resolution: "@types/trusted-types@npm:2.0.3" - checksum: 10/4794804bc4a4a173d589841b6d26cf455ff5dc4f3e704e847de7d65d215f2e7043d8757e4741ce3a823af3f08260a8d04a1a6e9c5ec9b20b7b04586956a6b005 + version: 2.0.7 + resolution: "@types/trusted-types@npm:2.0.7" + checksum: 10/8e4202766a65877efcf5d5a41b7dd458480b36195e580a3b1085ad21e948bc417d55d6f8af1fd2a7ad008015d4117d5fdfe432731157da3c68678487174e4ba3 languageName: node linkType: hard @@ -16139,6 +16895,13 @@ __metadata: languageName: node linkType: hard +"@types/uuid@npm:8.3.0": + version: 8.3.0 + resolution: "@types/uuid@npm:8.3.0" + checksum: 10/0f46b15020b9c252473fb327a6491fd7d238c7b5bbaebd32195a0de178db040f6abb96902507ba25dd4a673cdd9cc28b8880512dba54561e8bc60d8f326c1e30 + languageName: node + linkType: hard + "@types/uuid@npm:9.0.6": version: 9.0.6 resolution: "@types/uuid@npm:9.0.6" @@ -16220,11 +16983,11 @@ __metadata: linkType: hard "@types/yargs@npm:^16.0.0": - version: 16.0.6 - resolution: "@types/yargs@npm:16.0.6" + version: 16.0.9 + resolution: "@types/yargs@npm:16.0.9" dependencies: "@types/yargs-parser": "npm:*" - checksum: 10/a1908b4344d34b918bb99b6157b3ee87f8441dc6d697c7787b779374d9118f69d979a93a44eec134ff20f25479d1fa460caac3d5a8e66e4af09c2cb261d2352d + checksum: 10/8f31cbfcd5c3ac67c27e26026d8b9af0c37770fb2421b661939ba06d136f5a4fa61528a5d0f495d5802fbf1d9244b499e664d8d884e3eb3c36d556fb7c278f18 languageName: node linkType: hard @@ -16647,6 +17410,16 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/ast@npm:1.12.1, @webassemblyjs/ast@npm:^1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/ast@npm:1.12.1" + dependencies: + "@webassemblyjs/helper-numbers": "npm:1.11.6" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + checksum: 10/a775b0559437ae122d14fec0cfe59fdcaf5ca2d8ff48254014fd05d6797e20401e0f1518e628f9b06819aa085834a2534234977f9608b3f2e51f94b6e8b0bc43 + languageName: node + linkType: hard + "@webassemblyjs/floating-point-hex-parser@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.6" @@ -16668,6 +17441,13 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/helper-buffer@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/helper-buffer@npm:1.12.1" + checksum: 10/1d8705daa41f4d22ef7c6d422af4c530b84d69d0c253c6db5adec44d511d7caa66837803db5b1addcea611a1498fd5a67d2cf318b057a916283ae41ffb85ba8a + languageName: node + linkType: hard + "@webassemblyjs/helper-numbers@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/helper-numbers@npm:1.11.6" @@ -16698,6 +17478,18 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/helper-wasm-section@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/helper-wasm-section@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-buffer": "npm:1.12.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + "@webassemblyjs/wasm-gen": "npm:1.12.1" + checksum: 10/e91e6b28114e35321934070a2db8973a08a5cd9c30500b817214c683bbf5269ed4324366dd93ad83bf2fba0d671ac8f39df1c142bf58f70c57a827eeba4a3d2f + languageName: node + linkType: hard + "@webassemblyjs/ieee754@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/ieee754@npm:1.11.6" @@ -16739,6 +17531,22 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/wasm-edit@npm:^1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-edit@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-buffer": "npm:1.12.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + "@webassemblyjs/helper-wasm-section": "npm:1.12.1" + "@webassemblyjs/wasm-gen": "npm:1.12.1" + "@webassemblyjs/wasm-opt": "npm:1.12.1" + "@webassemblyjs/wasm-parser": "npm:1.12.1" + "@webassemblyjs/wast-printer": "npm:1.12.1" + checksum: 10/5678ae02dbebba2f3a344e25928ea5a26a0df777166c9be77a467bfde7aca7f4b57ef95587e4bd768a402cdf2fddc4c56f0a599d164cdd9fe313520e39e18137 + languageName: node + linkType: hard + "@webassemblyjs/wasm-gen@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/wasm-gen@npm:1.11.6" @@ -16752,6 +17560,19 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/wasm-gen@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-gen@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + "@webassemblyjs/ieee754": "npm:1.11.6" + "@webassemblyjs/leb128": "npm:1.11.6" + "@webassemblyjs/utf8": "npm:1.11.6" + checksum: 10/ec45bd50e86bc9856f80fe9af4bc1ae5c98fb85f57023d11dff2b670da240c47a7b1b9b6c89755890314212bd167cf3adae7f1157216ddffb739a4ce589fc338 + languageName: node + linkType: hard + "@webassemblyjs/wasm-opt@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/wasm-opt@npm:1.11.6" @@ -16764,6 +17585,18 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/wasm-opt@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-opt@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-buffer": "npm:1.12.1" + "@webassemblyjs/wasm-gen": "npm:1.12.1" + "@webassemblyjs/wasm-parser": "npm:1.12.1" + checksum: 10/21f25ae109012c49bb084e09f3b67679510429adc3e2408ad3621b2b505379d9cce337799a7919ef44db64e0d136833216914aea16b0d4856f353b9778e0cdb7 + languageName: node + linkType: hard + "@webassemblyjs/wasm-parser@npm:1.11.6, @webassemblyjs/wasm-parser@npm:^1.11.5": version: 1.11.6 resolution: "@webassemblyjs/wasm-parser@npm:1.11.6" @@ -16778,6 +17611,20 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/wasm-parser@npm:1.12.1, @webassemblyjs/wasm-parser@npm:^1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-parser@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-api-error": "npm:1.11.6" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + "@webassemblyjs/ieee754": "npm:1.11.6" + "@webassemblyjs/leb128": "npm:1.11.6" + "@webassemblyjs/utf8": "npm:1.11.6" + checksum: 10/f7311685b76c3e1def2abea3488be1e77f06ecd8633143a6c5c943ca289660952b73785231bb76a010055ca64645227a4bc79705c26ab7536216891b6bb36320 + languageName: node + linkType: hard + "@webassemblyjs/wast-printer@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/wast-printer@npm:1.11.6" @@ -16788,6 +17635,16 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/wast-printer@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wast-printer@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@xtuc/long": "npm:4.2.2" + checksum: 10/1a6a4b6bc4234f2b5adbab0cb11a24911b03380eb1cab6fb27a2250174a279fdc6aa2f5a9cf62dd1f6d4eb39f778f488e8ff15b9deb0670dee5c5077d46cf572 + languageName: node + linkType: hard + "@webpack-cli/configtest@npm:^1.2.0": version: 1.2.0 resolution: "@webpack-cli/configtest@npm:1.2.0" @@ -17022,7 +17879,7 @@ __metadata: languageName: node linkType: hard -"accepts@npm:^1.3.5, accepts@npm:^1.3.7, accepts@npm:~1.3.8": +"accepts@npm:^1.3.5, accepts@npm:^1.3.7, accepts@npm:~1.3.7, accepts@npm:~1.3.8": version: 1.3.8 resolution: "accepts@npm:1.3.8" dependencies: @@ -17301,7 +18158,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:8.12.0, ajv@npm:^8.10.0, ajv@npm:^8.11.0, ajv@npm:^8.11.2, ajv@npm:^8.6.0, ajv@npm:^8.6.3": +"ajv@npm:8.12.0, ajv@npm:^8.10.0, ajv@npm:^8.11.0, ajv@npm:^8.11.2, ajv@npm:^8.6.3": version: 8.12.0 resolution: "ajv@npm:8.12.0" dependencies: @@ -17349,6 +18206,18 @@ __metadata: languageName: node linkType: hard +"ajv@npm:^8.6.0": + version: 8.14.0 + resolution: "ajv@npm:8.14.0" + dependencies: + fast-deep-equal: "npm:^3.1.3" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + uri-js: "npm:^4.4.1" + checksum: 10/b6430527c2e1bf3d20dce4cca2979b5cc69db15751ac00105e269e04d7b09c2e20364070257cafacfa676171a8bf9c84c1cd9def97267a20cd15c64daa486151 + languageName: node + linkType: hard + "ajv@npm:^8.8.0": version: 8.11.0 resolution: "ajv@npm:8.11.0" @@ -17815,7 +18684,7 @@ __metadata: languageName: node linkType: hard -"aria-query@npm:^5.0.0, aria-query@npm:^5.1.3": +"aria-query@npm:^5.0.0, aria-query@npm:^5.3.0": version: 5.3.0 resolution: "aria-query@npm:5.3.0" dependencies: @@ -17916,16 +18785,17 @@ __metadata: languageName: node linkType: hard -"array-includes@npm:^3.1.6": - version: 3.1.6 - resolution: "array-includes@npm:3.1.6" +"array-includes@npm:^3.1.6, array-includes@npm:^3.1.8": + version: 3.1.8 + resolution: "array-includes@npm:3.1.8" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.4" - es-abstract: "npm:^1.20.4" - get-intrinsic: "npm:^1.1.3" + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.4" is-string: "npm:^1.0.7" - checksum: 10/a7168bd16821ec76b95a8f50f73076577a7cbd6c762452043d2b978c8a5fa4afe4f98a025d6f1d5c971b8d0b440b4ee73f6a57fc45382c858b8e17c275015428 + checksum: 10/290b206c9451f181fb2b1f79a3bf1c0b66bb259791290ffbada760c79b284eef6f5ae2aeb4bcff450ebc9690edd25732c4c73a3c2b340fcc0f4563aed83bf488 languageName: node linkType: hard @@ -18012,16 +18882,17 @@ __metadata: languageName: node linkType: hard -"array.prototype.findlastindex@npm:^1.2.2": - version: 1.2.2 - resolution: "array.prototype.findlastindex@npm:1.2.2" +"array.prototype.findlast@npm:^1.2.5": + version: 1.2.5 + resolution: "array.prototype.findlast@npm:1.2.5" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.4" - es-abstract: "npm:^1.20.4" - es-shim-unscopables: "npm:^1.0.0" - get-intrinsic: "npm:^1.1.3" - checksum: 10/a97b6dad48ac27bccb1a062c1d9dec6726bcedf34d6be2ee7b9ed9a8db519df6d278b8011c2d6c49ed70802488f23ab10c0142606ef58e48dbc0a035a810318e + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10/7dffcc665aa965718ad6de7e17ac50df0c5e38798c0a5bf9340cf24feb8594df6ec6f3fcbe714c1577728a1b18b5704b15669474b27bceeca91ef06ce2a23c31 languageName: node linkType: hard @@ -18038,19 +18909,7 @@ __metadata: languageName: node linkType: hard -"array.prototype.flat@npm:^1.3.1": - version: 1.3.1 - resolution: "array.prototype.flat@npm:1.3.1" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.4" - es-abstract: "npm:^1.20.4" - es-shim-unscopables: "npm:^1.0.0" - checksum: 10/787bd3e93887b1c12cfed018864cb819a4fe361728d4aadc7b401b0811cf923121881cca369557432529ffa803a463f01e37eaa4b52e4c13bc574c438cd615cb - languageName: node - linkType: hard - -"array.prototype.flat@npm:^1.3.2": +"array.prototype.flat@npm:^1.3.1, array.prototype.flat@npm:^1.3.2": version: 1.3.2 resolution: "array.prototype.flat@npm:1.3.2" dependencies: @@ -18062,18 +18921,6 @@ __metadata: languageName: node linkType: hard -"array.prototype.flatmap@npm:^1.3.1": - version: 1.3.1 - resolution: "array.prototype.flatmap@npm:1.3.1" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.4" - es-abstract: "npm:^1.20.4" - es-shim-unscopables: "npm:^1.0.0" - checksum: 10/f1f3d8e0610afce06a8622295b4843507dfc2fbbd2c2b2a8d541d9f42871747393c3099d630a3f8266ca086b97b089687db64cd86b6eb7e270ebc8f767eec9fc - languageName: node - linkType: hard - "array.prototype.flatmap@npm:^1.3.2": version: 1.3.2 resolution: "array.prototype.flatmap@npm:1.3.2" @@ -18087,28 +18934,42 @@ __metadata: linkType: hard "array.prototype.reduce@npm:^1.0.6": - version: 1.0.6 - resolution: "array.prototype.reduce@npm:1.0.6" + version: 1.0.7 + resolution: "array.prototype.reduce@npm:1.0.7" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" es-array-method-boxes-properly: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" is-string: "npm:^1.0.7" - checksum: 10/991989a3edb9716a3e3c6feb67a09abc8317e42535f1560156784e920f521418fff43abec57d14684015ef2d3f134830962b47b3d0be0c8a5dd68d8d7c65b9c1 + checksum: 10/3a4fa56cf5843d821e97680861c8edfdfe6684a7f7cd1145ed611b5fa611fd62d1b149a438ae24ae884c843876a6539b67fbcacdd3276f89731eee9415dc9012 languageName: node linkType: hard -"array.prototype.tosorted@npm:^1.1.1": - version: 1.1.1 - resolution: "array.prototype.tosorted@npm:1.1.1" +"array.prototype.toreversed@npm:^1.1.2": + version: 1.1.2 + resolution: "array.prototype.toreversed@npm:1.1.2" dependencies: call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.4" - es-abstract: "npm:^1.20.4" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" es-shim-unscopables: "npm:^1.0.0" - get-intrinsic: "npm:^1.1.3" - checksum: 10/23e86074d0dda9260aaa137ec45ae5a8196916ee3f256e41665381f120fdb5921bd84ad93eeba8d0234e5cd355093049585167ba2307fde340e5cee15b12415d + checksum: 10/b4076d687ddc22c191863ce105d320cc4b0e1435bfda9ffeeff681682fe88fa6fe30e0d2ae94fa4b2d7fad901e1954ea4f75c1cab217db4848da84a2b5889192 + languageName: node + linkType: hard + +"array.prototype.tosorted@npm:^1.1.3": + version: 1.1.3 + resolution: "array.prototype.tosorted@npm:1.1.3" + dependencies: + call-bind: "npm:^1.0.5" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.22.3" + es-errors: "npm:^1.1.0" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10/9a5b7909a9ddd02a5f5489911766c314a11fb40f8f5106bdbedf6c21898763faeb78ba3af53f7038f288de9161d2605ad10d8b720e07f71a7ed1de49f39c0897 languageName: node linkType: hard @@ -18242,10 +19103,10 @@ __metadata: languageName: node linkType: hard -"ast-types-flow@npm:^0.0.7": - version: 0.0.7 - resolution: "ast-types-flow@npm:0.0.7" - checksum: 10/663b90e99b56ee2d7f736a6b6fff8b3c5404f28fa1860bb8d83ee5a9bff9e687520d0d6d9db6edff5a34fd4d3c0c11a3beb1cf75e43c9a880cca04371cc99808 +"ast-types-flow@npm:^0.0.8": + version: 0.0.8 + resolution: "ast-types-flow@npm:0.0.8" + checksum: 10/85a1c24af4707871c27cfe456bd2ff7fcbe678f3d1c878ac968c9557735a171a17bdcc8c8f903ceab3fc3c49d5b3da2194e6ab0a6be7fec0e133fa028f21ba1b languageName: node linkType: hard @@ -18334,15 +19195,6 @@ __metadata: languageName: node linkType: hard -"asynciterator.prototype@npm:^1.0.0": - version: 1.0.0 - resolution: "asynciterator.prototype@npm:1.0.0" - dependencies: - has-symbols: "npm:^1.0.3" - checksum: 10/e8ebfd9493ac651cf9b4165e9d64030b3da1d17181bb1963627b59e240cdaf021d9b59d44b827dc1dde4e22387ec04c2d0f8720cf58a1c282e34e40cc12721b3 - languageName: node - linkType: hard - "asynckit@npm:^0.4.0": version: 0.4.0 resolution: "asynckit@npm:0.4.0" @@ -18406,12 +19258,12 @@ __metadata: linkType: hard "autoprefixer@npm:^10.4.13": - version: 10.4.15 - resolution: "autoprefixer@npm:10.4.15" + version: 10.4.19 + resolution: "autoprefixer@npm:10.4.19" dependencies: - browserslist: "npm:^4.21.10" - caniuse-lite: "npm:^1.0.30001520" - fraction.js: "npm:^4.2.0" + browserslist: "npm:^4.23.0" + caniuse-lite: "npm:^1.0.30001599" + fraction.js: "npm:^4.3.7" normalize-range: "npm:^0.1.2" picocolors: "npm:^1.0.0" postcss-value-parser: "npm:^4.2.0" @@ -18419,7 +19271,7 @@ __metadata: postcss: ^8.1.0 bin: autoprefixer: bin/autoprefixer - checksum: 10/99ab82461d33bb79318dbf26c76d207eab8bf98680d8981aeddf7af4208fd57579b4c68dcf576b1d1baba8bd5410665b9406eac468f8119bd42e11b9ff0074b7 + checksum: 10/98378eae37b8bf0f1515e4c91b4c9c1ce69ede311d4dea7e934f5afe147d23712c577f112c4019a4c40461c585d82d474d08044f8eb6cb8a063c3d5b7aca52d2 languageName: node linkType: hard @@ -18482,10 +19334,10 @@ __metadata: languageName: node linkType: hard -"axe-core@npm:^4.6.2": - version: 4.7.2 - resolution: "axe-core@npm:4.7.2" - checksum: 10/1b94fcbe203296fc7174992a3d70dbcd477d88b933afa045aaffa1704fe63d8da8945e4b38fc576f9c7384abeb353e2d6607ab54d25b5c90b255ef2244bda29a +"axe-core@npm:=4.7.0": + version: 4.7.0 + resolution: "axe-core@npm:4.7.0" + checksum: 10/615c0f7722c3c9fcf353dbd70b00e2ceae234d4c17cbc839dd85c01d16797c4e4da45f8d27c6118e9e6b033fb06efd196106e13651a1b2f3a10e0f11c7b2f660 languageName: node linkType: hard @@ -18500,7 +19352,7 @@ __metadata: languageName: node linkType: hard -"axobject-query@npm:^3.1.1": +"axobject-query@npm:^3.2.1": version: 3.2.1 resolution: "axobject-query@npm:3.2.1" dependencies: @@ -18658,6 +19510,19 @@ __metadata: languageName: node linkType: hard +"babel-plugin-polyfill-corejs2@npm:^0.4.10": + version: 0.4.11 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.11" + dependencies: + "@babel/compat-data": "npm:^7.22.6" + "@babel/helper-define-polyfill-provider": "npm:^0.6.2" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 10/9c79908bed61b9f52190f254e22d3dca6ce25769738642579ba8d23832f3f9414567a90d8367a31831fa45d9b9607ac43d8d07ed31167d8ca8cda22871f4c7a1 + languageName: node + linkType: hard + "babel-plugin-polyfill-corejs2@npm:^0.4.4": version: 0.4.5 resolution: "babel-plugin-polyfill-corejs2@npm:0.4.5" @@ -18671,16 +19536,15 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.5, babel-plugin-polyfill-corejs2@npm:^0.4.6": - version: 0.4.6 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.6" +"babel-plugin-polyfill-corejs3@npm:^0.10.1, babel-plugin-polyfill-corejs3@npm:^0.10.4": + version: 0.10.4 + resolution: "babel-plugin-polyfill-corejs3@npm:0.10.4" dependencies: - "@babel/compat-data": "npm:^7.22.6" - "@babel/helper-define-polyfill-provider": "npm:^0.4.3" - semver: "npm:^6.3.1" + "@babel/helper-define-polyfill-provider": "npm:^0.6.1" + core-js-compat: "npm:^3.36.1" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/736b1bb8e570be029f941a374c769972af870c96b5c324a5387c6b6994aabdad045ce560c530038c8626f02ec70f711ad7445f2572c32ba81fa0e13402cc23f8 + checksum: 10/a69ed5a95bb55e9b7ea37307d56113f7e24054d479c15de6d50fa61388b5334bed1f9b6414cde6c575fa910a4de4d1ab4f2d22720967d57c4fec9d1b8f61b355 languageName: node linkType: hard @@ -18696,19 +19560,7 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.8.3, babel-plugin-polyfill-corejs3@npm:^0.8.5": - version: 0.8.5 - resolution: "babel-plugin-polyfill-corejs3@npm:0.8.5" - dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.4.3" - core-js-compat: "npm:^3.32.2" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/5c2ac3615bd064f294a0b36bf6a1939995ec510173602e317fb18b1c015d31f46e2dd885faa3376e4da22785a515e5ba37e069f0008e5eea830d2fe3b0e66a27 - languageName: node - linkType: hard - -"babel-plugin-polyfill-regenerator@npm:^0.5.1, babel-plugin-polyfill-regenerator@npm:^0.5.2": +"babel-plugin-polyfill-regenerator@npm:^0.5.1": version: 0.5.2 resolution: "babel-plugin-polyfill-regenerator@npm:0.5.2" dependencies: @@ -18719,14 +19571,14 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-regenerator@npm:^0.5.3": - version: 0.5.3 - resolution: "babel-plugin-polyfill-regenerator@npm:0.5.3" +"babel-plugin-polyfill-regenerator@npm:^0.6.1": + version: 0.6.2 + resolution: "babel-plugin-polyfill-regenerator@npm:0.6.2" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.4.3" + "@babel/helper-define-polyfill-provider": "npm:^0.6.2" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/2bb546582cda1870d19e646a7183baeb2cccd56e0ef3e4eaeabd28e120daf17cb87399194a9ccdcf32506bcaa68d23e73440fc8ab990a7a0f8c5a77c12d5d4bc + checksum: 10/150233571072b6b3dfe946242da39cba8587b7f908d1c006f7545fc88b0e3c3018d445739beb61e7a75835f0c2751dbe884a94ff9b245ec42369d9267e0e1b3f languageName: node linkType: hard @@ -18916,14 +19768,15 @@ __metadata: linkType: hard "bfj@npm:^7.0.2": - version: 7.0.2 - resolution: "bfj@npm:7.0.2" + version: 7.1.0 + resolution: "bfj@npm:7.1.0" dependencies: - bluebird: "npm:^3.5.5" - check-types: "npm:^11.1.1" + bluebird: "npm:^3.7.2" + check-types: "npm:^11.2.3" hoopy: "npm:^0.1.4" + jsonpath: "npm:^1.1.1" tryer: "npm:^1.0.1" - checksum: 10/e1040fe6aec2afeb6f6c5231bbbc055616fa99c23c5249c7d20a2919507a69d8fd4d82d2245eca5ee08cbfcd3e70ce817328b8a20acda69af4638f1c11343bc7 + checksum: 10/efe4ca2ce43ef279c0ced8538d7de452bae6d8a552c5a72561c66aa6983aa8e448202af848b63518562750bddbb13af20b026c87633324c38499a044ec965eab languageName: node linkType: hard @@ -19075,7 +19928,7 @@ __metadata: languageName: node linkType: hard -"bluebird@npm:3.7.2, bluebird@npm:^3.5.0, bluebird@npm:^3.5.2, bluebird@npm:^3.5.5": +"bluebird@npm:3.7.2, bluebird@npm:^3.5.0, bluebird@npm:^3.5.2, bluebird@npm:^3.7.2": version: 3.7.2 resolution: "bluebird@npm:3.7.2" checksum: 10/007c7bad22c5d799c8dd49c85b47d012a1fe3045be57447721e6afbd1d5be43237af1db62e26cb9b0d9ba812d2e4ca3bac82f6d7e016b6b88de06ee25ceb96e7 @@ -19438,17 +20291,17 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.0.0, browserslist@npm:^4.18.1, browserslist@npm:^4.21.4, browserslist@npm:^4.22.1": - version: 4.22.1 - resolution: "browserslist@npm:4.22.1" +"browserslist@npm:^4.0.0, browserslist@npm:^4.18.1, browserslist@npm:^4.21.4, browserslist@npm:^4.23.0": + version: 4.23.0 + resolution: "browserslist@npm:4.23.0" dependencies: - caniuse-lite: "npm:^1.0.30001541" - electron-to-chromium: "npm:^1.4.535" - node-releases: "npm:^2.0.13" + caniuse-lite: "npm:^1.0.30001587" + electron-to-chromium: "npm:^1.4.668" + node-releases: "npm:^2.0.14" update-browserslist-db: "npm:^1.0.13" bin: browserslist: cli.js - checksum: 10/4a515168e0589c7b1ccbf13a93116ce0418cc5e65d228ec036022cf0e08773fdfb732e2abbf1e1188b96d19ecd4dd707504e75b6d393cba2782fc7d6a7fdefe8 + checksum: 10/496c3862df74565dd942b4ae65f502c575cbeba1fa4a3894dad7aa3b16130dc3033bc502d8848147f7b625154a284708253d9598bcdbef5a1e34cf11dc7bad8e languageName: node linkType: hard @@ -19978,7 +20831,7 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.4, call-bind@npm:^1.0.5": +"call-bind@npm:^1.0.5": version: 1.0.5 resolution: "call-bind@npm:1.0.5" dependencies: @@ -20147,10 +21000,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001520": - version: 1.0.30001524 - resolution: "caniuse-lite@npm:1.0.30001524" - checksum: 10/381e0bbaeb2a60f1fcd10c17d233c17826a2af933dfc68fa8e315c6ae08b6b56d316e7fa07b039912aac8d8b2b07fb8188edbbdd29dffacb3860e0013548c445 +"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001587, caniuse-lite@npm:^1.0.30001599": + version: 1.0.30001625 + resolution: "caniuse-lite@npm:1.0.30001625" + checksum: 10/583a310a4dca7ec8339bd959756259af441525a86fe6b799b9c6fc202a60ade530ad622962d83fc03cb1a759fd56eed1f255301239884e8ea5db22bcb7da9fa0 languageName: node linkType: hard @@ -20182,13 +21035,6 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001541": - version: 1.0.30001549 - resolution: "caniuse-lite@npm:1.0.30001549" - checksum: 10/515ea123e5249075566a602e2c6a3239e16283d3cd4b78daf4fa86569c450ea6eec8a1c2d2cc33e3d554fa37b3a203306dc8423fee635ec04a86b2a9164dbbf2 - languageName: node - linkType: hard - "caniuse-lite@npm:^1.0.30001565": version: 1.0.30001579 resolution: "caniuse-lite@npm:1.0.30001579" @@ -20419,10 +21265,10 @@ __metadata: languageName: node linkType: hard -"check-types@npm:^11.1.1": - version: 11.2.2 - resolution: "check-types@npm:11.2.2" - checksum: 10/a741fc4748d1923b0ff11003aab3fc18eaa8d8b6b3d5e93d21796fc6355f95557b9acc6189fe9e2411efe8724313b3123ba0bc1d728c0db30791c3b8a894a38a +"check-types@npm:^11.2.3": + version: 11.2.3 + resolution: "check-types@npm:11.2.3" + checksum: 10/557e119fa018d7de4e873ada0a6c8917a0f6e0955dc19293396405f5292cfcfe190457557f4cc422e6845d715ef6bbb1d0ab9198ff6735dd96ac50e3ef1e2424 languageName: node linkType: hard @@ -20455,7 +21301,7 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:3.5.3, chokidar@npm:>=3.0.0 <4.0.0, chokidar@npm:^3.0.0, chokidar@npm:^3.3.0, chokidar@npm:^3.4.0, chokidar@npm:^3.4.2, chokidar@npm:^3.5.2, chokidar@npm:^3.5.3": +"chokidar@npm:3.5.3, chokidar@npm:>=3.0.0 <4.0.0, chokidar@npm:^3.0.0, chokidar@npm:^3.3.0, chokidar@npm:^3.4.0, chokidar@npm:^3.5.2, chokidar@npm:^3.5.3": version: 3.5.3 resolution: "chokidar@npm:3.5.3" dependencies: @@ -20474,6 +21320,25 @@ __metadata: languageName: node linkType: hard +"chokidar@npm:^3.4.2": + version: 3.6.0 + resolution: "chokidar@npm:3.6.0" + dependencies: + anymatch: "npm:~3.1.2" + braces: "npm:~3.0.2" + fsevents: "npm:~2.3.2" + glob-parent: "npm:~5.1.2" + is-binary-path: "npm:~2.1.0" + is-glob: "npm:~4.0.1" + normalize-path: "npm:~3.0.0" + readdirp: "npm:~3.6.0" + dependenciesMeta: + fsevents: + optional: true + checksum: 10/c327fb07704443f8d15f7b4a7ce93b2f0bc0e6cea07ec28a7570aa22cd51fcf0379df589403976ea956c369f25aa82d84561947e227cd925902e1751371658df + languageName: node + linkType: hard + "chownr@npm:^1.1.1, chownr@npm:^1.1.4": version: 1.1.4 resolution: "chownr@npm:1.1.4" @@ -20616,11 +21481,11 @@ __metadata: linkType: hard "clean-css@npm:^5.2.2": - version: 5.3.2 - resolution: "clean-css@npm:5.3.2" + version: 5.3.3 + resolution: "clean-css@npm:5.3.3" dependencies: source-map: "npm:~0.6.0" - checksum: 10/efd9efbf400f38a12f99324bad5359bdd153211b048721e4d4ddb629a88865dff3012dca547a14bdd783d78ccf064746e39fd91835546a08e2d811866aff0857 + checksum: 10/2db1ae37b384c8ff0a06a12bfa80f56cc02b4abcaaf340db98c0ae88a61dd67c856653fd8135ace6eb0ec13aeab3089c425d2e4238d2a2ad6b6917e6ccc74729 languageName: node linkType: hard @@ -20848,13 +21713,6 @@ __metadata: languageName: node linkType: hard -"clsx@npm:^2.0.0": - version: 2.0.0 - resolution: "clsx@npm:2.0.0" - checksum: 10/943766d1b02fee3538c871e56638d87f973fbc2d6291ce221215ea436fdecb9be97ad323f411839c2d52c45640c449b1a53fbfe7e8b3d529b4e263308b630c9a - languageName: node - linkType: hard - "clsx@npm:^2.1.0": version: 2.1.0 resolution: "clsx@npm:2.1.0" @@ -21108,14 +21966,7 @@ __metadata: languageName: node linkType: hard -"commander@npm:^9.1.0": - version: 9.2.0 - resolution: "commander@npm:9.2.0" - checksum: 10/db4855c6cd7694d4117e17ec353c7fcc678695e008e12dd5cd45ebaf3fd15607a476df690bf658c7a20a661743580fb0150c825087d773847a24392891e7b4bc - languageName: node - linkType: hard - -"commander@npm:^9.2.0": +"commander@npm:^9.1.0, commander@npm:^9.2.0": version: 9.5.0 resolution: "commander@npm:9.5.0" checksum: 10/41c49b3d0f94a1fbeb0463c85b13f15aa15a9e0b4d5e10a49c0a1d58d4489b549d62262b052ae0aa6cfda53299bee487bfe337825df15e342114dde543f82906 @@ -21390,6 +22241,15 @@ __metadata: languageName: node linkType: hard +"content-disposition@npm:0.5.3": + version: 0.5.3 + resolution: "content-disposition@npm:0.5.3" + dependencies: + safe-buffer: "npm:5.1.2" + checksum: 10/7d0df7855b0202c02d083767258c7baae5cfc2664181de8abccca1b06aa6cc127d15a0f9f45409683a7b58e42af6dcb2ba46201071ce4225ae3980b2a55f58cd + languageName: node + linkType: hard + "content-disposition@npm:0.5.4, content-disposition@npm:^0.5.3": version: 0.5.4 resolution: "content-disposition@npm:0.5.4" @@ -21702,26 +22562,26 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.32.2": - version: 3.33.0 - resolution: "core-js-compat@npm:3.33.0" +"core-js-compat@npm:^3.36.1": + version: 3.37.1 + resolution: "core-js-compat@npm:3.37.1" dependencies: - browserslist: "npm:^4.22.1" - checksum: 10/b1a5f7aab1c6ac0efd86c1412a5b27fb372c4e52c4b8f2c80b05216385125c4de30e4c36e4bcc6bfeec917a56e7736c87fab6a301ff8faaa1ae4acf81643fc9a + browserslist: "npm:^4.23.0" + checksum: 10/30c6fdbd9ff179cc53951814689b8aabec106e5de6cddfa7a7feacc96b66d415b8eebcf5ec8f7c68ef35c552fe7d39edb8b15b1ce0f27379a272295b6e937061 languageName: node linkType: hard "core-js-pure@npm:^3.23.3": - version: 3.32.1 - resolution: "core-js-pure@npm:3.32.1" - checksum: 10/6ebd41c95cf5da8e032f9c9100360196c5e2af8b0c074a6e151c96e6390329814e87ad737bc44566990928d9af73304252112b6c15d3f43784473d0260bbe0f4 + version: 3.37.1 + resolution: "core-js-pure@npm:3.37.1" + checksum: 10/c683d4e46c4e4b9573f471a8229d972f9531a27e718453dfae601f1c104a2c905c3fe4e85ea3db449e364c573ecbe8801a08a3ffe88177df8dd8f8ea9af2cf81 languageName: node linkType: hard "core-js@npm:^3.19.2": - version: 3.32.1 - resolution: "core-js@npm:3.32.1" - checksum: 10/8d76615ef67f2cf8d2af05e4ec8e5663c941a461c97ff3f53eca6b4ab6fb765ef1b88509827b510963044aa122153f25c3073f3de7fcad06cc1b3f6c06a725c3 + version: 3.37.1 + resolution: "core-js@npm:3.37.1" + checksum: 10/25d6bd15fcc6ffd2a0ec0be57a78ff3358b3e1fdffdb6800fc93dcfdb3854037aee41f3d101aed8c37905d107daf98218b3e7ee95cec383710d2a66a5d9e541b languageName: node linkType: hard @@ -22259,7 +23119,7 @@ __metadata: languageName: node linkType: hard -"css-loader@npm:6.8.1, css-loader@npm:^6.5.1": +"css-loader@npm:6.8.1": version: 6.8.1 resolution: "css-loader@npm:6.8.1" dependencies: @@ -22277,6 +23137,30 @@ __metadata: languageName: node linkType: hard +"css-loader@npm:^6.5.1": + version: 6.11.0 + resolution: "css-loader@npm:6.11.0" + dependencies: + icss-utils: "npm:^5.1.0" + postcss: "npm:^8.4.33" + postcss-modules-extract-imports: "npm:^3.1.0" + postcss-modules-local-by-default: "npm:^4.0.5" + postcss-modules-scope: "npm:^3.2.0" + postcss-modules-values: "npm:^4.0.0" + postcss-value-parser: "npm:^4.2.0" + semver: "npm:^7.5.4" + peerDependencies: + "@rspack/core": 0.x || 1.x + webpack: ^5.0.0 + peerDependenciesMeta: + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 10/9e3665509f6786d46683de5c5f5c4bdd4aa62396b4017b41dbbb41ea5ada4012c80ee1e3302b79b504bc24da7fa69e3552d99006cecc953e0d9eef4a3053b929 + languageName: node + linkType: hard + "css-minimizer-webpack-plugin@npm:^3.2.0": version: 3.4.1 resolution: "css-minimizer-webpack-plugin@npm:3.4.1" @@ -22400,9 +23284,9 @@ __metadata: linkType: hard "cssdb@npm:^7.1.0": - version: 7.7.1 - resolution: "cssdb@npm:7.7.1" - checksum: 10/2e24443084b9d38bcceae91ed6d2d47f2c6726ea55e653f258b880b509f1ad66d63a013385e43dcd5189899904a918b7b31ef236d831c1d7f3707c9441a1d711 + version: 7.11.2 + resolution: "cssdb@npm:7.11.2" + checksum: 10/234e15ff8b09083d67b4fb1d97dc619f5a328bc559f9633eb312dc4020d9af0a1a57b5813de0868af0e93d2d327e9f684243a9933e1ac863d21e291c2ea6ebc9 languageName: node linkType: hard @@ -22522,13 +23406,6 @@ __metadata: languageName: node linkType: hard -"csstype@npm:^3.1.2": - version: 3.1.2 - resolution: "csstype@npm:3.1.2" - checksum: 10/1f39c541e9acd9562996d88bc9fb62d1cb234786ef11ed275567d4b2bd82e1ceacde25debc8de3d3b4871ae02c2933fa02614004c97190711caebad6347debc2 - languageName: node - linkType: hard - "csstype@npm:^3.1.3": version: 3.1.3 resolution: "csstype@npm:3.1.3" @@ -22618,6 +23495,39 @@ __metadata: languageName: node linkType: hard +"data-view-buffer@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-buffer@npm:1.0.1" + dependencies: + call-bind: "npm:^1.0.6" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.1" + checksum: 10/5919a39a18ee919573336158fd162fdf8ada1bc23a139f28543fd45fac48e0ea4a3ad3bfde91de124d4106e65c4a7525f6a84c20ba0797ec890a77a96d13a82a + languageName: node + linkType: hard + +"data-view-byte-length@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-byte-length@npm:1.0.1" + dependencies: + call-bind: "npm:^1.0.7" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.1" + checksum: 10/f33c65e58d8d0432ad79761f2e8a579818d724b5dc6dc4e700489b762d963ab30873c0f1c37d8f2ed12ef51c706d1195f64422856d25f067457aeec50cc40aac + languageName: node + linkType: hard + +"data-view-byte-offset@npm:^1.0.0": + version: 1.0.0 + resolution: "data-view-byte-offset@npm:1.0.0" + dependencies: + call-bind: "npm:^1.0.6" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.1" + checksum: 10/96f34f151bf02affb7b9f98762fb7aca1dd5f4553cb57b80bce750ca609c15d33ca659568ef1d422f7e35680736cbccb893a3d4b012760c758c1446bbdc4c6db + languageName: node + linkType: hard + "dataloader@npm:2.1.0": version: 2.1.0 resolution: "dataloader@npm:2.1.0" @@ -23036,7 +23946,7 @@ __metadata: languageName: node linkType: hard -"define-data-property@npm:^1.1.2": +"define-data-property@npm:^1.1.2, define-data-property@npm:^1.1.4": version: 1.1.4 resolution: "define-data-property@npm:1.1.4" dependencies: @@ -23270,6 +24180,13 @@ __metadata: languageName: node linkType: hard +"destroy@npm:~1.0.4": + version: 1.0.4 + resolution: "destroy@npm:1.0.4" + checksum: 10/da9ab4961dc61677c709da0c25ef01733042614453924d65636a7db37308fef8a24cd1e07172e61173d471ca175371295fbc984b0af5b2b4ff47cd57bd784c03 + languageName: node + linkType: hard + "detect-file@npm:^1.0.0": version: 1.0.0 resolution: "detect-file@npm:1.0.0" @@ -23853,13 +24770,13 @@ __metadata: linkType: hard "ejs@npm:^3.1.6": - version: 3.1.9 - resolution: "ejs@npm:3.1.9" + version: 3.1.10 + resolution: "ejs@npm:3.1.10" dependencies: jake: "npm:^10.8.5" bin: ejs: bin/cli.js - checksum: 10/71f56d37540d2c2d71701f0116710c676f75314a3e997ef8b83515d5d4d2b111c5a72725377caeecb928671bacb84a0d38135f345904812e989847057d59f21a + checksum: 10/a9cb7d7cd13b7b1cd0be5c4788e44dd10d92f7285d2f65b942f33e127230c054f99a42db4d99f766d8dbc6c57e94799593ee66a14efd7c8dd70c4812bf6aa384 languageName: node linkType: hard @@ -23900,13 +24817,6 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.535": - version: 1.4.556 - resolution: "electron-to-chromium@npm:1.4.556" - checksum: 10/b5edf73fa95d5a9d2dceb66c77e5893656d2af938065416dc7d3d5dbb91d6e661a314d069d10cdc4f78adbb8c74eea1a0d6d9012c36415d4418046c6f407cbef - languageName: node - linkType: hard - "electron-to-chromium@npm:^1.4.601": version: 1.4.640 resolution: "electron-to-chromium@npm:1.4.640" @@ -23914,6 +24824,13 @@ __metadata: languageName: node linkType: hard +"electron-to-chromium@npm:^1.4.668": + version: 1.4.783 + resolution: "electron-to-chromium@npm:1.4.783" + checksum: 10/d9ce717bb320d4dc5886fd314e35e7bf0e2b025504d9909b371b5485712ee2eb453c8dbc133d5adbd59dac0e7e84d01f33c500c1707b777ea988afd4b6b94f50 + languageName: node + linkType: hard + "elliptic@npm:6.5.4, elliptic@npm:^6.4.0, elliptic@npm:^6.4.1, elliptic@npm:^6.5.2, elliptic@npm:^6.5.3, elliptic@npm:^6.5.4": version: 6.5.4 resolution: "elliptic@npm:6.5.4" @@ -24112,6 +25029,16 @@ __metadata: languageName: node linkType: hard +"enhanced-resolve@npm:^5.16.0": + version: 5.16.1 + resolution: "enhanced-resolve@npm:5.16.1" + dependencies: + graceful-fs: "npm:^4.2.4" + tapable: "npm:^2.2.0" + checksum: 10/1c44474437ec52d938ee0776d5883d5fec8fc645bccbebf6eb58229f3223c111bc1f5cb94222949a5a4565e7a2d7c34f03a0f7e97c10d6cd800e7a46c95e3aec + languageName: node + linkType: hard + "enquirer@npm:2.3.6, enquirer@npm:^2.3.0, enquirer@npm:^2.3.6": version: 2.3.6 resolution: "enquirer@npm:2.3.6" @@ -24201,50 +25128,57 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.17.2, es-abstract@npm:^1.22.1": - version: 1.22.1 - resolution: "es-abstract@npm:1.22.1" +"es-abstract@npm:^1.17.2, es-abstract@npm:^1.23.0, es-abstract@npm:^1.23.1, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3": + version: 1.23.3 + resolution: "es-abstract@npm:1.23.3" dependencies: - array-buffer-byte-length: "npm:^1.0.0" - arraybuffer.prototype.slice: "npm:^1.0.1" - available-typed-arrays: "npm:^1.0.5" - call-bind: "npm:^1.0.2" - es-set-tostringtag: "npm:^2.0.1" + array-buffer-byte-length: "npm:^1.0.1" + arraybuffer.prototype.slice: "npm:^1.0.3" + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.7" + data-view-buffer: "npm:^1.0.1" + data-view-byte-length: "npm:^1.0.1" + data-view-byte-offset: "npm:^1.0.0" + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + es-set-tostringtag: "npm:^2.0.3" es-to-primitive: "npm:^1.2.1" - function.prototype.name: "npm:^1.1.5" - get-intrinsic: "npm:^1.2.1" - get-symbol-description: "npm:^1.0.0" + function.prototype.name: "npm:^1.1.6" + get-intrinsic: "npm:^1.2.4" + get-symbol-description: "npm:^1.0.2" globalthis: "npm:^1.0.3" gopd: "npm:^1.0.1" - has: "npm:^1.0.3" - has-property-descriptors: "npm:^1.0.0" - has-proto: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.2" + has-proto: "npm:^1.0.3" has-symbols: "npm:^1.0.3" - internal-slot: "npm:^1.0.5" - is-array-buffer: "npm:^3.0.2" + hasown: "npm:^2.0.2" + internal-slot: "npm:^1.0.7" + is-array-buffer: "npm:^3.0.4" is-callable: "npm:^1.2.7" - is-negative-zero: "npm:^2.0.2" + is-data-view: "npm:^1.0.1" + is-negative-zero: "npm:^2.0.3" is-regex: "npm:^1.1.4" - is-shared-array-buffer: "npm:^1.0.2" + is-shared-array-buffer: "npm:^1.0.3" is-string: "npm:^1.0.7" - is-typed-array: "npm:^1.1.10" + is-typed-array: "npm:^1.1.13" is-weakref: "npm:^1.0.2" - object-inspect: "npm:^1.12.3" + object-inspect: "npm:^1.13.1" object-keys: "npm:^1.1.1" - object.assign: "npm:^4.1.4" - regexp.prototype.flags: "npm:^1.5.0" - safe-array-concat: "npm:^1.0.0" - safe-regex-test: "npm:^1.0.0" - string.prototype.trim: "npm:^1.2.7" - string.prototype.trimend: "npm:^1.0.6" - string.prototype.trimstart: "npm:^1.0.6" - typed-array-buffer: "npm:^1.0.0" - typed-array-byte-length: "npm:^1.0.0" - typed-array-byte-offset: "npm:^1.0.0" - typed-array-length: "npm:^1.0.4" + object.assign: "npm:^4.1.5" + regexp.prototype.flags: "npm:^1.5.2" + safe-array-concat: "npm:^1.1.2" + safe-regex-test: "npm:^1.0.3" + string.prototype.trim: "npm:^1.2.9" + string.prototype.trimend: "npm:^1.0.8" + string.prototype.trimstart: "npm:^1.0.8" + typed-array-buffer: "npm:^1.0.2" + typed-array-byte-length: "npm:^1.0.1" + typed-array-byte-offset: "npm:^1.0.2" + typed-array-length: "npm:^1.0.6" unbox-primitive: "npm:^1.0.2" - which-typed-array: "npm:^1.1.10" - checksum: 10/bd6c243a128ea1cb97cdd11c433a1f712b607b66bb2d40b42e4a4e4c746e679d3c168b59614fefed4bc3b0d7abc106ad202e8f417739371a151b9189d75af72a + which-typed-array: "npm:^1.1.15" + checksum: 10/2da795a6a1ac5fc2c452799a409acc2e3692e06dc6440440b076908617188899caa562154d77263e3053bcd9389a07baa978ab10ac3b46acc399bd0c77be04cb languageName: node linkType: hard @@ -24276,7 +25210,7 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.20.4, es-abstract@npm:^1.21.2": +"es-abstract@npm:^1.20.4": version: 1.21.2 resolution: "es-abstract@npm:1.21.2" dependencies: @@ -24318,6 +25252,53 @@ __metadata: languageName: node linkType: hard +"es-abstract@npm:^1.22.1": + version: 1.22.1 + resolution: "es-abstract@npm:1.22.1" + dependencies: + array-buffer-byte-length: "npm:^1.0.0" + arraybuffer.prototype.slice: "npm:^1.0.1" + available-typed-arrays: "npm:^1.0.5" + call-bind: "npm:^1.0.2" + es-set-tostringtag: "npm:^2.0.1" + es-to-primitive: "npm:^1.2.1" + function.prototype.name: "npm:^1.1.5" + get-intrinsic: "npm:^1.2.1" + get-symbol-description: "npm:^1.0.0" + globalthis: "npm:^1.0.3" + gopd: "npm:^1.0.1" + has: "npm:^1.0.3" + has-property-descriptors: "npm:^1.0.0" + has-proto: "npm:^1.0.1" + has-symbols: "npm:^1.0.3" + internal-slot: "npm:^1.0.5" + is-array-buffer: "npm:^3.0.2" + is-callable: "npm:^1.2.7" + is-negative-zero: "npm:^2.0.2" + is-regex: "npm:^1.1.4" + is-shared-array-buffer: "npm:^1.0.2" + is-string: "npm:^1.0.7" + is-typed-array: "npm:^1.1.10" + is-weakref: "npm:^1.0.2" + object-inspect: "npm:^1.12.3" + object-keys: "npm:^1.1.1" + object.assign: "npm:^4.1.4" + regexp.prototype.flags: "npm:^1.5.0" + safe-array-concat: "npm:^1.0.0" + safe-regex-test: "npm:^1.0.0" + string.prototype.trim: "npm:^1.2.7" + string.prototype.trimend: "npm:^1.0.6" + string.prototype.trimstart: "npm:^1.0.6" + typed-array-buffer: "npm:^1.0.0" + typed-array-byte-length: "npm:^1.0.0" + typed-array-byte-offset: "npm:^1.0.0" + typed-array-length: "npm:^1.0.4" + unbox-primitive: "npm:^1.0.2" + which-typed-array: "npm:^1.1.10" + checksum: 10/bd6c243a128ea1cb97cdd11c433a1f712b607b66bb2d40b42e4a4e4c746e679d3c168b59614fefed4bc3b0d7abc106ad202e8f417739371a151b9189d75af72a + languageName: node + linkType: hard + "es-abstract@npm:^1.22.3": version: 1.22.5 resolution: "es-abstract@npm:1.22.5" @@ -24383,7 +25364,7 @@ __metadata: languageName: node linkType: hard -"es-errors@npm:^1.0.0, es-errors@npm:^1.2.1, es-errors@npm:^1.3.0": +"es-errors@npm:^1.0.0, es-errors@npm:^1.1.0, es-errors@npm:^1.2.1, es-errors@npm:^1.3.0": version: 1.3.0 resolution: "es-errors@npm:1.3.0" checksum: 10/96e65d640156f91b707517e8cdc454dd7d47c32833aa3e85d79f24f9eb7ea85f39b63e36216ef0114996581969b59fe609a94e30316b08f5f4df1d44134cf8d5 @@ -24407,25 +25388,25 @@ __metadata: languageName: node linkType: hard -"es-iterator-helpers@npm:^1.0.12": - version: 1.0.15 - resolution: "es-iterator-helpers@npm:1.0.15" +"es-iterator-helpers@npm:^1.0.15, es-iterator-helpers@npm:^1.0.19": + version: 1.0.19 + resolution: "es-iterator-helpers@npm:1.0.19" dependencies: - asynciterator.prototype: "npm:^1.0.0" - call-bind: "npm:^1.0.2" + call-bind: "npm:^1.0.7" define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.22.1" - es-set-tostringtag: "npm:^2.0.1" - function-bind: "npm:^1.1.1" - get-intrinsic: "npm:^1.2.1" + es-abstract: "npm:^1.23.3" + es-errors: "npm:^1.3.0" + es-set-tostringtag: "npm:^2.0.3" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" globalthis: "npm:^1.0.3" - has-property-descriptors: "npm:^1.0.0" - has-proto: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.2" + has-proto: "npm:^1.0.3" has-symbols: "npm:^1.0.3" - internal-slot: "npm:^1.0.5" + internal-slot: "npm:^1.0.7" iterator.prototype: "npm:^1.1.2" - safe-array-concat: "npm:^1.0.1" - checksum: 10/78535c00c49d81df603e650886d3806f3cd8d288e2c07703cfb145725753a3d2df19bff9feeb14cd1baed02252d1f85c4bbc922c8db02841722ab3ec02e78339 + safe-array-concat: "npm:^1.1.2" + checksum: 10/980a8081cf6798fe17fcea193b0448d784d72d76aca7240b10813207c67e3dc0d8a23992263870c4fc291da5a946935b0c56dec4fa1a9de8fee0165e4fa1fc58 languageName: node linkType: hard @@ -24443,6 +25424,15 @@ __metadata: languageName: node linkType: hard +"es-object-atoms@npm:^1.0.0": + version: 1.0.0 + resolution: "es-object-atoms@npm:1.0.0" + dependencies: + es-errors: "npm:^1.3.0" + checksum: 10/f8910cf477e53c0615f685c5c96210591841850871b81924fcf256bfbaa68c254457d994a4308c60d15b20805e7f61ce6abc669375e01a5349391a8c1767584f + languageName: node + linkType: hard + "es-set-tostringtag@npm:^2.0.1": version: 2.0.1 resolution: "es-set-tostringtag@npm:2.0.1" @@ -24839,7 +25829,7 @@ __metadata: languageName: node linkType: hard -"escodegen@npm:^1.14.1": +"escodegen@npm:^1.14.1, escodegen@npm:^1.8.1": version: 1.14.3 resolution: "escodegen@npm:1.14.3" dependencies: @@ -24923,7 +25913,7 @@ __metadata: languageName: node linkType: hard -"eslint-import-resolver-node@npm:^0.3.7, eslint-import-resolver-node@npm:^0.3.9": +"eslint-import-resolver-node@npm:^0.3.9": version: 0.3.9 resolution: "eslint-import-resolver-node@npm:0.3.9" dependencies: @@ -24972,7 +25962,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-import@npm:2.29.1": +"eslint-plugin-import@npm:2.29.1, eslint-plugin-import@npm:^2.25.3": version: 2.29.1 resolution: "eslint-plugin-import@npm:2.29.1" dependencies: @@ -24999,33 +25989,6 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-import@npm:^2.25.3": - version: 2.28.1 - resolution: "eslint-plugin-import@npm:2.28.1" - dependencies: - array-includes: "npm:^3.1.6" - array.prototype.findlastindex: "npm:^1.2.2" - array.prototype.flat: "npm:^1.3.1" - array.prototype.flatmap: "npm:^1.3.1" - debug: "npm:^3.2.7" - doctrine: "npm:^2.1.0" - eslint-import-resolver-node: "npm:^0.3.7" - eslint-module-utils: "npm:^2.8.0" - has: "npm:^1.0.3" - is-core-module: "npm:^2.13.0" - is-glob: "npm:^4.0.3" - minimatch: "npm:^3.1.2" - object.fromentries: "npm:^2.0.6" - object.groupby: "npm:^1.0.0" - object.values: "npm:^1.1.6" - semver: "npm:^6.3.1" - tsconfig-paths: "npm:^3.14.2" - peerDependencies: - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - checksum: 10/707dc97f06b12b0f3f91d5248dcea91bcd6a72c1168249a3ba177dd1ab6f31de9d5db829705236207a6ae79ad99a7a03efdfddb4a703da3a85530f9cc7401b2f - languageName: node - linkType: hard - "eslint-plugin-jest@npm:^25.3.0": version: 25.7.0 resolution: "eslint-plugin-jest@npm:25.7.0" @@ -25044,28 +26007,28 @@ __metadata: linkType: hard "eslint-plugin-jsx-a11y@npm:^6.5.1": - version: 6.7.1 - resolution: "eslint-plugin-jsx-a11y@npm:6.7.1" + version: 6.8.0 + resolution: "eslint-plugin-jsx-a11y@npm:6.8.0" dependencies: - "@babel/runtime": "npm:^7.20.7" - aria-query: "npm:^5.1.3" - array-includes: "npm:^3.1.6" - array.prototype.flatmap: "npm:^1.3.1" - ast-types-flow: "npm:^0.0.7" - axe-core: "npm:^4.6.2" - axobject-query: "npm:^3.1.1" + "@babel/runtime": "npm:^7.23.2" + aria-query: "npm:^5.3.0" + array-includes: "npm:^3.1.7" + array.prototype.flatmap: "npm:^1.3.2" + ast-types-flow: "npm:^0.0.8" + axe-core: "npm:=4.7.0" + axobject-query: "npm:^3.2.1" damerau-levenshtein: "npm:^1.0.8" emoji-regex: "npm:^9.2.2" - has: "npm:^1.0.3" - jsx-ast-utils: "npm:^3.3.3" - language-tags: "npm:=1.0.5" + es-iterator-helpers: "npm:^1.0.15" + hasown: "npm:^2.0.0" + jsx-ast-utils: "npm:^3.3.5" + language-tags: "npm:^1.0.9" minimatch: "npm:^3.1.2" - object.entries: "npm:^1.1.6" - object.fromentries: "npm:^2.0.6" - semver: "npm:^6.3.0" + object.entries: "npm:^1.1.7" + object.fromentries: "npm:^2.0.7" peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: 10/b7eb451304dc27c9552649a716be1de3b5d577f39e53f6da6a2dac084b84b349b0224be3020439f99c2b3bf417a13c5591326f1ce6af8d74f1cb5d5d95c4222b + checksum: 10/7a8e4498531a43d988ce2f12502a3f5ce96eacfec13f956cf927f24bb041b724fb7fc0f0306ea19d143bfc79e138bf25e25acca0822847206ac6bf5ce095e846 languageName: node linkType: hard @@ -25115,37 +26078,39 @@ __metadata: linkType: hard "eslint-plugin-react-hooks@npm:^4.3.0": - version: 4.6.0 - resolution: "eslint-plugin-react-hooks@npm:4.6.0" + version: 4.6.2 + resolution: "eslint-plugin-react-hooks@npm:4.6.2" peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - checksum: 10/3c63134e056a6d98d66e2c475c81f904169db817e89316d14e36269919e31f4876a2588aa0e466ec8ef160465169c627fe823bfdaae7e213946584e4a165a3ac + checksum: 10/5a0680941f34e70cf505bcb6082df31a3e445d193ee95a88ff3483041eb944f4cefdaf7e81b0eb1feb4eeceee8c7c6ddb8a2a6e8c4c0388514a42e16ac7b7a69 languageName: node linkType: hard "eslint-plugin-react@npm:^7.27.1": - version: 7.33.2 - resolution: "eslint-plugin-react@npm:7.33.2" + version: 7.34.2 + resolution: "eslint-plugin-react@npm:7.34.2" dependencies: - array-includes: "npm:^3.1.6" - array.prototype.flatmap: "npm:^1.3.1" - array.prototype.tosorted: "npm:^1.1.1" + array-includes: "npm:^3.1.8" + array.prototype.findlast: "npm:^1.2.5" + array.prototype.flatmap: "npm:^1.3.2" + array.prototype.toreversed: "npm:^1.1.2" + array.prototype.tosorted: "npm:^1.1.3" doctrine: "npm:^2.1.0" - es-iterator-helpers: "npm:^1.0.12" + es-iterator-helpers: "npm:^1.0.19" estraverse: "npm:^5.3.0" jsx-ast-utils: "npm:^2.4.1 || ^3.0.0" minimatch: "npm:^3.1.2" - object.entries: "npm:^1.1.6" - object.fromentries: "npm:^2.0.6" - object.hasown: "npm:^1.1.2" - object.values: "npm:^1.1.6" + object.entries: "npm:^1.1.8" + object.fromentries: "npm:^2.0.8" + object.hasown: "npm:^1.1.4" + object.values: "npm:^1.2.0" prop-types: "npm:^15.8.1" - resolve: "npm:^2.0.0-next.4" + resolve: "npm:^2.0.0-next.5" semver: "npm:^6.3.1" - string.prototype.matchall: "npm:^4.0.8" + string.prototype.matchall: "npm:^4.0.11" peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: 10/cb8c5dd5859cace330e24b7d74b9c652c0d93ef1d87957261fe1ac2975c27c918d0d5dc607f25aba4972ce74d04456f4f93883a16ac10cd598680d047fc3495d + checksum: 10/6efccc29ad09a45fe1764089199e87b69b63a40152dd40cbbece639c6be4cda4306b58b15ba9b449f639705eb9a08ddc51b58308077c0394537769c455f976b7 languageName: node linkType: hard @@ -25252,7 +26217,7 @@ __metadata: languageName: node linkType: hard -"eslint@npm:8.57.0": +"eslint@npm:8.57.0, eslint@npm:^8.3.0": version: 8.57.0 resolution: "eslint@npm:8.57.0" dependencies: @@ -25348,53 +26313,6 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^8.3.0": - version: 8.48.0 - resolution: "eslint@npm:8.48.0" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.2.0" - "@eslint-community/regexpp": "npm:^4.6.1" - "@eslint/eslintrc": "npm:^2.1.2" - "@eslint/js": "npm:8.48.0" - "@humanwhocodes/config-array": "npm:^0.11.10" - "@humanwhocodes/module-importer": "npm:^1.0.1" - "@nodelib/fs.walk": "npm:^1.2.8" - ajv: "npm:^6.12.4" - chalk: "npm:^4.0.0" - cross-spawn: "npm:^7.0.2" - debug: "npm:^4.3.2" - doctrine: "npm:^3.0.0" - escape-string-regexp: "npm:^4.0.0" - eslint-scope: "npm:^7.2.2" - eslint-visitor-keys: "npm:^3.4.3" - espree: "npm:^9.6.1" - esquery: "npm:^1.4.2" - esutils: "npm:^2.0.2" - fast-deep-equal: "npm:^3.1.3" - file-entry-cache: "npm:^6.0.1" - find-up: "npm:^5.0.0" - glob-parent: "npm:^6.0.2" - globals: "npm:^13.19.0" - graphemer: "npm:^1.4.0" - ignore: "npm:^5.2.0" - imurmurhash: "npm:^0.1.4" - is-glob: "npm:^4.0.0" - is-path-inside: "npm:^3.0.3" - js-yaml: "npm:^4.1.0" - json-stable-stringify-without-jsonify: "npm:^1.0.1" - levn: "npm:^0.4.1" - lodash.merge: "npm:^4.6.2" - minimatch: "npm:^3.1.2" - natural-compare: "npm:^1.4.0" - optionator: "npm:^0.9.3" - strip-ansi: "npm:^6.0.1" - text-table: "npm:^0.2.0" - bin: - eslint: bin/eslint.js - checksum: 10/43ba3a939aa9203b2d98de9aa242262f10dd242eba6f9f72d17cd9ba8a82085441ffa8b93e017aae0561d52d3bcf49fde3afda4d25b4f95ff4e7274dc911474a - languageName: node - linkType: hard - "esm@npm:3.2.25, esm@npm:^3.2.25": version: 3.2.25 resolution: "esm@npm:3.2.25" @@ -25423,6 +26341,16 @@ __metadata: languageName: node linkType: hard +"esprima@npm:1.2.2": + version: 1.2.2 + resolution: "esprima@npm:1.2.2" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: 10/7ed9274abb1fed861354239f0da8fa3ec6592617ad0fd2aab16b0beb0425137c46f05c82faa0de89b3bb3d704054815c2657658c7e221b1fb550e88c237eefd2 + languageName: node + linkType: hard + "esprima@npm:^4.0.0, esprima@npm:^4.0.1, esprima@npm:~4.0.0": version: 4.0.1 resolution: "esprima@npm:4.0.1" @@ -26136,6 +27064,44 @@ __metadata: languageName: node linkType: hard +"express@npm:4.17.1": + version: 4.17.1 + resolution: "express@npm:4.17.1" + dependencies: + accepts: "npm:~1.3.7" + array-flatten: "npm:1.1.1" + body-parser: "npm:1.19.0" + content-disposition: "npm:0.5.3" + content-type: "npm:~1.0.4" + cookie: "npm:0.4.0" + cookie-signature: "npm:1.0.6" + debug: "npm:2.6.9" + depd: "npm:~1.1.2" + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + finalhandler: "npm:~1.1.2" + fresh: "npm:0.5.2" + merge-descriptors: "npm:1.0.1" + methods: "npm:~1.1.2" + on-finished: "npm:~2.3.0" + parseurl: "npm:~1.3.3" + path-to-regexp: "npm:0.1.7" + proxy-addr: "npm:~2.0.5" + qs: "npm:6.7.0" + range-parser: "npm:~1.2.1" + safe-buffer: "npm:5.1.2" + send: "npm:0.17.1" + serve-static: "npm:1.14.1" + setprototypeof: "npm:1.1.1" + statuses: "npm:~1.5.0" + type-is: "npm:~1.6.18" + utils-merge: "npm:1.0.1" + vary: "npm:~1.1.2" + checksum: 10/b4a03cdd6a3ca8555057249f8240d8b2d4feb469c8d3edbf94afcc454c0cb73cd108cf4a1b801b978f7e960e420b2597e1efd0480efb9092faa151f38f9576b5 + languageName: node + linkType: hard + "express@npm:4.18.2, express@npm:^4.10.6, express@npm:^4.14.0, express@npm:^4.17.1, express@npm:^4.17.3": version: 4.18.2 resolution: "express@npm:4.18.2" @@ -26490,7 +27456,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:3.3.1, fast-glob@npm:^3.2.12, fast-glob@npm:^3.2.5, fast-glob@npm:^3.3.0": +"fast-glob@npm:3.3.1, fast-glob@npm:^3.2.5, fast-glob@npm:^3.3.0": version: 3.3.1 resolution: "fast-glob@npm:3.3.1" dependencies: @@ -26901,6 +27867,21 @@ __metadata: languageName: node linkType: hard +"finalhandler@npm:~1.1.2": + version: 1.1.2 + resolution: "finalhandler@npm:1.1.2" + dependencies: + debug: "npm:2.6.9" + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + on-finished: "npm:~2.3.0" + parseurl: "npm:~1.3.3" + statuses: "npm:~1.5.0" + unpipe: "npm:~1.0.0" + checksum: 10/351e99a889abf149eb3edb24568586469feeb3019f5eafb9b31e632a5ad886f12a5595a221508245e6a37da69ae866c9fb411eb541a844238e2c900f63ac1576 + languageName: node + linkType: hard + "find-cache-dir@npm:^0.1.1": version: 0.1.1 resolution: "find-cache-dir@npm:0.1.1" @@ -27322,6 +28303,13 @@ __metadata: languageName: node linkType: hard +"fraction.js@npm:^4.3.7": + version: 4.3.7 + resolution: "fraction.js@npm:4.3.7" + checksum: 10/bb5ebcdeeffcdc37b68ead3bdfc244e68de188e0c64e9702197333c72963b95cc798883ad16adc21588088b942bca5b6a6ff4aeb1362d19f6f3b629035dc15f5 + languageName: node + linkType: hard + "fragment-cache@npm:^0.2.1": version: 0.2.1 resolution: "fragment-cache@npm:0.2.1" @@ -29176,6 +30164,15 @@ __metadata: languageName: node linkType: hard +"hasown@npm:^2.0.2": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 10/7898a9c1788b2862cf0f9c345a6bec77ba4a0c0983c7f19d610c382343d4f98fa260686b225dfb1f88393a66679d2ec58ee310c1d6868c081eda7918f32cc70a + languageName: node + linkType: hard + "hdr-histogram-js@npm:^2.0.1": version: 2.0.3 resolution: "hdr-histogram-js@npm:2.0.3" @@ -29335,9 +30332,9 @@ __metadata: linkType: hard "html-entities@npm:^2.1.0": - version: 2.4.0 - resolution: "html-entities@npm:2.4.0" - checksum: 10/646f2f19214bad751e060ceef4df98520654a1d0cd631b55d45504df2f0aaf8a14d8c0a5a4f92b353be298774d856157ac2d04a031d78889c9011892078ca157 + version: 2.5.2 + resolution: "html-entities@npm:2.5.2" + checksum: 10/4ec12ebdf2d5ba8192c68e1aef3c1e4a4f36b29246a0a88464fe278a54517d0196d3489af46a3145c7ecacb4fc5fd50497be19eb713b810acab3f0efcf36fdc2 languageName: node linkType: hard @@ -29373,8 +30370,8 @@ __metadata: linkType: hard "html-webpack-plugin@npm:^5.5.0": - version: 5.5.3 - resolution: "html-webpack-plugin@npm:5.5.3" + version: 5.6.0 + resolution: "html-webpack-plugin@npm:5.6.0" dependencies: "@types/html-minifier-terser": "npm:^6.0.0" html-minifier-terser: "npm:^6.0.2" @@ -29382,8 +30379,14 @@ __metadata: pretty-error: "npm:^4.0.0" tapable: "npm:^2.0.0" peerDependencies: + "@rspack/core": 0.x || 1.x webpack: ^5.20.0 - checksum: 10/01d302a434e3db9f0e2db370f06300fb613de0fb8bdcafd4693e44c2528b8608621e5e7ca5d8302446db3f20c5f8875f1f675926d469b13ebab139954d241055 + peerDependenciesMeta: + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 10/d651f3a88a7c932c72c6a30f0fdd610b49a864a69f1ddb34562c750f1602ea471e27fd8fc32c01adadd484b38fa6b74f055d1ccce26e5f8fcf814ee0d398a121 languageName: node linkType: hard @@ -29489,6 +30492,19 @@ __metadata: languageName: node linkType: hard +"http-errors@npm:~1.7.2": + version: 1.7.3 + resolution: "http-errors@npm:1.7.3" + dependencies: + depd: "npm:~1.1.2" + inherits: "npm:2.0.4" + setprototypeof: "npm:1.1.1" + statuses: "npm:>= 1.5.0 < 2" + toidentifier: "npm:1.0.0" + checksum: 10/157cb95296118e9c37034f04d5c372916db03bcb6b1097caf693fbc9cf85ac881c8cbdf892140acb7ede6cad6a1a3dbf86a8031b2b127dc47bfc0600b3fda8a0 + languageName: node + linkType: hard + "http-https@npm:^1.0.0": version: 1.0.0 resolution: "http-https@npm:1.0.0" @@ -30602,6 +31618,15 @@ __metadata: languageName: node linkType: hard +"is-data-view@npm:^1.0.1": + version: 1.0.1 + resolution: "is-data-view@npm:1.0.1" + dependencies: + is-typed-array: "npm:^1.1.13" + checksum: 10/4ba4562ac2b2ec005fefe48269d6bd0152785458cd253c746154ffb8a8ab506a29d0cfb3b74af87513843776a88e4981ae25c89457bf640a33748eab1a7216b5 + languageName: node + linkType: hard + "is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.5": version: 1.0.5 resolution: "is-date-object@npm:1.0.5" @@ -32859,6 +33884,15 @@ __metadata: languageName: node linkType: hard +"jiti@npm:^1.21.0": + version: 1.21.0 + resolution: "jiti@npm:1.21.0" + bin: + jiti: bin/jiti.js + checksum: 10/005a0239e50381b5c9919f59dbab86128367bd64872f3376dbbde54b6523f41bd134bf22909e2a509e38fd87e1c22125ca255b9b6b53e7df0fedd23f737334cc + languageName: node + linkType: hard + "jmespath@npm:0.15.0": version: 0.15.0 resolution: "jmespath@npm:0.15.0" @@ -33289,6 +34323,17 @@ __metadata: languageName: node linkType: hard +"jsonpath@npm:^1.1.1": + version: 1.1.1 + resolution: "jsonpath@npm:1.1.1" + dependencies: + esprima: "npm:1.2.2" + static-eval: "npm:2.0.2" + underscore: "npm:1.12.1" + checksum: 10/aa6c2fea9c05eeba4a37870cbbcf30c20de5211d0fd967786b6c59b8546c9f80182328ee2428daf989c8d5c6e6bf97fed28eefc790144258b1238707c30706eb + languageName: node + linkType: hard + "jsonpointer@npm:^5.0.0": version: 5.0.1 resolution: "jsonpointer@npm:5.0.1" @@ -33333,7 +34378,7 @@ __metadata: languageName: node linkType: hard -"jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.3": +"jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.5": version: 3.3.5 resolution: "jsx-ast-utils@npm:3.3.5" dependencies: @@ -33709,19 +34754,19 @@ __metadata: languageName: node linkType: hard -"language-subtag-registry@npm:~0.3.2": - version: 0.3.22 - resolution: "language-subtag-registry@npm:0.3.22" - checksum: 10/5591f4abd775d1ab5945355a5ba894327d2d94c900607bdb69aac1bc5bb921dbeeeb5f616df95e8c0ae875501d19c1cfa0e852ece822121e95048deb34f2b4d2 +"language-subtag-registry@npm:^0.3.20": + version: 0.3.23 + resolution: "language-subtag-registry@npm:0.3.23" + checksum: 10/fe13ed74ab9f862db8e5747b98cc9aa08d52a19f85b5cdb4975cd364c8539bd2da3380e4560d2dbbd728ec33dff8a4b4421fcb2e5b1b1bdaa21d16f91a54d0d4 languageName: node linkType: hard -"language-tags@npm:=1.0.5": - version: 1.0.5 - resolution: "language-tags@npm:1.0.5" +"language-tags@npm:^1.0.9": + version: 1.0.9 + resolution: "language-tags@npm:1.0.9" dependencies: - language-subtag-registry: "npm:~0.3.2" - checksum: 10/2161292ddae73ff2f5a15fd2d753b21096b81324337dff4ad78d702c63210d5beb18892cd53a3455ee6e88065807c8e285e82c40503678951d2071d101a473b4 + language-subtag-registry: "npm:^0.3.20" + checksum: 10/d3a7c14b694e67f519153d6df6cb200681648d38d623c3bfa9d6a66a5ec5493628acb88e9df5aceef3cf1902ab263a205e7d59ee4cf1d6bb67e707b83538bd6d languageName: node linkType: hard @@ -34140,9 +35185,9 @@ __metadata: linkType: hard "libphonenumber-js@npm:^1.10.53": - version: 1.11.1 - resolution: "libphonenumber-js@npm:1.11.1" - checksum: 10/ce34fa0c35e5ee95042ee834918e10b01e37e9d95291a2da466458906a454cde0966dacaea98d3e94fa279e0cef9b613c2bbcdbf0bfd22f75e24f496cfc1c534 + version: 1.11.2 + resolution: "libphonenumber-js@npm:1.11.2" + checksum: 10/9fc858151a33bc8cfa89925e6cf99e8e7a349f9b75c7f340e55abbe2063d78db4c6156367de8a934b6dc9efef2accfda36e2d4820bdbe83a3127f2da624c2221 languageName: node linkType: hard @@ -34220,13 +35265,20 @@ __metadata: languageName: node linkType: hard -"lilconfig@npm:^2.0.3, lilconfig@npm:^2.0.5, lilconfig@npm:^2.1.0": +"lilconfig@npm:^2.0.3, lilconfig@npm:^2.1.0": version: 2.1.0 resolution: "lilconfig@npm:2.1.0" checksum: 10/b1314a2e55319013d5e7d7d08be39015829d2764a1eaee130129545d40388499d81b1c31b0f9b3417d4db12775a88008b72ec33dd06e0184cf7503b32ca7cc0b languageName: node linkType: hard +"lilconfig@npm:^3.0.0": + version: 3.1.1 + resolution: "lilconfig@npm:3.1.1" + checksum: 10/c80fbf98ae7d1daf435e16a83fe3c63743b9d92804cac6dc53ee081c7c265663645c3162d8a0d04ff1874f9c07df145519743317dee67843234c6ed279300f83 + languageName: node + linkType: hard + "lines-and-columns@npm:^1.1.6": version: 1.2.4 resolution: "lines-and-columns@npm:1.2.4" @@ -35665,7 +36717,7 @@ __metadata: languageName: node linkType: hard -"mini-css-extract-plugin@npm:2.7.6, mini-css-extract-plugin@npm:^2.4.5": +"mini-css-extract-plugin@npm:2.7.6": version: 2.7.6 resolution: "mini-css-extract-plugin@npm:2.7.6" dependencies: @@ -35676,6 +36728,18 @@ __metadata: languageName: node linkType: hard +"mini-css-extract-plugin@npm:^2.4.5": + version: 2.9.0 + resolution: "mini-css-extract-plugin@npm:2.9.0" + dependencies: + schema-utils: "npm:^4.0.0" + tapable: "npm:^2.2.1" + peerDependencies: + webpack: ^5.0.0 + checksum: 10/4c9ee9c0c6160a64a4884d5a92a1a5c0b68d556cd00f975cf6c8a79b51ac90e6130a37b3832b17d377d0cb1b31c0313c8c023458d4f69e95fe3424a8b43d834f + languageName: node + linkType: hard + "minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": version: 1.0.1 resolution: "minimalistic-assert@npm:1.0.1" @@ -36150,6 +37214,13 @@ __metadata: languageName: node linkType: hard +"ms@npm:2.1.1": + version: 2.1.1 + resolution: "ms@npm:2.1.1" + checksum: 10/0078a23cd916a9a7435c413caa14c57d4b4f6e2470e0ab554b6964163c8a4436448ac7ae020e883685475da6b6796cc396b670f579cb275db288a21e3e57721e + languageName: node + linkType: hard + "ms@npm:2.1.2": version: 2.1.2 resolution: "ms@npm:2.1.2" @@ -37866,25 +38937,14 @@ __metadata: languageName: node linkType: hard -"object.entries@npm:^1.1.6": - version: 1.1.7 - resolution: "object.entries@npm:1.1.7" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - checksum: 10/03f0bd0f23a8626c94429d15abf26ccda7723f08cd26be2c09c72d436765f8c7468605b5476ca58d4a7cec1ec7eca5be496dbd938fd4236b77ed6d05a8680048 - languageName: node - linkType: hard - -"object.fromentries@npm:^2.0.6": - version: 2.0.6 - resolution: "object.fromentries@npm:2.0.6" +"object.entries@npm:^1.1.7, object.entries@npm:^1.1.8": + version: 1.1.8 + resolution: "object.entries@npm:1.1.8" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.4" - es-abstract: "npm:^1.20.4" - checksum: 10/e8b813647cbc6505750cdff8b3978bb341492707a5f1df4129e2d8a904b31692e225eff92481ae5916be3bde3c2eff1d0e8a6730921ca7f4eed60bc15a70cb35 + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10/2301918fbd1ee697cf6ff7cd94f060c738c0a7d92b22fd24c7c250e9b593642c9707ad2c44d339303c1439c5967d8964251cdfc855f7f6ec55db2dd79e8dc2a7 languageName: node linkType: hard @@ -37899,28 +38959,30 @@ __metadata: languageName: node linkType: hard -"object.getownpropertydescriptors@npm:^2.1.0": - version: 2.1.7 - resolution: "object.getownpropertydescriptors@npm:2.1.7" +"object.fromentries@npm:^2.0.8": + version: 2.0.8 + resolution: "object.fromentries@npm:2.0.8" dependencies: - array.prototype.reduce: "npm:^1.0.6" - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - safe-array-concat: "npm:^1.0.0" - checksum: 10/c99e0f66873e7e5a4ffb3b4465ef57d139d2a232b26ea72571ab90069442db39a1b10c0f7ea228c8aab721437f39dbc97a73158bb68b892706a3d18b277a9bc7 + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-object-atoms: "npm:^1.0.0" + checksum: 10/5b2e80f7af1778b885e3d06aeb335dcc86965e39464671adb7167ab06ac3b0f5dd2e637a90d8ebd7426d69c6f135a4753ba3dd7d0fe2a7030cf718dcb910fd92 languageName: node linkType: hard -"object.groupby@npm:^1.0.0": - version: 1.0.0 - resolution: "object.groupby@npm:1.0.0" +"object.getownpropertydescriptors@npm:^2.1.0": + version: 2.1.8 + resolution: "object.getownpropertydescriptors@npm:2.1.8" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.21.2" - get-intrinsic: "npm:^1.2.1" - checksum: 10/8233fa5288744dd6ea22050d96bb3f59c5acf85ab32ed758821ff82f276dda76b1bb1b9220a52432673476dff361a06ddcfff6d7d859135ff3c1c89b8c844b3e + array.prototype.reduce: "npm:^1.0.6" + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-object-atoms: "npm:^1.0.0" + gopd: "npm:^1.0.1" + safe-array-concat: "npm:^1.1.2" + checksum: 10/8c50f52e0d702d30836f3d2772ba02807ca25a5381be6f9470c6d143ee0bad01bce3fff0fedea2bdbc0c9297e4eb7785ffee5739f6a3a7c60fcd622b42f8a9fb languageName: node linkType: hard @@ -37937,13 +38999,14 @@ __metadata: languageName: node linkType: hard -"object.hasown@npm:^1.1.2": - version: 1.1.3 - resolution: "object.hasown@npm:1.1.3" +"object.hasown@npm:^1.1.4": + version: 1.1.4 + resolution: "object.hasown@npm:1.1.4" dependencies: - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - checksum: 10/735679729c25a4e0d3713adf5df9861d862f0453e87ada4d991b75cd4225365dec61a08435e1127f42c9cc1adfc8e952fa5dca75364ebda6539dadf4721dc9c4 + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-object-atoms: "npm:^1.0.0" + checksum: 10/797385577b3ef3c0d19333e03ed34bc7987978ae1ee1245069c9922e17d1128265187f729dc610260d03f8d418af26fcd7919b423793bf0af9099d9f08367d69 languageName: node linkType: hard @@ -37966,7 +39029,18 @@ __metadata: languageName: node linkType: hard -"object.values@npm:^1.1.0, object.values@npm:^1.1.7": +"object.values@npm:^1.1.0, object.values@npm:^1.1.6, object.values@npm:^1.2.0": + version: 1.2.0 + resolution: "object.values@npm:1.2.0" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10/db2e498019c354428c5dd30d02980d920ac365b155fce4dcf63eb9433f98ccf0f72624309e182ce7cc227c95e45d474e1d483418e60de2293dd23fa3ebe34903 + languageName: node + linkType: hard + +"object.values@npm:^1.1.7": version: 1.1.7 resolution: "object.values@npm:1.1.7" dependencies: @@ -37977,17 +39051,6 @@ __metadata: languageName: node linkType: hard -"object.values@npm:^1.1.6": - version: 1.1.6 - resolution: "object.values@npm:1.1.6" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.4" - es-abstract: "npm:^1.20.4" - checksum: 10/adea807c90951df34eb2f5c6a90ab5624e15c71f0b3a3e422db16933c9f4e19551d10649fffcb4adcac01d86d7c14a64bfb500d8f058db5a52976150a917f6eb - languageName: node - linkType: hard - "obliterator@npm:^2.0.0": version: 2.0.2 resolution: "obliterator@npm:2.0.2" @@ -39901,11 +40964,11 @@ __metadata: linkType: hard "postcss-load-config@npm:^4.0.1": - version: 4.0.1 - resolution: "postcss-load-config@npm:4.0.1" + version: 4.0.2 + resolution: "postcss-load-config@npm:4.0.2" dependencies: - lilconfig: "npm:^2.0.5" - yaml: "npm:^2.1.1" + lilconfig: "npm:^3.0.0" + yaml: "npm:^2.3.4" peerDependencies: postcss: ">=8.0.9" ts-node: ">=9.0.0" @@ -39914,7 +40977,7 @@ __metadata: optional: true ts-node: optional: true - checksum: 10/d841565bc3638ae4b6854d3046904e054e76fca0aea5cf3e730b47e171e3e0a041ffc5f9b7348b18ea59c5d1e315944fa657b1cf9c573eecb053117b0d31eb8d + checksum: 10/e2c2ed9b7998a5b123e1ce0c124daf6504b1454c67dcc1c8fdbcc5ffb2597b7de245e3ac34f63afc928d3fd3260b1e36492ebbdb01a9ff63f16b3c8b7b925d1b languageName: node linkType: hard @@ -40047,6 +41110,15 @@ __metadata: languageName: node linkType: hard +"postcss-modules-extract-imports@npm:^3.1.0": + version: 3.1.0 + resolution: "postcss-modules-extract-imports@npm:3.1.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10/00bfd3aff045fc13ded8e3bbfd8dfc73eff9a9708db1b2a132266aef6544c8d2aee7a5d7e021885f6f9bbd5565a9a9ab52990316e21ad9468a2534f87df8e849 + languageName: node + linkType: hard + "postcss-modules-local-by-default@npm:^4.0.3": version: 4.0.3 resolution: "postcss-modules-local-by-default@npm:4.0.3" @@ -40060,6 +41132,19 @@ __metadata: languageName: node linkType: hard +"postcss-modules-local-by-default@npm:^4.0.5": + version: 4.0.5 + resolution: "postcss-modules-local-by-default@npm:4.0.5" + dependencies: + icss-utils: "npm:^5.0.0" + postcss-selector-parser: "npm:^6.0.2" + postcss-value-parser: "npm:^4.1.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10/b08b01aa7f3d1a80bb1a5508ba3a208578fdd2fb6e54e5613fac244a4e014aa7ca639a614859fec93b399e5a6f86938f7690ca60f7e57c4e35b75621d3c07734 + languageName: node + linkType: hard + "postcss-modules-scope@npm:^3.0.0": version: 3.0.0 resolution: "postcss-modules-scope@npm:3.0.0" @@ -40071,6 +41156,17 @@ __metadata: languageName: node linkType: hard +"postcss-modules-scope@npm:^3.2.0": + version: 3.2.0 + resolution: "postcss-modules-scope@npm:3.2.0" + dependencies: + postcss-selector-parser: "npm:^6.0.4" + peerDependencies: + postcss: ^8.1.0 + checksum: 10/17c293ad13355ba456498aa5815ddb7a4a736f7b781d89b294e1602a53b8d0e336131175f82460e290a0d672642f9039540042edc361d9000b682c44e766925b + languageName: node + linkType: hard + "postcss-modules-values@npm:^4.0.0": version: 4.0.0 resolution: "postcss-modules-values@npm:4.0.0" @@ -40394,12 +41490,12 @@ __metadata: linkType: hard "postcss-selector-parser@npm:^6.0.11, postcss-selector-parser@npm:^6.0.5, postcss-selector-parser@npm:^6.0.9": - version: 6.0.13 - resolution: "postcss-selector-parser@npm:6.0.13" + version: 6.1.0 + resolution: "postcss-selector-parser@npm:6.1.0" dependencies: cssesc: "npm:^3.0.0" util-deprecate: "npm:^1.0.2" - checksum: 10/e779aa1f8ca9ee45d562400aac6109a2bccc59559b6e15adec8bc2a71d395ca563a378fd68f6a61963b4ef2ca190e0c0486e6dc6c41d755f3b82dd6e480e6941 + checksum: 10/2f9e5045b8bbe674fed3b79dbcd3daf21f5188cd7baf179beac513710ec3d75a8fc8184a262c3aec1c628ad3fd8bdb29c5d8530f1c9c5a61a18e1980bb000945 languageName: node linkType: hard @@ -41052,7 +42148,7 @@ __metadata: languageName: node linkType: hard -"proxy-addr@npm:^2.0.7, proxy-addr@npm:~2.0.7": +"proxy-addr@npm:^2.0.7, proxy-addr@npm:~2.0.5, proxy-addr@npm:~2.0.7": version: 2.0.7 resolution: "proxy-addr@npm:2.0.7" dependencies: @@ -41510,7 +42606,7 @@ __metadata: languageName: node linkType: hard -"react-dom@npm:18.2.0, react-dom@npm:^18.2.0": +"react-dom@npm:18.2.0": version: 18.2.0 resolution: "react-dom@npm:18.2.0" dependencies: @@ -41522,6 +42618,18 @@ __metadata: languageName: node linkType: hard +"react-dom@npm:^18.2.0": + version: 18.3.1 + resolution: "react-dom@npm:18.3.1" + dependencies: + loose-envify: "npm:^1.1.0" + scheduler: "npm:^0.23.2" + peerDependencies: + react: ^18.3.1 + checksum: 10/3f4b73a3aa083091173b29812b10394dd06f4ac06aff410b74702cfb3aa29d7b0ced208aab92d5272919b612e5cda21aeb1d54191848cf6e46e9e354f3541f81 + languageName: node + linkType: hard + "react-error-overlay@npm:^6.0.11": version: 6.0.11 resolution: "react-error-overlay@npm:6.0.11" @@ -41710,7 +42818,7 @@ __metadata: languageName: node linkType: hard -"react@npm:18.2.0, react@npm:^18.2.0": +"react@npm:18.2.0": version: 18.2.0 resolution: "react@npm:18.2.0" dependencies: @@ -41729,6 +42837,15 @@ __metadata: languageName: node linkType: hard +"react@npm:^18.2.0": + version: 18.3.1 + resolution: "react@npm:18.3.1" + dependencies: + loose-envify: "npm:^1.1.0" + checksum: 10/261137d3f3993eaa2368a83110466fc0e558bc2c7f7ae7ca52d94f03aac945f45146bd85e5f481044db1758a1dbb57879e2fcdd33924e2dde1bdc550ce73f7bf + languageName: node + linkType: hard + "read-cache@npm:^1.0.0": version: 1.0.0 resolution: "read-cache@npm:1.0.0" @@ -42137,16 +43254,17 @@ __metadata: linkType: hard "reflect.getprototypeof@npm:^1.0.4": - version: 1.0.4 - resolution: "reflect.getprototypeof@npm:1.0.4" + version: 1.0.6 + resolution: "reflect.getprototypeof@npm:1.0.6" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - get-intrinsic: "npm:^1.2.1" + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.1" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.4" globalthis: "npm:^1.0.3" which-builtin-type: "npm:^1.1.3" - checksum: 10/52ff881f62a9cb4acdd7f9a8f4ac88234056c4a6b1ed570c249cc085de5c313249b90251d16eb8e58302b82ae697eec19dde16ff62949f6b87f035a3a26dc5df + checksum: 10/518f6457e4bb470c9b317d239c62d4b4a05678b7eae4f1c3f4332fad379b3ea6d2d8999bfad448547fdba8fb77e4725cfe8c6440d0168ff387f16b4f19f759ad languageName: node linkType: hard @@ -42235,18 +43353,7 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.5.1": - version: 1.5.1 - resolution: "regexp.prototype.flags@npm:1.5.1" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - set-function-name: "npm:^2.0.0" - checksum: 10/3fa5610b8e411bbc3a43ddfd13162f3a817beb43155fbd8caa24d4fd0ce2f431a8197541808772a5a06e5946cebfb68464c827827115bde0d11720a92fe2981a - languageName: node - linkType: hard - -"regexp.prototype.flags@npm:^1.5.2": +"regexp.prototype.flags@npm:^1.5.1, regexp.prototype.flags@npm:^1.5.2": version: 1.5.2 resolution: "regexp.prototype.flags@npm:1.5.2" dependencies: @@ -42761,29 +43868,29 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.7, resolve@npm:^1.22.4": - version: 1.22.4 - resolution: "resolve@npm:1.22.4" +"resolve@npm:^1.1.7, resolve@npm:^1.19.0, resolve@npm:^1.22.2, resolve@npm:^1.22.3": + version: 1.22.8 + resolution: "resolve@npm:1.22.8" dependencies: is-core-module: "npm:^2.13.0" path-parse: "npm:^1.0.7" supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 10/5634f87e72888b139a7cb544213504cc0c6dcd82c6f67ce810b4ca6b3367ddb2aeed5f21c9bb6cd8f3115f0b7e6c0980ef25eeb0dcbd188d9590bb5c84d2d253 + checksum: 10/c473506ee01eb45cbcfefb68652ae5759e092e6b0fb64547feadf9736a6394f258fbc6f88e00c5ca36d5477fbb65388b272432a3600fa223062e54333c156753 languageName: node linkType: hard -"resolve@npm:^1.19.0, resolve@npm:^1.22.2, resolve@npm:^1.22.3": - version: 1.22.8 - resolution: "resolve@npm:1.22.8" +"resolve@npm:^1.22.4": + version: 1.22.4 + resolution: "resolve@npm:1.22.4" dependencies: is-core-module: "npm:^2.13.0" path-parse: "npm:^1.0.7" supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 10/c473506ee01eb45cbcfefb68652ae5759e092e6b0fb64547feadf9736a6394f258fbc6f88e00c5ca36d5477fbb65388b272432a3600fa223062e54333c156753 + checksum: 10/5634f87e72888b139a7cb544213504cc0c6dcd82c6f67ce810b4ca6b3367ddb2aeed5f21c9bb6cd8f3115f0b7e6c0980ef25eeb0dcbd188d9590bb5c84d2d253 languageName: node linkType: hard @@ -42800,6 +43907,19 @@ __metadata: languageName: node linkType: hard +"resolve@npm:^2.0.0-next.5": + version: 2.0.0-next.5 + resolution: "resolve@npm:2.0.0-next.5" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10/2d6fd28699f901744368e6f2032b4268b4c7b9185fd8beb64f68c93ac6b22e52ae13560ceefc96241a665b985edf9ffd393ae26d2946a7d3a07b7007b7d51e79 + languageName: node + linkType: hard + "resolve@patch:resolve@npm%3A1.17.0#optional!builtin": version: 1.17.0 resolution: "resolve@patch:resolve@npm%3A1.17.0#optional!builtin::version=1.17.0&hash=c3c19d" @@ -42835,29 +43955,29 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": - version: 1.22.4 - resolution: "resolve@patch:resolve@npm%3A1.22.4#optional!builtin::version=1.22.4&hash=c3c19d" +"resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.2#optional!builtin, resolve@patch:resolve@npm%3A^1.22.3#optional!builtin": + version: 1.22.8 + resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" dependencies: is-core-module: "npm:^2.13.0" path-parse: "npm:^1.0.7" supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 10/13262490c7b0ac54f6397f1d45ee139ebd2e431781e2ff0d9c27bf41648a349a90bc23a3ab2768f0f821efdd2cba08fb85f21288fc0cc01718c03557fbd285bc + checksum: 10/f345cd37f56a2c0275e3fe062517c650bb673815d885e7507566df589375d165bbbf4bdb6aa95600a9bc55f4744b81f452b5a63f95b9f10a72787dba3c90890a languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.2#optional!builtin, resolve@patch:resolve@npm%3A^1.22.3#optional!builtin": - version: 1.22.8 - resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" +"resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": + version: 1.22.4 + resolution: "resolve@patch:resolve@npm%3A1.22.4#optional!builtin::version=1.22.4&hash=c3c19d" dependencies: is-core-module: "npm:^2.13.0" path-parse: "npm:^1.0.7" supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 10/f345cd37f56a2c0275e3fe062517c650bb673815d885e7507566df589375d165bbbf4bdb6aa95600a9bc55f4744b81f452b5a63f95b9f10a72787dba3c90890a + checksum: 10/13262490c7b0ac54f6397f1d45ee139ebd2e431781e2ff0d9c27bf41648a349a90bc23a3ab2768f0f821efdd2cba08fb85f21288fc0cc01718c03557fbd285bc languageName: node linkType: hard @@ -42874,6 +43994,19 @@ __metadata: languageName: node linkType: hard +"resolve@patch:resolve@npm%3A^2.0.0-next.5#optional!builtin": + version: 2.0.0-next.5 + resolution: "resolve@patch:resolve@npm%3A2.0.0-next.5#optional!builtin::version=2.0.0-next.5&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10/05fa778de9d0347c8b889eb7a18f1f06bf0f801b0eb4610b4871a4b2f22e220900cf0ad525e94f990bb8d8921c07754ab2122c0c225ab4cdcea98f36e64fa4c2 + languageName: node + linkType: hard + "responselike@npm:^1.0.2": version: 1.0.2 resolution: "responselike@npm:1.0.2" @@ -43280,18 +44413,6 @@ __metadata: languageName: node linkType: hard -"safe-array-concat@npm:^1.0.1": - version: 1.0.1 - resolution: "safe-array-concat@npm:1.0.1" - dependencies: - call-bind: "npm:^1.0.2" - get-intrinsic: "npm:^1.2.1" - has-symbols: "npm:^1.0.3" - isarray: "npm:^2.0.5" - checksum: 10/44f073d85ca12458138e6eff103ac63cec619c8261b6579bd2fa3ae7b6516cf153f02596d68e40c5bbe322a29c930017800efff652734ddcb8c0f33b2a71f89c - languageName: node - linkType: hard - "safe-array-concat@npm:^1.1.0": version: 1.1.0 resolution: "safe-array-concat@npm:1.1.0" @@ -43304,6 +44425,18 @@ __metadata: languageName: node linkType: hard +"safe-array-concat@npm:^1.1.2": + version: 1.1.2 + resolution: "safe-array-concat@npm:1.1.2" + dependencies: + call-bind: "npm:^1.0.7" + get-intrinsic: "npm:^1.2.4" + has-symbols: "npm:^1.0.3" + isarray: "npm:^2.0.5" + checksum: 10/a54f8040d7cb696a1ee38d19cc71ab3cfb654b9b81bae00c6459618cfad8214ece7e6666592f9c925aafef43d0a20c5e6fbb3413a2b618e1ce9d516a2e6dcfc5 + languageName: node + linkType: hard + "safe-buffer@npm:5.1.1": version: 5.1.1 resolution: "safe-buffer@npm:5.1.1" @@ -43536,6 +44669,15 @@ __metadata: languageName: node linkType: hard +"scheduler@npm:^0.23.2": + version: 0.23.2 + resolution: "scheduler@npm:0.23.2" + dependencies: + loose-envify: "npm:^1.1.0" + checksum: 10/e8d68b89d18d5b028223edf090092846868a765a591944760942b77ea1f69b17235f7e956696efbb62c8130ab90af7e0949bfb8eba7896335507317236966bc9 + languageName: node + linkType: hard + "schema-utils@npm:2.7.0": version: 2.7.0 resolution: "schema-utils@npm:2.7.0" @@ -43706,6 +44848,27 @@ __metadata: languageName: node linkType: hard +"send@npm:0.17.1": + version: 0.17.1 + resolution: "send@npm:0.17.1" + dependencies: + debug: "npm:2.6.9" + depd: "npm:~1.1.2" + destroy: "npm:~1.0.4" + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + fresh: "npm:0.5.2" + http-errors: "npm:~1.7.2" + mime: "npm:1.6.0" + ms: "npm:2.1.1" + on-finished: "npm:~2.3.0" + range-parser: "npm:~1.2.1" + statuses: "npm:~1.5.0" + checksum: 10/b632573e156db8f110e3776e4c8e8393bed1c3ad2be01d4f2832d33525395058cdababdaffea639af3a2d81b3d46c242134279efce87d33d2be3ccf31abaa937 + languageName: node + linkType: hard + "send@npm:0.18.0": version: 0.18.0 resolution: "send@npm:0.18.0" @@ -43812,6 +44975,18 @@ __metadata: languageName: node linkType: hard +"serve-static@npm:1.14.1": + version: 1.14.1 + resolution: "serve-static@npm:1.14.1" + dependencies: + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + parseurl: "npm:~1.3.3" + send: "npm:0.17.1" + checksum: 10/a479286814f2aa3712683951908ea49d6c4999191465f9139d68ad001f8b594e4c16aee02d9511f3579e90aac20bf574a267b799fd48fc1857d89a2a08e280d7 + languageName: node + linkType: hard + "serve-static@npm:1.15.0": version: 1.15.0 resolution: "serve-static@npm:1.15.0" @@ -43877,7 +45052,7 @@ __metadata: languageName: node linkType: hard -"set-function-name@npm:^2.0.0, set-function-name@npm:^2.0.1": +"set-function-name@npm:^2.0.1": version: 2.0.1 resolution: "set-function-name@npm:2.0.1" dependencies: @@ -43888,6 +45063,18 @@ __metadata: languageName: node linkType: hard +"set-function-name@npm:^2.0.2": + version: 2.0.2 + resolution: "set-function-name@npm:2.0.2" + dependencies: + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + functions-have-names: "npm:^1.2.3" + has-property-descriptors: "npm:^1.0.2" + checksum: 10/c7614154a53ebf8c0428a6c40a3b0b47dac30587c1a19703d1b75f003803f73cdfa6a93474a9ba678fa565ef5fbddc2fae79bca03b7d22ab5fd5163dbe571a74 + languageName: node + linkType: hard + "set-value@npm:^2.0.0, set-value@npm:^2.0.1": version: 2.0.1 resolution: "set-value@npm:2.0.1" @@ -44075,6 +45262,18 @@ __metadata: languageName: node linkType: hard +"side-channel@npm:^1.0.6": + version: 1.0.6 + resolution: "side-channel@npm:1.0.6" + dependencies: + call-bind: "npm:^1.0.7" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.4" + object-inspect: "npm:^1.13.1" + checksum: 10/eb10944f38cebad8ad643dd02657592fa41273ce15b8bfa928d3291aff2d30c20ff777cfe908f76ccc4551ace2d1245822fdc576657cce40e9066c638ca8fa4d + languageName: node + linkType: hard + "signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.1, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.4, signal-exit@npm:^3.0.6, signal-exit@npm:^3.0.7": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" @@ -44577,13 +45776,20 @@ __metadata: languageName: node linkType: hard -"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.1, source-map-js@npm:^1.0.2": +"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.2": version: 1.0.2 resolution: "source-map-js@npm:1.0.2" checksum: 10/38e2d2dd18d2e331522001fc51b54127ef4a5d473f53b1349c5cca2123562400e0986648b52e9407e348eaaed53bce49248b6e2641e6d793ca57cb2c360d6d51 languageName: node linkType: hard +"source-map-js@npm:^1.0.1": + version: 1.2.0 + resolution: "source-map-js@npm:1.2.0" + checksum: 10/74f331cfd2d121c50790c8dd6d3c9de6be21926de80583b23b37029b0f37aefc3e019fa91f9a10a5e120c08135297e1ecf312d561459c45908cb1e0e365f49e5 + languageName: node + linkType: hard + "source-map-loader@npm:4.0.1": version: 4.0.1 resolution: "source-map-loader@npm:4.0.1" @@ -45024,6 +46230,15 @@ __metadata: languageName: node linkType: hard +"static-eval@npm:2.0.2": + version: 2.0.2 + resolution: "static-eval@npm:2.0.2" + dependencies: + escodegen: "npm:^1.8.1" + checksum: 10/2e2faf1b23bad5d9d5b2407b18945c7b97f8706b6d65f06bb3583a2d4fd1994cf5890c5779a1bfa2a02905dc860e077e4f045d7413d289d8993f605758f8992f + languageName: node + linkType: hard + "static-extend@npm:^0.1.1": version: 0.1.2 resolution: "static-extend@npm:0.1.2" @@ -45041,7 +46256,7 @@ __metadata: languageName: node linkType: hard -"statuses@npm:>= 1.4.0 < 2, statuses@npm:>= 1.5.0 < 2": +"statuses@npm:>= 1.4.0 < 2, statuses@npm:>= 1.5.0 < 2, statuses@npm:~1.5.0": version: 1.5.0 resolution: "statuses@npm:1.5.0" checksum: 10/c469b9519de16a4bb19600205cffb39ee471a5f17b82589757ca7bd40a8d92ebb6ed9f98b5a540c5d302ccbc78f15dc03cc0280dd6e00df1335568a5d5758a5c @@ -45295,20 +46510,23 @@ __metadata: languageName: node linkType: hard -"string.prototype.matchall@npm:^4.0.6, string.prototype.matchall@npm:^4.0.8": - version: 4.0.10 - resolution: "string.prototype.matchall@npm:4.0.10" +"string.prototype.matchall@npm:^4.0.11, string.prototype.matchall@npm:^4.0.6": + version: 4.0.11 + resolution: "string.prototype.matchall@npm:4.0.11" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - get-intrinsic: "npm:^1.2.1" + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.4" + gopd: "npm:^1.0.1" has-symbols: "npm:^1.0.3" - internal-slot: "npm:^1.0.5" - regexp.prototype.flags: "npm:^1.5.0" - set-function-name: "npm:^2.0.0" - side-channel: "npm:^1.0.4" - checksum: 10/0f7a1a7f91790cd45f804039a16bc6389c8f4f25903e648caa3eea080b019a5c7b0cac2ca83976646140c2332b159042140bf389f23675609d869dd52450cddc + internal-slot: "npm:^1.0.7" + regexp.prototype.flags: "npm:^1.5.2" + set-function-name: "npm:^2.0.2" + side-channel: "npm:^1.0.6" + checksum: 10/a902ff4500f909f2a08e55cc5ab1ffbbc905f603b36837674370ee3921058edd0392147e15891910db62a2f31ace2adaf065eaa3bc6e9810bdbc8ca48e05a7b5 languageName: node linkType: hard @@ -45345,6 +46563,18 @@ __metadata: languageName: node linkType: hard +"string.prototype.trim@npm:^1.2.9": + version: 1.2.9 + resolution: "string.prototype.trim@npm:1.2.9" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.0" + es-object-atoms: "npm:^1.0.0" + checksum: 10/b2170903de6a2fb5a49bb8850052144e04b67329d49f1343cdc6a87cb24fb4e4b8ad00d3e273a399b8a3d8c32c89775d93a8f43cb42fbff303f25382079fb58a + languageName: node + linkType: hard + "string.prototype.trimend@npm:^1.0.4": version: 1.0.4 resolution: "string.prototype.trimend@npm:1.0.4" @@ -45377,6 +46607,17 @@ __metadata: languageName: node linkType: hard +"string.prototype.trimend@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimend@npm:1.0.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10/c2e862ae724f95771da9ea17c27559d4eeced9208b9c20f69bbfcd1b9bc92375adf8af63a103194dba17c4cc4a5cb08842d929f415ff9d89c062d44689c8761b + languageName: node + linkType: hard + "string.prototype.trimstart@npm:^1.0.4": version: 1.0.4 resolution: "string.prototype.trimstart@npm:1.0.4" @@ -45409,6 +46650,17 @@ __metadata: languageName: node linkType: hard +"string.prototype.trimstart@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimstart@npm:1.0.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10/160167dfbd68e6f7cb9f51a16074eebfce1571656fc31d40c3738ca9e30e35496f2c046fe57b6ad49f65f238a152be8c86fd9a2dd58682b5eba39dad995b3674 + languageName: node + linkType: hard + "string_decoder@npm:^1.1.1, string_decoder@npm:^1.3.0": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" @@ -45619,11 +46871,11 @@ __metadata: linkType: hard "style-loader@npm:^3.3.1": - version: 3.3.3 - resolution: "style-loader@npm:3.3.3" + version: 3.3.4 + resolution: "style-loader@npm:3.3.4" peerDependencies: webpack: ^5.0.0 - checksum: 10/6c13d5075b5a5d69602215a242ef157460766e6e8a2e48276eb5da5b9852716910b48b3f120d492bbc7cd825dfa940b35fc84e1a9ab2a8792fd8d568b6b3e87a + checksum: 10/2dd2a77d4fc689e1f73836ed7653830cb4e628af0b2979dcf6f31524c72bf44fca4bac8aebe62df95a5f9be19bea18f952a2cfcaaeff32c524c4402226d9c58f languageName: node linkType: hard @@ -45659,12 +46911,12 @@ __metadata: linkType: hard "sucrase@npm:^3.32.0": - version: 3.34.0 - resolution: "sucrase@npm:3.34.0" + version: 3.35.0 + resolution: "sucrase@npm:3.35.0" dependencies: "@jridgewell/gen-mapping": "npm:^0.3.2" commander: "npm:^4.0.0" - glob: "npm:7.1.6" + glob: "npm:^10.3.10" lines-and-columns: "npm:^1.1.6" mz: "npm:^2.7.0" pirates: "npm:^4.0.1" @@ -45672,7 +46924,7 @@ __metadata: bin: sucrase: bin/sucrase sucrase-node: bin/sucrase-node - checksum: 10/b64d154a7a7eaa4b39668c3124bd08cd505f683d36ac4fb94def6491fb3af155b24b6e41b55011e38582e7d59c440af79ffba8709f3da78aeedf2f07b6d51d84 + checksum: 10/bc601558a62826f1c32287d4fdfa4f2c09fe0fec4c4d39d0e257fd9116d7d6227a18309721d4185ec84c9dc1af0d5ec0e05a42a337fbb74fc293e068549aacbe languageName: node linkType: hard @@ -45904,9 +47156,9 @@ __metadata: linkType: hard "swagger-ui-dist@npm:>=5.0.0": - version: 5.17.7 - resolution: "swagger-ui-dist@npm:5.17.7" - checksum: 10/17fd7c632e040c8d6aa7ac77e9688e2d1f70037631864a60a8147d4cf528fe93f6b94b44c15466d1be78c587242b4b469e95db1b7bf9d0cdaaecf889c395b222 + version: 5.17.13 + resolution: "swagger-ui-dist@npm:5.17.13" + checksum: 10/9af5a85dc9bb2896d7719a42c142ce198bae707ac79db87baece48aed41ad2228525e93821b130c6c4a97deb99a461e2d15209f9195b3dfd92dc2303d835923e languageName: node linkType: hard @@ -46006,18 +47258,18 @@ __metadata: linkType: hard "tailwindcss@npm:^3.0.2": - version: 3.3.3 - resolution: "tailwindcss@npm:3.3.3" + version: 3.4.3 + resolution: "tailwindcss@npm:3.4.3" dependencies: "@alloc/quick-lru": "npm:^5.2.0" arg: "npm:^5.0.2" chokidar: "npm:^3.5.3" didyoumean: "npm:^1.2.2" dlv: "npm:^1.1.3" - fast-glob: "npm:^3.2.12" + fast-glob: "npm:^3.3.0" glob-parent: "npm:^6.0.2" is-glob: "npm:^4.0.3" - jiti: "npm:^1.18.2" + jiti: "npm:^1.21.0" lilconfig: "npm:^2.1.0" micromatch: "npm:^4.0.5" normalize-path: "npm:^3.0.0" @@ -46034,7 +47286,7 @@ __metadata: bin: tailwind: lib/cli.js tailwindcss: lib/cli.js - checksum: 10/bc47f40cc33aca95fb9d523ecef0a450241e51d2259c354ac283c6a06c4dcd7edd1ffbd6f065fc496390ff3ab4dd8349c968b10cce7e11e0bde101705fa0f4f1 + checksum: 10/8d65347bcab1b492fe3acb95a917d8610112c1efb01a91259368c6360e98a5622bfd37bce96fc7ce70268c9d25d42674a7a475074e079781573a1eae8559bb9f languageName: node linkType: hard @@ -46144,7 +47396,7 @@ __metadata: languageName: node linkType: hard -"tapable@npm:^2.0.0, tapable@npm:^2.1.1, tapable@npm:^2.2.0": +"tapable@npm:^2.0.0, tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1": version: 2.2.1 resolution: "tapable@npm:2.2.1" checksum: 10/1769336dd21481ae6347611ca5fca47add0962fd8e80466515032125eca0084a4f0ede11e65341b9c0018ef4e1cf1ad820adbb0fba7cc99865c6005734000b0a @@ -46380,7 +47632,29 @@ __metadata: languageName: node linkType: hard -"terser-webpack-plugin@npm:^5.2.5, terser-webpack-plugin@npm:^5.3.7": +"terser-webpack-plugin@npm:^5.2.5, terser-webpack-plugin@npm:^5.3.10": + version: 5.3.10 + resolution: "terser-webpack-plugin@npm:5.3.10" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.20" + jest-worker: "npm:^27.4.5" + schema-utils: "npm:^3.1.1" + serialize-javascript: "npm:^6.0.1" + terser: "npm:^5.26.0" + peerDependencies: + webpack: ^5.1.0 + peerDependenciesMeta: + "@swc/core": + optional: true + esbuild: + optional: true + uglify-js: + optional: true + checksum: 10/fb1c2436ae1b4e983be043fa0a3d355c047b16b68f102437d08c736d7960c001e7420e2f722b9d99ce0dc70ca26a68cc63c0b82bc45f5b48671142b352a9d938 + languageName: node + linkType: hard + +"terser-webpack-plugin@npm:^5.3.7": version: 5.3.9 resolution: "terser-webpack-plugin@npm:5.3.9" dependencies: @@ -46416,9 +47690,9 @@ __metadata: languageName: node linkType: hard -"terser@npm:^5.0.0, terser@npm:^5.10.0": - version: 5.22.0 - resolution: "terser@npm:5.22.0" +"terser@npm:^5.0.0, terser@npm:^5.10.0, terser@npm:^5.26.0": + version: 5.31.0 + resolution: "terser@npm:5.31.0" dependencies: "@jridgewell/source-map": "npm:^0.3.3" acorn: "npm:^8.8.2" @@ -46426,7 +47700,7 @@ __metadata: source-map-support: "npm:~0.5.20" bin: terser: bin/terser - checksum: 10/e5407f9a143e7f9306f1b585b16dbb03df19b93318b55a26b542e12b74cc792dcf6961d9a2cab6778b20d7b591f498c200376d282a300cf9999ca40bccbc047c + checksum: 10/11b28065d6fd9f496acf1f23b22982867e4625e769d0a1821861a15e6bebfdb414142a8444f74f2a93f458d0182b8314ceb889be053b50eb5907cc98e8230467 languageName: node linkType: hard @@ -47068,18 +48342,6 @@ __metadata: languageName: node linkType: hard -"tsconfig-paths@npm:^3.14.2": - version: 3.14.2 - resolution: "tsconfig-paths@npm:3.14.2" - dependencies: - "@types/json5": "npm:^0.0.29" - json5: "npm:^1.0.2" - minimist: "npm:^1.2.6" - strip-bom: "npm:^3.0.0" - checksum: 10/17f23e98612a60cf23b80dc1d3b7b840879e41fcf603868fc3618a30f061ac7b463ef98cad8c28b68733b9bfe0cc40ffa2bcf29e94cf0d26e4f6addf7ac8527d - languageName: node - linkType: hard - "tsconfig-paths@npm:^3.15.0": version: 3.15.0 resolution: "tsconfig-paths@npm:3.15.0" @@ -47557,6 +48819,20 @@ __metadata: languageName: node linkType: hard +"typed-array-length@npm:^1.0.6": + version: 1.0.6 + resolution: "typed-array-length@npm:1.0.6" + dependencies: + call-bind: "npm:^1.0.7" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + has-proto: "npm:^1.0.3" + is-typed-array: "npm:^1.1.13" + possible-typed-array-names: "npm:^1.0.0" + checksum: 10/05e96cf4ff836743ebfc593d86133b8c30e83172cb5d16c56814d7bacfed57ce97e87ada9c4b2156d9aaa59f75cdef01c25bd9081c7826e0b869afbefc3e8c39 + languageName: node + linkType: hard + "typed-assert@npm:^1.0.8": version: 1.0.9 resolution: "typed-assert@npm:1.0.9" @@ -47796,6 +49072,13 @@ __metadata: languageName: node linkType: hard +"underscore@npm:>=1.13.2": + version: 1.13.6 + resolution: "underscore@npm:1.13.6" + checksum: 10/58cf5dc42cb0ac99c146ae4064792c0a2cc84f3a3c4ad88f5082e79057dfdff3371d896d1ec20379e9ece2450d94fa78f2ef5bfefc199ba320653e32c009bd66 + languageName: node + linkType: hard + "undici@npm:6.11.1": version: 6.11.1 resolution: "undici@npm:6.11.1" @@ -48108,7 +49391,7 @@ __metadata: languageName: node linkType: hard -"uri-js@npm:^4.2.2": +"uri-js@npm:^4.2.2, uri-js@npm:^4.4.1": version: 4.4.1 resolution: "uri-js@npm:4.4.1" dependencies: @@ -48646,6 +49929,16 @@ __metadata: languageName: node linkType: hard +"watchpack@npm:^2.4.1": + version: 2.4.1 + resolution: "watchpack@npm:2.4.1" + dependencies: + glob-to-regexp: "npm:^0.4.1" + graceful-fs: "npm:^4.1.2" + checksum: 10/0736ebd20b75d3931f9b6175c819a66dee29297c1b389b2e178bc53396a6f867ecc2fd5d87a713ae92dcb73e487daec4905beee20ca00a9e27f1184a7c2bca5e + languageName: node + linkType: hard + "wbuf@npm:^1.1.0, wbuf@npm:^1.7.3": version: 1.7.3 resolution: "wbuf@npm:1.7.3" @@ -50991,7 +52284,7 @@ __metadata: languageName: node linkType: hard -"webpack-dev-middleware@npm:^5.3.1": +"webpack-dev-middleware@npm:^5.3.1, webpack-dev-middleware@npm:^5.3.4": version: 5.3.4 resolution: "webpack-dev-middleware@npm:5.3.4" dependencies: @@ -51006,7 +52299,7 @@ __metadata: languageName: node linkType: hard -"webpack-dev-server@npm:4.15.1, webpack-dev-server@npm:^4.6.0": +"webpack-dev-server@npm:4.15.1": version: 4.15.1 resolution: "webpack-dev-server@npm:4.15.1" dependencies: @@ -51053,6 +52346,53 @@ __metadata: languageName: node linkType: hard +"webpack-dev-server@npm:^4.6.0": + version: 4.15.2 + resolution: "webpack-dev-server@npm:4.15.2" + dependencies: + "@types/bonjour": "npm:^3.5.9" + "@types/connect-history-api-fallback": "npm:^1.3.5" + "@types/express": "npm:^4.17.13" + "@types/serve-index": "npm:^1.9.1" + "@types/serve-static": "npm:^1.13.10" + "@types/sockjs": "npm:^0.3.33" + "@types/ws": "npm:^8.5.5" + ansi-html-community: "npm:^0.0.8" + bonjour-service: "npm:^1.0.11" + chokidar: "npm:^3.5.3" + colorette: "npm:^2.0.10" + compression: "npm:^1.7.4" + connect-history-api-fallback: "npm:^2.0.0" + default-gateway: "npm:^6.0.3" + express: "npm:^4.17.3" + graceful-fs: "npm:^4.2.6" + html-entities: "npm:^2.3.2" + http-proxy-middleware: "npm:^2.0.3" + ipaddr.js: "npm:^2.0.1" + launch-editor: "npm:^2.6.0" + open: "npm:^8.0.9" + p-retry: "npm:^4.5.0" + rimraf: "npm:^3.0.2" + schema-utils: "npm:^4.0.0" + selfsigned: "npm:^2.1.1" + serve-index: "npm:^1.9.1" + sockjs: "npm:^0.3.24" + spdy: "npm:^4.0.2" + webpack-dev-middleware: "npm:^5.3.4" + ws: "npm:^8.13.0" + peerDependencies: + webpack: ^4.37.0 || ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + bin: + webpack-dev-server: bin/webpack-dev-server.js + checksum: 10/86ca4fb49d2a264243b2284c6027a9a91fd7d47737bbb4096e873be8a3f8493a9577b1535d7cc84de1ee991da7da97686c85788ccac547b0f5cf5c7686aacee9 + languageName: node + linkType: hard + "webpack-manifest-plugin@npm:^4.0.2": version: 4.1.1 resolution: "webpack-manifest-plugin@npm:4.1.1" @@ -51127,7 +52467,7 @@ __metadata: languageName: node linkType: hard -"webpack@npm:5.88.2, webpack@npm:^5.64.4": +"webpack@npm:5.88.2": version: 5.88.2 resolution: "webpack@npm:5.88.2" dependencies: @@ -51164,6 +52504,43 @@ __metadata: languageName: node linkType: hard +"webpack@npm:^5.64.4": + version: 5.91.0 + resolution: "webpack@npm:5.91.0" + dependencies: + "@types/eslint-scope": "npm:^3.7.3" + "@types/estree": "npm:^1.0.5" + "@webassemblyjs/ast": "npm:^1.12.1" + "@webassemblyjs/wasm-edit": "npm:^1.12.1" + "@webassemblyjs/wasm-parser": "npm:^1.12.1" + acorn: "npm:^8.7.1" + acorn-import-assertions: "npm:^1.9.0" + browserslist: "npm:^4.21.10" + chrome-trace-event: "npm:^1.0.2" + enhanced-resolve: "npm:^5.16.0" + es-module-lexer: "npm:^1.2.1" + eslint-scope: "npm:5.1.1" + events: "npm:^3.2.0" + glob-to-regexp: "npm:^0.4.1" + graceful-fs: "npm:^4.2.11" + json-parse-even-better-errors: "npm:^2.3.1" + loader-runner: "npm:^4.2.0" + mime-types: "npm:^2.1.27" + neo-async: "npm:^2.6.2" + schema-utils: "npm:^3.2.0" + tapable: "npm:^2.1.1" + terser-webpack-plugin: "npm:^5.3.10" + watchpack: "npm:^2.4.1" + webpack-sources: "npm:^3.2.3" + peerDependenciesMeta: + webpack-cli: + optional: true + bin: + webpack: bin/webpack.js + checksum: 10/647ca53c15fe0fa1af4396a7257d7a93cbea648d2685e565a11cc822a9e3ea9316345250987d75f02c0b45dae118814f094ec81908d1032e77a33cd6470b289e + languageName: node + linkType: hard + "websocket-driver@npm:>=0.5.1, websocket-driver@npm:^0.7.4": version: 0.7.4 resolution: "websocket-driver@npm:0.7.4" @@ -51218,9 +52595,9 @@ __metadata: linkType: hard "whatwg-fetch@npm:^3.6.2": - version: 3.6.19 - resolution: "whatwg-fetch@npm:3.6.19" - checksum: 10/257b130a06bc0fca4e3f15cb4a7b7822d12b7493c6743353e3a107b62ef2716f77fae35b4c81b4b8630e221aca30ea5b9770969db762d63336108f57bee9f963 + version: 3.6.20 + resolution: "whatwg-fetch@npm:3.6.20" + checksum: 10/2b4ed92acd6a7ad4f626a6cb18b14ec982bbcaf1093e6fe903b131a9c6decd14d7f9c9ca3532663c2759d1bdf01d004c77a0adfb2716a5105465c20755a8c57c languageName: node linkType: hard @@ -51349,16 +52726,16 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.13": - version: 1.1.13 - resolution: "which-typed-array@npm:1.1.13" +"which-typed-array@npm:^1.1.13, which-typed-array@npm:^1.1.15": + version: 1.1.15 + resolution: "which-typed-array@npm:1.1.15" dependencies: - available-typed-arrays: "npm:^1.0.5" - call-bind: "npm:^1.0.4" + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.7" for-each: "npm:^0.3.3" gopd: "npm:^1.0.1" - has-tostringtag: "npm:^1.0.0" - checksum: 10/605e3e10b7118af904a0e79d0d50b95275102f06ec902734024989cd71354929f7acee50de43529d3baf5858e2e4eb32c75e6ebd226c888ad976d8140e4a3e71 + has-tostringtag: "npm:^1.0.2" + checksum: 10/c3b6a99beadc971baa53c3ee5b749f2b9bdfa3b3b9a70650dd8511a48b61d877288b498d424712e9991d16019633086bd8b5923369460d93463c5825fa36c448 languageName: node linkType: hard @@ -52337,10 +53714,12 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^2.1.1": - version: 2.3.3 - resolution: "yaml@npm:2.3.3" - checksum: 10/3b1a974b9d3672c671d47099a41c0de77b7ff978d0849aa55a095587486e82cd072321d19f2b4c791a367f766310b5a82dff098839b0f4ddcbbbe477f82dfb07 +"yaml@npm:^2.3.4": + version: 2.4.2 + resolution: "yaml@npm:2.4.2" + bin: + yaml: bin.mjs + checksum: 10/6eafbcd68dead734035f6f72af21bd820c29214caf7d8e40c595671a3c908535cef8092b9660a1c055c5833aa148aa640e0c5fa4adb5af2dacd6d28296ccd81c languageName: node linkType: hard