diff --git a/changelog.d/20240112_130130_hrajchert_plt_9089_createContract_bundle_support.md b/changelog.d/20240112_130130_hrajchert_plt_9089_createContract_bundle_support.md
index 4ad21d9c..20252d9c 100644
--- a/changelog.d/20240112_130130_hrajchert_plt_9089_createContract_bundle_support.md
+++ b/changelog.d/20240112_130130_hrajchert_plt_9089_createContract_bundle_support.md
@@ -1,5 +1,5 @@
### @marlowe.io/runtime-lifecycle
-- Added support for contract bundles in the `lifecycle.contracts.createContract` function. ([PR-167](https://github.com/input-output-hk/marlowe-ts-sdk/pull/167))
+- Feat (PLT-9089): Added support for contract bundles in the `lifecycle.contracts.createContract` function. ([PR-167](https://github.com/input-output-hk/marlowe-ts-sdk/pull/167))
diff --git a/changelog.d/20240122_133315_hrajchert_cip45.md b/changelog.d/20240122_133315_hrajchert_cip45.md
new file mode 100644
index 00000000..8d2ceae8
--- /dev/null
+++ b/changelog.d/20240122_133315_hrajchert_cip45.md
@@ -0,0 +1,4 @@
+
+### @marlowe.io/wallet
+
+- Feat: Added a `@marlowe.io/wallet/peer-connect` module to enable mobile support by adapting to the [cardano-peer-connect](https://github.com/fabianbormann/cardano-peer-connect) library. ([PR-179](https://github.com/input-output-hk/marlowe-ts-sdk/pull/179))
diff --git a/examples/cip45-flow/Readme.md b/examples/cip45-flow/Readme.md
new file mode 100644
index 00000000..59f7228c
--- /dev/null
+++ b/examples/cip45-flow/Readme.md
@@ -0,0 +1,18 @@
+# CIP-45 flow
+
+This example is a Work In Progress. It shows how to use the `@marlowe.io/wallet/peer-connect` module together with the [cardano-peer-connect](https://github.com/fabianbormann/cardano-peer-connect) library.
+
+## How to run
+
+1. Build the project
+```bash
+$ npm i
+$ npm run build
+```
+2. Serve the examples folder
+```bash
+$ npm run serve-dev
+```
+3. Open the browser at http://localhost:1337/examples/cip45-flow/
+4. Use a cip45 wallet like [Eternl](https://eternl.io/) and scan the QR code to connect to the wallet
+5. After the prompt to connect, you can click the create contract button.
diff --git a/examples/cip45-flow/index.html b/examples/cip45-flow/index.html
new file mode 100644
index 00000000..4e0a6d8c
--- /dev/null
+++ b/examples/cip45-flow/index.html
@@ -0,0 +1,41 @@
+
+
+
+
+
+ CIP45 test Flow
+
+
+
+
+
CIP45 test Flow
+
+
Setup Runtime
+
+
+
+
+
+
+
Connected Wallet
+
+
+
+
+
+
+
+
Console
+
+
+
+
+
+
+
diff --git a/examples/cip45-flow/index.js b/examples/cip45-flow/index.js
new file mode 100644
index 00000000..08a5fd05
--- /dev/null
+++ b/examples/cip45-flow/index.js
@@ -0,0 +1,170 @@
+import { mkRestClient } from "@marlowe.io/runtime-rest-client";
+import { MarloweJSON } from "@marlowe.io/adapter/codec";
+import { clearConsole, log, logJSON } from "../js/poc-helpers.js";
+import { mkPeerConnectAdapter } from "@marlowe.io/wallet/peer-connect";
+import { mkRuntimeLifecycle } from "@marlowe.io/runtime-lifecycle";
+
+import * as H from "../js/poc-helpers.js";
+
+window.restClient = null;
+function getRestClient() {
+ if (window.restClient === null) {
+ const runtimeURL = H.getRuntimeUrl();
+ window.restClient = mkRestClient(runtimeURL);
+ }
+ return window.restClient;
+}
+const runtimeUrlInput = document.getElementById("runtimeUrl");
+runtimeUrlInput.addEventListener("change", () => {
+ window.restClient = null;
+});
+
+const clearConsoleButton = document.getElementById("clear-console");
+clearConsoleButton.addEventListener("click", clearConsole);
+
+H.setupLocalStorageRuntimeUrl();
+
+const adapter = mkPeerConnectAdapter();
+adapter.onDeleteWallet(async (walletId) => {
+ updateDisconnectedWalletStatus();
+});
+adapter.onNewWallet(async (walletId, wallet) => {
+ updateConnectedWalletStatus(wallet);
+});
+window.adapter = adapter;
+
+// Give your app some basic information that will be displayed to the client wallet when he is connecting to your DApp.
+const dAppInfo = {
+ name: "Cip45 test",
+ url: "http://localhost:1337/examples",
+};
+// Define a function that will be called when the client tries to connect to your DApp.
+const verifyConnection = (walletInfo, callback) => {
+ logJSON("walletInfo", walletInfo);
+ callback(
+ //
+ window.confirm(
+ `Do you want to connect to wallet ${walletInfo.name} (${walletInfo.address})?`
+ )
+ );
+};
+
+function updateDisconnectedWalletStatus() {
+ document.getElementById("connected-wallet").style.display = "none";
+ document.getElementById("qr-code").style.display = "block";
+}
+
+async function updateConnectedWalletStatus(wallet) {
+ const address = await wallet.getChangeAddress();
+ const balance = await wallet.getLovelaces();
+ const addressElm = document.getElementById("connected-wallet-address");
+ const balanceElm = document.getElementById("connected-wallet-balance");
+ addressElm.textContent = address;
+ balanceElm.textContent = balance;
+
+ document.getElementById("connected-wallet").style.display = "block";
+ document.getElementById("qr-code").style.display = "none";
+}
+
+const dAppConnect = new CardanoPeerConnect.DAppPeerConnect({
+ dAppInfo: dAppInfo,
+ verifyConnection: verifyConnection,
+ onApiInject: adapter.adaptApiInject,
+ onApiEject: adapter.adaptApiEject,
+});
+window.dAppConnect = dAppConnect;
+
+document
+ .getElementById("disconnect-wallet")
+ .addEventListener("click", async () => {
+ // NOTE: dAppConnect doesn't have a disconnect method, and this is currently
+ // not working. It's not clear how to disconnect from the wallet.
+ // https://github.com/fabianbormann/cardano-peer-connect/issues/57
+ logJSON("adapter", adapter);
+ logJSON("dAppConnect", dAppConnect);
+ const walletInfo = { version: 1, name: "a", icon: "bubu" };
+ dAppConnect.meerkat.api.disconnect(
+ // dAppConnect.dAppInfo.address,
+ dAppConnect.connectedWallet,
+ walletInfo,
+ (connectStatus) => {
+ console.log(connectStatus);
+ debugger;
+ }
+ );
+ });
+
+document
+ .getElementById("create-contract")
+ .addEventListener("click", async () => {
+ const wallet = adapter.getWallet();
+ const runtime = mkRuntimeLifecycle({
+ runtimeURL: H.getRuntimeUrl(),
+ wallet,
+ });
+
+ const [contractId, txId] = await runtime.contracts.createContract({
+ contract: "close",
+ tags: {
+ "cip-45": "true",
+ },
+ });
+
+ log(`contractId: ${contractId}`);
+ log(`waiting for txId ${txId}`);
+ await wallet.waitConfirmation(txId);
+ log("transaction confirmed");
+ });
+
+document.getElementById("wallet-flow").addEventListener("click", async () => {
+ const wallet = adapter.getWallet();
+ log(`