diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index edcdfc825b..546dbb6807 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -1730,6 +1730,31 @@ jobs:
# restore-keys: |
# ${{ runner.os }}-yarn-
# - run: ./tools/ci.sh
+ cactus-plugin-bungee-hermes:
+ continue-on-error: false
+ env:
+ FULL_BUILD_DISABLED: true
+ JEST_TEST_RUNNER_DISABLED: false
+ JEST_TEST_PATTERN: packages/cactus-plugin-bungee-hermes/src/test/typescript/(unit|integration|benchmark)/.*/*.test.ts
+ TAPE_TEST_RUNNER_DISABLED: true
+ needs: build-dev
+ runs-on: ubuntu-22.04
+ steps:
+ - name: Use Node.js ${{ env.NODEJS_VERSION }}
+ uses: actions/setup-node@v3.6.0
+ with:
+ node-version: ${{ env.NODEJS_VERSION }}
+ - uses: actions/checkout@v3.5.2
+
+ - id: yarn-cache
+ name: Restore Yarn Cache
+ uses: actions/cache@v3.3.1
+ with:
+ key: ${{ runner.os }}-yarn-${{ hashFiles('./yarn.lock') }}
+ path: ./.yarn/
+ restore-keys: |
+ ${{ runner.os }}-yarn-${{ hashFiles('./yarn.lock') }}
+ - run: ./tools/ci.sh
cactus-test-api-client:
continue-on-error: false
env:
diff --git a/CODEOWNERS b/CODEOWNERS
index eba468f56e..b561fc8bde 100644
--- a/CODEOWNERS
+++ b/CODEOWNERS
@@ -1,6 +1,7 @@
* @petermetz @takeutak @izuru0 @jagpreetsinghsasan @vramakrishna @sandeepnRES @outSH
packages/cactus-plugin-satp-hermes @RafaelAPB
+packages/cactus-plugin-bungee-hermes @RafaelAPB
examples/cactus-example-cbdc-bridging @RafaelAPB
examples/cactus-example-cbdc-bridging-backend @RafaelAPB
examples/cactus-example-cbdc-bridging-frontend @RafaelAPB
diff --git a/packages/cactus-plugin-bungee-hermes/CHANGELOG.md b/packages/cactus-plugin-bungee-hermes/CHANGELOG.md
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/packages/cactus-plugin-bungee-hermes/README.md b/packages/cactus-plugin-bungee-hermes/README.md
new file mode 100644
index 0000000000..e176174ae2
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/README.md
@@ -0,0 +1,159 @@
+# `@hyperledger/cactus-plugin-bungee-hermes`
+
+The package provides `Hyperledger Cacti` a way to create blockchain snapshots and views for different distributed ledgers currently supported by Cacti. The implementation follows the paper [BUNGEE](https://dl.acm.org/doi/pdf/10.1145/3643689) (Blockchain UNifier view GEnErator).
+
+The plugin will allow, as suggested in the paper, "new applications built on top
+of dependable blockchain interoperability, such as stakeholder-centric snapshots for audits, cross-chain analysis, blockchain
+migration, and combined on-chain-off-chain analytics".
+
+## Summary
+
+- [`@hyperledger/cactus-plugin-bungee-hermes`](#hyperledgercactus-plugin-bungee-hermes)
+ - [Summary](#summary)
+ - [Getting Started](#getting-started)
+ - [Prerequisites](#prerequisites)
+ - [Architecture](#architecture)
+ - [BUNGEE - Hermes API](#bungee---hermes-api)
+ - [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-fabric](https://github.com/hyperledger/cactus/tree/main/packages/cactus-plugin-ledger-connector-fabric)
+ - [cactus-plugin-ledger-connector-besu](https://github.com/hyperledger/cactus/tree/main/packages/cactus-plugin-ledger-connector-besu)
+
+
+## Architecture
+
+The plugin interacts with a cactus ledger connector, using strategies with custom logic for each different network.
+
+Note that, so far, only strategies for Fabric and Besu networks were implemented. Smart-contracts in Fabric and Besu must implement the interface provided in the files ITraceableContract.ts and ITraceableContract.sol, in the test directory
+
+The plugin stands _behind_ a cacti-ledger-connector, which is used to fetch information from the ledger to create the snapshot.
+```typescript
+.......................................
+. Cacti Node .
+. .
+. .
+. .......... ............. . .........
+. . . . Cacti . . . .
+. . BUNGEE . ---------- . Connector . -----------. _DLT .
+. . . ............. . . .
+. .......... . .........
+. .
+. .
+. .
+.......................................
+```
+The plugin can then serve multiple purposes, and thus serve also other plugins or apps in more complex deployment architectures (where we link bungee to other components).
+
+### BUNGEE - Hermes API
+
+This plugin uses OpenAPI to generate the API paths.
+Endpoints exposed:
+
+ - CreateViewV1
+ - GetPublicKey
+ - GetAvailableStrategies
+
+
+## Running the tests
+ - **besu-test-basic.test.ts**: A test using strategy-besu and a besu connector, testing creating views for different timeframes and states.
+ - **fabric-test-basic.test.ts**: A test using strategy-fabric and a fabric connector, testing creating views for different timeframes and states.
+ - **besu-test-pruning.test.ts**: A test using strategy-besu and a besu connector, testing creating views for specific timeframes.
+ - **fabric-test-pruning.test.ts**: A test using strategy-fabric and a fabric connector, testing creating views for specific timeframes.
+ - **bungee-api-test.test.ts**: A more complex test, using both besu and fabric strategies, fabric and besu connectors, and calls to bungee-hermes API. Tests bungee's API and functionality with multiple strategies.
+
+Tests developed using JEST testing framework.
+
+## Usage
+Lets imagine we want bungee-hermes to create views for a besu ledger.
+Let us consider a besu ledger connector, exposing its API on URL: http://localhost:4000
+
+
+Then we instantiate the plugin as follows:
+```typescript
+const pluginBungeeHermesOptions = {
+ keyPair: Secp256k1Keys.generateKeyPairsBuffer(),
+ instanceId: uuidv4(),
+ logLevel,
+};
+const bungee = new PluginBungeeHermes(pluginBungeeHermesOptions);
+```
+
+We add the desired strategies:
+
+```typescript
+bungee.addStrategy('BESU_STRATEGY', new StrategyBesu("INFO"));
+```
+
+Save network details for our target ledger:
+
+```typescript
+const besuNetworkDetails: BesuNetworkDetails = {
+ signingCredential: besuSigningCredential,
+ contractName: besuContractName,
+ connectorApiPath: 'http://localhost:4000',
+ keychainId: besuKeychainPlugin.getKeychainId(),
+ contractAddress: besuContractAddress,
+ participant: accountAddress,
+ };
+```
+
+And we can request views, after exposing the api:
+```typescript
+const expressApp = express();
+ expressApp.use(bodyParser.json({ limit: "250mb" }));
+ bungeeServer = http.createServer(expressApp);
+ const listenOptions: IListenOptions = {
+ hostname: "127.0.0.1",
+ port: 3000,
+ server: bungeeServer,
+ };
+const addressInfo = (await Servers.listen(listenOptions)) as AddressInfo;
+const { address, port } = addressInfo;
+
+await bungee.getOrCreateWebServices();
+await bungee.registerWebServices(expressApp);
+const bungeePath = `http://${address}:${port}`;
+
+const config = new Configuration({ basePath: bungeePath });
+const bungeeApi = new BungeeApi(config);
+
+const viewBesu = await bungeeApi.createViewV1({
+ strategyId: 'BESU_STRATEGY',
+ networkDetails: besuNetworkDetails,
+ tI: undefined, //default to 0 (UNIX timestamp seconds)
+ tF: undefined, //default to Number.MAX_SAFE_INTEGER.toString() (UNIX timestamp seconds)
+ stateIds: undefined, //default to capture all assets
+ viewID: undefined, //plugin generates the id, if not given
+ } as CreateViewRequest);
+```
+
+Note that each strategy can be used to query different ledgers (ledgers of the same type, but on different locations), and BUNGEE also supports adding multiple strategies to each bungee-hermes-plugin instance.
+Each strategy implements the logic to query information from each different ledger (i.e. capture set of asset states), while bungee-hermes plugin handles the snapshot and view creation.
+
+
+
+## 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-bungee-hermes/openapitools.json b/packages/cactus-plugin-bungee-hermes/openapitools.json
new file mode 100644
index 0000000000..225ff1aaae
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/openapitools.json
@@ -0,0 +1,7 @@
+{
+ "$schema": "node_modules/@openapitools/openapi-generator-cli/config.schema.json",
+ "spaces": 2,
+ "generator-cli": {
+ "version": "6.6.0"
+ }
+}
diff --git a/packages/cactus-plugin-bungee-hermes/package.json b/packages/cactus-plugin-bungee-hermes/package.json
new file mode 100644
index 0000000000..6c069f2a36
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/package.json
@@ -0,0 +1,111 @@
+{
+ "name": "@hyperledger/cactus-plugin-bungee-hermes",
+ "version": "2.0.0-alpha.2",
+ "description": "Allows Cactus nodes to create DLT views using Cactus connectors",
+ "keywords": [
+ "Hyperledger",
+ "Cactus",
+ "Integration",
+ "Blockchain",
+ "Distributed Ledger Technology",
+ "View"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/hyperledger/cacti.git"
+ },
+ "license": "Apache-2.0",
+ "author": {
+ "name": "Hyperledger Cactus Contributors",
+ "email": "cactus@lists.hyperledger.org",
+ "url": "https://www.hyperledger.org/use/cacti"
+ },
+ "contributors": [
+ {
+ "name": "Eduardo Vasques",
+ "email": "eduardovasques10@tecnico.ulisboa.pt",
+ "url": "https://github.com/eduv09"
+ },
+ {
+ "name": "Rafael Belchior",
+ "email": "rafael.belchior@tecnico.ulisboa.pt",
+ "url": "https://rafaelapb.github.io/"
+ },
+ {
+ "name": "André Augusto",
+ "email": "andre.augusto@tecnico.ulisboa.pt",
+ "url": "https://github.com/AndreAugusto11"
+ }
+ ],
+ "main": "dist/lib/main/typescript/index.js",
+ "module": "dist/lib/main/typescript/index.js",
+ "types": "dist/lib/main/typescript/index.d.ts",
+ "files": [
+ "dist/*"
+ ],
+ "scripts": {
+ "codegen": "run-p 'codegen:*'",
+ "codegen:openapi": "npm run generate-sdk",
+ "generate-sdk": "run-p 'generate-sdk:*'",
+ "generate-sdk:kotlin": "openapi-generator-cli generate -i ./src/main/json/openapi.json -g kotlin -o ./src/main/kotlin/generated/openapi/kotlin-client/ --reserved-words-mappings protected=protected --ignore-file-override ../../openapi-generator-ignore",
+ "generate-sdk:typescript-axios": "openapi-generator-cli generate -i ./src/main/json/openapi.json -g typescript-axios -o ./src/main/typescript/generated/openapi/typescript-axios/ --reserved-words-mappings protected=protected --ignore-file-override ../../openapi-generator-ignore",
+ "pretsc": "npm run generate-sdk",
+ "tsc": "tsc --project ./tsconfig.json",
+ "watch": "npm-watch"
+ },
+ "dependencies": {
+ "@hyperledger/cactus-cmd-api-server": "2.0.0-alpha.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-keychain-memory": "2.0.0-alpha.2",
+ "@hyperledger/cactus-plugin-ledger-connector-besu": "2.0.0-alpha.2",
+ "@hyperledger/cactus-plugin-ledger-connector-fabric": "2.0.0-alpha.2",
+ "@hyperledger/cactus-plugin-object-store-ipfs": "2.0.0-alpha.2",
+ "@hyperledger/cactus-test-tooling": "2.0.0-alpha.2",
+ "axios": "1.6.0",
+ "body-parser": "1.20.2",
+ "fs-extra": "10.1.0",
+ "key-encoder": "2.0.3",
+ "typescript-optional": "2.0.1",
+ "uuid": "9.0.1",
+ "web3": "1.6.1",
+ "web3-core": "1.6.1"
+ },
+ "devDependencies": {
+ "@types/body-parser": "1.19.4",
+ "@types/crypto-js": "4.0.1",
+ "@types/express": "4.17.19",
+ "@types/fs-extra": "11.0.3",
+ "@types/tape": "4.13.4",
+ "@types/uuid": "9.0.6",
+ "express": "4.18.2",
+ "fabric-network": "2.2.20",
+ "socket.io": "4.5.4"
+ },
+ "engines": {
+ "node": ">=18",
+ "npm": ">=8"
+ },
+ "publishConfig": {
+ "access": "public"
+ },
+ "watch": {
+ "tsc": {
+ "patterns": [
+ "src/",
+ "src/*/json/**/openapi*"
+ ],
+ "ignore": [
+ "src/**/generated/*"
+ ],
+ "extensions": [
+ "ts",
+ "json"
+ ],
+ "quiet": true,
+ "verbose": false,
+ "runOnChangeOnly": true
+ }
+ }
+}
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/json/openapi.json b/packages/cactus-plugin-bungee-hermes/src/main/json/openapi.json
new file mode 100644
index 0000000000..f4cf10bc34
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/json/openapi.json
@@ -0,0 +1,221 @@
+{
+ "openapi": "3.0.3",
+ "servers": [
+ {
+ "url": "http://{host}:{port}/api/v1/@hyperledger/cactus-plugin-satp-hermes",
+ "description": "Development server",
+ "variables": {
+ "host": {
+ "default": "localhost"
+ },
+ "port": {
+ "default": "3000"
+ }
+ }
+ }
+ ],
+
+ "info": {
+ "title": "Hyperledger Cactus Plugin - BUNGEE-Hermes",
+ "description": "Can create blockchain views of different networks",
+ "version": "2.0.0-alpha.2",
+ "license": {
+ "name": "Apache-2.0",
+ "url": "https://www.apache.org/licenses/LICENSE-2.0.html"
+ }
+ },
+ "components": {
+ "schemas": {
+ "CreateViewRequest":{
+ "type":"object",
+ "description": "Request object for createViewV1 endpoint",
+ "required": ["strategyId", "networkDetails"],
+ "properties": {
+ "stateIds":{
+ "type":"array",
+ "items":{
+ "type": "string",
+ "example": "id-of-asset-1"
+ },
+ "example": ["id-of-asset-1", "id-of-asset-2"]
+ },
+ "tI":{
+ "type":"string",
+ "example": "0"
+ },
+ "tF": {
+ "type": "string",
+ "example": "999999999999"
+ },
+ "viewID": {
+ "type": "string",
+ "example": "view-1"
+
+ },
+ "strategyId": {
+ "type": "string",
+ "example": "fabric-strategy",
+ "nullable": false
+ },
+ "networkDetails": {
+ "type": "object",
+ "nullable": false,
+ "required": ["connectorApiPath", "participant"],
+ "properties": {
+ "connectorApiPath":{
+ "type": "string",
+ "nullable": false,
+ "example": "http://localhost:3000"
+ },
+ "participant": {
+ "type": "string",
+ "nullable": false,
+ "example": "participant-1"
+ }
+ },
+ "example": {"connectorApiPath": "http://localhost:3000", "participant": "participant-1"}
+ }
+ },
+ "example": {"strategyId": "fabric-strategy", "networkDetails":{"connectorApiPath": "http://localhost:3000", "participant": "participant-1"}}
+ },
+ "CreateViewResponse":{
+ "type":"object",
+ "description": "This is the response for a viewRequests",
+ "properties": {
+ "view":{
+ "type":"string",
+ "example": "Object"
+ },
+ "signature":{
+ "type": "string",
+ "example": "signature of Object"
+ }
+ },
+ "example": {"view": "Object", "signature":"signature of Object"}
+ },
+ "GetPublicKeyResponse": {
+ "type": "object",
+ "description": "public key from bungee-hermes plugin instance",
+ "properties": {
+ "pubKey":{
+ "type": "string",
+ "example": "----BEGIN CERTIFICATE----random content...."
+ }
+ }
+ },
+ "AvailableStrategiesResponse":{
+ "type": "array",
+ "description": "Array with available strategy ids",
+ "items":{
+ "type": "string",
+ "example": "strategy-fabric"
+ }
+ }
+ }
+ },
+ "paths": {
+ "/api/v1/plugins/@hyperledger/cactus-plugin-bungee-hermes/create-view": {
+ "get": {
+ "x-hyperledger-cacti": {
+ "http": {
+ "verbLowerCase": "get",
+ "path": "/api/v1/plugins/@hyperledger/cactus-plugin-bungee-hermes/create-view"
+ }
+ },
+ "operationId": "createViewV1",
+ "summary": "Creates a Blockchain View.",
+ "description": "",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CreateViewRequest"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CreateViewResponse"
+ },
+ "example": {"view": "Object", "signature":"signature of Object"}
+ }
+ }
+ },
+ "404": {
+ "description": "Could not complete request."
+ }
+ }
+ }
+ },
+ "/api/v1/plugins/@hyperledger/cactus-plugin-bungee-hermes/get-public-key": {
+ "get": {
+ "x-hyperledger-cacti": {
+ "http": {
+ "verbLowerCase": "get",
+ "path": "/api/v1/plugins/@hyperledger/cactus-plugin-bungee-hermes/get-public-key"
+ }
+ },
+ "operationId": "GetPublicKey",
+ "summary": "Queries plugin's public key",
+ "description": "",
+ "parameters": [],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/GetPublicKeyResponse"
+ },
+ "example": {"pubKey": "----BEGIN CERTIFICATE----random content...."}
+ }
+
+ }
+ },
+ "404": {
+ "description": "Could not complete request."
+ }
+ }
+ }
+ },
+ "/api/v1/plugins/@hyperledger/cactus-plugin-bungee-hermes/get-available-strategies": {
+ "get": {
+ "x-hyperledger-cacti": {
+ "http": {
+ "verbLowerCase": "get",
+ "path": "/api/v1/plugins/@hyperledger/cactus-plugin-bungee-hermes/get-available-strategies"
+ }
+ },
+ "operationId": "GetAvailableStrategies",
+ "summary": "Queries plugin's available strategies for ledger capture",
+ "description": "",
+ "parameters": [],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AvailableStrategiesResponse"
+ },
+ "example": ["strategy-fabric"]
+ }
+
+ }
+ },
+ "404": {
+ "description": "Could not complete request."
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/.openapi-generator/FILES b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/.openapi-generator/FILES
new file mode 100644
index 0000000000..6aaf4cd1ed
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/.openapi-generator/FILES
@@ -0,0 +1,27 @@
+README.md
+build.gradle
+gradlew
+gradlew.bat
+settings.gradle
+src/main/kotlin/org/openapitools/client/apis/DefaultApi.kt
+src/main/kotlin/org/openapitools/client/infrastructure/ApiAbstractions.kt
+src/main/kotlin/org/openapitools/client/infrastructure/ApiClient.kt
+src/main/kotlin/org/openapitools/client/infrastructure/ApiResponse.kt
+src/main/kotlin/org/openapitools/client/infrastructure/BigDecimalAdapter.kt
+src/main/kotlin/org/openapitools/client/infrastructure/BigIntegerAdapter.kt
+src/main/kotlin/org/openapitools/client/infrastructure/ByteArrayAdapter.kt
+src/main/kotlin/org/openapitools/client/infrastructure/Errors.kt
+src/main/kotlin/org/openapitools/client/infrastructure/LocalDateAdapter.kt
+src/main/kotlin/org/openapitools/client/infrastructure/LocalDateTimeAdapter.kt
+src/main/kotlin/org/openapitools/client/infrastructure/OffsetDateTimeAdapter.kt
+src/main/kotlin/org/openapitools/client/infrastructure/PartConfig.kt
+src/main/kotlin/org/openapitools/client/infrastructure/RequestConfig.kt
+src/main/kotlin/org/openapitools/client/infrastructure/RequestMethod.kt
+src/main/kotlin/org/openapitools/client/infrastructure/ResponseExtensions.kt
+src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
+src/main/kotlin/org/openapitools/client/infrastructure/URIAdapter.kt
+src/main/kotlin/org/openapitools/client/infrastructure/UUIDAdapter.kt
+src/main/kotlin/org/openapitools/client/models/CreateViewRequest.kt
+src/main/kotlin/org/openapitools/client/models/CreateViewRequestNetworkDetails.kt
+src/main/kotlin/org/openapitools/client/models/CreateViewResponse.kt
+src/main/kotlin/org/openapitools/client/models/GetPublicKeyResponse.kt
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/.openapi-generator/VERSION b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/.openapi-generator/VERSION
new file mode 100644
index 0000000000..cd802a1ec4
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/.openapi-generator/VERSION
@@ -0,0 +1 @@
+6.6.0
\ No newline at end of file
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/README.md b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/README.md
new file mode 100644
index 0000000000..0330f07fe0
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/README.md
@@ -0,0 +1,65 @@
+# org.openapitools.client - Kotlin client library for Hyperledger Cactus Plugin - BUNGEE-Hermes
+
+Can create blockchain views of different networks
+
+## Overview
+This API client was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. By using the [openapi-spec](https://github.com/OAI/OpenAPI-Specification) from a remote server, you can easily generate an API client.
+
+- API version: 2.0.0-alpha.2
+- Package version:
+- Build package: org.openapitools.codegen.languages.KotlinClientCodegen
+
+## Requires
+
+* Kotlin 1.7.21
+* Gradle 7.5
+
+## Build
+
+First, create the gradle wrapper script:
+
+```
+gradle wrapper
+```
+
+Then, run:
+
+```
+./gradlew check assemble
+```
+
+This runs all tests and packages the library.
+
+## Features/Implementation Notes
+
+* Supports JSON inputs/outputs, File inputs, and Form inputs.
+* Supports collection formats for query parameters: csv, tsv, ssv, pipes.
+* Some Kotlin and Java types are fully qualified to avoid conflicts with types defined in OpenAPI definitions.
+* Implementation of ApiClient is intended to reduce method counts, specifically to benefit Android targets.
+
+
+## Documentation for API Endpoints
+
+All URIs are relative to *http://localhost:3000/api/v1/@hyperledger/cactus-plugin-satp-hermes*
+
+Class | Method | HTTP request | Description
+------------ | ------------- | ------------- | -------------
+*DefaultApi* | [**createViewV1**](docs/DefaultApi.md#createviewv1) | **GET** /api/v1/plugins/@hyperledger/cactus-plugin-bungee-hermes/create-view | Creates a Blockchain View.
+*DefaultApi* | [**getAvailableStrategies**](docs/DefaultApi.md#getavailablestrategies) | **GET** /api/v1/plugins/@hyperledger/cactus-plugin-bungee-hermes/get-available-strategies | Queries plugin's available strategies for ledger capture
+*DefaultApi* | [**getPublicKey**](docs/DefaultApi.md#getpublickey) | **GET** /api/v1/plugins/@hyperledger/cactus-plugin-bungee-hermes/get-public-key | Queries plugin's public key
+
+
+
+## Documentation for Models
+
+ - [org.openapitools.client.models.CreateViewRequest](docs/CreateViewRequest.md)
+ - [org.openapitools.client.models.CreateViewRequestNetworkDetails](docs/CreateViewRequestNetworkDetails.md)
+ - [org.openapitools.client.models.CreateViewResponse](docs/CreateViewResponse.md)
+ - [org.openapitools.client.models.GetPublicKeyResponse](docs/GetPublicKeyResponse.md)
+
+
+
+## Documentation for Authorization
+
+Endpoints do not require authorization.
+
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/build.gradle b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/build.gradle
new file mode 100644
index 0000000000..66a3c68b89
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/build.gradle
@@ -0,0 +1,38 @@
+group 'org.openapitools'
+version '1.0.0'
+
+wrapper {
+ gradleVersion = '7.5'
+ distributionUrl = "https://services.gradle.org/distributions/gradle-$gradleVersion-all.zip"
+}
+
+buildscript {
+ ext.kotlin_version = '1.7.21'
+
+ repositories {
+ maven { url "https://repo1.maven.org/maven2" }
+ }
+ dependencies {
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ }
+}
+
+apply plugin: 'kotlin'
+apply plugin: 'maven-publish'
+
+repositories {
+ maven { url "https://repo1.maven.org/maven2" }
+}
+
+test {
+ useJUnitPlatform()
+}
+
+dependencies {
+ implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
+ implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
+ implementation "com.squareup.moshi:moshi-kotlin:1.13.0"
+ implementation "com.squareup.moshi:moshi-adapters:1.13.0"
+ implementation "com.squareup.okhttp3:okhttp:4.10.0"
+ testImplementation "io.kotlintest:kotlintest-runner-junit5:3.4.2"
+}
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/gradlew b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/gradlew
new file mode 100644
index 0000000000..aeb74cbb43
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/gradlew
@@ -0,0 +1,245 @@
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+#
+# Gradle start up script for POSIX generated by Gradle.
+#
+# Important for running:
+#
+# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+# noncompliant, but you have some other compliant shell such as ksh or
+# bash, then to run this script, type that shell name before the whole
+# command line, like:
+#
+# ksh Gradle
+#
+# Busybox and similar reduced shells will NOT work, because this script
+# requires all of these POSIX shell features:
+# * functions;
+# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+# * compound commands having a testable exit status, especially «case»;
+# * various built-in commands including «command», «set», and «ulimit».
+#
+# Important for patching:
+#
+# (2) This script targets any POSIX shell, so it avoids extensions provided
+# by Bash, Ksh, etc; in particular arrays are avoided.
+#
+# The "traditional" practice of packing multiple parameters into a
+# space-separated string is a well documented source of bugs and security
+# problems, so this is (mostly) avoided, by progressively accumulating
+# options in "$@", and eventually passing that to Java.
+#
+# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+# see the in-line comments for details.
+#
+# There are tweaks for specific operating systems such as AIX, CygWin,
+# Darwin, MinGW, and NonStop.
+#
+# (3) This script is generated from the Groovy template
+# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# within the Gradle project.
+#
+# You can find Gradle at https://github.com/gradle/gradle/.
+#
+##############################################################################
+
+# Attempt to set APP_HOME
+
+# Resolve links: $0 may be a link
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
+done
+
+# This is normally unused
+# shellcheck disable=SC2034
+APP_BASE_NAME=${0##*/}
+APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD=maximum
+
+warn () {
+ echo "$*"
+} >&2
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+} >&2
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD=$JAVA_HOME/jre/sh/java
+ else
+ JAVACMD=$JAVA_HOME/bin/java
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD=java
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC3045
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC3045
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
+ esac
+fi
+
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
+ fi
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
+ done
+fi
+
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Collect all arguments for the java command;
+# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
+# shell script including quotes and variable substitutions, so put them in
+# double quotes to make sure that they get re-expanded; and
+# * put everything else in single quotes, so that it's not re-expanded.
+
+set -- \
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
+ -classpath "$CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ "$@"
+
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+ die "xargs is not available"
+fi
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+# set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"$@"'
+
+exec "$JAVACMD" "$@"
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/gradlew.bat b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/gradlew.bat
new file mode 100644
index 0000000000..93e3f59f13
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/gradlew.bat
@@ -0,0 +1,92 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%"=="" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if %ERRORLEVEL% equ 0 goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if %ERRORLEVEL% equ 0 goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/settings.gradle b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/settings.gradle
new file mode 100644
index 0000000000..391dcea81d
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/settings.gradle
@@ -0,0 +1,2 @@
+
+rootProject.name = 'kotlin-client'
\ No newline at end of file
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/apis/DefaultApi.kt b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/apis/DefaultApi.kt
new file mode 100644
index 0000000000..aa283d52da
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/apis/DefaultApi.kt
@@ -0,0 +1,261 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package org.openapitools.client.apis
+
+import java.io.IOException
+import okhttp3.OkHttpClient
+import okhttp3.HttpUrl
+
+import org.openapitools.client.models.CreateViewRequest
+import org.openapitools.client.models.CreateViewResponse
+import org.openapitools.client.models.GetPublicKeyResponse
+
+import com.squareup.moshi.Json
+
+import org.openapitools.client.infrastructure.ApiClient
+import org.openapitools.client.infrastructure.ApiResponse
+import org.openapitools.client.infrastructure.ClientException
+import org.openapitools.client.infrastructure.ClientError
+import org.openapitools.client.infrastructure.ServerException
+import org.openapitools.client.infrastructure.ServerError
+import org.openapitools.client.infrastructure.MultiValueMap
+import org.openapitools.client.infrastructure.PartConfig
+import org.openapitools.client.infrastructure.RequestConfig
+import org.openapitools.client.infrastructure.RequestMethod
+import org.openapitools.client.infrastructure.ResponseType
+import org.openapitools.client.infrastructure.Success
+import org.openapitools.client.infrastructure.toMultiValue
+
+class DefaultApi(basePath: kotlin.String = defaultBasePath, client: OkHttpClient = ApiClient.defaultClient) : ApiClient(basePath, client) {
+ companion object {
+ @JvmStatic
+ val defaultBasePath: String by lazy {
+ System.getProperties().getProperty(ApiClient.baseUrlKey, "http://localhost:3000/api/v1/@hyperledger/cactus-plugin-satp-hermes")
+ }
+ }
+
+ /**
+ * Creates a Blockchain View.
+ *
+ * @param createViewRequest
+ * @return CreateViewResponse
+ * @throws IllegalStateException If the request is not correctly configured
+ * @throws IOException Rethrows the OkHttp execute method exception
+ * @throws UnsupportedOperationException If the API returns an informational or redirection response
+ * @throws ClientException If the API returns a client error response
+ * @throws ServerException If the API returns a server error response
+ */
+ @Suppress("UNCHECKED_CAST")
+ @Throws(IllegalStateException::class, IOException::class, UnsupportedOperationException::class, ClientException::class, ServerException::class)
+ fun createViewV1(createViewRequest: CreateViewRequest) : CreateViewResponse {
+ val localVarResponse = createViewV1WithHttpInfo(createViewRequest = createViewRequest)
+
+ return when (localVarResponse.responseType) {
+ ResponseType.Success -> (localVarResponse as Success<*>).data as CreateViewResponse
+ ResponseType.Informational -> throw UnsupportedOperationException("Client does not support Informational responses.")
+ ResponseType.Redirection -> throw UnsupportedOperationException("Client does not support Redirection responses.")
+ ResponseType.ClientError -> {
+ val localVarError = localVarResponse as ClientError<*>
+ throw ClientException("Client error : ${localVarError.statusCode} ${localVarError.message.orEmpty()}", localVarError.statusCode, localVarResponse)
+ }
+ ResponseType.ServerError -> {
+ val localVarError = localVarResponse as ServerError<*>
+ throw ServerException("Server error : ${localVarError.statusCode} ${localVarError.message.orEmpty()}", localVarError.statusCode, localVarResponse)
+ }
+ }
+ }
+
+ /**
+ * Creates a Blockchain View.
+ *
+ * @param createViewRequest
+ * @return ApiResponse
+ * @throws IllegalStateException If the request is not correctly configured
+ * @throws IOException Rethrows the OkHttp execute method exception
+ */
+ @Suppress("UNCHECKED_CAST")
+ @Throws(IllegalStateException::class, IOException::class)
+ fun createViewV1WithHttpInfo(createViewRequest: CreateViewRequest) : ApiResponse {
+ val localVariableConfig = createViewV1RequestConfig(createViewRequest = createViewRequest)
+
+ return request(
+ localVariableConfig
+ )
+ }
+
+ /**
+ * To obtain the request config of the operation createViewV1
+ *
+ * @param createViewRequest
+ * @return RequestConfig
+ */
+ fun createViewV1RequestConfig(createViewRequest: CreateViewRequest) : RequestConfig {
+ val localVariableBody = createViewRequest
+ val localVariableQuery: MultiValueMap = mutableMapOf()
+ val localVariableHeaders: MutableMap = mutableMapOf()
+ localVariableHeaders["Content-Type"] = "application/json"
+ localVariableHeaders["Accept"] = "application/json"
+
+ return RequestConfig(
+ method = RequestMethod.GET,
+ path = "/api/v1/plugins/@hyperledger/cactus-plugin-bungee-hermes/create-view",
+ query = localVariableQuery,
+ headers = localVariableHeaders,
+ requiresAuthentication = false,
+ body = localVariableBody
+ )
+ }
+
+ /**
+ * Queries plugin's available strategies for ledger capture
+ *
+ * @return kotlin.collections.List
+ * @throws IllegalStateException If the request is not correctly configured
+ * @throws IOException Rethrows the OkHttp execute method exception
+ * @throws UnsupportedOperationException If the API returns an informational or redirection response
+ * @throws ClientException If the API returns a client error response
+ * @throws ServerException If the API returns a server error response
+ */
+ @Suppress("UNCHECKED_CAST")
+ @Throws(IllegalStateException::class, IOException::class, UnsupportedOperationException::class, ClientException::class, ServerException::class)
+ fun getAvailableStrategies() : kotlin.collections.List {
+ val localVarResponse = getAvailableStrategiesWithHttpInfo()
+
+ return when (localVarResponse.responseType) {
+ ResponseType.Success -> (localVarResponse as Success<*>).data as kotlin.collections.List
+ ResponseType.Informational -> throw UnsupportedOperationException("Client does not support Informational responses.")
+ ResponseType.Redirection -> throw UnsupportedOperationException("Client does not support Redirection responses.")
+ ResponseType.ClientError -> {
+ val localVarError = localVarResponse as ClientError<*>
+ throw ClientException("Client error : ${localVarError.statusCode} ${localVarError.message.orEmpty()}", localVarError.statusCode, localVarResponse)
+ }
+ ResponseType.ServerError -> {
+ val localVarError = localVarResponse as ServerError<*>
+ throw ServerException("Server error : ${localVarError.statusCode} ${localVarError.message.orEmpty()}", localVarError.statusCode, localVarResponse)
+ }
+ }
+ }
+
+ /**
+ * Queries plugin's available strategies for ledger capture
+ *
+ * @return ApiResponse?>
+ * @throws IllegalStateException If the request is not correctly configured
+ * @throws IOException Rethrows the OkHttp execute method exception
+ */
+ @Suppress("UNCHECKED_CAST")
+ @Throws(IllegalStateException::class, IOException::class)
+ fun getAvailableStrategiesWithHttpInfo() : ApiResponse?> {
+ val localVariableConfig = getAvailableStrategiesRequestConfig()
+
+ return request>(
+ localVariableConfig
+ )
+ }
+
+ /**
+ * To obtain the request config of the operation getAvailableStrategies
+ *
+ * @return RequestConfig
+ */
+ fun getAvailableStrategiesRequestConfig() : RequestConfig {
+ val localVariableBody = null
+ val localVariableQuery: MultiValueMap = mutableMapOf()
+ val localVariableHeaders: MutableMap = mutableMapOf()
+ localVariableHeaders["Accept"] = "application/json"
+
+ return RequestConfig(
+ method = RequestMethod.GET,
+ path = "/api/v1/plugins/@hyperledger/cactus-plugin-bungee-hermes/get-available-strategies",
+ query = localVariableQuery,
+ headers = localVariableHeaders,
+ requiresAuthentication = false,
+ body = localVariableBody
+ )
+ }
+
+ /**
+ * Queries plugin's public key
+ *
+ * @return GetPublicKeyResponse
+ * @throws IllegalStateException If the request is not correctly configured
+ * @throws IOException Rethrows the OkHttp execute method exception
+ * @throws UnsupportedOperationException If the API returns an informational or redirection response
+ * @throws ClientException If the API returns a client error response
+ * @throws ServerException If the API returns a server error response
+ */
+ @Suppress("UNCHECKED_CAST")
+ @Throws(IllegalStateException::class, IOException::class, UnsupportedOperationException::class, ClientException::class, ServerException::class)
+ fun getPublicKey() : GetPublicKeyResponse {
+ val localVarResponse = getPublicKeyWithHttpInfo()
+
+ return when (localVarResponse.responseType) {
+ ResponseType.Success -> (localVarResponse as Success<*>).data as GetPublicKeyResponse
+ ResponseType.Informational -> throw UnsupportedOperationException("Client does not support Informational responses.")
+ ResponseType.Redirection -> throw UnsupportedOperationException("Client does not support Redirection responses.")
+ ResponseType.ClientError -> {
+ val localVarError = localVarResponse as ClientError<*>
+ throw ClientException("Client error : ${localVarError.statusCode} ${localVarError.message.orEmpty()}", localVarError.statusCode, localVarResponse)
+ }
+ ResponseType.ServerError -> {
+ val localVarError = localVarResponse as ServerError<*>
+ throw ServerException("Server error : ${localVarError.statusCode} ${localVarError.message.orEmpty()}", localVarError.statusCode, localVarResponse)
+ }
+ }
+ }
+
+ /**
+ * Queries plugin's public key
+ *
+ * @return ApiResponse
+ * @throws IllegalStateException If the request is not correctly configured
+ * @throws IOException Rethrows the OkHttp execute method exception
+ */
+ @Suppress("UNCHECKED_CAST")
+ @Throws(IllegalStateException::class, IOException::class)
+ fun getPublicKeyWithHttpInfo() : ApiResponse {
+ val localVariableConfig = getPublicKeyRequestConfig()
+
+ return request(
+ localVariableConfig
+ )
+ }
+
+ /**
+ * To obtain the request config of the operation getPublicKey
+ *
+ * @return RequestConfig
+ */
+ fun getPublicKeyRequestConfig() : RequestConfig {
+ val localVariableBody = null
+ val localVariableQuery: MultiValueMap = mutableMapOf()
+ val localVariableHeaders: MutableMap = mutableMapOf()
+ localVariableHeaders["Accept"] = "application/json"
+
+ return RequestConfig(
+ method = RequestMethod.GET,
+ path = "/api/v1/plugins/@hyperledger/cactus-plugin-bungee-hermes/get-public-key",
+ query = localVariableQuery,
+ headers = localVariableHeaders,
+ requiresAuthentication = false,
+ body = localVariableBody
+ )
+ }
+
+
+ private fun encodeURIComponent(uriComponent: kotlin.String): kotlin.String =
+ HttpUrl.Builder().scheme("http").host("localhost").addPathSegment(uriComponent).build().encodedPathSegments[0]
+}
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/ApiAbstractions.kt b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/ApiAbstractions.kt
new file mode 100644
index 0000000000..ef7a8f1e1a
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/ApiAbstractions.kt
@@ -0,0 +1,23 @@
+package org.openapitools.client.infrastructure
+
+typealias MultiValueMap = MutableMap>
+
+fun collectionDelimiter(collectionFormat: String) = when(collectionFormat) {
+ "csv" -> ","
+ "tsv" -> "\t"
+ "pipe" -> "|"
+ "space" -> " "
+ else -> ""
+}
+
+val defaultMultiValueConverter: (item: Any?) -> String = { item -> "$item" }
+
+fun toMultiValue(items: Array, collectionFormat: String, map: (item: T) -> String = defaultMultiValueConverter)
+ = toMultiValue(items.asIterable(), collectionFormat, map)
+
+fun toMultiValue(items: Iterable, collectionFormat: String, map: (item: T) -> String = defaultMultiValueConverter): List {
+ return when(collectionFormat) {
+ "multi" -> items.map(map)
+ else -> listOf(items.joinToString(separator = collectionDelimiter(collectionFormat), transform = map))
+ }
+}
\ No newline at end of file
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/ApiClient.kt b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/ApiClient.kt
new file mode 100644
index 0000000000..ea4b7b6593
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/ApiClient.kt
@@ -0,0 +1,245 @@
+package org.openapitools.client.infrastructure
+
+import okhttp3.OkHttpClient
+import okhttp3.RequestBody
+import okhttp3.RequestBody.Companion.asRequestBody
+import okhttp3.RequestBody.Companion.toRequestBody
+import okhttp3.FormBody
+import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
+import okhttp3.ResponseBody
+import okhttp3.MediaType.Companion.toMediaTypeOrNull
+import okhttp3.Request
+import okhttp3.Headers
+import okhttp3.Headers.Companion.toHeaders
+import okhttp3.MultipartBody
+import okhttp3.Call
+import okhttp3.Callback
+import okhttp3.Response
+import okhttp3.internal.EMPTY_REQUEST
+import java.io.BufferedWriter
+import java.io.File
+import java.io.FileWriter
+import java.io.IOException
+import java.net.URLConnection
+import java.time.LocalDate
+import java.time.LocalDateTime
+import java.time.LocalTime
+import java.time.OffsetDateTime
+import java.time.OffsetTime
+import java.util.Locale
+import com.squareup.moshi.adapter
+
+open class ApiClient(val baseUrl: String, val client: OkHttpClient = defaultClient) {
+ companion object {
+ protected const val ContentType = "Content-Type"
+ protected const val Accept = "Accept"
+ protected const val Authorization = "Authorization"
+ protected const val JsonMediaType = "application/json"
+ protected const val FormDataMediaType = "multipart/form-data"
+ protected const val FormUrlEncMediaType = "application/x-www-form-urlencoded"
+ protected const val XmlMediaType = "application/xml"
+
+ val apiKey: MutableMap = mutableMapOf()
+ val apiKeyPrefix: MutableMap = mutableMapOf()
+ var username: String? = null
+ var password: String? = null
+ var accessToken: String? = null
+ const val baseUrlKey = "org.openapitools.client.baseUrl"
+
+ @JvmStatic
+ val defaultClient: OkHttpClient by lazy {
+ builder.build()
+ }
+
+ @JvmStatic
+ val builder: OkHttpClient.Builder = OkHttpClient.Builder()
+ }
+
+ /**
+ * Guess Content-Type header from the given file (defaults to "application/octet-stream").
+ *
+ * @param file The given file
+ * @return The guessed Content-Type
+ */
+ protected fun guessContentTypeFromFile(file: File): String {
+ val contentType = URLConnection.guessContentTypeFromName(file.name)
+ return contentType ?: "application/octet-stream"
+ }
+
+ protected inline fun requestBody(content: T, mediaType: String?): RequestBody =
+ when {
+ content is File -> content.asRequestBody((mediaType ?: guessContentTypeFromFile(content)).toMediaTypeOrNull())
+ mediaType == FormDataMediaType ->
+ MultipartBody.Builder()
+ .setType(MultipartBody.FORM)
+ .apply {
+ // content's type *must* be Map>
+ @Suppress("UNCHECKED_CAST")
+ (content as Map>).forEach { (name, part) ->
+ if (part.body is File) {
+ val partHeaders = part.headers.toMutableMap() +
+ ("Content-Disposition" to "form-data; name=\"$name\"; filename=\"${part.body.name}\"")
+ val fileMediaType = guessContentTypeFromFile(part.body).toMediaTypeOrNull()
+ addPart(
+ partHeaders.toHeaders(),
+ part.body.asRequestBody(fileMediaType)
+ )
+ } else {
+ val partHeaders = part.headers.toMutableMap() +
+ ("Content-Disposition" to "form-data; name=\"$name\"")
+ addPart(
+ partHeaders.toHeaders(),
+ parameterToString(part.body).toRequestBody(null)
+ )
+ }
+ }
+ }.build()
+ mediaType == FormUrlEncMediaType -> {
+ FormBody.Builder().apply {
+ // content's type *must* be Map>
+ @Suppress("UNCHECKED_CAST")
+ (content as Map>).forEach { (name, part) ->
+ add(name, parameterToString(part.body))
+ }
+ }.build()
+ }
+ mediaType == null || mediaType.startsWith("application/") && mediaType.endsWith("json") ->
+ if (content == null) {
+ EMPTY_REQUEST
+ } else {
+ Serializer.moshi.adapter(T::class.java).toJson(content)
+ .toRequestBody((mediaType ?: JsonMediaType).toMediaTypeOrNull())
+ }
+ mediaType == XmlMediaType -> throw UnsupportedOperationException("xml not currently supported.")
+ // TODO: this should be extended with other serializers
+ else -> throw UnsupportedOperationException("requestBody currently only supports JSON body and File body.")
+ }
+
+ @OptIn(ExperimentalStdlibApi::class)
+ protected inline fun responseBody(body: ResponseBody?, mediaType: String? = JsonMediaType): T? {
+ if(body == null) {
+ return null
+ }
+ if (T::class.java == File::class.java) {
+ // return tempFile
+ // Attention: if you are developing an android app that supports API Level 25 and bellow, please check flag supportAndroidApiLevel25AndBelow in https://openapi-generator.tech/docs/generators/kotlin#config-options
+ val tempFile = java.nio.file.Files.createTempFile("tmp.org.openapitools.client", null).toFile()
+ tempFile.deleteOnExit()
+ body.byteStream().use { inputStream ->
+ tempFile.outputStream().use { tempFileOutputStream ->
+ inputStream.copyTo(tempFileOutputStream)
+ }
+ }
+ return tempFile as T
+ }
+ val bodyContent = body.string()
+ if (bodyContent.isEmpty()) {
+ return null
+ }
+ return when {
+ mediaType==null || (mediaType.startsWith("application/") && mediaType.endsWith("json")) ->
+ Serializer.moshi.adapter().fromJson(bodyContent)
+ else -> throw UnsupportedOperationException("responseBody currently only supports JSON body.")
+ }
+ }
+
+
+ protected inline fun request(requestConfig: RequestConfig): ApiResponse {
+ val httpUrl = baseUrl.toHttpUrlOrNull() ?: throw IllegalStateException("baseUrl is invalid.")
+
+ val url = httpUrl.newBuilder()
+ .addEncodedPathSegments(requestConfig.path.trimStart('/'))
+ .apply {
+ requestConfig.query.forEach { query ->
+ query.value.forEach { queryValue ->
+ addQueryParameter(query.key, queryValue)
+ }
+ }
+ }.build()
+
+ // take content-type/accept from spec or set to default (application/json) if not defined
+ if (requestConfig.body != null && requestConfig.headers[ContentType].isNullOrEmpty()) {
+ requestConfig.headers[ContentType] = JsonMediaType
+ }
+ if (requestConfig.headers[Accept].isNullOrEmpty()) {
+ requestConfig.headers[Accept] = JsonMediaType
+ }
+ val headers = requestConfig.headers
+
+ if (headers[Accept].isNullOrEmpty()) {
+ throw kotlin.IllegalStateException("Missing Accept header. This is required.")
+ }
+
+ val contentType = if (headers[ContentType] != null) {
+ // TODO: support multiple contentType options here.
+ (headers[ContentType] as String).substringBefore(";").lowercase(Locale.US)
+ } else {
+ null
+ }
+
+ val request = when (requestConfig.method) {
+ RequestMethod.DELETE -> Request.Builder().url(url).delete(requestBody(requestConfig.body, contentType))
+ RequestMethod.GET -> Request.Builder().url(url)
+ RequestMethod.HEAD -> Request.Builder().url(url).head()
+ RequestMethod.PATCH -> Request.Builder().url(url).patch(requestBody(requestConfig.body, contentType))
+ RequestMethod.PUT -> Request.Builder().url(url).put(requestBody(requestConfig.body, contentType))
+ RequestMethod.POST -> Request.Builder().url(url).post(requestBody(requestConfig.body, contentType))
+ RequestMethod.OPTIONS -> Request.Builder().url(url).method("OPTIONS", null)
+ }.apply {
+ headers.forEach { header -> addHeader(header.key, header.value) }
+ }.build()
+
+ val response = client.newCall(request).execute()
+
+ val accept = response.header(ContentType)?.substringBefore(";")?.lowercase(Locale.US)
+
+ // TODO: handle specific mapping types. e.g. Map>
+ return when {
+ response.isRedirect -> Redirection(
+ response.code,
+ response.headers.toMultimap()
+ )
+ response.isInformational -> Informational(
+ response.message,
+ response.code,
+ response.headers.toMultimap()
+ )
+ response.isSuccessful -> Success(
+ responseBody(response.body, accept),
+ response.code,
+ response.headers.toMultimap()
+ )
+ response.isClientError -> ClientError(
+ response.message,
+ response.body?.string(),
+ response.code,
+ response.headers.toMultimap()
+ )
+ else -> ServerError(
+ response.message,
+ response.body?.string(),
+ response.code,
+ response.headers.toMultimap()
+ )
+ }
+ }
+
+ protected fun parameterToString(value: Any?): String = when (value) {
+ null -> ""
+ is Array<*> -> toMultiValue(value, "csv").toString()
+ is Iterable<*> -> toMultiValue(value, "csv").toString()
+ is OffsetDateTime, is OffsetTime, is LocalDateTime, is LocalDate, is LocalTime ->
+ parseDateToQueryString(value)
+ else -> value.toString()
+ }
+
+ protected inline fun parseDateToQueryString(value : T): String {
+ /*
+ .replace("\"", "") converts the json object string to an actual string for the query parameter.
+ The moshi or gson adapter allows a more generic solution instead of trying to use a native
+ formatter. It also easily allows to provide a simple way to define a custom date format pattern
+ inside a gson/moshi adapter.
+ */
+ return Serializer.moshi.adapter(T::class.java).toJson(value).replace("\"", "")
+ }
+}
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/ApiResponse.kt b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/ApiResponse.kt
new file mode 100644
index 0000000000..cf2cfaa95d
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/ApiResponse.kt
@@ -0,0 +1,43 @@
+package org.openapitools.client.infrastructure
+
+enum class ResponseType {
+ Success, Informational, Redirection, ClientError, ServerError
+}
+
+interface Response
+
+abstract class ApiResponse(val responseType: ResponseType): Response {
+ abstract val statusCode: Int
+ abstract val headers: Map>
+}
+
+class Success(
+ val data: T,
+ override val statusCode: Int = -1,
+ override val headers: Map> = mapOf()
+): ApiResponse(ResponseType.Success)
+
+class Informational(
+ val statusText: String,
+ override val statusCode: Int = -1,
+ override val headers: Map> = mapOf()
+) : ApiResponse(ResponseType.Informational)
+
+class Redirection(
+ override val statusCode: Int = -1,
+ override val headers: Map> = mapOf()
+) : ApiResponse(ResponseType.Redirection)
+
+class ClientError(
+ val message: String? = null,
+ val body: Any? = null,
+ override val statusCode: Int = -1,
+ override val headers: Map> = mapOf()
+) : ApiResponse(ResponseType.ClientError)
+
+class ServerError(
+ val message: String? = null,
+ val body: Any? = null,
+ override val statusCode: Int = -1,
+ override val headers: Map>
+): ApiResponse(ResponseType.ServerError)
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/BigDecimalAdapter.kt b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/BigDecimalAdapter.kt
new file mode 100644
index 0000000000..064b57fc6b
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/BigDecimalAdapter.kt
@@ -0,0 +1,17 @@
+package org.openapitools.client.infrastructure
+
+import com.squareup.moshi.FromJson
+import com.squareup.moshi.ToJson
+import java.math.BigDecimal
+
+class BigDecimalAdapter {
+ @ToJson
+ fun toJson(value: BigDecimal): String {
+ return value.toPlainString()
+ }
+
+ @FromJson
+ fun fromJson(value: String): BigDecimal {
+ return BigDecimal(value)
+ }
+}
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/BigIntegerAdapter.kt b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/BigIntegerAdapter.kt
new file mode 100644
index 0000000000..7df6057b45
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/BigIntegerAdapter.kt
@@ -0,0 +1,17 @@
+package org.openapitools.client.infrastructure
+
+import com.squareup.moshi.FromJson
+import com.squareup.moshi.ToJson
+import java.math.BigInteger
+
+class BigIntegerAdapter {
+ @ToJson
+ fun toJson(value: BigInteger): String {
+ return value.toString()
+ }
+
+ @FromJson
+ fun fromJson(value: String): BigInteger {
+ return BigInteger(value)
+ }
+}
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/ByteArrayAdapter.kt b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/ByteArrayAdapter.kt
new file mode 100644
index 0000000000..ff5e2a81ee
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/ByteArrayAdapter.kt
@@ -0,0 +1,12 @@
+package org.openapitools.client.infrastructure
+
+import com.squareup.moshi.FromJson
+import com.squareup.moshi.ToJson
+
+class ByteArrayAdapter {
+ @ToJson
+ fun toJson(data: ByteArray): String = String(data)
+
+ @FromJson
+ fun fromJson(data: String): ByteArray = data.toByteArray()
+}
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/Errors.kt b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/Errors.kt
new file mode 100644
index 0000000000..b5310e71f1
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/Errors.kt
@@ -0,0 +1,18 @@
+@file:Suppress("unused")
+package org.openapitools.client.infrastructure
+
+import java.lang.RuntimeException
+
+open class ClientException(message: kotlin.String? = null, val statusCode: Int = -1, val response: Response? = null) : RuntimeException(message) {
+
+ companion object {
+ private const val serialVersionUID: Long = 123L
+ }
+}
+
+open class ServerException(message: kotlin.String? = null, val statusCode: Int = -1, val response: Response? = null) : RuntimeException(message) {
+
+ companion object {
+ private const val serialVersionUID: Long = 456L
+ }
+}
\ No newline at end of file
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/LocalDateAdapter.kt b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/LocalDateAdapter.kt
new file mode 100644
index 0000000000..b2e1654479
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/LocalDateAdapter.kt
@@ -0,0 +1,19 @@
+package org.openapitools.client.infrastructure
+
+import com.squareup.moshi.FromJson
+import com.squareup.moshi.ToJson
+import java.time.LocalDate
+import java.time.format.DateTimeFormatter
+
+class LocalDateAdapter {
+ @ToJson
+ fun toJson(value: LocalDate): String {
+ return DateTimeFormatter.ISO_LOCAL_DATE.format(value)
+ }
+
+ @FromJson
+ fun fromJson(value: String): LocalDate {
+ return LocalDate.parse(value, DateTimeFormatter.ISO_LOCAL_DATE)
+ }
+
+}
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/LocalDateTimeAdapter.kt b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/LocalDateTimeAdapter.kt
new file mode 100644
index 0000000000..e082db9481
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/LocalDateTimeAdapter.kt
@@ -0,0 +1,19 @@
+package org.openapitools.client.infrastructure
+
+import com.squareup.moshi.FromJson
+import com.squareup.moshi.ToJson
+import java.time.LocalDateTime
+import java.time.format.DateTimeFormatter
+
+class LocalDateTimeAdapter {
+ @ToJson
+ fun toJson(value: LocalDateTime): String {
+ return DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(value)
+ }
+
+ @FromJson
+ fun fromJson(value: String): LocalDateTime {
+ return LocalDateTime.parse(value, DateTimeFormatter.ISO_LOCAL_DATE_TIME)
+ }
+
+}
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/OffsetDateTimeAdapter.kt b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/OffsetDateTimeAdapter.kt
new file mode 100644
index 0000000000..87437871a3
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/OffsetDateTimeAdapter.kt
@@ -0,0 +1,19 @@
+package org.openapitools.client.infrastructure
+
+import com.squareup.moshi.FromJson
+import com.squareup.moshi.ToJson
+import java.time.OffsetDateTime
+import java.time.format.DateTimeFormatter
+
+class OffsetDateTimeAdapter {
+ @ToJson
+ fun toJson(value: OffsetDateTime): String {
+ return DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(value)
+ }
+
+ @FromJson
+ fun fromJson(value: String): OffsetDateTime {
+ return OffsetDateTime.parse(value, DateTimeFormatter.ISO_OFFSET_DATE_TIME)
+ }
+
+}
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/PartConfig.kt b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/PartConfig.kt
new file mode 100644
index 0000000000..be00e38fba
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/PartConfig.kt
@@ -0,0 +1,11 @@
+package org.openapitools.client.infrastructure
+
+/**
+ * Defines a config object for a given part of a multi-part request.
+ * NOTE: Headers is a Map because rfc2616 defines
+ * multi-valued headers as csv-only.
+ */
+data class PartConfig(
+ val headers: MutableMap = mutableMapOf(),
+ val body: T? = null
+)
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/RequestConfig.kt b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/RequestConfig.kt
new file mode 100644
index 0000000000..625a19002b
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/RequestConfig.kt
@@ -0,0 +1,18 @@
+package org.openapitools.client.infrastructure
+
+/**
+ * Defines a config object for a given request.
+ * NOTE: This object doesn't include 'body' because it
+ * allows for caching of the constructed object
+ * for many request definitions.
+ * NOTE: Headers is a Map because rfc2616 defines
+ * multi-valued headers as csv-only.
+ */
+data class RequestConfig(
+ val method: RequestMethod,
+ val path: String,
+ val headers: MutableMap = mutableMapOf(),
+ val query: MutableMap> = mutableMapOf(),
+ val requiresAuthentication: Boolean,
+ val body: T? = null
+)
\ No newline at end of file
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/RequestMethod.kt b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/RequestMethod.kt
new file mode 100644
index 0000000000..931b12b8bd
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/RequestMethod.kt
@@ -0,0 +1,8 @@
+package org.openapitools.client.infrastructure
+
+/**
+ * Provides enumerated HTTP verbs
+ */
+enum class RequestMethod {
+ GET, DELETE, HEAD, OPTIONS, PATCH, POST, PUT
+}
\ No newline at end of file
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/ResponseExtensions.kt b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/ResponseExtensions.kt
new file mode 100644
index 0000000000..9bd2790dc1
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/ResponseExtensions.kt
@@ -0,0 +1,24 @@
+package org.openapitools.client.infrastructure
+
+import okhttp3.Response
+
+/**
+ * Provides an extension to evaluation whether the response is a 1xx code
+ */
+val Response.isInformational : Boolean get() = this.code in 100..199
+
+/**
+ * Provides an extension to evaluation whether the response is a 3xx code
+ */
+@Suppress("EXTENSION_SHADOWED_BY_MEMBER")
+val Response.isRedirect : Boolean get() = this.code in 300..399
+
+/**
+ * Provides an extension to evaluation whether the response is a 4xx code
+ */
+val Response.isClientError : Boolean get() = this.code in 400..499
+
+/**
+ * Provides an extension to evaluation whether the response is a 5xx (Standard) through 999 (non-standard) code
+ */
+val Response.isServerError : Boolean get() = this.code in 500..999
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
new file mode 100644
index 0000000000..e22592e47d
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
@@ -0,0 +1,23 @@
+package org.openapitools.client.infrastructure
+
+import com.squareup.moshi.Moshi
+import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
+
+object Serializer {
+ @JvmStatic
+ val moshiBuilder: Moshi.Builder = Moshi.Builder()
+ .add(OffsetDateTimeAdapter())
+ .add(LocalDateTimeAdapter())
+ .add(LocalDateAdapter())
+ .add(UUIDAdapter())
+ .add(ByteArrayAdapter())
+ .add(URIAdapter())
+ .add(KotlinJsonAdapterFactory())
+ .add(BigDecimalAdapter())
+ .add(BigIntegerAdapter())
+
+ @JvmStatic
+ val moshi: Moshi by lazy {
+ moshiBuilder.build()
+ }
+}
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/URIAdapter.kt b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/URIAdapter.kt
new file mode 100644
index 0000000000..927522757d
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/URIAdapter.kt
@@ -0,0 +1,13 @@
+package org.openapitools.client.infrastructure
+
+import com.squareup.moshi.FromJson
+import com.squareup.moshi.ToJson
+import java.net.URI
+
+class URIAdapter {
+ @ToJson
+ fun toJson(uri: URI) = uri.toString()
+
+ @FromJson
+ fun fromJson(s: String): URI = URI.create(s)
+}
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/UUIDAdapter.kt b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/UUIDAdapter.kt
new file mode 100644
index 0000000000..7ccf7dc25d
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/infrastructure/UUIDAdapter.kt
@@ -0,0 +1,13 @@
+package org.openapitools.client.infrastructure
+
+import com.squareup.moshi.FromJson
+import com.squareup.moshi.ToJson
+import java.util.UUID
+
+class UUIDAdapter {
+ @ToJson
+ fun toJson(uuid: UUID) = uuid.toString()
+
+ @FromJson
+ fun fromJson(s: String): UUID = UUID.fromString(s)
+}
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/models/CreateViewRequest.kt b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/models/CreateViewRequest.kt
new file mode 100644
index 0000000000..74f718ad22
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/models/CreateViewRequest.kt
@@ -0,0 +1,56 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package org.openapitools.client.models
+
+import org.openapitools.client.models.CreateViewRequestNetworkDetails
+
+import com.squareup.moshi.Json
+import com.squareup.moshi.JsonClass
+
+/**
+ * Request object for createViewV1 endpoint
+ *
+ * @param strategyId
+ * @param networkDetails
+ * @param stateIds
+ * @param tI
+ * @param tF
+ * @param viewID
+ */
+
+
+data class CreateViewRequest (
+
+ @Json(name = "strategyId")
+ val strategyId: kotlin.String,
+
+ @Json(name = "networkDetails")
+ val networkDetails: CreateViewRequestNetworkDetails,
+
+ @Json(name = "stateIds")
+ val stateIds: kotlin.collections.List? = null,
+
+ @Json(name = "tI")
+ val tI: kotlin.String? = null,
+
+ @Json(name = "tF")
+ val tF: kotlin.String? = null,
+
+ @Json(name = "viewID")
+ val viewID: kotlin.String? = null
+
+)
+
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/models/CreateViewRequestNetworkDetails.kt b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/models/CreateViewRequestNetworkDetails.kt
new file mode 100644
index 0000000000..748c488a5a
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/models/CreateViewRequestNetworkDetails.kt
@@ -0,0 +1,39 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package org.openapitools.client.models
+
+
+import com.squareup.moshi.Json
+import com.squareup.moshi.JsonClass
+
+/**
+ *
+ *
+ * @param connectorApiPath
+ * @param participant
+ */
+
+
+data class CreateViewRequestNetworkDetails (
+
+ @Json(name = "connectorApiPath")
+ val connectorApiPath: kotlin.String,
+
+ @Json(name = "participant")
+ val participant: kotlin.String
+
+)
+
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/models/CreateViewResponse.kt b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/models/CreateViewResponse.kt
new file mode 100644
index 0000000000..fd3bca7f79
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/models/CreateViewResponse.kt
@@ -0,0 +1,39 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package org.openapitools.client.models
+
+
+import com.squareup.moshi.Json
+import com.squareup.moshi.JsonClass
+
+/**
+ * This is the response for a viewRequests
+ *
+ * @param view
+ * @param signature
+ */
+
+
+data class CreateViewResponse (
+
+ @Json(name = "view")
+ val view: kotlin.String? = null,
+
+ @Json(name = "signature")
+ val signature: kotlin.String? = null
+
+)
+
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/models/GetPublicKeyResponse.kt b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/models/GetPublicKeyResponse.kt
new file mode 100644
index 0000000000..7131884f72
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/kotlin/generated/openapi/kotlin-client/src/main/kotlin/org/openapitools/client/models/GetPublicKeyResponse.kt
@@ -0,0 +1,35 @@
+/**
+ *
+ * Please note:
+ * This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit this file manually.
+ *
+ */
+
+@file:Suppress(
+ "ArrayInDataClass",
+ "EnumEntryName",
+ "RemoveRedundantQualifierName",
+ "UnusedImport"
+)
+
+package org.openapitools.client.models
+
+
+import com.squareup.moshi.Json
+import com.squareup.moshi.JsonClass
+
+/**
+ * public key from bungee-hermes plugin instance
+ *
+ * @param pubKey
+ */
+
+
+data class GetPublicKeyResponse (
+
+ @Json(name = "pubKey")
+ val pubKey: kotlin.String? = null
+
+)
+
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/typescript/generated/openapi/typescript-axios/.openapi-generator/FILES b/packages/cactus-plugin-bungee-hermes/src/main/typescript/generated/openapi/typescript-axios/.openapi-generator/FILES
new file mode 100644
index 0000000000..53250c0269
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/typescript/generated/openapi/typescript-axios/.openapi-generator/FILES
@@ -0,0 +1,5 @@
+api.ts
+base.ts
+common.ts
+configuration.ts
+index.ts
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/typescript/generated/openapi/typescript-axios/.openapi-generator/VERSION b/packages/cactus-plugin-bungee-hermes/src/main/typescript/generated/openapi/typescript-axios/.openapi-generator/VERSION
new file mode 100644
index 0000000000..cd802a1ec4
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/typescript/generated/openapi/typescript-axios/.openapi-generator/VERSION
@@ -0,0 +1 @@
+6.6.0
\ No newline at end of file
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/typescript/generated/openapi/typescript-axios/api.ts b/packages/cactus-plugin-bungee-hermes/src/main/typescript/generated/openapi/typescript-axios/api.ts
new file mode 100644
index 0000000000..a1e5d31bc4
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/typescript/generated/openapi/typescript-axios/api.ts
@@ -0,0 +1,347 @@
+/* tslint:disable */
+/* eslint-disable */
+/**
+ * Hyperledger Cactus Plugin - BUNGEE-Hermes
+ * Can create blockchain views of different networks
+ *
+ * The version of the OpenAPI document: 2.0.0-alpha.2
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+import type { Configuration } from './configuration';
+import type { AxiosPromise, AxiosInstance, AxiosRequestConfig } from 'axios';
+import globalAxios from 'axios';
+// Some imports not used depending on template conditions
+// @ts-ignore
+import { DUMMY_BASE_URL, assertParamExists, setApiKeyToObject, setBasicAuthToObject, setBearerAuthToObject, setOAuthToObject, setSearchParams, serializeDataIfNeeded, toPathString, createRequestFunction } from './common';
+import type { RequestArgs } from './base';
+// @ts-ignore
+import { BASE_PATH, COLLECTION_FORMATS, BaseAPI, RequiredError } from './base';
+
+/**
+ * Request object for createViewV1 endpoint
+ * @export
+ * @interface CreateViewRequest
+ */
+export interface CreateViewRequest {
+ /**
+ *
+ * @type {Array}
+ * @memberof CreateViewRequest
+ */
+ 'stateIds'?: Array;
+ /**
+ *
+ * @type {string}
+ * @memberof CreateViewRequest
+ */
+ 'tI'?: string;
+ /**
+ *
+ * @type {string}
+ * @memberof CreateViewRequest
+ */
+ 'tF'?: string;
+ /**
+ *
+ * @type {string}
+ * @memberof CreateViewRequest
+ */
+ 'viewID'?: string;
+ /**
+ *
+ * @type {string}
+ * @memberof CreateViewRequest
+ */
+ 'strategyId': string;
+ /**
+ *
+ * @type {CreateViewRequestNetworkDetails}
+ * @memberof CreateViewRequest
+ */
+ 'networkDetails': CreateViewRequestNetworkDetails;
+}
+/**
+ *
+ * @export
+ * @interface CreateViewRequestNetworkDetails
+ */
+export interface CreateViewRequestNetworkDetails {
+ /**
+ *
+ * @type {string}
+ * @memberof CreateViewRequestNetworkDetails
+ */
+ 'connectorApiPath': string;
+ /**
+ *
+ * @type {string}
+ * @memberof CreateViewRequestNetworkDetails
+ */
+ 'participant': string;
+}
+/**
+ * This is the response for a viewRequests
+ * @export
+ * @interface CreateViewResponse
+ */
+export interface CreateViewResponse {
+ /**
+ *
+ * @type {string}
+ * @memberof CreateViewResponse
+ */
+ 'view'?: string;
+ /**
+ *
+ * @type {string}
+ * @memberof CreateViewResponse
+ */
+ 'signature'?: string;
+}
+/**
+ * public key from bungee-hermes plugin instance
+ * @export
+ * @interface GetPublicKeyResponse
+ */
+export interface GetPublicKeyResponse {
+ /**
+ *
+ * @type {string}
+ * @memberof GetPublicKeyResponse
+ */
+ 'pubKey'?: string;
+}
+
+/**
+ * DefaultApi - axios parameter creator
+ * @export
+ */
+export const DefaultApiAxiosParamCreator = function (configuration?: Configuration) {
+ return {
+ /**
+ *
+ * @summary Creates a Blockchain View.
+ * @param {CreateViewRequest} createViewRequest
+ * @param {*} [options] Override http request option.
+ * @throws {RequiredError}
+ */
+ createViewV1: async (createViewRequest: CreateViewRequest, options: AxiosRequestConfig = {}): Promise => {
+ // verify required parameter 'createViewRequest' is not null or undefined
+ assertParamExists('createViewV1', 'createViewRequest', createViewRequest)
+ const localVarPath = `/api/v1/plugins/@hyperledger/cactus-plugin-bungee-hermes/create-view`;
+ // use dummy base URL string because the URL constructor only accepts absolute URLs.
+ const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
+ let baseOptions;
+ if (configuration) {
+ baseOptions = configuration.baseOptions;
+ }
+
+ const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};
+ const localVarHeaderParameter = {} as any;
+ const localVarQueryParameter = {} as any;
+
+
+
+ localVarHeaderParameter['Content-Type'] = 'application/json';
+
+ setSearchParams(localVarUrlObj, localVarQueryParameter);
+ let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+ localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
+ localVarRequestOptions.data = serializeDataIfNeeded(createViewRequest, localVarRequestOptions, configuration)
+
+ return {
+ url: toPathString(localVarUrlObj),
+ options: localVarRequestOptions,
+ };
+ },
+ /**
+ *
+ * @summary Queries plugin\'s available strategies for ledger capture
+ * @param {*} [options] Override http request option.
+ * @throws {RequiredError}
+ */
+ getAvailableStrategies: async (options: AxiosRequestConfig = {}): Promise => {
+ const localVarPath = `/api/v1/plugins/@hyperledger/cactus-plugin-bungee-hermes/get-available-strategies`;
+ // use dummy base URL string because the URL constructor only accepts absolute URLs.
+ const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
+ let baseOptions;
+ if (configuration) {
+ baseOptions = configuration.baseOptions;
+ }
+
+ const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};
+ const localVarHeaderParameter = {} as any;
+ const localVarQueryParameter = {} as any;
+
+
+
+ setSearchParams(localVarUrlObj, localVarQueryParameter);
+ let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+ localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
+
+ return {
+ url: toPathString(localVarUrlObj),
+ options: localVarRequestOptions,
+ };
+ },
+ /**
+ *
+ * @summary Queries plugin\'s public key
+ * @param {*} [options] Override http request option.
+ * @throws {RequiredError}
+ */
+ getPublicKey: async (options: AxiosRequestConfig = {}): Promise => {
+ const localVarPath = `/api/v1/plugins/@hyperledger/cactus-plugin-bungee-hermes/get-public-key`;
+ // use dummy base URL string because the URL constructor only accepts absolute URLs.
+ const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
+ let baseOptions;
+ if (configuration) {
+ baseOptions = configuration.baseOptions;
+ }
+
+ const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};
+ const localVarHeaderParameter = {} as any;
+ const localVarQueryParameter = {} as any;
+
+
+
+ setSearchParams(localVarUrlObj, localVarQueryParameter);
+ let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+ localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
+
+ return {
+ url: toPathString(localVarUrlObj),
+ options: localVarRequestOptions,
+ };
+ },
+ }
+};
+
+/**
+ * DefaultApi - functional programming interface
+ * @export
+ */
+export const DefaultApiFp = function(configuration?: Configuration) {
+ const localVarAxiosParamCreator = DefaultApiAxiosParamCreator(configuration)
+ return {
+ /**
+ *
+ * @summary Creates a Blockchain View.
+ * @param {CreateViewRequest} createViewRequest
+ * @param {*} [options] Override http request option.
+ * @throws {RequiredError}
+ */
+ async createViewV1(createViewRequest: CreateViewRequest, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> {
+ const localVarAxiosArgs = await localVarAxiosParamCreator.createViewV1(createViewRequest, options);
+ return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
+ },
+ /**
+ *
+ * @summary Queries plugin\'s available strategies for ledger capture
+ * @param {*} [options] Override http request option.
+ * @throws {RequiredError}
+ */
+ async getAvailableStrategies(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>> {
+ const localVarAxiosArgs = await localVarAxiosParamCreator.getAvailableStrategies(options);
+ return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
+ },
+ /**
+ *
+ * @summary Queries plugin\'s public key
+ * @param {*} [options] Override http request option.
+ * @throws {RequiredError}
+ */
+ async getPublicKey(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> {
+ const localVarAxiosArgs = await localVarAxiosParamCreator.getPublicKey(options);
+ return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
+ },
+ }
+};
+
+/**
+ * DefaultApi - factory interface
+ * @export
+ */
+export const DefaultApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) {
+ const localVarFp = DefaultApiFp(configuration)
+ return {
+ /**
+ *
+ * @summary Creates a Blockchain View.
+ * @param {CreateViewRequest} createViewRequest
+ * @param {*} [options] Override http request option.
+ * @throws {RequiredError}
+ */
+ createViewV1(createViewRequest: CreateViewRequest, options?: any): AxiosPromise {
+ return localVarFp.createViewV1(createViewRequest, options).then((request) => request(axios, basePath));
+ },
+ /**
+ *
+ * @summary Queries plugin\'s available strategies for ledger capture
+ * @param {*} [options] Override http request option.
+ * @throws {RequiredError}
+ */
+ getAvailableStrategies(options?: any): AxiosPromise> {
+ return localVarFp.getAvailableStrategies(options).then((request) => request(axios, basePath));
+ },
+ /**
+ *
+ * @summary Queries plugin\'s public key
+ * @param {*} [options] Override http request option.
+ * @throws {RequiredError}
+ */
+ getPublicKey(options?: any): AxiosPromise {
+ return localVarFp.getPublicKey(options).then((request) => request(axios, basePath));
+ },
+ };
+};
+
+/**
+ * DefaultApi - object-oriented interface
+ * @export
+ * @class DefaultApi
+ * @extends {BaseAPI}
+ */
+export class DefaultApi extends BaseAPI {
+ /**
+ *
+ * @summary Creates a Blockchain View.
+ * @param {CreateViewRequest} createViewRequest
+ * @param {*} [options] Override http request option.
+ * @throws {RequiredError}
+ * @memberof DefaultApi
+ */
+ public createViewV1(createViewRequest: CreateViewRequest, options?: AxiosRequestConfig) {
+ return DefaultApiFp(this.configuration).createViewV1(createViewRequest, options).then((request) => request(this.axios, this.basePath));
+ }
+
+ /**
+ *
+ * @summary Queries plugin\'s available strategies for ledger capture
+ * @param {*} [options] Override http request option.
+ * @throws {RequiredError}
+ * @memberof DefaultApi
+ */
+ public getAvailableStrategies(options?: AxiosRequestConfig) {
+ return DefaultApiFp(this.configuration).getAvailableStrategies(options).then((request) => request(this.axios, this.basePath));
+ }
+
+ /**
+ *
+ * @summary Queries plugin\'s public key
+ * @param {*} [options] Override http request option.
+ * @throws {RequiredError}
+ * @memberof DefaultApi
+ */
+ public getPublicKey(options?: AxiosRequestConfig) {
+ return DefaultApiFp(this.configuration).getPublicKey(options).then((request) => request(this.axios, this.basePath));
+ }
+}
+
+
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/typescript/generated/openapi/typescript-axios/base.ts b/packages/cactus-plugin-bungee-hermes/src/main/typescript/generated/openapi/typescript-axios/base.ts
new file mode 100644
index 0000000000..8114b7b05a
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/typescript/generated/openapi/typescript-axios/base.ts
@@ -0,0 +1,72 @@
+/* tslint:disable */
+/* eslint-disable */
+/**
+ * Hyperledger Cactus Plugin - BUNGEE-Hermes
+ * Can create blockchain views of different networks
+ *
+ * The version of the OpenAPI document: 2.0.0-alpha.2
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+import type { Configuration } from './configuration';
+// Some imports not used depending on template conditions
+// @ts-ignore
+import type { AxiosPromise, AxiosInstance, AxiosRequestConfig } from 'axios';
+import globalAxios from 'axios';
+
+export const BASE_PATH = "http://localhost:3000/api/v1/@hyperledger/cactus-plugin-satp-hermes".replace(/\/+$/, "");
+
+/**
+ *
+ * @export
+ */
+export const COLLECTION_FORMATS = {
+ csv: ",",
+ ssv: " ",
+ tsv: "\t",
+ pipes: "|",
+};
+
+/**
+ *
+ * @export
+ * @interface RequestArgs
+ */
+export interface RequestArgs {
+ url: string;
+ options: AxiosRequestConfig;
+}
+
+/**
+ *
+ * @export
+ * @class BaseAPI
+ */
+export class BaseAPI {
+ protected configuration: Configuration | undefined;
+
+ constructor(configuration?: Configuration, protected basePath: string = BASE_PATH, protected axios: AxiosInstance = globalAxios) {
+ if (configuration) {
+ this.configuration = configuration;
+ this.basePath = configuration.basePath || this.basePath;
+ }
+ }
+};
+
+/**
+ *
+ * @export
+ * @class RequiredError
+ * @extends {Error}
+ */
+export class RequiredError extends Error {
+ constructor(public field: string, msg?: string) {
+ super(msg);
+ this.name = "RequiredError"
+ }
+}
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/typescript/generated/openapi/typescript-axios/common.ts b/packages/cactus-plugin-bungee-hermes/src/main/typescript/generated/openapi/typescript-axios/common.ts
new file mode 100644
index 0000000000..6a4c5f28c2
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/typescript/generated/openapi/typescript-axios/common.ts
@@ -0,0 +1,150 @@
+/* tslint:disable */
+/* eslint-disable */
+/**
+ * Hyperledger Cactus Plugin - BUNGEE-Hermes
+ * Can create blockchain views of different networks
+ *
+ * The version of the OpenAPI document: 2.0.0-alpha.2
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+import type { Configuration } from "./configuration";
+import type { RequestArgs } from "./base";
+import type { AxiosInstance, AxiosResponse } from 'axios';
+import { RequiredError } from "./base";
+
+/**
+ *
+ * @export
+ */
+export const DUMMY_BASE_URL = 'https://example.com'
+
+/**
+ *
+ * @throws {RequiredError}
+ * @export
+ */
+export const assertParamExists = function (functionName: string, paramName: string, paramValue: unknown) {
+ if (paramValue === null || paramValue === undefined) {
+ throw new RequiredError(paramName, `Required parameter ${paramName} was null or undefined when calling ${functionName}.`);
+ }
+}
+
+/**
+ *
+ * @export
+ */
+export const setApiKeyToObject = async function (object: any, keyParamName: string, configuration?: Configuration) {
+ if (configuration && configuration.apiKey) {
+ const localVarApiKeyValue = typeof configuration.apiKey === 'function'
+ ? await configuration.apiKey(keyParamName)
+ : await configuration.apiKey;
+ object[keyParamName] = localVarApiKeyValue;
+ }
+}
+
+/**
+ *
+ * @export
+ */
+export const setBasicAuthToObject = function (object: any, configuration?: Configuration) {
+ if (configuration && (configuration.username || configuration.password)) {
+ object["auth"] = { username: configuration.username, password: configuration.password };
+ }
+}
+
+/**
+ *
+ * @export
+ */
+export const setBearerAuthToObject = async function (object: any, configuration?: Configuration) {
+ if (configuration && configuration.accessToken) {
+ const accessToken = typeof configuration.accessToken === 'function'
+ ? await configuration.accessToken()
+ : await configuration.accessToken;
+ object["Authorization"] = "Bearer " + accessToken;
+ }
+}
+
+/**
+ *
+ * @export
+ */
+export const setOAuthToObject = async function (object: any, name: string, scopes: string[], configuration?: Configuration) {
+ if (configuration && configuration.accessToken) {
+ const localVarAccessTokenValue = typeof configuration.accessToken === 'function'
+ ? await configuration.accessToken(name, scopes)
+ : await configuration.accessToken;
+ object["Authorization"] = "Bearer " + localVarAccessTokenValue;
+ }
+}
+
+function setFlattenedQueryParams(urlSearchParams: URLSearchParams, parameter: any, key: string = ""): void {
+ if (parameter == null) return;
+ if (typeof parameter === "object") {
+ if (Array.isArray(parameter)) {
+ (parameter as any[]).forEach(item => setFlattenedQueryParams(urlSearchParams, item, key));
+ }
+ else {
+ Object.keys(parameter).forEach(currentKey =>
+ setFlattenedQueryParams(urlSearchParams, parameter[currentKey], `${key}${key !== '' ? '.' : ''}${currentKey}`)
+ );
+ }
+ }
+ else {
+ if (urlSearchParams.has(key)) {
+ urlSearchParams.append(key, parameter);
+ }
+ else {
+ urlSearchParams.set(key, parameter);
+ }
+ }
+}
+
+/**
+ *
+ * @export
+ */
+export const setSearchParams = function (url: URL, ...objects: any[]) {
+ const searchParams = new URLSearchParams(url.search);
+ setFlattenedQueryParams(searchParams, objects);
+ url.search = searchParams.toString();
+}
+
+/**
+ *
+ * @export
+ */
+export const serializeDataIfNeeded = function (value: any, requestOptions: any, configuration?: Configuration) {
+ const nonString = typeof value !== 'string';
+ const needsSerialization = nonString && configuration && configuration.isJsonMime
+ ? configuration.isJsonMime(requestOptions.headers['Content-Type'])
+ : nonString;
+ return needsSerialization
+ ? JSON.stringify(value !== undefined ? value : {})
+ : (value || "");
+}
+
+/**
+ *
+ * @export
+ */
+export const toPathString = function (url: URL) {
+ return url.pathname + url.search + url.hash
+}
+
+/**
+ *
+ * @export
+ */
+export const createRequestFunction = function (axiosArgs: RequestArgs, globalAxios: AxiosInstance, BASE_PATH: string, configuration?: Configuration) {
+ return >(axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+ const axiosRequestArgs = {...axiosArgs.options, url: (configuration?.basePath || basePath) + axiosArgs.url};
+ return axios.request(axiosRequestArgs);
+ };
+}
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/typescript/generated/openapi/typescript-axios/configuration.ts b/packages/cactus-plugin-bungee-hermes/src/main/typescript/generated/openapi/typescript-axios/configuration.ts
new file mode 100644
index 0000000000..9d0f329544
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/typescript/generated/openapi/typescript-axios/configuration.ts
@@ -0,0 +1,101 @@
+/* tslint:disable */
+/* eslint-disable */
+/**
+ * Hyperledger Cactus Plugin - BUNGEE-Hermes
+ * Can create blockchain views of different networks
+ *
+ * The version of the OpenAPI document: 2.0.0-alpha.2
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+export interface ConfigurationParameters {
+ apiKey?: string | Promise | ((name: string) => string) | ((name: string) => Promise);
+ username?: string;
+ password?: string;
+ accessToken?: string | Promise | ((name?: string, scopes?: string[]) => string) | ((name?: string, scopes?: string[]) => Promise);
+ basePath?: string;
+ baseOptions?: any;
+ formDataCtor?: new () => any;
+}
+
+export class Configuration {
+ /**
+ * parameter for apiKey security
+ * @param name security name
+ * @memberof Configuration
+ */
+ apiKey?: string | Promise | ((name: string) => string) | ((name: string) => Promise);
+ /**
+ * parameter for basic security
+ *
+ * @type {string}
+ * @memberof Configuration
+ */
+ username?: string;
+ /**
+ * parameter for basic security
+ *
+ * @type {string}
+ * @memberof Configuration
+ */
+ password?: string;
+ /**
+ * parameter for oauth2 security
+ * @param name security name
+ * @param scopes oauth2 scope
+ * @memberof Configuration
+ */
+ accessToken?: string | Promise | ((name?: string, scopes?: string[]) => string) | ((name?: string, scopes?: string[]) => Promise);
+ /**
+ * override base path
+ *
+ * @type {string}
+ * @memberof Configuration
+ */
+ basePath?: string;
+ /**
+ * base options for axios calls
+ *
+ * @type {any}
+ * @memberof Configuration
+ */
+ baseOptions?: any;
+ /**
+ * The FormData constructor that will be used to create multipart form data
+ * requests. You can inject this here so that execution environments that
+ * do not support the FormData class can still run the generated client.
+ *
+ * @type {new () => FormData}
+ */
+ formDataCtor?: new () => any;
+
+ constructor(param: ConfigurationParameters = {}) {
+ this.apiKey = param.apiKey;
+ this.username = param.username;
+ this.password = param.password;
+ this.accessToken = param.accessToken;
+ this.basePath = param.basePath;
+ this.baseOptions = param.baseOptions;
+ this.formDataCtor = param.formDataCtor;
+ }
+
+ /**
+ * Check if the given MIME is a JSON MIME.
+ * JSON MIME examples:
+ * application/json
+ * application/json; charset=UTF8
+ * APPLICATION/JSON
+ * application/vnd.company+json
+ * @param mime - MIME (Multipurpose Internet Mail Extensions)
+ * @return True if the given MIME is JSON, false otherwise.
+ */
+ public isJsonMime(mime: string): boolean {
+ const jsonMime: RegExp = new RegExp('^(application\/json|[^;/ \t]+\/[^;/ \t]+[+]json)[ \t]*(;.*)?$', 'i');
+ return mime !== null && (jsonMime.test(mime) || mime.toLowerCase() === 'application/json-patch+json');
+ }
+}
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/typescript/generated/openapi/typescript-axios/index.ts b/packages/cactus-plugin-bungee-hermes/src/main/typescript/generated/openapi/typescript-axios/index.ts
new file mode 100644
index 0000000000..c51f822d4a
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/typescript/generated/openapi/typescript-axios/index.ts
@@ -0,0 +1,18 @@
+/* tslint:disable */
+/* eslint-disable */
+/**
+ * Hyperledger Cactus Plugin - BUNGEE-Hermes
+ * Can create blockchain views of different networks
+ *
+ * The version of the OpenAPI document: 2.0.0-alpha.2
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+export * from "./api";
+export * from "./configuration";
+
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/typescript/index.ts b/packages/cactus-plugin-bungee-hermes/src/main/typescript/index.ts
new file mode 100755
index 0000000000..87cb558397
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/typescript/index.ts
@@ -0,0 +1 @@
+export * from "./public-api";
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/typescript/index.web.ts b/packages/cactus-plugin-bungee-hermes/src/main/typescript/index.web.ts
new file mode 100755
index 0000000000..cb0ff5c3b5
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/typescript/index.web.ts
@@ -0,0 +1 @@
+export {};
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/typescript/plugin-bungee-hermes.ts b/packages/cactus-plugin-bungee-hermes/src/main/typescript/plugin-bungee-hermes.ts
new file mode 100644
index 0000000000..8b0e906d68
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/typescript/plugin-bungee-hermes.ts
@@ -0,0 +1,250 @@
+import {
+ Checks,
+ IJsObjectSignerOptions,
+ JsObjectSigner,
+ LogLevelDesc,
+ Logger,
+ LoggerProvider,
+ Secp256k1Keys,
+} from "@hyperledger/cactus-common";
+import { v4 as uuidV4 } from "uuid";
+import {
+ ICactusPlugin,
+ ICactusPluginOptions,
+ IPluginWebService,
+ IWebServiceEndpoint,
+} from "@hyperledger/cactus-core-api";
+import { State } from "./view-creation/state";
+import OAS from "../json/openapi.json";
+import type { Express } from "express";
+import { Optional } from "typescript-optional";
+
+import { Server } from "http";
+import { Server as SecureServer } from "https";
+import {
+ CreateViewRequest,
+ CreateViewResponse,
+} from "./generated/openapi/typescript-axios";
+import { Snapshot } from "./view-creation/snapshot";
+import { View } from "./view-creation/view";
+import {
+ NetworkDetails,
+ ObtainLedgerStrategy,
+} from "./strategy/obtain-ledger-strategy";
+import { CreateViewEndpointV1 } from "./web-services/create-view-endpoint";
+import { GetPublicKeyEndpointV1 } from "./web-services/get-public-key-endpoint";
+import { GetAvailableStrategiesEndpointV1 } from "./web-services/get-available-strategies-endpoint";
+
+export interface IKeyPair {
+ publicKey: Uint8Array;
+ privateKey: Uint8Array;
+}
+
+export interface IPluginBungeeHermesOptions extends ICactusPluginOptions {
+ instanceId: string;
+ keyPair?: IKeyPair;
+
+ logLevel?: LogLevelDesc;
+
+ disableSignalHandlers?: true;
+}
+
+export class PluginBungeeHermes implements ICactusPlugin, IPluginWebService {
+ public static readonly CLASS_NAME = "PluginBungeeHermes";
+ private readonly instanceId: string;
+
+ private log: Logger;
+
+ private keyPair: IKeyPair;
+ private bungeeSigner: JsObjectSigner;
+ private privKeyBungee: string;
+ private pubKeyBungee: string;
+
+ private strategies: Map;
+
+ private level: LogLevelDesc;
+ private endpoints: IWebServiceEndpoint[] | undefined;
+
+ constructor(public readonly options: IPluginBungeeHermesOptions) {
+ const fnTag = `${this.className}#constructor()`;
+ Checks.truthy(options, `${fnTag} arg options`);
+ Checks.truthy(options.instanceId, `${fnTag} options.instanceId`);
+
+ this.level = options.logLevel || "INFO";
+ this.strategies = new Map();
+ const label = this.className;
+ const level = this.level;
+
+ this.log = LoggerProvider.getOrCreate({ label, level });
+
+ this.instanceId = options.instanceId;
+
+ this.keyPair = options.keyPair
+ ? options.keyPair
+ : Secp256k1Keys.generateKeyPairsBuffer();
+ this.privKeyBungee = Buffer.from(this.keyPair.privateKey).toString("hex");
+ this.pubKeyBungee = Buffer.from(this.keyPair.publicKey).toString("hex");
+ const bungeeSignerOptions: IJsObjectSignerOptions = {
+ privateKey: this.privKeyBungee,
+ logLevel: "debug",
+ };
+ this.bungeeSigner = new JsObjectSigner(bungeeSignerOptions);
+ }
+
+ public get className(): string {
+ return PluginBungeeHermes.CLASS_NAME;
+ }
+ public get logger(): Logger {
+ return this.log;
+ }
+
+ public getPublicKey(): string {
+ return this.pubKeyBungee;
+ }
+
+ public addStrategy(strategyId: string, strategy: ObtainLedgerStrategy) {
+ if (this.strategies.get(strategyId) == undefined) {
+ this.strategies.set(strategyId, strategy);
+ } else {
+ throw Error("Strategy " + strategyId + " already exists.");
+ }
+ }
+ public getStrategy(strategyId: string): ObtainLedgerStrategy | undefined {
+ return this.strategies.get(strategyId);
+ }
+ public getAvailableStrategies(): string[] {
+ return Array.from(this.strategies.keys());
+ }
+
+ public getOpenApiSpec(): unknown {
+ return OAS;
+ }
+
+ public async shutdown(): Promise {
+ this.log.info(`Shutting down ${this.className}...`);
+ }
+ public getPackageName(): string {
+ return `@hyperledger/cactus-plugin-bungee-hermes`;
+ }
+
+ public async onPluginInit(): Promise {
+ return;
+ }
+
+ 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 viewEndpoint = new CreateViewEndpointV1({
+ bungee: this,
+ });
+ const pubKeyEndpoint = new GetPublicKeyEndpointV1({
+ bungee: this,
+ });
+ const availableStrategiesEndpoint = new GetAvailableStrategiesEndpointV1({
+ bungee: this,
+ });
+
+ this.endpoints = [
+ viewEndpoint,
+ pubKeyEndpoint,
+ availableStrategiesEndpoint,
+ ];
+ return this.endpoints;
+ }
+
+ public getHttpServer(): Optional {
+ return Optional.empty();
+ }
+
+ public getInstanceId(): string {
+ return this.instanceId;
+ }
+
+ async onCreateView(request: CreateViewRequest): Promise {
+ //ti and tf are unix timestamps, represented as strings
+ const ti: string = request.tI ? request.tI : "0";
+ const tf: string = request.tF
+ ? request.tF
+ : Number.MAX_SAFE_INTEGER.toString();
+ const stateIds: string[] = request.stateIds ? request.stateIds : [];
+
+ const snapshot = await this.generateSnapshot(
+ stateIds,
+ request.strategyId,
+ request.networkDetails,
+ );
+ this.logger.info("Generating view for request: ", request);
+ const response = JSON.stringify(
+ this.generateView(snapshot, ti, tf, request.viewID),
+ );
+ return {
+ view: response,
+ };
+ }
+
+ public generateView(
+ snapshot: Snapshot,
+ tI: string,
+ tF: string,
+ id: string | undefined,
+ ): { view?: View; signature?: string } {
+ if (
+ parseInt(tI) > parseInt(snapshot.getTF()) ||
+ parseInt(tF) < parseInt(snapshot.getTI()) ||
+ parseInt(tI) > parseInt(tF)
+ ) {
+ return {};
+ }
+ const view = new View(tI, tF, snapshot, id);
+ snapshot.pruneStates(tI, tF);
+
+ const signature = this.sign(JSON.stringify(view));
+
+ return { view: view, signature: signature };
+ }
+
+ sign(msg: string): string {
+ return Buffer.from(this.bungeeSigner.sign(msg)).toString("hex");
+ }
+
+ public async generateSnapshot(
+ stateIds: string[],
+ strategyId: string,
+ networkDetails: NetworkDetails,
+ ): Promise {
+ const strategy = this.getStrategy(strategyId);
+ if (strategy == undefined) {
+ throw Error("Strategy " + strategyId + " is undefined/unsupported");
+ }
+
+ const ledgerStates = await strategy.generateLedgerStates(
+ stateIds,
+ networkDetails,
+ );
+
+ const states: State[] = [];
+ for (const key of ledgerStates.keys()) {
+ if (stateIds.includes(key) || stateIds.length == 0) {
+ states.push(ledgerStates.get(key) as State);
+ }
+ }
+
+ const snapShotId = uuidV4();
+ const snapshot = new Snapshot(
+ snapShotId,
+ networkDetails.participant,
+ states,
+ );
+ snapshot.update_TI_TF();
+
+ return snapshot;
+ }
+}
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/typescript/plugin-factory-bungee-hermes.ts b/packages/cactus-plugin-bungee-hermes/src/main/typescript/plugin-factory-bungee-hermes.ts
new file mode 100644
index 0000000000..79f009bc29
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/typescript/plugin-factory-bungee-hermes.ts
@@ -0,0 +1,19 @@
+import {
+ IPluginFactoryOptions,
+ PluginFactory,
+} from "@hyperledger/cactus-core-api";
+import {
+ IPluginBungeeHermesOptions,
+ PluginBungeeHermes,
+} from "./plugin-bungee-hermes";
+export class PluginFactoryBungeeHermes extends PluginFactory<
+ PluginBungeeHermes,
+ IPluginBungeeHermesOptions,
+ IPluginFactoryOptions
+> {
+ async create(
+ pluginOptions: IPluginBungeeHermesOptions,
+ ): Promise {
+ return new PluginBungeeHermes(pluginOptions);
+ }
+}
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/typescript/public-api.ts b/packages/cactus-plugin-bungee-hermes/src/main/typescript/public-api.ts
new file mode 100644
index 0000000000..ff3dd0e66d
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/typescript/public-api.ts
@@ -0,0 +1,13 @@
+import { IPluginFactoryOptions } from "@hyperledger/cactus-core-api";
+import { PluginFactoryBungeeHermes } from "./plugin-factory-bungee-hermes";
+
+export {
+ PluginBungeeHermes,
+ IPluginBungeeHermesOptions,
+} from "./plugin-bungee-hermes";
+
+export async function createBungeePluginFactory(
+ pluginFactoryOptions: IPluginFactoryOptions,
+): Promise {
+ return new PluginFactoryBungeeHermes(pluginFactoryOptions);
+}
diff --git a/packages/cactus-plugin-bungee-hermes/src/main/typescript/strategy/obtain-ledger-strategy.ts b/packages/cactus-plugin-bungee-hermes/src/main/typescript/strategy/obtain-ledger-strategy.ts
new file mode 100644
index 0000000000..eeb1b68aa1
--- /dev/null
+++ b/packages/cactus-plugin-bungee-hermes/src/main/typescript/strategy/obtain-ledger-strategy.ts
@@ -0,0 +1,15 @@
+import { Logger } from "@hyperledger/cactus-common";
+import { State } from "../view-creation/state";
+
+export interface NetworkDetails {
+ connectorApiPath: string;
+ participant: string;
+}
+export interface ObtainLedgerStrategy {
+ log: Logger;
+
+ generateLedgerStates(
+ stateIds: string[],
+ networkDetails: NetworkDetails,
+ ): Promise