From cf9d015ad965ef900d353232fbb9244a0312f499 Mon Sep 17 00:00:00 2001
From: mtyszczak <mateusz.tyszczak@gmail.com>
Date: Wed, 26 Feb 2025 14:09:30 +0100
Subject: [PATCH] Add signature provider example based on our extensions

---
 examples/ts/signature-extension/.npmrc        |  2 +
 examples/ts/signature-extension/.parcelrc     |  6 ++
 examples/ts/signature-extension/README.md     | 14 +++++
 .../ts/signature-extension/common-data.ts     | 10 ++++
 examples/ts/signature-extension/package.json  | 20 +++++++
 .../ts/signature-extension/test/index.html    | 57 +++++++++++++++++++
 examples/ts/signature-extension/tsconfig.json | 11 ++++
 7 files changed, 120 insertions(+)
 create mode 100644 examples/ts/signature-extension/.npmrc
 create mode 100644 examples/ts/signature-extension/.parcelrc
 create mode 100644 examples/ts/signature-extension/README.md
 create mode 100644 examples/ts/signature-extension/common-data.ts
 create mode 100644 examples/ts/signature-extension/package.json
 create mode 100644 examples/ts/signature-extension/test/index.html
 create mode 100644 examples/ts/signature-extension/tsconfig.json

diff --git a/examples/ts/signature-extension/.npmrc b/examples/ts/signature-extension/.npmrc
new file mode 100644
index 000000000..c09005dca
--- /dev/null
+++ b/examples/ts/signature-extension/.npmrc
@@ -0,0 +1,2 @@
+# https://gitlab.syncad.com/hive group specification, offering aggregated package view: https://gitlab.syncad.com/groups/hive/-/packages
+@hiveio:registry=https://gitlab.syncad.com/api/v4/groups/136/-/packages/npm/
diff --git a/examples/ts/signature-extension/.parcelrc b/examples/ts/signature-extension/.parcelrc
new file mode 100644
index 000000000..7c4c7db42
--- /dev/null
+++ b/examples/ts/signature-extension/.parcelrc
@@ -0,0 +1,6 @@
+{
+  "extends": "@parcel/config-default",
+  "transformers": {
+    "*.{ts,tsx}": ["@parcel/transformer-typescript-tsc"]
+  }
+}
\ No newline at end of file
diff --git a/examples/ts/signature-extension/README.md b/examples/ts/signature-extension/README.md
new file mode 100644
index 000000000..74001ccd1
--- /dev/null
+++ b/examples/ts/signature-extension/README.md
@@ -0,0 +1,14 @@
+# signature-extension
+
+> [!WARNING]
+> This example will not be ran automatically on the CI as it requires direct user action, e.g. OAuth 3rd party app Hive blockchain user authorization
+
+This example presents different ways of implementing 3rd party apps authorization using wax
+
+To test this example:
+
+1. Install keychain extension
+2. Import `guest4test` posting key to your wallet
+3. Install dependencies: `pnpm install`
+4. Run parcel: `pnpm test`
+5. Goto [http://localhost:1234](http://localhost:1234), sign the transaction and check logs
diff --git a/examples/ts/signature-extension/common-data.ts b/examples/ts/signature-extension/common-data.ts
new file mode 100644
index 000000000..daf510fe2
--- /dev/null
+++ b/examples/ts/signature-extension/common-data.ts
@@ -0,0 +1,10 @@
+export const accountName = "guest4test";
+export const publicKey = "STM8XQJiRBND7q6Cu1kxyRgLVLU3y1B5iGFU5VAqSpaAK38YFGZP8";
+export const privateKey = process.env.PRIVATE_KEY as string;
+
+export const voteData = {
+  voter: accountName,
+  author: "c0ff33a",
+  permlink: "ewxhnjbj",
+  weight: 2200
+};
diff --git a/examples/ts/signature-extension/package.json b/examples/ts/signature-extension/package.json
new file mode 100644
index 000000000..284f6fb58
--- /dev/null
+++ b/examples/ts/signature-extension/package.json
@@ -0,0 +1,20 @@
+{
+  "name": "signature-extension",
+  "version": "1.0.0",
+  "type": "module",
+  "scripts": {
+    "test": "parcel test/index.html"
+  },
+  "dependencies": {
+    "@hiveio/wax": "file:../../../ts",
+    "@hiveio/wax-signers-keychain": "file:../../../ts/packages/signers-keychain",
+    "@hiveio/wax-signers-peakvault": "file:../../../ts/packages/signers-peakvault"
+  },
+  "devDependencies": {
+    "@parcel/config-default": "^2.13.3",
+    "@parcel/transformer-typescript-tsc": "^2.13.3",
+    "buffer": "^5.5.0||^6.0.0",
+    "parcel": "^2.13.3",
+    "process": "^0.11.10"
+  }
+}
diff --git a/examples/ts/signature-extension/test/index.html b/examples/ts/signature-extension/test/index.html
new file mode 100644
index 000000000..558c0f36e
--- /dev/null
+++ b/examples/ts/signature-extension/test/index.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+</head>
+<body>
+  <h1>Signing example</h1>
+  <h3>Remember to unlock Peak Vault before using it</h3>
+  <button onclick="useKeychain()">Use Keychain</button>
+  <button onclick="usePeakVault()">Use Peak Vault</button>
+  <pre><code id="tx-result"></code></pre>
+  <script type="module">
+    import { createHiveChain } from "@hiveio/wax";
+    import { accountName, publicKey, voteData } from "../common-data";
+    import KeychainProvider from "@hiveio/wax-signers-keychain";
+    import PeakVaultProvider from "@hiveio/wax-signers-peakvault";
+
+    const txResult = document.getElementById('tx-result');
+
+    (async()=> {
+      const keychainProvider = KeychainProvider.for(accountName, "posting");
+      const peakVaultProvider = PeakVaultProvider.for(accountName, "posting");
+
+      const chain = await createHiveChain();
+
+      const createTransaction = async () => {
+        txResult.textContent = 'Signing...';
+        const tx = await chain.createTransaction();
+        tx.pushOperation({
+          vote: voteData
+        });
+        console.log(tx.transaction);
+        console.log(`Sig digest: ${tx.sigDigest}`);
+        return tx;
+      };
+
+      const sign = async (provider) => {
+        try {
+          const tx = await createTransaction();
+          await tx.sign(provider);
+          const apiJson = tx.toApiJson();
+          console.log('Transaction:', apiJson);
+          console.log(`Keys match: ${tx.signatureKeys[0] === publicKey}`);
+          txResult.textContent = JSON.stringify(apiJson, null, 2);
+        } catch (error) {
+          console.error(error);
+          txResult.textContent = `Error: ${error.message}`;
+        }
+      };
+
+      window.useKeychain = () => void sign(keychainProvider);
+      window.usePeakVault = () => void sign(peakVaultProvider);
+    })();
+  </script>
+</body>
+</html>
diff --git a/examples/ts/signature-extension/tsconfig.json b/examples/ts/signature-extension/tsconfig.json
new file mode 100644
index 000000000..f5fe061f8
--- /dev/null
+++ b/examples/ts/signature-extension/tsconfig.json
@@ -0,0 +1,11 @@
+{
+  "extends": "../../../ts/tsconfig.json",
+  "compilerOptions": {
+    "rootDir": ".",
+    "baseUrl": ".",
+    "outDir": "dist"
+  },
+  "include": [
+    "."
+  ]
+}
\ No newline at end of file
-- 
GitLab