aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2025-11-21 19:37:37 -0800
committerAdam Soltys <[email protected]>2026-02-11 15:33:07 -0800
commit21023052918c0b787916ef78937e0be41f46142a (patch)
tree09c5d29fae412a1ed274559098369d0886342178
parent8dc79c6080a66b587220634ad1b143d52ec60570 (diff)
downloadcoinos-ui-21023052918c0b787916ef78937e0be41f46142a.tar.gz
coinos-ui-21023052918c0b787916ef78937e0be41f46142a.zip
ark route
-rw-r--r--bun.lock11
-rw-r--r--package.json1
-rw-r--r--src/components/About.svelte2
-rw-r--r--src/lib/ark.ts5
-rw-r--r--src/lib/store.ts4
-rw-r--r--src/routes/(app)/ark/+page.svelte53
-rw-r--r--static/map.webpbin0 -> 33082 bytes
7 files changed, 73 insertions, 3 deletions
diff --git a/bun.lock b/bun.lock
index d4da774e..988086bb 100644
--- a/bun.lock
+++ b/bun.lock
@@ -4,6 +4,7 @@
"": {
"name": "coinos",
"dependencies": {
+ "@arkade-os/sdk": "^0.3.7",
"@capacitor/status-bar": "^7.0.3",
"@tailwindcss/postcss": "^4.1.13",
"@tailwindcss/vite": "^4.1.13",
@@ -72,6 +73,8 @@
"packages": {
"@alloc/quick-lru": ["@alloc/[email protected]", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="],
+ "@arkade-os/sdk": ["@arkade-os/[email protected]", "", { "dependencies": { "@noble/curves": "2.0.0", "@noble/secp256k1": "3.0.0", "@scure/base": "2.0.0", "@scure/btc-signer": "2.0.1", "bip68": "1.0.4" } }, "sha512-uXRf3uXc+YKZA0nnPe/gM6QKGTB4xlQn+EHPU3PliCp7fWTDYnPX/QzWszNY5Y71/FWMebrUgHFyDk6XnlQOrw=="],
+
"@babel/code-frame": ["@babel/[email protected]", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="],
"@babel/helper-validator-identifier": ["@babel/[email protected]", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="],
@@ -208,6 +211,8 @@
"@noble/hashes": ["@noble/[email protected]", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="],
+ "@noble/secp256k1": ["@noble/[email protected]", "", {}, "sha512-NJBaR352KyIvj3t6sgT/+7xrNyF9Xk9QlLSIqUGVUYlsnDTAUqY8LOmwpcgEx4AMJXRITQ5XEVHD+mMaPfr3mg=="],
+
"@nodelib/fs.scandir": ["@nodelib/[email protected]", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
"@nodelib/fs.stat": ["@nodelib/[email protected]", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
@@ -438,6 +443,8 @@
"bip21": ["[email protected]", "", { "dependencies": { "query-string": "^9.0.0" } }, "sha512-uJ3opZiOUs9x+Q+D6ezcIQje3ymIXyFFEbx1C8wRVSERxQ0rXTG4FJuj8neYUDNJhwsvTy9f2dYMaUMq+3/fIw=="],
+ "bip68": ["[email protected]", "", {}, "sha512-O1htyufFTYy3EO0JkHg2CLykdXEtV2ssqw47Gq9A0WByp662xpJnMEB9m43LZjsSDjIAOozWRExlFQk2hlV1XQ=="],
+
"bitcoin-address-validation": ["[email protected]", "", { "dependencies": { "base58-js": "^3.0.2", "bech32": "^2.0.0", "sha256-uint8array": "^0.10.3" } }, "sha512-R1X1c9EdgjgjTpjshjk5e16TbgF7HYasxBcu7l5ScWMxVs53845vMUg5PvnQ/R/3h8Grly6Y52DgH6/77gazLQ=="],
"bl": ["[email protected]", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="],
@@ -1244,6 +1251,8 @@
"zxing-wasm": ["[email protected]", "", { "dependencies": { "@types/emscripten": "^1.40.1", "type-fest": "^4.41.0" } }, "sha512-RyHxVaAHsLSDzmwcAG05IF8sVOE5Ta2JT1dRDh0mzVZOIiDXZstsjkqvKHasN1n4lvFSbX7ngkHDufnt/XI07Q=="],
+ "@arkade-os/sdk/@noble/curves": ["@noble/[email protected]", "", { "dependencies": { "@noble/hashes": "2.0.0" } }, "sha512-RiwZZeJnsTnhT+/gg2KvITJZhK5oagQrpZo+yQyd3mv3D5NAG2qEeEHpw7IkXRlpkoD45wl2o4ydHAvY9wyEfw=="],
+
"@capacitor/assets/@capacitor/cli": ["@capacitor/[email protected]", "", { "dependencies": { "@ionic/cli-framework-output": "^2.2.5", "@ionic/utils-fs": "^3.1.6", "@ionic/utils-subprocess": "^2.1.11", "@ionic/utils-terminal": "^2.3.3", "commander": "^9.3.0", "debug": "^4.3.4", "env-paths": "^2.2.0", "kleur": "^4.1.4", "native-run": "^2.0.0", "open": "^8.4.0", "plist": "^3.0.5", "prompts": "^2.4.2", "rimraf": "^4.4.1", "semver": "^7.3.7", "tar": "^6.1.11", "tslib": "^2.4.0", "xml2js": "^0.5.0" }, "bin": { "cap": "bin/capacitor", "capacitor": "bin/capacitor" } }, "sha512-qN8LDlREMhrYhOvVXahoJVNkP8LP55/YPRJrzTAFrMqlNJC18L3CzgWYIblFPnuwfbH/RxbfoZT/ydkwgVpMrw=="],
"@capacitor/cli/commander": ["[email protected]", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="],
@@ -1436,6 +1445,8 @@
"xml2js/xmlbuilder": ["[email protected]", "", {}, "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="],
+ "@arkade-os/sdk/@noble/curves/@noble/hashes": ["@noble/[email protected]", "", {}, "sha512-h8VUBlE8R42+XIDO229cgisD287im3kdY6nbNZJFjc6ZvKIXPYXe6Vc/t+kyjFdMFyt5JpapzTsEg8n63w5/lw=="],
+
"@capacitor/assets/@capacitor/cli/@ionic/utils-subprocess": ["@ionic/[email protected]", "", { "dependencies": { "@ionic/utils-array": "2.1.6", "@ionic/utils-fs": "3.1.7", "@ionic/utils-process": "2.1.11", "@ionic/utils-stream": "3.1.6", "@ionic/utils-terminal": "2.3.4", "cross-spawn": "^7.0.3", "debug": "^4.0.0", "tslib": "^2.0.1" } }, "sha512-nGYvyGVjU0kjPUcSRFr4ROTraT3w/7r502f5QJEsMRKTqa4eEzCshtwRk+/mpASm0kgBN5rrjYA5A/OZg8ahqg=="],
"@capacitor/assets/@capacitor/cli/commander": ["[email protected]", "", {}, "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="],
diff --git a/package.json b/package.json
index a0c110cb..95adeea3 100644
--- a/package.json
+++ b/package.json
@@ -69,6 +69,7 @@
},
"type": "module",
"dependencies": {
+ "@arkade-os/sdk": "^0.3.7",
"@capacitor/status-bar": "^7.0.3",
"@tailwindcss/postcss": "^4.1.13",
"@tailwindcss/vite": "^4.1.13",
diff --git a/src/components/About.svelte b/src/components/About.svelte
index 331a5188..8f74b47c 100644
--- a/src/components/About.svelte
+++ b/src/components/About.svelte
@@ -78,7 +78,7 @@
<div class="relative">
<a href="/map" class="contents">
- <img src="/map.png" class="mx-auto" alt="Map" />
+ <img src="/map.webp" class="mx-auto" alt="Map" />
</a>
<a href="/map" class="contents">
diff --git a/src/lib/ark.ts b/src/lib/ark.ts
new file mode 100644
index 00000000..0986983a
--- /dev/null
+++ b/src/lib/ark.ts
@@ -0,0 +1,5 @@
+import { persistLocal } from "$lib/store";
+
+const prefix = "ark";
+export const mnemonic = persistLocal(`${prefix}mnemonic`, "");
+export const password = persistLocal(`${prefix}password`, "");
diff --git a/src/lib/store.ts b/src/lib/store.ts
index c7dc9970..0148f480 100644
--- a/src/lib/store.ts
+++ b/src/lib/store.ts
@@ -1,7 +1,7 @@
import { browser } from "$app/environment";
import { writable } from "svelte/store";
-const persistSession = (key, defaultValue = undefined) => {
+export const persistSession = (key, defaultValue = undefined) => {
const s = writable(
browser &&
sessionStorage.getItem(key) &&
@@ -17,7 +17,7 @@ const persistSession = (key, defaultValue = undefined) => {
return s;
};
-const persistLocal = (key, defaultValue: any = undefined) => {
+export const persistLocal = (key, defaultValue: any = undefined) => {
const s = writable(
browser &&
localStorage.getItem(key) &&
diff --git a/src/routes/(app)/ark/+page.svelte b/src/routes/(app)/ark/+page.svelte
new file mode 100644
index 00000000..81ef9354
--- /dev/null
+++ b/src/routes/(app)/ark/+page.svelte
@@ -0,0 +1,53 @@
+<script>
+ import { SingleKey, Wallet } from "@arkade-os/sdk";
+ import { onMount, tick } from "svelte";
+ import { HDKey } from "@scure/bip32";
+
+ const identity = SingleKey.fromHex(
+ "ce66c68f8875c0c98a502c666303dc183a21600130013c06f9d1edf60207abf2",
+ );
+
+ let loading = $state();
+ let balance = $state();
+
+ onMount(async () => {
+ setTimeout(checkBalance, 1000);
+ });
+
+ let checkBalance = async (e) => {
+ e?.preventDefault();
+ loading = true;
+
+ const wallet = await Wallet.create({
+ identity,
+ arkServerUrl: "https://arkade.computer",
+ });
+
+ balance = await wallet.getBalance();
+
+ loading = false;
+ };
+</script>
+
+<div class="space-y-5">
+ <h1 class="text-center text-3xl font-semibold">Ark</h1>
+
+ <div class="container w-full mx-auto text-lg px-4 max-w-xl space-y-5">
+ {#if loading}
+ <div>
+ <div class="loading loading-spinner"></div>
+ </div>
+ {:else if typeof balance !== "undefined"}
+ <div class="flex items-center gap-2">
+ <div>
+ {balance.available} sats
+ </div>
+ </div>
+ {/if}
+
+ <div class="flex gap-2 justify-center w-full">
+ <a href="/receive" class="btn grow">Receive</a>
+ <a href="/send" class="btn grow">Send</a>
+ </div>
+ </div>
+</div>
diff --git a/static/map.webp b/static/map.webp
new file mode 100644
index 00000000..95ff0147
--- /dev/null
+++ b/static/map.webp
Binary files differ