aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2023-04-07 14:46:09 -0700
committerAdam Soltys <[email protected]>2023-04-07 14:46:09 -0700
commitd145b9de59cb20181f6fe48f6aa4677d406cf16d (patch)
tree16439dbce4ff7e48c60f57875489c16ea5532a13
parentd4de8dce613f5ee49068ce90b868ffda5d4771d7 (diff)
parent648d9fb41c5302672822fd76fb1b1a90f654b05b (diff)
downloadcoinos-ui-d145b9de59cb20181f6fe48f6aa4677d406cf16d.tar.gz
coinos-ui-d145b9de59cb20181f6fe48f6aa4677d406cf16d.zip
Merge branch 'master' into hashme
-rw-r--r--package.json22
-rw-r--r--pnpm-lock.yaml1548
-rw-r--r--src/app.html2
-rw-r--r--src/components/Balance.svelte35
-rw-r--r--src/components/Lnurlp.svelte6
-rw-r--r--src/components/Lnurlw.svelte5
-rw-r--r--src/components/Numpad.svelte15
-rw-r--r--src/components/Pin.svelte62
-rw-r--r--src/components/Pinpad.svelte3
-rw-r--r--src/components/RegisterOrLogin.svelte8
-rw-r--r--src/lib/nostr.js86
-rw-r--r--src/lib/samples.js23
-rw-r--r--src/lib/store.js3
-rw-r--r--src/lib/translations/index.js5
-rw-r--r--src/lib/translations/lang.json3
-rw-r--r--src/lib/utils.js54
-rw-r--r--src/locales/fa.json283
-rw-r--r--src/routes/(app)/+layout.svelte17
-rw-r--r--src/routes/(app)/[username]/(profile)/+layout.svelte60
-rw-r--r--src/routes/(app)/[username]/(profile)/+page.svelte44
-rw-r--r--src/routes/(app)/[username]/dashboard/+page.server.js4
-rw-r--r--src/routes/(app)/[username]/dashboard/+page.svelte163
-rw-r--r--src/routes/(app)/[username]/generate/+page.svelte3
-rw-r--r--src/routes/(app)/[username]/generate/+server.js3
-rw-r--r--src/routes/(app)/[username]/invoice/[hash]/+layout.server.js4
-rw-r--r--src/routes/(app)/[username]/invoice/[hash]/paid/+page.svelte8
-rw-r--r--src/routes/(app)/[username]/invoice/[hash]/tip/+page.svelte10
-rw-r--r--src/routes/(app)/[username]/messages/+page.server.js3
-rw-r--r--src/routes/(app)/[username]/messages/+page.svelte4
-rw-r--r--src/routes/(app)/[username]/payments/[...page]/+page.svelte11
-rw-r--r--src/routes/(app)/[username]/receive/[...param]/+page.svelte5
-rw-r--r--src/routes/(app)/[username]/reset/+server.js10
-rw-r--r--src/routes/(app)/[username]/settings/[...tab]/+page.svelte7
-rw-r--r--src/routes/(app)/[username]/settings/[...tab]/_security.svelte6
-rw-r--r--src/routes/(app)/admin/+page.server.js6
-rw-r--r--src/routes/(app)/admin/+page.svelte15
-rw-r--r--src/routes/(app)/buy/+page.svelte21
-rw-r--r--src/routes/(app)/launch/purchase/+page.svelte1
-rw-r--r--src/routes/(app)/login/+page.svelte8
-rw-r--r--src/routes/(app)/payment/[id]/+page.svelte15
-rw-r--r--src/routes/(app)/payment/[id]/print/+server.js7
-rw-r--r--src/routes/(app)/pot/[name]/+page.svelte2
-rw-r--r--src/routes/(app)/send/+layout.svelte21
-rw-r--r--src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.svelte11
-rw-r--r--src/routes/(app)/send/invoice/[id]/+page.server.js3
-rw-r--r--src/routes/(app)/send/invoice/[id]/+page.svelte10
-rw-r--r--src/routes/(app)/send/lightning/[payreq]/+page.svelte5
-rw-r--r--src/routes/(app)/send/pot/[name]/[...amount]/+page.svelte5
-rw-r--r--src/routes/(app)/send/user/[username]/[...amount]/+page.server.js32
-rw-r--r--src/routes/(app)/send/user/[username]/[...amount]/+page.svelte13
-rw-r--r--src/routes/(app)/support/+page.svelte28
-rw-r--r--src/routes/(static)/docs/+page.svelte148
-rw-r--r--vite.config.js5
53 files changed, 925 insertions, 1956 deletions
diff --git a/package.json b/package.json
index 2aeecb5e..ac04d02f 100644
--- a/package.json
+++ b/package.json
@@ -10,21 +10,21 @@
"format": "prettier --write --plugin-search-dir=. ."
},
"devDependencies": {
+ "@scure/base": "^1.1.1",
+ "@scure/bip39": "^1.2.0",
+ "@sveltejs/adapter-node": "^1.1.4",
+ "@sveltejs/kit": "^1.14.0",
"@tailwindcss/line-clamp": "^0.4.2",
"@zerodevx/svelte-toast": "^0.7.2",
"autoprefixer": "^10.4.13",
"bech32": "^2.0.0",
"bip21": "^2.0.3",
- "bip32": "^3.1.0",
- "bip39": "^3.0.4",
"bitcoin-address-validation": "^2.2.1",
- "bolt11": "^1.4.0",
"buffer": "^6.0.3",
"date-fns": "^2.29.3",
"leaflet": "^1.9.3",
"leaflet.markercluster": "^1.5.3",
- "nostr": "^0.2.7",
- "nostr-tools": "^1.7.4",
+ "nostr-tools": "^1.7.5",
"postcss": "^8.4.20",
"prettier": "^2.8.1",
"prettier-plugin-svelte": "^2.9.0",
@@ -40,12 +40,8 @@
"sveltekit-i18n": "^2.2.2",
"tailwind-scrollbar": "^2.1.0",
"tailwindcss": "^3.2.4",
- "tiny-secp256k1": "^2.2.1",
"uuid": "^9.0.0",
- "vite": "^4.0.4",
- "vite-plugin-node-polyfills": "^0.5.0",
- "vite-plugin-top-level-await": "^1.2.2",
- "vite-plugin-wasm": "^3.1.0"
+ "vite": "^4.2.1"
},
"pnpm": {
"peerDependencyRules": {
@@ -54,9 +50,5 @@
}
}
},
- "type": "module",
- "dependencies": {
- "@sveltejs/adapter-node": "^1.1.4",
- "@sveltejs/kit": "^1.2.10"
- }
+ "type": "module"
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 6bccc4b2..43b3b80a 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -1,23 +1,21 @@
lockfileVersion: 5.4
specifiers:
+ '@scure/base': ^1.1.1
+ '@scure/bip39': ^1.2.0
'@sveltejs/adapter-node': ^1.1.4
- '@sveltejs/kit': ^1.2.10
+ '@sveltejs/kit': ^1.14.0
'@tailwindcss/line-clamp': ^0.4.2
'@zerodevx/svelte-toast': ^0.7.2
autoprefixer: ^10.4.13
bech32: ^2.0.0
bip21: ^2.0.3
- bip32: ^3.1.0
- bip39: ^3.0.4
bitcoin-address-validation: ^2.2.1
- bolt11: ^1.4.0
buffer: ^6.0.3
date-fns: ^2.29.3
leaflet: ^1.9.3
leaflet.markercluster: ^1.5.3
- nostr: ^0.2.7
- nostr-tools: ^1.7.4
+ nostr-tools: ^1.7.5
postcss: ^8.4.20
prettier: ^2.8.1
prettier-plugin-svelte: ^2.9.0
@@ -33,33 +31,25 @@ specifiers:
sveltekit-i18n: ^2.2.2
tailwind-scrollbar: ^2.1.0
tailwindcss: ^3.2.4
- tiny-secp256k1: ^2.2.1
uuid: ^9.0.0
- vite: ^4.0.4
- vite-plugin-node-polyfills: ^0.5.0
- vite-plugin-top-level-await: ^1.2.2
- vite-plugin-wasm: ^3.1.0
-
-dependencies:
- '@sveltejs/adapter-node': 1.1.4_@[email protected]
+ vite: ^4.2.1
devDependencies:
+ '@scure/base': 1.1.1
+ '@scure/bip39': 1.2.0
+ '@sveltejs/adapter-node': 1.1.4_@[email protected]
'@tailwindcss/line-clamp': [email protected]
'@zerodevx/svelte-toast': 0.7.2
autoprefixer: [email protected]
bech32: 2.0.0
bip21: 2.0.3
- bip32: 3.1.0
- bip39: 3.0.4
bitcoin-address-validation: 2.2.1
- bolt11: 1.4.0
buffer: 6.0.3
date-fns: 2.29.3
leaflet: 1.9.3
leaflet.markercluster: [email protected]
- nostr: 0.2.7
- nostr-tools: 1.7.4
+ nostr-tools: 1.7.5
postcss: 8.4.20
prettier: 2.8.1
prettier-plugin-svelte: 2.9.0_ajxj753sv7dbwexjherrch25ta
@@ -75,17 +65,13 @@ devDependencies:
sveltekit-i18n: [email protected]
tailwind-scrollbar: [email protected]
tailwindcss: [email protected]
- tiny-secp256k1: 2.2.1
uuid: 9.0.0
- vite: 4.0.4
- vite-plugin-node-polyfills: [email protected][email protected]
- vite-plugin-top-level-await: [email protected]
- vite-plugin-wasm: 3.1.0
+ vite: 4.2.1
packages:
- /@esbuild/android-arm/0.15.18:
- resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==}
+ /@esbuild/android-arm/0.17.13:
+ resolution: {integrity: sha512-5tZZ/hLIfBmt7E8JsE5KbsknoAFmoElkg+A/gjyPtmSQvJjPf+9GsSJihid8VMa08lrsYyaEXOT9RLh3xXQONw==}
engines: {node: '>=12'}
cpu: [arm]
os: [android]
@@ -93,194 +79,198 @@ packages:
dev: true
optional: true
- /@esbuild/android-arm/0.16.10:
- resolution: {integrity: sha512-RmJjQTRrO6VwUWDrzTBLmV4OJZTarYsiepLGlF2rYTVB701hSorPywPGvP6d8HCuuRibyXa5JX4s3jN2kHEtjQ==}
- engines: {node: '>=12'}
- cpu: [arm]
- os: [android]
- requiresBuild: true
- optional: true
-
- /@esbuild/android-arm64/0.16.10:
- resolution: {integrity: sha512-47Y+NwVKTldTlDhSgJHZ/RpvBQMUDG7eKihqaF/u6g7s0ZPz4J1vy8A3rwnnUOF2CuDn7w7Gj/QcMoWz3U3SJw==}
+ /@esbuild/android-arm64/0.17.13:
+ resolution: {integrity: sha512-F5DgvJMV2ZEpLNpPCO7FEk1wy8O5tg6cikWSB6uvvncsgE1xgbPlm+Boio/4820C2/mj713X83X1h01v0qoeHg==}
engines: {node: '>=12'}
cpu: [arm64]
os: [android]
requiresBuild: true
+ dev: true
optional: true
- /@esbuild/android-x64/0.16.10:
- resolution: {integrity: sha512-C4PfnrBMcuAcOurQzpF1tTtZz94IXO5JmICJJ3NFJRHbXXsQUg9RFG45KvydKqtFfBaFLCHpduUkUfXwIvGnRg==}
+ /@esbuild/android-x64/0.17.13:
+ resolution: {integrity: sha512-5m1UUslzpfVrumG3m3Zv2x9VNAcvMOQWJy009y6jt10tcHpzIq2/b0I0k4fz0QYqGSNS1GteRIhVPN4H7OyCXg==}
engines: {node: '>=12'}
cpu: [x64]
os: [android]
requiresBuild: true
+ dev: true
optional: true
- /@esbuild/darwin-arm64/0.16.10:
- resolution: {integrity: sha512-bH/bpFwldyOKdi9HSLCLhhKeVgRYr9KblchwXgY2NeUHBB/BzTUHtUSBgGBmpydB1/4E37m+ggXXfSrnD7/E7g==}
+ /@esbuild/darwin-arm64/0.17.13:
+ resolution: {integrity: sha512-TXbXp/05r7heRsG8yWwbHw9diay+wXIyRNcIHFoNARRIGahYbTW/qwJzE37zkfxLIUPHgR/SyLTUlnTICg14ag==}
engines: {node: '>=12'}
cpu: [arm64]
os: [darwin]
requiresBuild: true
+ dev: true
optional: true
- /@esbuild/darwin-x64/0.16.10:
- resolution: {integrity: sha512-OXt7ijoLuy+AjDSKQWu+KdDFMBbdeaL6wtgMKtDUXKWHiAMKHan5+R1QAG6HD4+K0nnOvEJXKHeA9QhXNAjOTQ==}
+ /@esbuild/darwin-x64/0.17.13:
+ resolution: {integrity: sha512-Ku9Db2sblCxFvQdEO7X9nBaLR/S81uch81e2Q2+Os5z1NcnsFjuqhIYH0Gm6KNNpIKaEbC7gCLbiIPbLLMX4Pg==}
engines: {node: '>=12'}
cpu: [x64]
os: [darwin]
requiresBuild: true
+ dev: true
optional: true
- /@esbuild/freebsd-arm64/0.16.10:
- resolution: {integrity: sha512-shSQX/3GHuspE3Uxtq5kcFG/zqC+VuMnJkqV7LczO41cIe6CQaXHD3QdMLA4ziRq/m0vZo7JdterlgbmgNIAlQ==}
+ /@esbuild/freebsd-arm64/0.17.13:
+ resolution: {integrity: sha512-t1T5/nIf2j+FdSf1Fa3dcU0cXycr0nK4xJe52qjWa+1I249mM5NBY1ODjiabZxZ0x3CG05y4fd9bxfDLy9kQtA==}
engines: {node: '>=12'}
cpu: [arm64]
os: [freebsd]
requiresBuild: true
+ dev: true
optional: true
- /@esbuild/freebsd-x64/0.16.10:
- resolution: {integrity: sha512-5YVc1zdeaJGASijZmTzSO4h6uKzsQGG3pkjI6fuXvolhm3hVRhZwnHJkforaZLmzvNv5Tb7a3QL2FAVmrgySIA==}
+ /@esbuild/freebsd-x64/0.17.13:
+ resolution: {integrity: sha512-/zbkgEO4gY2qGZr9UNAGI38w/FwUY4bx4EC88k9VeiCKNr3ukNgwH/oIgB5Z9/OqpkNLlcS4w9e2d/MIiy5fbw==}
engines: {node: '>=12'}
cpu: [x64]
os: [freebsd]
requiresBuild: true
+ dev: true
optional: true
- /@esbuild/linux-arm/0.16.10:
- resolution: {integrity: sha512-c360287ZWI2miBnvIj23bPyVctgzeMT2kQKR+x94pVqIN44h3GF8VMEs1SFPH1UgyDr3yBbx3vowDS1SVhyVhA==}
+ /@esbuild/linux-arm/0.17.13:
+ resolution: {integrity: sha512-RrhjzrCF6aCDH248nUAQoldnRmN7nHMxv85GOj5AH+qkxxYvcig7fnUmgANngntRu4btXhN9WKHMgQ5seERDMw==}
engines: {node: '>=12'}
cpu: [arm]
os: [linux]
requiresBuild: true
+ dev: true
optional: true
- /@esbuild/linux-arm64/0.16.10:
- resolution: {integrity: sha512-2aqeNVxIaRfPcIaMZIFoblLh588sWyCbmj1HHCCs9WmeNWm+EIN0SmvsmPvTa/TsNZFKnxTcvkX2eszTcCqIrA==}
+ /@esbuild/linux-arm64/0.17.13:
+ resolution: {integrity: sha512-siu3QZrQ7eGrSttvFaRKyjT7kNRbUuHEKzCCyqRh19MbpGokGY13jbIsBEjx6JmH3T50hds325oweS9Ey2ihAQ==}
engines: {node: '>=12'}
cpu: [arm64]
os: [linux]
requiresBuild: true
+ dev: true
optional: true
- /@esbuild/linux-ia32/0.16.10:
- resolution: {integrity: sha512-sqMIEWeyrLGU7J5RB5fTkLRIFwsgsQ7ieWXlDLEmC2HblPYGb3AucD7inw2OrKFpRPKsec1l+lssiM3+NV5aOw==}
+ /@esbuild/linux-ia32/0.17.13:
+ resolution: {integrity: sha512-ADHA1PqP5gIegehVP0RvxMmNPxpLgetI8QCwYOjUheGXKIKWSdUN8ZS3rusQv3NGZmFCpYdMZzFoI0QtzzGAdw==}
engines: {node: '>=12'}
cpu: [ia32]
os: [linux]
requiresBuild: true
- optional: true
-
- /@esbuild/linux-loong64/0.15.18:
- resolution: {integrity: sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==}
- engines: {node: '>=12'}
- cpu: [loong64]
- os: [linux]
- requiresBuild: true
dev: true
optional: true
- /@esbuild/linux-loong64/0.16.10:
- resolution: {integrity: sha512-O7Pd5hLEtTg37NC73pfhUOGTjx/+aXu5YoSq3ahCxcN7Bcr2F47mv+kG5t840thnsEzrv0oB70+LJu3gUgchvg==}
+ /@esbuild/linux-loong64/0.17.13:
+ resolution: {integrity: sha512-n1JQPxETmR0brkpWlJHeohReEPLH+m00bnJdNnFyHN3zLBt1QypevuZSmnmFWsC+7r7HTwWILj3lBDjtPH3ydg==}
engines: {node: '>=12'}
cpu: [loong64]
os: [linux]
requiresBuild: true
+ dev: true
optional: true
- /@esbuild/linux-mips64el/0.16.10:
- resolution: {integrity: sha512-FN8mZOH7531iPHM0kaFhAOqqNHoAb6r/YHW2ZIxNi0a85UBi2DO4Vuyn7t1p4UN8a4LoAnLOT1PqNgHkgBJgbA==}
+ /@esbuild/linux-mips64el/0.17.13:
+ resolution: {integrity: sha512-d0pnD/j5KKQ43xtSIvOD+wNIy6D/Vh9GbXVRa3u4zCyiJMYWjxkPkbBzlEgNjdDmUM+5gBFen9k7B8Xscy+Myg==}
engines: {node: '>=12'}
cpu: [mips64el]
os: [linux]
requiresBuild: true
+ dev: true
optional: true
- /@esbuild/linux-ppc64/0.16.10:
- resolution: {integrity: sha512-Dg9RiqdvHOAWnOKIOTsIx8dFX9EDlY2IbPEY7YFzchrCiTZmMkD7jWA9UdZbNUygPjdmQBVPRCrLydReFlX9yg==}
+ /@esbuild/linux-ppc64/0.17.13:
+ resolution: {integrity: sha512-C9sMpa/VcGLjVtsT01sXtzZNS7bAZ+icUclkKkiUwBQ9hzT+J+/Xpj+EykI5hB3KgtxQVo4XUahanFoZNxbQ1g==}
engines: {node: '>=12'}
cpu: [ppc64]
os: [linux]
requiresBuild: true
+ dev: true
optional: true
- /@esbuild/linux-riscv64/0.16.10:
- resolution: {integrity: sha512-XMqtpjwzbmlar0BJIxmzu/RZ7EWlfVfH68Vadrva0Wj5UKOdKvqskuev2jY2oPV3aoQUyXwnMbMrFmloO2GfAw==}
+ /@esbuild/linux-riscv64/0.17.13:
+ resolution: {integrity: sha512-jYkc5EpNpvjccAHNYekiAtklusVGWftR0VVLtng7dJzDyy+5adAsf1fOG3LllP0WALxS55/w6boLE/728J/bXw==}
engines: {node: '>=12'}
cpu: [riscv64]
os: [linux]
requiresBuild: true
+ dev: true
optional: true
- /@esbuild/linux-s390x/0.16.10:
- resolution: {integrity: sha512-fu7XtnoeRNFMx8DjK3gPWpFBDM2u5ba+FYwg27SjMJwKvJr4bDyKz5c+FLXLUSSAkMAt/UL+cUbEbra+rYtUgw==}
+ /@esbuild/linux-s390x/0.17.13:
+ resolution: {integrity: sha512-4jAJI5O6E/hATL4lsrG2A+noDjZ377KlATVFKwV3SWaNHj+OvoXe/T84ScQIXEtPI7ndJyLkMYruXj8RR5Ilyw==}
engines: {node: '>=12'}
cpu: [s390x]
os: [linux]
requiresBuild: true
+ dev: true
optional: true
- /@esbuild/linux-x64/0.16.10:
- resolution: {integrity: sha512-61lcjVC/RldNNMUzQQdyCWjCxp9YLEQgIxErxU9XluX7juBdGKb0pvddS0vPNuCvotRbzijZ1pzII+26haWzbA==}
+ /@esbuild/linux-x64/0.17.13:
+ resolution: {integrity: sha512-eFLQhJq98qijGRcv9je/9M4Mz1suZ+pOtj62ArsLd0gubNGhhQDz6T30X2X3f1KZ8lkKkr+zN5vtZzx1GAMoFw==}
engines: {node: '>=12'}
cpu: [x64]
os: [linux]
requiresBuild: true
+ dev: true
optional: true
- /@esbuild/netbsd-x64/0.16.10:
- resolution: {integrity: sha512-JeZXCX3viSA9j4HqSoygjssdqYdfHd6yCFWyfSekLbz4Ef+D2EjvsN02ZQPwYl5a5gg/ehdHgegHhlfOFP0HCA==}
+ /@esbuild/netbsd-x64/0.17.13:
+ resolution: {integrity: sha512-F8PXDeT+3eQpPjf4bmNJapPLu0SKKlWRGPQvBQqVS+YDGoMKnyyYp2UENLFMV8zT7kS39zKxZRZvUL3fMz/7Ww==}
engines: {node: '>=12'}
cpu: [x64]
os: [netbsd]
requiresBuild: true
+ dev: true
optional: true
- /@esbuild/openbsd-x64/0.16.10:
- resolution: {integrity: sha512-3qpxQKuEVIIg8SebpXsp82OBrqjPV/OwNWmG+TnZDr3VGyChNnGMHccC1xkbxCHDQNnnXjxhMQNyHmdFJbmbRA==}
+ /@esbuild/openbsd-x64/0.17.13:
+ resolution: {integrity: sha512-9jWfzbFCnIZdHjNs+00KQHArUbp7kjQDNmiuqkwGOQFs67m4/dKNupBv2DP5hTqVlQY4tW4RG3qpb6Y3zOHJeA==}
engines: {node: '>=12'}
cpu: [x64]
os: [openbsd]
requiresBuild: true
+ dev: true
optional: true
- /@esbuild/sunos-x64/0.16.10:
- resolution: {integrity: sha512-z+q0xZ+et/7etz7WoMyXTHZ1rB8PMSNp/FOqURLJLOPb3GWJ2aj4oCqFCjPwEbW1rsT7JPpxeH/DwGAWk/I1Bg==}
+ /@esbuild/sunos-x64/0.17.13:
+ resolution: {integrity: sha512-ALbOMlTIBkAVi6KqYjONa7u2oH95RN7OpetFqMtjufFLBiSaayRuwUzhs2yuR9CfGT4qi0jv6HQDav+EG314TQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [sunos]
requiresBuild: true
+ dev: true
optional: true
- /@esbuild/win32-arm64/0.16.10:
- resolution: {integrity: sha512-+YYu5sbQ9npkNT9Dec+tn1F/kjg6SMgr6bfi/6FpXYZvCRfu2YFPZGb+3x8K30s8eRxFpoG4sGhiSUkr1xbHEw==}
+ /@esbuild/win32-arm64/0.17.13:
+ resolution: {integrity: sha512-FJBLYL4PkrZGeuHzEqme+0DjNetxkJ+XbB+Aoeow7aQ53JCwsA0/mo8sS5aPkDHgCnMkN4A5GLoFTlDj3BKDrQ==}
engines: {node: '>=12'}
cpu: [arm64]
os: [win32]
requiresBuild: true
+ dev: true
optional: true
- /@esbuild/win32-ia32/0.16.10:
- resolution: {integrity: sha512-Aw7Fupk7XNehR1ftHGYwUteyJ2q+em/aE+fVU3YMTBN2V5A7Z4aVCSV+SvCp9HIIHZavPFBpbdP3VfjQpdf6Xg==}
+ /@esbuild/win32-ia32/0.17.13:
+ resolution: {integrity: sha512-Qrvst9RkLz4qgi3hqswNliYuKW92/HGJnd7xLWkGaGPa8S4qsONf81FW0ebDc5iUHb0I7QJwQATutvghTabnFA==}
engines: {node: '>=12'}
cpu: [ia32]
os: [win32]
requiresBuild: true
+ dev: true
optional: true
- /@esbuild/win32-x64/0.16.10:
- resolution: {integrity: sha512-qddWullt3sC1EIpfHvCRBq3H4g3L86DZpD6n8k2XFjFVyp01D++uNbN1hT/JRsHxTbyyemZcpwL5aRlJwc/zFw==}
+ /@esbuild/win32-x64/0.17.13:
+ resolution: {integrity: sha512-pZ/NIgz861XaUPlIkPFjP55nJ4PJa0o/CD4zgeRb1Q9FVE+8GvdB6ifJcK05jRhny5hKExhnRFIdgHmmCYH8vg==}
engines: {node: '>=12'}
cpu: [x64]
os: [win32]
requiresBuild: true
+ dev: true
optional: true
/@jridgewell/sourcemap-codec/1.4.14:
resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
- dev: false
+ dev: true
/@noble/hashes/1.0.0:
resolution: {integrity: sha512-DZVbtY62kc3kkBtMHqwCOfXrT/hnoORy5BJ4+HU1IR59X0KWAOqsfzQPcUl/lQLlG7qXbe/fZ3r/emxtAl+sqg==}
@@ -290,6 +280,10 @@ packages:
resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==}
dev: true
+ /@noble/hashes/1.3.0:
+ resolution: {integrity: sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg==}
+ dev: true
+
/@noble/secp256k1/1.7.1:
resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==}
dev: true
@@ -317,7 +311,7 @@ packages:
/@polka/url/1.0.0-next.21:
resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==}
- dev: false
+ dev: true
/@rollup/plugin-commonjs/[email protected]:
resolution: {integrity: sha512-15LsiWRZk4eOGqvrJyu3z3DaBu5BhXIMeWnijSRvd8irrrg9SHpQ1pH+BUK4H6Z9wL9yOxZJMTLU+Au86XHxow==}
@@ -335,17 +329,6 @@ packages:
is-reference: 1.2.1
magic-string: 0.27.0
rollup: 3.8.1
- dev: false
-
- /@rollup/plugin-inject/[email protected]:
- resolution: {integrity: sha512-4pbcU4J/nS+zuHk+c+OL3WtmEQhqxlZ9uqfjQMQDOHOPld7PsCd8k5LWs8h5wjwJN7MgnAn768F2sDxEP4eNFQ==}
- peerDependencies:
- rollup: ^1.20.0 || ^2.0.0
- dependencies:
- '@rollup/pluginutils': [email protected]
- estree-walker: 2.0.2
- magic-string: 0.25.9
- rollup: 2.79.1
dev: true
/@rollup/plugin-json/[email protected]:
@@ -359,7 +342,7 @@ packages:
dependencies:
'@rollup/pluginutils': [email protected]
rollup: 3.8.1
- dev: false
+ dev: true
/@rollup/plugin-node-resolve/[email protected]:
resolution: {integrity: sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg==}
@@ -377,18 +360,6 @@ packages:
is-module: 1.0.0
resolve: 1.22.1
rollup: 3.8.1
- dev: false
-
- /@rollup/pluginutils/[email protected]:
- resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==}
- engines: {node: '>= 8.0.0'}
- peerDependencies:
- rollup: ^1.20.0||^2.0.0
- dependencies:
- '@types/estree': 0.0.39
- estree-walker: 1.0.1
- picomatch: 2.3.1
- rollup: 2.79.1
dev: true
/@rollup/pluginutils/[email protected]:
@@ -404,7 +375,7 @@ packages:
estree-walker: 2.0.2
picomatch: 2.3.1
rollup: 3.8.1
- dev: false
+ dev: true
/@scure/base/1.1.1:
resolution: {integrity: sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==}
@@ -418,14 +389,14 @@ packages:
'@scure/base': 1.1.1
dev: true
- /@scure/bip39/1.1.1:
- resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==}
+ /@scure/bip39/1.2.0:
+ resolution: {integrity: sha512-SX/uKq52cuxm4YFXWFaVByaSHJh2w3BnokVSeUJVCv6K7WulT9u2BuNRBhuFl8vAuYnzx9bEu9WgpcNYTrYieg==}
dependencies:
- '@noble/hashes': 1.2.0
+ '@noble/hashes': 1.3.0
'@scure/base': 1.1.1
dev: true
- /@sveltejs/adapter-node/1.1.4_@[email protected]:
+ /@sveltejs/adapter-node/1.1.4_@[email protected]:
resolution: {integrity: sha512-3iEBqi1fXLXP9YIbVuz2LXajoebRJCmAFEQbN40DlxAnA7G+InxUgnqFun3q9gBMz2Qvd99K51g/HxWetXRe8Q==}
peerDependencies:
'@sveltejs/kit': ^1.0.0
@@ -433,12 +404,12 @@ packages:
'@rollup/plugin-commonjs': [email protected]
'@rollup/plugin-json': [email protected]
'@rollup/plugin-node-resolve': [email protected]
rollup: 3.8.1
- dev: false
+ dev: true
- resolution: {integrity: sha512-5LKhBEvkli5xzRObhV0c9QfyRiV96MQNouFM2Cn9nlEno6c88WVCFlNFPuTiSmHM2GE3pSCB+uT37fMFoWSERA==}
+ resolution: {integrity: sha512-4e/cZT0z4IppEkqNvMrurGz6VE1gScukFU7XqwTL/yrGJGXHqS9D7RvsOcE1hASsgrMu6w/fKTIhxT5oN0K1Jw==}
engines: {node: ^16.14 || >=18}
hasBin: true
requiresBuild: true
@@ -446,26 +417,26 @@ packages:
svelte: ^3.54.0
vite: ^4.0.0 || 4
dependencies:
- '@sveltejs/vite-plugin-svelte': [email protected][email protected]
+ '@sveltejs/vite-plugin-svelte': [email protected][email protected]
'@types/cookie': 0.5.1
cookie: 0.5.0
- devalue: 4.2.2
+ devalue: 4.3.0
esm-env: 1.0.0
kleur: 4.1.5
- magic-string: 0.27.0
+ magic-string: 0.30.0
mime: 3.0.0
sade: 1.8.1
set-cookie-parser: 2.5.1
sirv: 2.0.2
svelte: 3.55.0
tiny-glob: 0.2.9
- undici: 5.16.0
- vite: 4.0.4
+ undici: 5.21.0
+ vite: 4.2.1
transitivePeerDependencies:
- supports-color
- dev: false
+ dev: true
- /@sveltejs/vite-plugin-svelte/[email protected][email protected]:
+ /@sveltejs/vite-plugin-svelte/[email protected][email protected]:
resolution: {integrity: sha512-xCEan0/NNpQuL0l5aS42FjwQ6wwskdxC3pW1OeFtEKNZwRg7Evro9lac9HesGP6TdFsTv2xMes5ASQVKbCacxg==}
engines: {node: ^14.18.0 || >= 16}
peerDependencies:
@@ -478,11 +449,11 @@ packages:
magic-string: 0.27.0
svelte: 3.55.0
svelte-hmr: [email protected]
- vite: 4.0.4
+ vite: 4.2.1
transitivePeerDependencies:
- supports-color
- dev: false
+ dev: true
/@sveltekit-i18n/base/[email protected]:
resolution: {integrity: sha512-F8gqG2+KAOeT0o2wYlUrW3TRCX7zaD7rBy/1CEVNw0irfw9TgFf/ODmhubkHHT3+6Zk+SMz8RNgeuffBfAMbJw==}
@@ -498,114 +469,6 @@ packages:
resolution: {integrity: sha512-HheveklTjp3hxpYQhoHfyA6B4bQaUeSV5MQf2usIv/58UF2jY/YqhCAWj9bDBjufbuZc5pSz4BXvdX3WVT+viA==}
dev: true
- /@swc/core-darwin-arm64/1.3.24:
- resolution: {integrity: sha512-rR+9UpWm+fGXcipsjCst2hIL1GYIbo0YTLhJZWdIpQD6KRHHJMFXiydMgQQkDj2Ml7HpqUVgxj6m4ZWYL8b0OA==}
- engines: {node: '>=10'}
- cpu: [arm64]
- os: [darwin]
- requiresBuild: true
- dev: true
- optional: true
-
- /@swc/core-darwin-x64/1.3.24:
- resolution: {integrity: sha512-px+5vkGtgPH0m3FkkTBHynlRdS5rRz+lK+wiXIuBZFJSySWFl6RkKbvwkD+sf0MpazQlqwlv/rTOGJBw6oDffg==}
- engines: {node: '>=10'}
- cpu: [x64]
- os: [darwin]
- requiresBuild: true
- dev: true
- optional: true
-
- /@swc/core-linux-arm-gnueabihf/1.3.24:
- resolution: {integrity: sha512-jLs8ZOdTV4UW4J12E143QJ4mOMONQtqgAnuhBbRuWFzQ3ny1dfoC3P1jNWAJ2Xi59XdxAIXn0PggPNH4Kh34kw==}
- engines: {node: '>=10'}
- cpu: [arm]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@swc/core-linux-arm64-gnu/1.3.24:
- resolution: {integrity: sha512-A/v0h70BekrwGpp1DlzIFGcHQ3QQ2PexXcnnuIBZeMc9gNmHlcZmg3EcwAnaUDiokhNuSUFA/wV94yk1OqmSkw==}
- engines: {node: '>=10'}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@swc/core-linux-arm64-musl/1.3.24:
- resolution: {integrity: sha512-pbc9eArWPTiMrbpS/pJo0IiQNAKAQBcBIDjWBGP1tcw2iDXYLw4bruwz9kI/VjakbshWb8MoE4T5ClkeuULvSw==}
- engines: {node: '>=10'}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@swc/core-linux-x64-gnu/1.3.24:
- resolution: {integrity: sha512-pP5pOLlY1xd352qo7rTlpVPUI9/9VhOd4b3Lk+LzfZDq9bTL2NDlGfyrPiwa5DGHMSzrugH56K2J68eutkxYVA==}
- engines: {node: '>=10'}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@swc/core-linux-x64-musl/1.3.24:
- resolution: {integrity: sha512-phNbP7zGp+Wcyxq1Qxlpe5KkxO7WLT2kVQUC7aDFGlVdCr+xdXsfH1MzheHtnr0kqTVQX1aiM8XXXHfFxR0oNA==}
- engines: {node: '>=10'}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@swc/core-win32-arm64-msvc/1.3.24:
- resolution: {integrity: sha512-qhbiJTWAOqyR+K9xnGmCkOWSz2EmWpDBstEJCEOTc6FZiEdbiTscDmqTcMbCKaTHGu8t+6erVA4t65/Eg6uWPA==}
- engines: {node: '>=10'}
- cpu: [arm64]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
-
- /@swc/core-win32-ia32-msvc/1.3.24:
- resolution: {integrity: sha512-JfghIlscE4Rz+Lc08lSoDh+R0cWxrISed5biogFfE6vZqhaDnw3E5Qshqw7O3pIaiq8L2u1nmzuyP581ZmpbRA==}
- engines: {node: '>=10'}
- cpu: [ia32]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
-
- /@swc/core-win32-x64-msvc/1.3.24:
- resolution: {integrity: sha512-3AmJRr0hwciwDBbzUNqaftvppzS8v9X/iv/Wl7YaVLBVpPfQvaZzfqLycvNMGLZb5vIKXR/u58txg3dRBGsJtw==}
- engines: {node: '>=10'}
- cpu: [x64]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
-
- /@swc/core/1.3.24:
- resolution: {integrity: sha512-QMOTd0AgiUT3K1crxLRqd3gw0f3FC8hhH1vvlIlryvYqU4c+FJ/T2G4ZhMKLxQlZ/jX6Rhk0gKINZRBxy2GFyQ==}
- engines: {node: '>=10'}
- hasBin: true
- requiresBuild: true
- optionalDependencies:
- '@swc/core-darwin-arm64': 1.3.24
- '@swc/core-darwin-x64': 1.3.24
- '@swc/core-linux-arm-gnueabihf': 1.3.24
- '@swc/core-linux-arm64-gnu': 1.3.24
- '@swc/core-linux-arm64-musl': 1.3.24
- '@swc/core-linux-x64-gnu': 1.3.24
- '@swc/core-linux-x64-musl': 1.3.24
- '@swc/core-win32-arm64-msvc': 1.3.24
- '@swc/core-win32-ia32-msvc': 1.3.24
- '@swc/core-win32-x64-msvc': 1.3.24
- dev: true
-
/@tailwindcss/line-clamp/[email protected]:
resolution: {integrity: sha512-HFzAQuqYCjyy/SX9sLGB1lroPzmcnWv1FHkIpmypte10hptf4oPUfucryMKovZh2u0uiS9U5Ty3GghWfEJGwVw==}
peerDependencies:
@@ -614,25 +477,16 @@ packages:
tailwindcss: [email protected]
dev: true
- /@types/bn.js/4.11.6:
- resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==}
- dependencies:
- '@types/node': 18.11.17
- dev: true
-
/@types/cookie/0.5.1:
resolution: {integrity: sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==}
- dev: false
+ dev: true
/@types/estree/0.0.39:
resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==}
+ dev: true
/@types/estree/1.0.0:
resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==}
- dev: false
-
- /@types/node/11.11.6:
- resolution: {integrity: sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==}
dev: true
/@types/node/18.11.17:
@@ -649,7 +503,7 @@ packages:
/@types/resolve/1.20.2:
resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
- dev: false
+ dev: true
/@types/sass/1.43.1:
resolution: {integrity: sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==}
@@ -692,24 +546,6 @@ packages:
resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
dev: true
- /asn1.js/5.4.1:
- resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==}
- dependencies:
- bn.js: 4.12.0
- inherits: 2.0.4
- minimalistic-assert: 1.0.1
- safer-buffer: 2.1.2
- dev: true
-
- /assert/2.0.0:
- resolution: {integrity: sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==}
- dependencies:
- es6-object-assign: 1.1.0
- is-nan: 1.3.2
- object-is: 1.1.5
- util: 0.12.5
- dev: true
-
/autoprefixer/[email protected]:
resolution: {integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==}
engines: {node: ^10 || ^12 || >=14}
@@ -726,18 +562,8 @@ packages:
postcss-value-parser: 4.2.0
dev: true
- /available-typed-arrays/1.0.5:
- resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==}
- engines: {node: '>= 0.4'}
- dev: true
-
/balanced-match/1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
-
- /base-x/3.0.9:
- resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==}
- dependencies:
- safe-buffer: 5.2.1
dev: true
/base58-js/1.0.5:
@@ -749,10 +575,6 @@ packages:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
dev: true
- /bech32/1.1.4:
- resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==}
- dev: true
-
/bech32/2.0.0:
resolution: {integrity: sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==}
dev: true
@@ -762,38 +584,12 @@ packages:
engines: {node: '>=8'}
dev: true
- /bip174/2.1.0:
- resolution: {integrity: sha512-lkc0XyiX9E9KiVAS1ZiOqK1xfiwvf4FXDDdkDq5crcDzOq+xGytY+14qCsqz7kCiy8rpN1CRNfacRhf9G3JNSA==}
- engines: {node: '>=8.0.0'}
- dev: true
-
/bip21/2.0.3:
resolution: {integrity: sha512-L4ODmASLjsHYAU+TG7xffkYNMvHzAe4mkVX7mcvOUyKAr/MDBPrsRgqUhE8EmKdeEKHk5SYpX1Aexzvm/6WdbQ==}
dependencies:
qs: 6.11.0
dev: true
- /bip32/3.1.0:
- resolution: {integrity: sha512-eoeajYEzJ4d6yyVtby8C+XkCeKItiC4Mx56a0M9VaqTMC73SWOm4xVZG7SaR8e/yp4eSyky2XcBpH3DApPdu7Q==}
- engines: {node: '>=6.0.0'}
- dependencies:
- bs58check: 2.1.2
- create-hash: 1.2.0
- create-hmac: 1.1.7
- ripemd160: 2.0.2
- typeforce: 1.18.0
- wif: 2.0.6
- dev: true
-
- /bip39/3.0.4:
- resolution: {integrity: sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==}
- dependencies:
- '@types/node': 11.11.6
- create-hash: 1.2.0
- pbkdf2: 3.1.2
- randombytes: 2.1.0
- dev: true
-
/bitcoin-address-validation/2.2.1:
resolution: {integrity: sha512-f6LXNpvRKlTbHWb37N9tHoAbYGbshzM8FPWvCtloh++hxZ0/dmkokvKNVLz6HkG82zVwo8w6Sq4JmfO2timzyg==}
dependencies:
@@ -802,41 +598,6 @@ packages:
sha256-uint8array: 0.10.3
dev: true
- /bitcoinjs-lib/6.1.0:
- resolution: {integrity: sha512-eupi1FBTJmPuAZdChnzTXLv2HBqFW2AICpzXZQLniP0V9FWWeeUQSMKES6sP8isy/xO0ijDexbgkdEyFVrsuJw==}
- engines: {node: '>=8.0.0'}
- dependencies:
- bech32: 2.0.0
- bip174: 2.1.0
- bs58check: 2.1.2
- create-hash: 1.2.0
- ripemd160: 2.0.2
- typeforce: 1.18.0
- varuint-bitcoin: 1.1.2
- wif: 2.0.6
- dev: true
-
- /bn.js/4.12.0:
- resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==}
- dev: true
-
- /bn.js/5.2.1:
- resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==}
- dev: true
-
- /bolt11/1.4.0:
- resolution: {integrity: sha512-TeGIOpFNrvNA1XGvwBr+lYmzKfoJeyMRt7nsGmIci+5gbmSz7s46jwKLNYXH3IoxV7fjmYUEUu2NM19n9w0msg==}
- dependencies:
- '@types/bn.js': 4.11.6
- bech32: 1.1.4
- bitcoinjs-lib: 6.1.0
- bn.js: 4.12.0
- create-hash: 1.2.0
- lodash: 4.17.21
- safe-buffer: 5.2.1
- secp256k1: 4.0.3
- dev: true
-
/brace-expansion/1.1.11:
resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
dependencies:
@@ -848,7 +609,7 @@ packages:
resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
dependencies:
balanced-match: 1.0.2
- dev: false
+ dev: true
/braces/3.0.2:
resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
@@ -857,71 +618,6 @@ packages:
fill-range: 7.0.1
dev: true
- /brorand/1.1.0:
- resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==}
- dev: true
-
- /browser-resolve/2.0.0:
- resolution: {integrity: sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==}
- dependencies:
- resolve: 1.22.1
- dev: true
-
- /browserify-aes/1.2.0:
- resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==}
- dependencies:
- buffer-xor: 1.0.3
- cipher-base: 1.0.4
- create-hash: 1.2.0
- evp_bytestokey: 1.0.3
- inherits: 2.0.4
- safe-buffer: 5.2.1
- dev: true
-
- /browserify-cipher/1.0.1:
- resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==}
- dependencies:
- browserify-aes: 1.2.0
- browserify-des: 1.0.2
- evp_bytestokey: 1.0.3
- dev: true
-
- /browserify-des/1.0.2:
- resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==}
- dependencies:
- cipher-base: 1.0.4
- des.js: 1.0.1
- inherits: 2.0.4
- safe-buffer: 5.2.1
- dev: true
-
- /browserify-rsa/4.1.0:
- resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==}
- dependencies:
- bn.js: 5.2.1
- randombytes: 2.1.0
- dev: true
-
- /browserify-sign/4.2.1:
- resolution: {integrity: sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==}
- dependencies:
- bn.js: 5.2.1
- browserify-rsa: 4.1.0
- create-hash: 1.2.0
- create-hmac: 1.1.7
- elliptic: 6.5.4
- inherits: 2.0.4
- parse-asn1: 5.1.6
- readable-stream: 3.6.0
- safe-buffer: 5.2.1
- dev: true
-
- /browserify-zlib/0.2.0:
- resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==}
- dependencies:
- pako: 1.0.11
- dev: true
-
/browserslist/4.21.4:
resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
@@ -933,35 +629,10 @@ packages:
update-browserslist-db: [email protected]
dev: true
- /bs58/4.0.1:
- resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==}
- dependencies:
- base-x: 3.0.9
- dev: true
-
- /bs58check/2.1.2:
- resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==}
- dependencies:
- bs58: 4.0.1
- create-hash: 1.2.0
- safe-buffer: 5.2.1
- dev: true
-
/buffer-crc32/0.2.13:
resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
dev: true
- /buffer-xor/1.0.3:
- resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==}
- dev: true
-
- /buffer/5.7.1:
- resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
- dependencies:
- base64-js: 1.5.1
- ieee754: 1.2.1
- dev: true
-
/buffer/6.0.3:
resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
dependencies:
@@ -972,10 +643,6 @@ packages:
/builtin-modules/3.3.0:
resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
engines: {node: '>=6'}
- dev: false
-
- /builtin-status-codes/3.0.0:
- resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==}
dev: true
/busboy/1.6.0:
@@ -983,7 +650,7 @@ packages:
engines: {node: '>=10.16.0'}
dependencies:
streamsearch: 1.1.0
- dev: false
+ dev: true
/call-bind/1.0.2:
resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
@@ -1016,84 +683,21 @@ packages:
fsevents: 2.3.2
dev: true
- /cipher-base/1.0.4:
- resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==}
- dependencies:
- inherits: 2.0.4
- safe-buffer: 5.2.1
- dev: true
-
/color-name/1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
dev: true
/commondir/1.0.1:
resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==}
- dev: false
+ dev: true
/concat-map/0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
dev: true
- /console-browserify/1.2.0:
- resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==}
- dev: true
-
- /constants-browserify/1.0.0:
- resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==}
- dev: true
-
/cookie/0.5.0:
resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==}
engines: {node: '>= 0.6'}
- dev: false
-
- /create-ecdh/4.0.4:
- resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==}
- dependencies:
- bn.js: 4.12.0
- elliptic: 6.5.4
- dev: true
-
- /create-hash/1.2.0:
- resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==}
- dependencies:
- cipher-base: 1.0.4
- inherits: 2.0.4
- md5.js: 1.3.5
- ripemd160: 2.0.2
- sha.js: 2.4.11
- dev: true
-
- /create-hmac/1.1.7:
- resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==}
- dependencies:
- cipher-base: 1.0.4
- create-hash: 1.2.0
- inherits: 2.0.4
- ripemd160: 2.0.2
- safe-buffer: 5.2.1
- sha.js: 2.4.11
- dev: true
-
- /create-require/1.1.1:
- resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
- dev: true
-
- /crypto-browserify/3.12.0:
- resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==}
- dependencies:
- browserify-cipher: 1.0.1
- browserify-sign: 4.2.1
- create-ecdh: 4.0.4
- create-hash: 1.2.0
- create-hmac: 1.1.7
- diffie-hellman: 5.0.3
- inherits: 2.0.4
- pbkdf2: 3.1.2
- public-encrypt: 4.0.3
- randombytes: 2.1.0
- randomfill: 1.0.4
dev: true
/cssesc/3.0.0:
@@ -1117,32 +721,17 @@ packages:
optional: true
dependencies:
ms: 2.1.2
- dev: false
+ dev: true
/deepmerge/4.2.2:
resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==}
engines: {node: '>=0.10.0'}
- dev: false
-
- /define-properties/1.1.4:
- resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==}
- engines: {node: '>= 0.4'}
- dependencies:
- has-property-descriptors: 1.0.0
- object-keys: 1.1.1
dev: true
/defined/1.0.1:
resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==}
dev: true
- /des.js/1.0.1:
- resolution: {integrity: sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==}
- dependencies:
- inherits: 2.0.4
- minimalistic-assert: 1.0.1
- dev: true
-
/detect-indent/6.1.0:
resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==}
engines: {node: '>=8'}
@@ -1158,294 +747,56 @@ packages:
minimist: 1.2.7
dev: true
- /devalue/4.2.2:
- resolution: {integrity: sha512-Pkwd8qrI9O20VJ14fBNHu+on99toTNZFbgWRpZbC0zbDXpnE2WHYcrC1fHhMsF/3Ee+2yaW7vEujAT7fCYgqrA==}
- dev: false
+ /devalue/4.3.0:
+ resolution: {integrity: sha512-n94yQo4LI3w7erwf84mhRUkUJfhLoCZiLyoOZ/QFsDbcWNZePrLwbQpvZBUG2TNxwV3VjCKPxkiiQA6pe3TrTA==}
+ dev: true
/didyoumean/1.2.2:
resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
dev: true
- /diffie-hellman/5.0.3:
- resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==}
- dependencies:
- bn.js: 4.12.0
- miller-rabin: 4.0.1
- randombytes: 2.1.0
- dev: true
-
/dlv/1.1.3:
resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
dev: true
- /domain-browser/4.22.0:
- resolution: {integrity: sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==}
- engines: {node: '>=10'}
- dev: true
-
/electron-to-chromium/1.4.284:
resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==}
dev: true
- /elliptic/6.5.4:
- resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==}
- dependencies:
- bn.js: 4.12.0
- brorand: 1.1.0
- hash.js: 1.1.7
- hmac-drbg: 1.0.1
- inherits: 2.0.4
- minimalistic-assert: 1.0.1
- minimalistic-crypto-utils: 1.0.1
- dev: true
-
- /es6-object-assign/1.1.0:
- resolution: {integrity: sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==}
- dev: true
-
/es6-promise/3.3.1:
resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==}
dev: true
- /esbuild-android-64/0.15.18:
- resolution: {integrity: sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [android]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-android-arm64/0.15.18:
- resolution: {integrity: sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [android]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-darwin-64/0.15.18:
- resolution: {integrity: sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [darwin]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-darwin-arm64/0.15.18:
- resolution: {integrity: sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [darwin]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-freebsd-64/0.15.18:
- resolution: {integrity: sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [freebsd]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-freebsd-arm64/0.15.18:
- resolution: {integrity: sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [freebsd]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-linux-32/0.15.18:
- resolution: {integrity: sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==}
- engines: {node: '>=12'}
- cpu: [ia32]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-linux-64/0.15.18:
- resolution: {integrity: sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-linux-arm/0.15.18:
- resolution: {integrity: sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==}
- engines: {node: '>=12'}
- cpu: [arm]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-linux-arm64/0.15.18:
- resolution: {integrity: sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-linux-mips64le/0.15.18:
- resolution: {integrity: sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==}
- engines: {node: '>=12'}
- cpu: [mips64el]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-linux-ppc64le/0.15.18:
- resolution: {integrity: sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==}
- engines: {node: '>=12'}
- cpu: [ppc64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-linux-riscv64/0.15.18:
- resolution: {integrity: sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==}
- engines: {node: '>=12'}
- cpu: [riscv64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-linux-s390x/0.15.18:
- resolution: {integrity: sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==}
- engines: {node: '>=12'}
- cpu: [s390x]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-netbsd-64/0.15.18:
- resolution: {integrity: sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [netbsd]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-openbsd-64/0.15.18:
- resolution: {integrity: sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [openbsd]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-sunos-64/0.15.18:
- resolution: {integrity: sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [sunos]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-windows-32/0.15.18:
- resolution: {integrity: sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==}
- engines: {node: '>=12'}
- cpu: [ia32]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-windows-64/0.15.18:
- resolution: {integrity: sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-windows-arm64/0.15.18:
- resolution: {integrity: sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild/0.15.18:
- resolution: {integrity: sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==}
+ /esbuild/0.17.13:
+ resolution: {integrity: sha512-4ixMwdErBcQHgTBeoxnowENCPKWFAGxgTyKHMK8gqn9sZaC7ZNWFKtim16g2rzQ2b/FYyy3lIUUJboFtjolhqg==}
engines: {node: '>=12'}
hasBin: true
requiresBuild: true
optionalDependencies:
- '@esbuild/android-arm': 0.15.18
- '@esbuild/linux-loong64': 0.15.18
- esbuild-android-64: 0.15.18
- esbuild-android-arm64: 0.15.18
- esbuild-darwin-64: 0.15.18
- esbuild-darwin-arm64: 0.15.18
- esbuild-freebsd-64: 0.15.18
- esbuild-freebsd-arm64: 0.15.18
- esbuild-linux-32: 0.15.18
- esbuild-linux-64: 0.15.18
- esbuild-linux-arm: 0.15.18
- esbuild-linux-arm64: 0.15.18
- esbuild-linux-mips64le: 0.15.18
- esbuild-linux-ppc64le: 0.15.18
- esbuild-linux-riscv64: 0.15.18
- esbuild-linux-s390x: 0.15.18
- esbuild-netbsd-64: 0.15.18
- esbuild-openbsd-64: 0.15.18
- esbuild-sunos-64: 0.15.18
- esbuild-windows-32: 0.15.18
- esbuild-windows-64: 0.15.18
- esbuild-windows-arm64: 0.15.18
+ '@esbuild/android-arm': 0.17.13
+ '@esbuild/android-arm64': 0.17.13
+ '@esbuild/android-x64': 0.17.13
+ '@esbuild/darwin-arm64': 0.17.13
+ '@esbuild/darwin-x64': 0.17.13
+ '@esbuild/freebsd-arm64': 0.17.13
+ '@esbuild/freebsd-x64': 0.17.13
+ '@esbuild/linux-arm': 0.17.13
+ '@esbuild/linux-arm64': 0.17.13
+ '@esbuild/linux-ia32': 0.17.13
+ '@esbuild/linux-loong64': 0.17.13
+ '@esbuild/linux-mips64el': 0.17.13
+ '@esbuild/linux-ppc64': 0.17.13
+ '@esbuild/linux-riscv64': 0.17.13
+ '@esbuild/linux-s390x': 0.17.13
+ '@esbuild/linux-x64': 0.17.13
+ '@esbuild/netbsd-x64': 0.17.13
+ '@esbuild/openbsd-x64': 0.17.13
+ '@esbuild/sunos-x64': 0.17.13
+ '@esbuild/win32-arm64': 0.17.13
+ '@esbuild/win32-ia32': 0.17.13
+ '@esbuild/win32-x64': 0.17.13
dev: true
- /esbuild/0.16.10:
- resolution: {integrity: sha512-z5dIViHoVnw2l+NCJ3zj5behdXjYvXne9gL18OOivCadXDUhyDkeSvEtLcGVAJW2fNmh33TDUpsi704XYlDodw==}
- engines: {node: '>=12'}
- hasBin: true
- requiresBuild: true
- optionalDependencies:
- '@esbuild/android-arm': 0.16.10
- '@esbuild/android-arm64': 0.16.10
- '@esbuild/android-x64': 0.16.10
- '@esbuild/darwin-arm64': 0.16.10
- '@esbuild/darwin-x64': 0.16.10
- '@esbuild/freebsd-arm64': 0.16.10
- '@esbuild/freebsd-x64': 0.16.10
- '@esbuild/linux-arm': 0.16.10
- '@esbuild/linux-arm64': 0.16.10
- '@esbuild/linux-ia32': 0.16.10
- '@esbuild/linux-loong64': 0.16.10
- '@esbuild/linux-mips64el': 0.16.10
- '@esbuild/linux-ppc64': 0.16.10
- '@esbuild/linux-riscv64': 0.16.10
- '@esbuild/linux-s390x': 0.16.10
- '@esbuild/linux-x64': 0.16.10
- '@esbuild/netbsd-x64': 0.16.10
- '@esbuild/openbsd-x64': 0.16.10
- '@esbuild/sunos-x64': 0.16.10
- '@esbuild/win32-arm64': 0.16.10
- '@esbuild/win32-ia32': 0.16.10
- '@esbuild/win32-x64': 0.16.10
-
/escalade/3.1.1:
resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
engines: {node: '>=6'}
@@ -1453,25 +804,10 @@ packages:
/esm-env/1.0.0:
resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==}
- dev: false
-
- /estree-walker/1.0.1:
- resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==}
dev: true
/estree-walker/2.0.2:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
-
- /events/3.3.0:
- resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
- engines: {node: '>=0.8.x'}
- dev: true
-
- /evp_bytestokey/1.0.3:
- resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==}
- dependencies:
- md5.js: 1.3.5
- safe-buffer: 5.2.1
dev: true
/fast-glob/3.2.12:
@@ -1498,36 +834,25 @@ packages:
to-regex-range: 5.0.1
dev: true
- /find-up/5.0.0:
- resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
- engines: {node: '>=10'}
- dependencies:
- locate-path: 6.0.0
- path-exists: 4.0.0
- dev: true
-
- /for-each/0.3.3:
- resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
- dependencies:
- is-callable: 1.2.7
- dev: true
-
/fraction.js/4.2.0:
resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==}
dev: true
/fs.realpath/1.0.0:
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+ dev: true
/fsevents/2.3.2:
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
requiresBuild: true
+ dev: true
optional: true
/function-bind/1.1.1:
resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
+ dev: true
/get-intrinsic/1.1.3:
resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==}
@@ -1571,76 +896,30 @@ packages:
inherits: 2.0.4
minimatch: 5.1.6
once: 1.4.0
- dev: false
+ dev: true
/globalyzer/0.1.0:
resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==}
- dev: false
+ dev: true
/globrex/0.1.2:
resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
- dev: false
-
- /gopd/1.0.1:
- resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
- dependencies:
- get-intrinsic: 1.1.3
dev: true
/graceful-fs/4.2.10:
resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
dev: true
- /has-property-descriptors/1.0.0:
- resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==}
- dependencies:
- get-intrinsic: 1.1.3
- dev: true
-
/has-symbols/1.0.3:
resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
engines: {node: '>= 0.4'}
dev: true
- /has-tostringtag/1.0.0:
- resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==}
- engines: {node: '>= 0.4'}
- dependencies:
- has-symbols: 1.0.3
- dev: true
-
/has/1.0.3:
resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
engines: {node: '>= 0.4.0'}
dependencies:
function-bind: 1.1.1
-
- /hash-base/3.1.0:
- resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==}
- engines: {node: '>=4'}
- dependencies:
- inherits: 2.0.4
- readable-stream: 3.6.0
- safe-buffer: 5.2.1
- dev: true
-
- /hash.js/1.1.7:
- resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==}
- dependencies:
- inherits: 2.0.4
- minimalistic-assert: 1.0.1
- dev: true
-
- /hmac-drbg/1.0.1:
- resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==}
- dependencies:
- hash.js: 1.1.7
- minimalistic-assert: 1.0.1
- minimalistic-crypto-utils: 1.0.1
- dev: true
-
- /https-browserify/1.0.0:
- resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==}
dev: true
/ieee754/1.2.1:
@@ -1652,16 +931,10 @@ packages:
dependencies:
once: 1.4.0
wrappy: 1.0.2
+ dev: true
/inherits/2.0.4:
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
-
- /is-arguments/1.1.1:
- resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.2
- has-tostringtag: 1.0.0
dev: true
/is-binary-path/2.1.0:
@@ -1676,30 +949,19 @@ packages:
engines: {node: '>=6'}
dependencies:
builtin-modules: 3.3.0
- dev: false
-
- /is-callable/1.2.7:
- resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
- engines: {node: '>= 0.4'}
dev: true
/is-core-module/2.11.0:
resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==}
dependencies:
has: 1.0.3
+ dev: true
/is-extglob/2.1.1:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
dev: true
- /is-generator-function/1.0.10:
- resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==}
- engines: {node: '>= 0.4'}
- dependencies:
- has-tostringtag: 1.0.0
- dev: true
-
/is-glob/4.0.3:
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
engines: {node: '>=0.10.0'}
@@ -1709,14 +971,6 @@ packages:
/is-module/1.0.0:
resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==}
- dev: false
-
- /is-nan/1.3.2:
- resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.1.4
dev: true
/is-number/7.0.0:
@@ -1728,28 +982,12 @@ packages:
resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
dependencies:
'@types/estree': 0.0.39
- dev: false
-
- /is-typed-array/1.1.10:
- resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==}
- engines: {node: '>= 0.4'}
- dependencies:
- available-typed-arrays: 1.0.5
- call-bind: 1.0.2
- for-each: 0.3.3
- gopd: 1.0.1
- has-tostringtag: 1.0.0
- dev: true
-
- /isomorphic-timers-promises/1.0.1:
- resolution: {integrity: sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==}
- engines: {node: '>=10'}
dev: true
/kleur/4.1.5:
resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
engines: {node: '>=6'}
- dev: false
+ dev: true
/leaflet.markercluster/[email protected]:
resolution: {integrity: sha512-vPTw/Bndq7eQHjLBVlWpnGeLa3t+3zGiuM7fJwCkiMFq+nmRuG3RI3f7f4N4TDX7T4NpbAXpR2+NTRSEGfCSeA==}
@@ -1768,17 +1006,6 @@ packages:
engines: {node: '>=10'}
dev: true
- /locate-path/6.0.0:
- resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
- engines: {node: '>=10'}
- dependencies:
- p-locate: 5.0.0
- dev: true
-
- /lodash/4.17.21:
- resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
- dev: true
-
/magic-string/0.25.9:
resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
dependencies:
@@ -1790,14 +1017,13 @@ packages:
engines: {node: '>=12'}
dependencies:
'@jridgewell/sourcemap-codec': 1.4.14
- dev: false
+ dev: true
- /md5.js/1.3.5:
- resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==}
+ /magic-string/0.30.0:
+ resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==}
+ engines: {node: '>=12'}
dependencies:
- hash-base: 3.1.0
- inherits: 2.0.4
- safe-buffer: 5.2.1
+ '@jridgewell/sourcemap-codec': 1.4.14
dev: true
/merge2/1.4.1:
@@ -1813,33 +1039,17 @@ packages:
picomatch: 2.3.1
dev: true
- /miller-rabin/4.0.1:
- resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==}
- hasBin: true
- dependencies:
- bn.js: 4.12.0
- brorand: 1.1.0
- dev: true
-
/mime/3.0.0:
resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==}
engines: {node: '>=10.0.0'}
hasBin: true
- dev: false
+ dev: true
/min-indent/1.0.1:
resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
engines: {node: '>=4'}
dev: true
- /minimalistic-assert/1.0.1:
- resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==}
- dev: true
-
- /minimalistic-crypto-utils/1.0.1:
- resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==}
- dev: true
-
/minimatch/3.1.2:
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
dependencies:
@@ -1851,7 +1061,7 @@ packages:
engines: {node: '>=10'}
dependencies:
brace-expansion: 2.0.1
- dev: false
+ dev: true
/minimist/1.2.7:
resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==}
@@ -1867,73 +1077,27 @@ packages:
/mri/1.2.0:
resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
engines: {node: '>=4'}
- dev: false
+ dev: true
/mrmime/1.0.1:
resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==}
engines: {node: '>=10'}
- dev: false
+ dev: true
/ms/2.1.2:
resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
- dev: false
+ dev: true
/nanoid/3.3.4:
resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
-
- /noble-secp256k1/1.2.14:
- resolution: {integrity: sha512-GSCXyoZBUaaPwVWdYncMEmzlSUjF9J/YeEHpklYJCyg8wPuJP3NzDx0BkiwArzINkdX2HJHvUJhL6vVWPOQQcg==}
- deprecated: Switch to namespaced @noble/secp256k1 for security and feature updates
- dev: true
-
- /node-addon-api/2.0.2:
- resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==}
- dev: true
-
- /node-gyp-build/4.5.0:
- resolution: {integrity: sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==}
- hasBin: true
dev: true
/node-releases/2.0.8:
resolution: {integrity: sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==}
dev: true
- /node-stdlib-browser/1.2.0:
- resolution: {integrity: sha512-VSjFxUhRhkyed8AtLwSCkMrJRfQ3e2lGtG3sP6FEgaLKBBbxM/dLfjRe1+iLhjvyLFW3tBQ8+c0pcOtXGbAZJg==}
- engines: {node: '>=10'}
- dependencies:
- assert: 2.0.0
- browser-resolve: 2.0.0
- browserify-zlib: 0.2.0
- buffer: 5.7.1
- console-browserify: 1.2.0
- constants-browserify: 1.0.0
- create-require: 1.1.1
- crypto-browserify: 3.12.0
- domain-browser: 4.22.0
- events: 3.3.0
- https-browserify: 1.0.0
- isomorphic-timers-promises: 1.0.1
- os-browserify: 0.3.0
- path-browserify: 1.0.1
- pkg-dir: 5.0.0
- process: 0.11.10
- punycode: 1.4.1
- querystring-es3: 0.2.1
- readable-stream: 3.6.0
- stream-browserify: 3.0.0
- stream-http: 3.2.0
- string_decoder: 1.3.0
- timers-browserify: 2.0.12
- tty-browserify: 0.0.1
- url: 0.11.0
- util: 0.12.5
- vm-browserify: 1.1.2
- dev: true
-
/normalize-path/3.0.0:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
engines: {node: '>=0.10.0'}
@@ -1944,27 +1108,17 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
- /nostr-tools/1.7.4:
- resolution: {integrity: sha512-YowDJ+S3UW9KCYPDZfZXXMITrJSMjiCmFOK5HohyKkg+w6EipFUTkFRBPRA2BTLXO/qw8gukKXfL0B7Dv3jtcQ==}
+ /nostr-tools/1.7.5:
+ resolution: {integrity: sha512-FFaYOAn9lFyISClbBzPe2eQ2ZiKx8xFviwHmdgTAmuue+eLrtPEI3tCqPtP624HghX/X4VnaixoiMvDB8g2+tQ==}
dependencies:
'@noble/hashes': 1.0.0
'@noble/secp256k1': 1.7.1
'@scure/base': 1.1.1
'@scure/bip32': 1.1.5
- '@scure/bip39': 1.1.1
+ '@scure/bip39': 1.2.0
prettier: 2.8.4
dev: true
- /nostr/0.2.7:
- resolution: {integrity: sha512-Yq5tkiCTJtohs7H7Fx+Ki83bR8b3xapdwYi17HunhW5EQfZ9rI0cIXFyihj2ZRkv/0YYvVBiCp/KIaLYt5LyfQ==}
- dependencies:
- noble-secp256k1: 1.2.14
- ws: 8.11.0
- transitivePeerDependencies:
- - bufferutil
- - utf-8-validate
- dev: true
-
/object-hash/3.0.0:
resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
engines: {node: '>= 6'}
@@ -1974,63 +1128,10 @@ packages:
resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==}
dev: true
- /object-is/1.1.5:
- resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.1.4
- dev: true
-
- /object-keys/1.1.1:
- resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
- engines: {node: '>= 0.4'}
- dev: true
-
/once/1.4.0:
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
dependencies:
wrappy: 1.0.2
-
- /os-browserify/0.3.0:
- resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==}
- dev: true
-
- /p-limit/3.1.0:
- resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
- engines: {node: '>=10'}
- dependencies:
- yocto-queue: 0.1.0
- dev: true
-
- /p-locate/5.0.0:
- resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
- engines: {node: '>=10'}
- dependencies:
- p-limit: 3.1.0
- dev: true
-
- /pako/1.0.11:
- resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
- dev: true
-
- /parse-asn1/5.1.6:
- resolution: {integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==}
- dependencies:
- asn1.js: 5.4.1
- browserify-aes: 1.2.0
- evp_bytestokey: 1.0.3
- pbkdf2: 3.1.2
- safe-buffer: 5.2.1
- dev: true
-
- /path-browserify/1.0.1:
- resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
- dev: true
-
- /path-exists/4.0.0:
- resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
- engines: {node: '>=8'}
dev: true
/path-is-absolute/1.0.1:
@@ -2040,37 +1141,22 @@ packages:
/path-parse/1.0.7:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
-
- /pbkdf2/3.1.2:
- resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==}
- engines: {node: '>=0.12'}
- dependencies:
- create-hash: 1.2.0
- create-hmac: 1.1.7
- ripemd160: 2.0.2
- safe-buffer: 5.2.1
- sha.js: 2.4.11
dev: true
/picocolors/1.0.0:
resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
+ dev: true
/picomatch/2.3.1:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
engines: {node: '>=8.6'}
+ dev: true
/pify/2.3.0:
resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
engines: {node: '>=0.10.0'}
dev: true
- /pkg-dir/5.0.0:
- resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==}
- engines: {node: '>=10'}
- dependencies:
- find-up: 5.0.0
- dev: true
-
/postcss-import/[email protected]:
resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==}
engines: {node: '>=10.0.0'}
@@ -2139,6 +1225,16 @@ packages:
nanoid: 3.3.4
picocolors: 1.0.0
source-map-js: 1.0.2
+ dev: true
+
+ /postcss/8.4.21:
+ resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==}
+ engines: {node: ^10 || ^12 || >=14}
+ dependencies:
+ nanoid: 3.3.4
+ picocolors: 1.0.0
+ source-map-js: 1.0.2
+ dev: true
/prettier-plugin-svelte/2.9.0_ajxj753sv7dbwexjherrch25ta:
resolution: {integrity: sha512-3doBi5NO4IVgaNPtwewvrgPpqAcvNv0NwJNflr76PIGgi9nf1oguQV1Hpdm9TI2ALIQVn/9iIwLpBO5UcD2Jiw==}
@@ -2162,30 +1258,6 @@ packages:
hasBin: true
dev: true
- /process/0.11.10:
- resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
- engines: {node: '>= 0.6.0'}
- dev: true
-
- /public-encrypt/4.0.3:
- resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==}
- dependencies:
- bn.js: 4.12.0
- browserify-rsa: 4.1.0
- create-hash: 1.2.0
- parse-asn1: 5.1.6
- randombytes: 2.1.0
- safe-buffer: 5.2.1
- dev: true
-
- /punycode/1.3.2:
- resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==}
- dev: true
-
- /punycode/1.4.1:
- resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==}
- dev: true
-
/qr-code-styling/1.6.0-rc.1:
resolution: {integrity: sha512-ModRIiW6oUnsP18QzrRYZSc/CFKFKIdj7pUs57AEVH20ajlglRpN3HukjHk0UbNMTlKGuaYl7Gt6/O5Gg2NU2Q==}
dependencies:
@@ -2213,17 +1285,6 @@ packages:
side-channel: 1.0.4
dev: true
- /querystring-es3/0.2.1:
- resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==}
- engines: {node: '>=0.4.x'}
- dev: true
-
- /querystring/0.2.0:
- resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==}
- engines: {node: '>=0.4.x'}
- deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.
- dev: true
-
/queue-microtask/1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
dev: true
@@ -2233,34 +1294,12 @@ packages:
engines: {node: '>=10'}
dev: true
- /randombytes/2.1.0:
- resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
- dependencies:
- safe-buffer: 5.2.1
- dev: true
-
- /randomfill/1.0.4:
- resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==}
- dependencies:
- randombytes: 2.1.0
- safe-buffer: 5.2.1
- dev: true
-
/read-cache/1.0.0:
resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
dependencies:
pify: 2.3.0
dev: true
- /readable-stream/3.6.0:
- resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==}
- engines: {node: '>= 6'}
- dependencies:
- inherits: 2.0.4
- string_decoder: 1.3.0
- util-deprecate: 1.0.2
- dev: true
-
/readdirp/3.6.0:
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
engines: {node: '>=8.10.0'}
@@ -2275,6 +1314,7 @@ packages:
is-core-module: 2.11.0
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
+ dev: true
/reusify/1.0.4:
resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
@@ -2288,13 +1328,6 @@ packages:
glob: 7.2.3
dev: true
- /ripemd160/2.0.2:
- resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==}
- dependencies:
- hash-base: 3.1.0
- inherits: 2.0.4
- dev: true
-
/rollup/2.79.1:
resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==}
engines: {node: '>=10.0.0'}
@@ -2303,12 +1336,21 @@ packages:
fsevents: 2.3.2
dev: true
+ /rollup/3.20.2:
+ resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==}
+ engines: {node: '>=14.18.0', npm: '>=8.0.0'}
+ hasBin: true
+ optionalDependencies:
+ fsevents: 2.3.2
+ dev: true
+
/rollup/3.8.1:
resolution: {integrity: sha512-4yh9eMW7byOroYcN8DlF9P/2jCpu6txVIHjEqquQVSx7DI0RgyCCN3tjrcy4ra6yVtV336aLBB3v2AarYAxePQ==}
engines: {node: '>=14.18.0', npm: '>=8.0.0'}
hasBin: true
optionalDependencies:
fsevents: 2.3.2
+ dev: true
/run-parallel/1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
@@ -2321,14 +1363,6 @@ packages:
engines: {node: '>=6'}
dependencies:
mri: 1.2.0
- dev: false
-
- /safe-buffer/5.2.1:
- resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
- dev: true
-
- /safer-buffer/2.1.2:
- resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
dev: true
/sander/0.5.1:
@@ -2345,30 +1379,8 @@ packages:
engines: {node: ^14.13.1 || >=16.0.0}
dev: true
- /secp256k1/4.0.3:
- resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==}
- engines: {node: '>=10.0.0'}
- requiresBuild: true
- dependencies:
- elliptic: 6.5.4
- node-addon-api: 2.0.2
- node-gyp-build: 4.5.0
- dev: true
-
/set-cookie-parser/2.5.1:
resolution: {integrity: sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==}
- dev: false
-
- /setimmediate/1.0.5:
- resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==}
- dev: true
-
- /sha.js/2.4.11:
- resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==}
- hasBin: true
- dependencies:
- inherits: 2.0.4
- safe-buffer: 5.2.1
dev: true
/sha256-uint8array/0.10.3:
@@ -2390,7 +1402,7 @@ packages:
'@polka/url': 1.0.0-next.21
mrmime: 1.0.1
totalist: 3.0.0
- dev: false
+ dev: true
/sorcery/0.10.0:
resolution: {integrity: sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==}
@@ -2405,37 +1417,16 @@ packages:
/source-map-js/1.0.2:
resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
engines: {node: '>=0.10.0'}
+ dev: true
/sourcemap-codec/1.4.8:
resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
deprecated: Please use @jridgewell/sourcemap-codec instead
dev: true
- /stream-browserify/3.0.0:
- resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==}
- dependencies:
- inherits: 2.0.4
- readable-stream: 3.6.0
- dev: true
-
- /stream-http/3.2.0:
- resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==}
- dependencies:
- builtin-status-codes: 3.0.0
- inherits: 2.0.4
- readable-stream: 3.6.0
- xtend: 4.0.2
- dev: true
-
/streamsearch/1.1.0:
resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
engines: {node: '>=10.0.0'}
- dev: false
-
- /string_decoder/1.3.0:
- resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
- dependencies:
- safe-buffer: 5.2.1
dev: true
/strip-indent/3.0.0:
@@ -2448,6 +1439,7 @@ packages:
/supports-preserve-symlinks-flag/1.0.0:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
+ dev: true
/svelte-hmr/[email protected]:
resolution: {integrity: sha512-BiKB4RZ8YSwRKCNVdNxK/GfY+r4Kjgp9jCLEy0DuqAKfmQtpL38cQK3afdpjw4sqSs4PLi3jIPJIFp259NkZtA==}
@@ -2456,7 +1448,7 @@ packages:
svelte: '>=3.19.0'
dependencies:
svelte: 3.55.0
- dev: false
+ dev: true
/svelte-outclick/[email protected]:
resolution: {integrity: sha512-1XyaNhhDfH0C9GR4NreTc9OTgKcnQVoT7iVLvdbgZ/Dur/Bq94Pl5RBaJ/fu2qlEZk9ZIhODpuWiNNUjyhjVCg==}
@@ -2528,6 +1520,7 @@ packages:
/svelte/3.55.0:
resolution: {integrity: sha512-uGu2FVMlOuey4JoKHKrpZFkoYyj0VLjJdz47zX5+gVK5odxHM40RVhar9/iK2YFRVxvfg9FkhfVlR0sjeIrOiA==}
engines: {node: '>= 8'}
+ dev: true
/sveltekit-i18n/[email protected]:
resolution: {integrity: sha512-6eygICleGCSL7elY7A3trF8XUhV+mlW56ZSoD0UUKXlw+Y6u0MTTHDq48u1LyY73SfnlbPHXgTarhTjZ0BvUKA==}
@@ -2582,25 +1575,11 @@ packages:
- ts-node
dev: true
- /timers-browserify/2.0.12:
- resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==}
- engines: {node: '>=0.6.0'}
- dependencies:
- setimmediate: 1.0.5
- dev: true
-
/tiny-glob/0.2.9:
resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==}
dependencies:
globalyzer: 0.1.0
globrex: 0.1.2
- dev: false
-
- /tiny-secp256k1/2.2.1:
- resolution: {integrity: sha512-/U4xfVqnVxJXN4YVsru0E6t5wVncu2uunB8+RVR40fYUxkKYUPS10f+ePQZgFBoE/Jbf9H1NBveupF2VmB58Ng==}
- engines: {node: '>=14.0.0'}
- dependencies:
- uint8array-tools: 0.0.7
dev: true
/to-regex-range/5.0.1:
@@ -2613,27 +1592,14 @@ packages:
/totalist/3.0.0:
resolution: {integrity: sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==}
engines: {node: '>=6'}
- dev: false
-
- /tty-browserify/0.0.1:
- resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==}
- dev: true
-
- /typeforce/1.18.0:
- resolution: {integrity: sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==}
- dev: true
-
- /uint8array-tools/0.0.7:
- resolution: {integrity: sha512-vrrNZJiusLWoFWBqz5Y5KMCgP9W9hnjZHzZiZRT8oNAkq3d5Z5Oe76jAvVVSRh4U8GGR90N2X1dWtrhvx6L8UQ==}
- engines: {node: '>=14.0.0'}
dev: true
- /undici/5.16.0:
- resolution: {integrity: sha512-KWBOXNv6VX+oJQhchXieUznEmnJMqgXMbs0xxH2t8q/FUAWSJvOSr/rMaZKnX5RIVq7JDn0JbP4BOnKG2SGXLQ==}
+ /undici/5.21.0:
+ resolution: {integrity: sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==}
engines: {node: '>=12.18'}
dependencies:
busboy: 1.6.0
- dev: false
+ dev: true
/update-browserslist-db/[email protected]:
resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==}
@@ -2646,74 +1612,17 @@ packages:
picocolors: 1.0.0
dev: true
- /url/0.11.0:
- resolution: {integrity: sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==}
- dependencies:
- punycode: 1.3.2
- querystring: 0.2.0
- dev: true
-
/util-deprecate/1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
dev: true
- /util/0.12.5:
- resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==}
- dependencies:
- inherits: 2.0.4
- is-arguments: 1.1.1
- is-generator-function: 1.0.10
- is-typed-array: 1.1.10
- which-typed-array: 1.1.9
- dev: true
-
/uuid/9.0.0:
resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==}
hasBin: true
dev: true
- /varuint-bitcoin/1.1.2:
- resolution: {integrity: sha512-4EVb+w4rx+YfVM32HQX42AbbT7/1f5zwAYhIujKXKk8NQK+JfRVl3pqT3hjNn/L+RstigmGGKVwHA/P0wgITZw==}
- dependencies:
- safe-buffer: 5.2.1
- dev: true
-
- /vite-plugin-node-polyfills/[email protected][email protected]:
- resolution: {integrity: sha512-zaTCjL64pJY6RDeP4ZZ1rtFKFTy44RYFtFIISKk3LclIeD/yR9tqpscj5x+jXhD7Bh1HYk2a7uu1aCFEYiUlIA==}
- peerDependencies:
- vite: ^2.0.0 || ^3.0.0 || 4
- dependencies:
- '@rollup/plugin-inject': [email protected]
- node-stdlib-browser: 1.2.0
- vite: 4.0.4
- transitivePeerDependencies:
- - rollup
- dev: true
-
- /vite-plugin-top-level-await/[email protected]:
- resolution: {integrity: sha512-JBuY9X5KCxZyzwQUOIBpgX0Jbe2BECxwElWPeyrdRC5xaWzDibTG65QBW25COmwqHBeVlV04u8GTlJkuOWhfgw==}
- peerDependencies:
- vite: '>=2.8 || 4'
- dependencies:
- '@swc/core': 1.3.24
- vite: 4.0.4
- dev: true
-
- /vite-plugin-wasm/3.1.0:
- resolution: {integrity: sha512-RzqOR+zMqqNZOhplq7XM9bkFNfW/Cs1VVj7p+aAdOznCBGwxYLqqzLGxuRwTV31HOGtDGjA8nvgcZG3GwmeVZQ==}
- dependencies:
- vite: 3.2.5
- transitivePeerDependencies:
- - '@types/node'
- - less
- - sass
- - stylus
- - sugarss
- - terser
- dev: true
-
- /vite/3.2.5:
- resolution: {integrity: sha512-4mVEpXpSOgrssFZAOmGIr85wPHKvaDAcXqxVxVRZhljkJOMZi1ibLibzjLHzJvcok8BMguLc7g1W6W/GqZbLdQ==}
+ /vite/4.2.1:
+ resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==}
engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true
peerDependencies:
@@ -2737,47 +1646,15 @@ packages:
terser:
optional: true
dependencies:
- esbuild: 0.15.18
- postcss: 8.4.20
+ esbuild: 0.17.13
+ postcss: 8.4.21
resolve: 1.22.1
- rollup: 2.79.1
+ rollup: 3.20.2
optionalDependencies:
fsevents: 2.3.2
dev: true
- /vite/4.0.4:
- resolution: {integrity: sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==}
- engines: {node: ^14.18.0 || >=16.0.0}
- hasBin: true
- peerDependencies:
- '@types/node': '>= 14'
- less: '*'
- sass: '*'
- stylus: '*'
- sugarss: '*'
- terser: ^5.4.0
- peerDependenciesMeta:
- '@types/node':
- optional: true
- less:
- optional: true
- sass:
- optional: true
- stylus:
- optional: true
- sugarss:
- optional: true
- terser:
- optional: true
- dependencies:
- esbuild: 0.16.10
- postcss: 8.4.20
- resolve: 1.22.1
- rollup: 3.8.1
- optionalDependencies:
- fsevents: 2.3.2
-
resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==}
peerDependencies:
vite: ^3.0.0 || ^4.0.0 || 4
@@ -2785,45 +1662,11 @@ packages:
vite:
optional: true
dependencies:
- vite: 4.0.4
- dev: false
-
- /vm-browserify/1.1.2:
- resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==}
- dev: true
-
- /which-typed-array/1.1.9:
- resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==}
- engines: {node: '>= 0.4'}
- dependencies:
- available-typed-arrays: 1.0.5
- call-bind: 1.0.2
- for-each: 0.3.3
- gopd: 1.0.1
- has-tostringtag: 1.0.0
- is-typed-array: 1.1.10
- dev: true
-
- /wif/2.0.6:
- resolution: {integrity: sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ==}
- dependencies:
- bs58check: 2.1.2
+ vite: 4.2.1
dev: true
/wrappy/1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
-
- /ws/8.11.0:
- resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==}
- engines: {node: '>=10.0.0'}
- peerDependencies:
- bufferutil: ^4.0.1
- utf-8-validate: ^5.0.2
- peerDependenciesMeta:
- bufferutil:
- optional: true
- utf-8-validate:
- optional: true
dev: true
/xtend/4.0.2:
@@ -2835,8 +1678,3 @@ packages:
resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
engines: {node: '>= 6'}
dev: true
-
- /yocto-queue/0.1.0:
- resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
- engines: {node: '>=10'}
- dev: true
diff --git a/src/app.html b/src/app.html
index 4a03a220..c0b7b4c1 100644
--- a/src/app.html
+++ b/src/app.html
@@ -3,7 +3,7 @@
<head>
<meta charset="utf-8" />
<link rel="icon" href="%sveltekit.assets%/favicon.svg" />
- <meta name="viewport" content="width=device-width, initial-scale=1" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<meta name="description" content="An easy bitcoin web wallet" />
<meta name="keywords" content="open source bitcoin lightning web wallet" />
<link rel="manifest" href="/manifest.webmanifest" />
diff --git a/src/components/Balance.svelte b/src/components/Balance.svelte
index cc923b7d..fddaae3e 100644
--- a/src/components/Balance.svelte
+++ b/src/components/Balance.svelte
@@ -1,21 +1,34 @@
<script>
+ import { Pin } from '$comp';
import { f, s, sat, sats } from '$lib/utils';
- import { animatedRate } from '$lib/store';
+ import { animatedRate, pin } from '$lib/store';
import { t } from '$lib/translations';
+ let show;
export let user;
</script>
+{#if show && user.haspin && $pin?.length !== 6}
+ <Pin />
+{/if}
+
<div class="space-y-2">
- <div class="text-5xl font-bold tabular-nums">
- {#if isNaN($animatedRate)}
- <div class="text-gray-200">&mdash;</div>
- {:else}
- {f((user.balance * $animatedRate) / sats, user.currency)}
- {/if}
- </div>
+ {#if user.haspin && !$pin}
+ <button
+ class="text-sm md:text-lg rounded-full border py-2 px-4 hover:opacity-80 min-w-[72px] bg-black text-white"
+ on:click={() => (show = true)}>Show Balance</button
+ >
+ {:else}
+ <div class="text-5xl font-bold tabular-nums">
+ {#if isNaN($animatedRate)}
+ <div class="text-gray-200">&mdash;</div>
+ {:else}
+ {f((user.balance * $animatedRate) / sats, user.currency)}
+ {/if}
+ </div>
- <div class="text-secondary text-2xl">
- ⚡️{s(user.balance)}
- </div>
+ <div class="text-secondary text-2xl">
+ ⚡️{s(user.balance)}
+ </div>
+ {/if}
</div>
diff --git a/src/components/Lnurlp.svelte b/src/components/Lnurlp.svelte
index ab0c50ce..9918a3f4 100644
--- a/src/components/Lnurlp.svelte
+++ b/src/components/Lnurlp.svelte
@@ -6,7 +6,9 @@
export let data, form;
let { currency } = data.user;
- let { minSendable, maxSendable, callback, metadata } = data;
+ let { minSendable, maxSendable, callback, metadata, rates } = data;
+
+ $: rate = rates[currency];
let amount = Math.round(minSendable / 1000),
loading;
@@ -33,7 +35,7 @@
</div>
{/if}
- <Numpad bind:amount {currency} />
+ <Numpad bind:amount bind:rate {currency} />
<form action="?/pay" method="POST" use:enhance on:submit={submit}>
<input name="amount" value={amount} type="hidden" />
diff --git a/src/components/Lnurlw.svelte b/src/components/Lnurlw.svelte
index f2855b53..f780d755 100644
--- a/src/components/Lnurlw.svelte
+++ b/src/components/Lnurlw.svelte
@@ -7,7 +7,8 @@
export let data, form;
let { currency, username } = data.user;
- let { defaultDescription, minWithdrawable, maxWithdrawable, k1, callback } = data;
+ let { defaultDescription, minWithdrawable, maxWithdrawable, k1, callback, rates } = data;
+ $: rate = rates[currency];
let amount = Math.round(maxWithdrawable / 1000),
loading;
@@ -28,7 +29,7 @@
</div>
{/if}
- <Numpad bind:amount {currency} />
+ <Numpad bind:amount {currency} bind:rate />
<form action="?/withdraw" method="POST" use:enhance on:submit={submit}>
<input name="amount" value={amount} type="hidden" />
diff --git a/src/components/Numpad.svelte b/src/components/Numpad.svelte
index 77a4f38b..82512678 100644
--- a/src/components/Numpad.svelte
+++ b/src/components/Numpad.svelte
@@ -1,23 +1,24 @@
<script>
import { Left, Icon } from '$comp';
- import { selectedRate } from '$lib/store';
import { f, s, post, warning, sat, sats } from '$lib/utils';
import { t } from '$lib/translations';
export let amount,
currency,
fiat = !amount,
+ rate,
submit = undefined;
export let amountFiat = 0;
+
let arrow = '<';
$: update(amount, amountFiat);
let update = (a, f) => {
if (fiat) {
- amount = Math.round(f / ($selectedRate / sats));
+ amount = Math.round(f / (rate / sats));
} else {
- amountFiat = ((a * $selectedRate) / sats).toFixed(2);
+ amountFiat = ((a * rate) / sats).toFixed(2);
}
};
@@ -60,7 +61,7 @@
amount = 0;
}
}
- } else if (value !== '.' && value !== '<' && parseInt(amountFiat + value) > $selectedRate) {
+ } else if (value !== '.' && value !== '<' && parseInt(amountFiat + value) > rate) {
warning($t('user.receive.lessThan1BTCWarning'));
} else if (amountFiat !== 0 && amountFiat.match(/\.../)) {
return;
@@ -184,12 +185,10 @@
type="button"
on:click={() => {
if (fiat) {
- amount = parseInt((amountFiat / ($selectedRate / sats)).toFixed(0));
+ amount = parseInt((amountFiat / (rate / sats)).toFixed(0));
} else {
amountFiat =
- (amount * ($selectedRate / sats)).toFixed(2) > 0.0
- ? (amount * ($selectedRate / sats)).toFixed(2)
- : 0;
+ (amount * (rate / sats)).toFixed(2) > 0.0 ? (amount * (rate / sats)).toFixed(2) : 0;
}
fiat = !fiat;
}}><Icon icon="swap" style="inline hover:opacity-80" /></button
diff --git a/src/components/Pin.svelte b/src/components/Pin.svelte
index 1d7ed65b..0cff904f 100644
--- a/src/components/Pin.svelte
+++ b/src/components/Pin.svelte
@@ -1,31 +1,59 @@
<script>
import { t } from '$lib/translations';
- import { focus } from '$lib/utils';
+ import { post, success, fail, focus } from '$lib/utils';
import { Pinpad } from '$comp';
+ import { pin } from '$lib/store';
+ import { onMount } from 'svelte';
export let value = '';
export let title = $t('user.settings.verifyPIN');
- export let cancel = () => (pin = '');
+ export let cancel = () => (p = '');
+ export let persist = true;
+ export let notify = true;
- let pin = '';
+ let p = '';
$: update(value);
- let update = (v) => (pin = v);
+ let update = (value) => (p = value);
- $: pin.toString().length > 5 && (value = pin.toString());
+ $: p.toString().length > 5 && (value = p.toString());
+
+ let loaded;
+ onMount(() => setTimeout(() => (loaded = true), 500));
+
+ $: loaded && checkPin(p);
+ let checkPin = async (p) => {
+ if (p?.length !== 6) return;
+ let result;
+ try {
+ result = await post('/pin', { pin: p });
+ } catch (e) {
+ console.log('Pin check failed', e);
+ }
+
+ if (result) {
+ if (notify) success('Pin confirmed');
+ if (persist) $pin = p;
+ } else {
+ fail('Invalid pin');
+ value = '';
+ }
+ };
</script>
-<div class="fixed inset-0 bg-gray-600 bg-opacity-50 overflow-y-auto h-full w-full z-50">
- <div class="relative top-40 mx-auto p-5 border w-96 shadow-lg rounded-md bg-white space-y-5">
- <h1 class="text-center text-2xl font-semibold">{title}</h1>
- <Pinpad bind:v={pin} {cancel} />
- <div class="w-full flex">
- <button
- class="border-2 border-black rounded-xl font-semibold mx-auto py-3 w-40 hover:opacity-80 mx-auto"
- on:click|preventDefault={cancel}
- >
- <div class="my-auto">Cancel</div>
- </button>
+{#if loaded}
+ <div class="fixed inset-0 bg-gray-600 bg-opacity-50 overflow-y-auto h-full w-full z-50">
+ <div class="relative top-40 mx-auto p-5 border w-96 shadow-lg rounded-md bg-white space-y-5">
+ <h1 class="text-center text-2xl font-semibold">{title}</h1>
+ <Pinpad bind:v={p} {cancel} />
+ <div class="w-full flex">
+ <button
+ class="border-2 border-black rounded-xl font-semibold mx-auto py-3 w-40 hover:opacity-80 mx-auto"
+ on:click|preventDefault={cancel}
+ >
+ <div class="my-auto">Cancel</div>
+ </button>
+ </div>
</div>
</div>
-</div>
+{/if}
diff --git a/src/components/Pinpad.svelte b/src/components/Pinpad.svelte
index bf3778f7..f55dc40d 100644
--- a/src/components/Pinpad.svelte
+++ b/src/components/Pinpad.svelte
@@ -1,7 +1,6 @@
<script>
import { Left, Icon } from '$comp';
- import { pin, selectedRate } from '$lib/store';
- import { f, s, focus, post, warning, sat, sats } from '$lib/utils';
+ import { focus, post, warning } from '$lib/utils';
import { t } from '$lib/translations';
export let v;
diff --git a/src/components/RegisterOrLogin.svelte b/src/components/RegisterOrLogin.svelte
index 6c099178..7aedeb9b 100644
--- a/src/components/RegisterOrLogin.svelte
+++ b/src/components/RegisterOrLogin.svelte
@@ -22,11 +22,7 @@
$: need2fa = form?.message === '2fa';
let cancel = () => (need2fa = false);
- $: if (form?.message === '2fa' && form.token === token) {
- token = '';
- console.log('TOKEN', token);
- fail('Invalid token, try again');
- }
+ $: if (form?.message === '2fa' && form.token === token) token = '';
let username, email, btn;
@@ -71,7 +67,7 @@
</script>
{#if need2fa}
- <Pin bind:value={token} title="Enter 2FA Code" {cancel} />
+ <Pin bind:value={token} title="Enter 2FA Code" {cancel} notify={false} />
{/if}
<div class="pt-10">
diff --git a/src/lib/nostr.js b/src/lib/nostr.js
index d72f48ef..1924643e 100644
--- a/src/lib/nostr.js
+++ b/src/lib/nostr.js
@@ -1,60 +1,39 @@
import { get } from 'svelte/store';
-import * as ecc from 'tiny-secp256k1';
-import { generateMnemonic, entropyToMnemonic, mnemonicToEntropy, mnemonicToSeedSync } from 'bip39';
import { Buffer } from 'buffer';
-import { bech32m } from 'bech32';
-import { bip32, fail, wait, post, stretch } from '$lib/utils';
-import { calculateId, signId } from 'nostr';
+import { fail, wait, post, stretch } from '$lib/utils';
import { decrypted, password as pw, passwordPrompt, pin, loginRedirect } from '$lib/store';
import { goto, invalidate } from '$app/navigation';
+import { getPublicKey, signEvent, getEventHash, nip04, nip06 } from 'nostr-tools';
+import { mnemonicToEntropy, entropyToMnemonic } from '@scure/bip39';
+import { wordlist } from '@scure/bip39/wordlists/english.js';
+import { bech32m } from '@scure/base';
-const { encode, decode, fromWords, toWords } = bech32m;
+const { generateSeedWords, privateKeyFromSeedWords } = nip06;
+const { encode, decode, toWords, fromWords } = bech32m;
export let generate = async (user) => {
- let password = get(pw);
- let mnemonic, key, seed, entropy, cipher, salt, child;
-
if (!get(pin)?.length === 6) return;
+ let password = get(pw);
- mnemonic = generateMnemonic();
- seed = mnemonicToSeedSync(mnemonic);
- entropy = mnemonicToEntropy(mnemonic);
- key = bip32.fromSeed(seed);
- child = key.derivePath("m/44'/1237'/0'/0/0");
- salt = crypto.getRandomValues(new Uint8Array(16));
+ let salt = crypto.getRandomValues(new Uint8Array(16));
+ let mnemonic = generateSeedWords();
+ let sk = privateKeyFromSeedWords(mnemonic);
let bytes = new Uint8Array(
await crypto.subtle.encrypt(
{ name: 'AES-GCM', iv: new Uint8Array(16) },
await stretch(password, salt),
- Uint8Array.from(Buffer.from(entropy, 'hex'))
+ Uint8Array.from(Buffer.from(mnemonicToEntropy(mnemonic, wordlist), 'hex'))
)
);
- user.pubkey = Buffer.from(ecc.xOnlyPointFromPoint(child.publicKey)).toString('hex');
+ user.pubkey = getPublicKey(sk);
user.cipher = encode('en', toWords(bytes), 180);
user.salt = Buffer.from(salt).toString('hex');
};
export let encrypt = async ({ message, recipient, user }) => {
- let sharedPoint = Buffer.from(
- ecc.pointMultiply(
- Uint8Array.from(Buffer.from('02' + recipient, 'hex')),
- Buffer.from(await getPrivateKey(user), 'hex')
- )
- );
-
- let iv = crypto.getRandomValues(new Uint8Array(16));
- let cipher = await crypto.subtle.encrypt(
- { name: 'AES-CBC', iv },
- await crypto.subtle.importKey('raw', sharedPoint.slice(1), 'AES-CBC', true, [
- 'encrypt',
- 'decrypt'
- ]),
- new TextEncoder().encode(message)
- );
-
- return Buffer.from(cipher).toString('base64') + '?iv=' + Buffer.from(iv).toString('base64');
+ return nip04.encrypt(await getPrivateKey(user), recipient, message);
};
export let decrypt = async ({ event, user }) => {
@@ -63,22 +42,8 @@ export let decrypt = async ({ event, user }) => {
let { content, pubkey, id } = event;
if (cache[id]) return cache[id];
if (pubkey === user.pubkey) pubkey = event.tags[0][1];
- pubkey = Uint8Array.from(Buffer.from('02' + pubkey, 'hex'));
-
- let sharedPoint = Buffer.from(
- ecc.pointMultiply(pubkey, Buffer.from(await getPrivateKey(user), 'hex'))
- );
- let [cipher, iv] = content.split('?iv=');
- cipher = Uint8Array.from(Buffer.from(cipher, 'base64'));
- iv = Uint8Array.from(Buffer.from(iv, 'base64'));
-
- let key = await crypto.subtle.importKey('raw', sharedPoint.slice(1), 'AES-CBC', true, [
- 'encrypt',
- 'decrypt'
- ]);
-
- let message = await crypto.subtle.decrypt({ name: 'AES-CBC', iv }, key, cipher);
+ let message = await nip04.decrypt(await getPrivateKey(user), pubkey, content);
cache[id] = Buffer.from(message).toString('utf8');
decrypted.set(cache);
@@ -111,27 +76,22 @@ let getPrivateKey = async (user) => {
password = get(pw);
let mnemonic, key, seed, entropy, child, privkey;
- entropy = Buffer.from(
+
+ entropy = new Uint8Array(
await crypto.subtle.decrypt(
{ name: 'AES-GCM', iv: new Uint8Array(16) },
await stretch(password, Buffer.from(salt, 'hex')),
Uint8Array.from(fromWords(decode(cipher, 180).words))
- ),
- 'hex'
- ).toString('hex');
-
- mnemonic = entropyToMnemonic(entropy);
- seed = mnemonicToSeedSync(mnemonic);
- key = bip32.fromSeed(seed);
- child = key.derivePath("m/44'/1237'/0'/0/0");
+ )
+ );
- return child.privateKey;
+ mnemonic = entropyToMnemonic(entropy, wordlist);
+ return privateKeyFromSeedWords(mnemonic);
};
export let sign = async ({ event, user }) => {
- let privkey = await getPrivateKey(user);
- event.id = await calculateId(event);
- event.sig = await signId(privkey, event.id);
+ event.id = getEventHash(event);
+ event.sig = signEvent(event, await getPrivateKey(user));
};
export let send = (event) => {
diff --git a/src/lib/samples.js b/src/lib/samples.js
index 93b9aa24..14d9e4e0 100644
--- a/src/lib/samples.js
+++ b/src/lib/samples.js
@@ -7,6 +7,13 @@ export default {
"username": "adam",
"password": "hunter2"
}'`,
+ payments: `curl "https://coinos.io/api/payments"
+ -H "application/json"
+ -H "Authorization: Bearer $token"
+}'`,
+ rates: `curl "https://coinos.io/api/rates"
+ -H "application/json"
+}'`,
invoice: `curl "https://coinos.io/api/invoice"
-H "application/json"
-H "Authorization: Bearer $token"
@@ -19,5 +26,19 @@ export default {
},
}'`,
fetchInvoice: `curl "https://coinos.io/api/invoice/bc1qmhfk9stzffhd9umzmld92vff7zg3mdlh7rvvaj"
- -H "application/json"'`
+ -H "application/json"'`,
+ invoiceResponse: `{
+ "amount":3141
+ "tip":0
+ "type":"bitcoin"
+ "prompt":false
+ "rate":31836.9702667
+ "hash":"bc1qmhfk9stzffhd9umzmld92vff7zg3mdlh7rvvaj"
+ "text":"bitcoin:bc1qmhfk9stzffhd9umzmld92vff7zg3mdlh7rvvaj?amount=0.00003141"
+ "currency":"CAD"
+ "uid":"a9770421-3f65-11ed-9f57-0242ac2a0004"
+ "received":0
+ "created":1677537428134
+}`,
+ socketAuth: `echo '{"type":"login","data":{"username":"user","password":"password"}}' | websocat -n https://coinos.io/ws`
};
diff --git a/src/lib/store.js b/src/lib/store.js
index 6853386c..ce984b17 100644
--- a/src/lib/store.js
+++ b/src/lib/store.js
@@ -32,7 +32,7 @@ const persistLocal = (key, defaultValue) => {
return s;
};
-export const animatedRate = writable(0);
+export const animatedRate = persistLocal('rate', 0);
export const avatar = writable();
export const banner = writable();
export const colorTheme = writable('from-primary to-gradient');
@@ -50,6 +50,5 @@ export const pin = persistSession('pin', undefined);
export const rate = writable();
export const request = writable();
export const requestRedirect = writable();
-export const selectedRate = writable();
export const token = persistSession('token');
export const user = writable();
diff --git a/src/lib/translations/index.js b/src/lib/translations/index.js
index dfd7f47f..ea92192b 100644
--- a/src/lib/translations/index.js
+++ b/src/lib/translations/index.js
@@ -28,6 +28,11 @@ const config = {
loader: async () => (await import('../../locales/en.json')).default
},
{
+ locale: 'fa',
+ key: '',
+ loader: async () => (await import('../../locales/fa.json')).default
+ },
+ {
locale: 'fr',
key: '',
loader: async () => (await import('../../locales/fr.json')).default
diff --git a/src/lib/translations/lang.json b/src/lib/translations/lang.json
index c607ebd0..cbf1ce4a 100644
--- a/src/lib/translations/lang.json
+++ b/src/lib/translations/lang.json
@@ -4,5 +4,6 @@
"es": "Español",
"de": "Deutsch",
"pt": "Português",
- "zh": "中国人"
+ "zh": "中国人",
+ "fa": "فارسی "
}
diff --git a/src/lib/utils.js b/src/lib/utils.js
index 7b10c638..5eef79fc 100644
--- a/src/lib/utils.js
+++ b/src/lib/utils.js
@@ -1,5 +1,3 @@
-import * as ecc from 'tiny-secp256k1';
-import { BIP32Factory } from 'bip32';
import { browser } from '$app/environment';
import { toast } from '@zerodevx/svelte-toast';
import { goto } from '$app/navigation';
@@ -12,11 +10,11 @@ export function scroll(section) {
setTimeout(() => section.scrollIntoView({ behavior: 'smooth' }), 500);
}
-const base = browser ? '' : PUBLIC_COINOS_URL;
+let base = browser ? '' : PUBLIC_COINOS_URL;
-export const punk = (k) => Math.floor((parseInt(k.slice(-2), 16) / 256) * 64) + 1 + '.webp';
+export let punk = (k) => Math.floor((parseInt(k.slice(-2), 16) / 256) * 64) + 1 + '.webp';
-export const g = (url, fetch, headers) =>
+export let g = (url, fetch, headers) =>
fetch(base + url, { headers })
.then((r) => r.text())
.then((body) => {
@@ -27,7 +25,7 @@ export const g = (url, fetch, headers) =>
}
});
-export const get = (url, headers = {}) =>
+export let get = (url, headers = {}) =>
fetch(base + url, { headers })
.then(async (r) => {
if (r.ok) return r.text();
@@ -41,7 +39,7 @@ export const get = (url, headers = {}) =>
}
});
-export const post = (url, body, headers) => {
+export let post = (url, body, headers) => {
headers = { ...headers, 'content-type': 'application/json', accept: 'application/json' };
return fetch(base + url, { method: 'POST', body: JSON.stringify(body), headers })
.then(async (r) => {
@@ -71,7 +69,7 @@ export const post = (url, body, headers) => {
});
};
-export const copy = (text) => {
+export let copy = (text) => {
navigator.clipboard.writeText(text);
success('Copied!');
};
@@ -87,7 +85,7 @@ export function reverseFormat(val, locale) {
export let protectedRoutes = [/customers/, /settings/, /payments/];
-export const success = (m) => {
+export let success = (m) => {
toast.pop();
toast.push(m, {
theme: {
@@ -96,7 +94,7 @@ export const success = (m) => {
});
};
-export const warning = (m) => {
+export let warning = (m) => {
toast.pop();
toast.push(m, {
theme: {
@@ -104,7 +102,7 @@ export const warning = (m) => {
}
});
};
-export const fail = (m) => {
+export let fail = (m) => {
toast.pop();
toast.push(m, {
theme: {
@@ -112,7 +110,7 @@ export const fail = (m) => {
}
});
};
-export const info = (m) => {
+export let info = (m) => {
toast.pop();
toast.push(m, {
theme: {
@@ -121,7 +119,7 @@ export const info = (m) => {
});
};
-export const login = async (user, cookies) => {
+export let login = async (user, cookies) => {
let maxAge = 30 * 24 * 60 * 60;
let res = await fetch(base + '/login', {
@@ -145,17 +143,17 @@ export const login = async (user, cookies) => {
cookies.set('token', token, opts);
};
-export const auth = (cookies) => ({ authorization: `Bearer ${cookies.get('token')}` });
+export let auth = (cookies) => ({ authorization: `Bearer ${cookies.get('token')}` });
-export const fiat = (amount, rate) => (amount * rate) / sats;
-export const fd = async (req) => {
+export let fiat = (amount, rate) => (amount * rate) / sats;
+export let fd = async (req) => {
let obj = Object.fromEntries(await req.formData());
for (let k in obj)
(obj[k] === 'undefined' && (obj[k] = undefined)) || (obj[k] === 'false' && (obj[k] = false));
return obj;
};
-export const f = (s, currency) =>
+export let f = (s, currency) =>
new Intl.NumberFormat('en-US', {
style: 'currency',
currency
@@ -163,8 +161,8 @@ export const f = (s, currency) =>
.format(s)
.replace('CA', '');
-export const s = (s) => new Intl.NumberFormat('en-US', { maximumFractionDigits: 0 }).format(s);
-export const sat = (s) => {
+export let s = (s) => new Intl.NumberFormat('en-US', { maximumFractionDigits: 0 }).format(s);
+export let sat = (s) => {
s = Math.abs(s);
let p = Math.floor(Math.log(s) / Math.LN10 + 0.000000001);
let d = Math.floor((p + 1) / 3);
@@ -179,20 +177,20 @@ export const sat = (s) => {
);
};
-export const sats = 100000000;
+export let sats = 100000000;
-export const back = () => browser && history.go(-1);
-export const focus = (el) => browser && screen.width > 1280 && setTimeout(() => el.focus(), 1);
+export let back = () => browser && (history.length ? history.go(-1) : goto('/'));
+export let focus = (el) => browser && screen.width > 1280 && setTimeout(() => el.focus(), 1);
-export const sleep = (n) => new Promise((r) => setTimeout(r, n));
-export const wait = async (f, n = 100, s = 300) => {
+export let sleep = (n) => new Promise((r) => setTimeout(r, n));
+export let wait = async (f, n = 100, s = 300) => {
let i = 0;
while (!(await f()) && i < s) (await sleep(n)) && i++;
if (i >= s) throw new Error('timeout');
return f();
};
-export const stretch = async (password, salt) =>
+export let stretch = async (password, salt) =>
crypto.subtle.deriveKey(
{
name: 'PBKDF2',
@@ -212,8 +210,6 @@ export const stretch = async (password, salt) =>
['encrypt', 'decrypt']
);
-export const bip32 = await BIP32Factory(ecc);
-
function get_bigrams(string) {
var s = string.toLowerCase();
var v = s.split('');
@@ -240,10 +236,12 @@ export function ss(str1, str2) {
return 0.0;
}
-export const types = {
+export let types = {
bitcoin: 'bitcoin',
lightning: 'lightning',
internal: 'internal',
pot: 'pot',
classic: 'classic'
};
+
+export let ease = (t) => (t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t);
diff --git a/src/locales/fa.json b/src/locales/fa.json
new file mode 100644
index 00000000..28f7db2b
--- /dev/null
+++ b/src/locales/fa.json
@@ -0,0 +1,283 @@
+{
+ "404": {
+ "404": "404",
+ "pageNotFound": "Page not found."
+ },
+ "about": {
+ "header": "About",
+ "p1": "Coinos is an open source bitcoin payment app. Development started in Vancouver in September 2012 as a way to provide local merchants with a convenient way to accept bitcoin payments.",
+ "p2": "You can download the source code to run an instance and connect it to your own bitcoin and lightning nodes. We'll help you get started being a benevolent custodian and payments provider for your community.",
+ "p3": "Account transfers amongst users on our server are done off-chain so they're completely free, instant, and unlimited.",
+ "team": {
+ "header": "The Team",
+ "adam": {
+ "name": "Adam Soltys",
+ "position": "Chief Technical Officer",
+ "bio": "Adam is a web developer and bitcoin enthusiast who believes sound money is key to increasing global prosperity. He lives in North Vancouver with his wife Chelsea and two children."
+ },
+ "cole": {
+ "name": "Cole",
+ "position": "Certified Bitcoin Professional",
+ "bio": "Cole is a driven individual with a passion for freedom. He came across bitcoin in 2016 and studied it in depth. Now he wants to introduce the lightning network to as many users as possible."
+ }
+ },
+ "locations": {
+ "header": "Locations",
+ "description": "Here are some businesses that are accepting bitcoin with Coinos. We hope that yours will be next!"
+ }
+ },
+ "error": {
+ "header": "Error",
+ "message": "Please try again or contact support.",
+ "signIn": "Please sign in to continue."
+ },
+ "faq": {
+ "header": "FAQ",
+ "cost": {
+ "question": "What does it cost?",
+ "answer": "It's free to register an account and receive payments. We charge a 0.1% conversion fee if you withdraw regular bitcoin to lightning or vice versa."
+ },
+ "compatibility": {
+ "question": "Do I need any special device or software?",
+ "answer": "No. Coinos is web based, so as long as you have an internet connection and a web browser, it works anywhere. Retail merchants might use it on a phone or a tablet."
+ },
+ "safety": {
+ "question": "When do my funds settle?",
+ "answer": "Lightning payments are settled instantly. You can withdraw your balance to another wallet or exchange immediately once funds are received."
+ }
+ },
+ "footer": {
+ "company": "Company",
+ "followUs": "Follow Us",
+ "github": "GitHub",
+ "linktree": "Linktree",
+ "jobs": "Jobs",
+ "support": "Support",
+ "telegram": "Telegram",
+ "twitter": "Twitter",
+ "documentation": "Documentation"
+ },
+ "howItWorks": {
+ "header": "How it works",
+ "step1": {
+ "header": "1. Create your account",
+ "description": "A username and password is all you need to get started."
+ },
+ "step2": {
+ "header": "2. Ask for payments",
+ "description": "The same as you normally would, but with bitcoin."
+ },
+ "step3": {
+ "header": "3. That's all!",
+ "description": "Spend your coin immediately or save it and watch it grow, the choice is yours."
+ }
+ },
+ "invoice": {
+ "addTip": "Add a tip",
+ "addTipq": "Add a tip?",
+ "done": "Done",
+ "paymentSuccessful": "Payment received!",
+ "invoice": "Invoice",
+ "total": "Total",
+ "tip": "Tip"
+ },
+ "jobs": {
+ "header": "Jobs",
+ "subheader": "Current Openings",
+ "pitch1": "Coinos is actively looking for developers to join our growing team (full-time or part-time, remote working OK).",
+ "pitch2": "Excited about working on open source bitcoin? Then take a look at our repositories on",
+ "github": "GitHub",
+ "pitch3": "If you think you can make an impact, we'd love to hear from you. Send us your resume to"
+ },
+ "landing": {
+ "header_before_icon": "The",
+ "header_with_icon": "easiest",
+ "header_after_icon": "way to get started with bitcoin.",
+ "subheader": "A simple but powerful web wallet for everyone. No software or hardware required.",
+ "info1": {
+ "title": "Instant payments via Lightning",
+ "description": "We make it easy for merchants to receive retail payments. No waiting for bank settlements or worrying about chargebacks. Instant settlement, in seconds. Say goodbye to 3% credit card processing fees."
+ },
+ "info2": {
+ "title": "Simple to use",
+ "description1": "Just enter an amount in your local currency, share the QR code and you’re done.",
+ "description2": "We do all the heavy lifting so you can focus on your business.",
+ "description3": "You always have the option of taking custody of your funds by withdrawing instantly at any time."
+ },
+ "info3": {
+ "title": "Brand it your way!",
+ "description": "Customize your profile page look and feel, or keep it on default - it's totally up to you."
+ }
+ },
+ "login": {
+ "optional": "Optional",
+ "token": "2FA Token",
+ "username": "Username",
+ "password": "Password",
+ "email": "Email",
+ "passwordRecommendation": "We recommend a long, random password generated with a password manager.",
+ "forgotUserOrPassword": "Forgot Username or Password?",
+ "haveAccount": "Already have an account?",
+ "noAccount": "Don't have an account?",
+ "register": "Register",
+ "signIn": "Sign In",
+ "failed": "Login failed"
+ },
+ "nav": {
+ "profile": "Profile",
+ "startInSeconds": "Start in Seconds",
+ "account": "Account",
+ "signIn": "Sign In",
+ "signOut": "Sign Out",
+ "dashboard": "Dashboard",
+ "settings": "Settings",
+ "support": "Support"
+ },
+ "newSiteHeader": "Join us at our <a href=\"/launch\" class=\"underline underline-offset-4 text-black hover:opacity-80\">launch party</a> in Vancouver on October 26! Looking for the old coinos? Visit <a href=\"https://classic.coinos.io\" class=\"underline underline-offset-4 text-black hover:opacity-80\">classic.coinos.io</a>",
+ "news": {
+ "header": "News",
+ "subheader": "Latest Updates",
+ "update1": ""
+ },
+ "user": {
+ "bitcoin": "Bitcoin",
+ "lightning": "Lightning",
+ "invoice": "Invoice",
+ "unfollow": "Unfollow",
+ "following": "Following",
+ "follow": "Follow",
+ "followers": "Followers",
+ "remove": "Remove",
+ "noNotes": "No notes yet",
+ "message": "Message",
+ "messages": "Messages",
+ "feed": "Feed",
+ "notes": "Notes",
+ "pay": "Pay",
+ "scanToPayBTC": "Scan to pay with bitcoin",
+ "this": "This",
+ "lightningAddress": "lightning address",
+ "likeAnEmail": "is like an email for bitcoin. You can publish it on your website or business cards and use it multiple times.",
+ "dashboard": {
+ "go": "Go",
+ "dashboard": "Dashboard",
+ "accountBalance": "Account Balance",
+ "bitcoinPrice": "bitcoin Price:",
+ "conversionFeeWarning": "You will be charged a 1% withdrawal fee on the amount.",
+ "dataFromBinance": "Data from <span class=\"text-black\">Binance</span>.",
+ "fetchingRate": "fetching rate...",
+ "optionalNote": "Note (Optional)",
+ "send": "Send",
+ "receive": "Receive",
+ "withdraw": "Send",
+ "deposit": "Deposit",
+ "voucher": "Voucher"
+ },
+ "receive": {
+ "lessThan1BTCWarning": "Please enter an amount less than 1 bitcoin.",
+ "showQR": "Show QR"
+ },
+ "send": {
+ "contacts": "Contacts",
+ "scan": "Scan",
+ "paste": "Paste",
+ "next": "Next",
+ "placeholder": "Paste a bitcoin address, lightning invoice or coinos username"
+ },
+ "settings": {
+ "saveSettings": "Save Settings",
+ "bannerImage": "Banner Image",
+ "profileImage": "Profile Image",
+ "oneTimeCode": "Enter one-time code",
+ "accountId": "Account Secret",
+ "header": "Settings",
+ "ACCOUNT": "ACCOUNT",
+ "POINT_OF_SALE": "PREFERENCES",
+ "SECURITY": "SECURITY",
+ "locale": "Language",
+ "username": "Username",
+ "email": "Email",
+ "newPassword": "Change Password",
+ "about": "About",
+ "aboutPlaceholder": "A little something about you or your business address and hours",
+ "emailNotifications": "Email Notifications",
+ "emailNotificationsDescription": "Get notified via email when a change occurs on your account or when people send you payments.",
+ "smsNotifications": "SMS Notifications",
+ "smsNotificationsDescription": "Coinos will send you text notifications when this is enabled.",
+ "theme": "Color Theme",
+ "tipPrompt": "Prompt for tips",
+ "tipPromptDescription": "Ask people if they want to add a tip before paying their invoices",
+ "displayName": "Display name",
+ "themeDescription": "Select from the default color themes.",
+ "localCurrency": "Currency",
+ "btcUnit": "Display bitcoin in:",
+ "bitcoin": "bitcoin",
+ "minutes": "minutes",
+ "hour": "hour",
+ "hours": "hours",
+ "satoshis": "Satoshis",
+ "securityPIN": "Security PIN",
+ "securityPINDescription": "Set a security pin that will be used to unlock your settings and to send outgoing payments.",
+ "setPIN": "Set PIN",
+ "autoLock": "Auto-Lock Timer",
+ "autoLockDescription": "Your account will go into a secure mode, requiring you to re-enter your credentials after a specified time:",
+ "twofa": "2-Factor Authentication",
+ "twofaDescription": "Add an extra level of security to your device by enabling 2-factor authentication.",
+ "twofaSetup": "Set up 2FA",
+ "twofaDisable": "Disable 2FA",
+ "select": "Select",
+ "verifyPIN": "Verify PIN",
+ "enablePIN": "Enable PIN",
+ "disablePIN": "Disable PIN"
+ },
+ "support": {
+ "header": "Support",
+ "email": "Email",
+ "accountName": "Account Name",
+ "message": "Message",
+ "send": "Send"
+ }
+ },
+ "payments": {
+ "amount": "Amount",
+ "date": "Date",
+ "id": "Transaction ID",
+ "details": "Transaction Details",
+ "header": "Payments",
+ "preimage": "Proof of payment",
+ "type": "Type",
+ "time": "Time",
+ "sent": "Sent",
+ "received": "Received",
+ "empty": "No transactions yet.",
+ "send": "Send",
+ "next": "Next",
+ "sendersChoice": "Sender's choice",
+ "sendTo": "Send to",
+ "to": "to",
+ "pay": "Pay",
+ "requesting": "is requesting",
+ "sentInvoiceTo": "Sent invoice to",
+ "sentRequestTo": "Request sent!",
+ "pleasePay": "Please pay",
+ "day": "Day",
+ "week": "Week",
+ "month": "Month",
+ "all": "All",
+ "export": "Export",
+ "invoice": "Invoice",
+ "readyToPay": "is ready to pay",
+ "describeOrder": "Use this field to describe your order",
+ "requestAnInvoice": "Request Invoice",
+ "submit": "Submit",
+ "isRequesting": "is requesting",
+ "invoiceFrom": "Invoice from",
+ "awaiting": "Awaiting",
+ "tapAnywhere": "Tap anywhere to continue",
+ "from": "from",
+ "redeem": "Redeem",
+ "redeemed": "Redeemed",
+ "redeemedBy": "Redeemed by",
+ "sendMessage": "Write a message..."
+ }
+}
diff --git a/src/routes/(app)/+layout.svelte b/src/routes/(app)/+layout.svelte
index 0dcdc1b2..9eb8f18c 100644
--- a/src/routes/(app)/+layout.svelte
+++ b/src/routes/(app)/+layout.svelte
@@ -2,7 +2,7 @@
import { SvelteToast } from '@zerodevx/svelte-toast';
import { onDestroy, onMount } from 'svelte';
import { close, connect, send } from '$lib/socket';
- import { last, selectedRate, invoice, rate, user, request, passwordPrompt } from '$lib/store';
+ import { last, invoice, request, passwordPrompt } from '$lib/store';
import { page } from '$app/stores';
import { browser } from '$app/environment';
import { goto } from '$app/navigation';
@@ -15,16 +15,7 @@
export let data;
let { subject } = $page.data;
- let r, u, token, rates;
-
- $: update(data);
- let update = () => {
- ({ user: u, rate: r, token, rates } = data);
- $rate = r;
- $user = u;
- };
-
- $: $selectedRate = r * (rates[u?.currency || 'USD'] / rates.USD);
+ let { rate, user, token, rates } = data;
onMount(() => {
let localStorageLocale = localStorage.getItem(localeLocalStorageKey);
@@ -89,9 +80,9 @@
</main>
{#if $invoice}
- <Invoice user={u} />
+ <Invoice {user} />
{/if}
{#if $request}
- <Request user={u} />
+ <Request {user} />
{/if}
diff --git a/src/routes/(app)/[username]/(profile)/+layout.svelte b/src/routes/(app)/[username]/(profile)/+layout.svelte
index bbb2379e..df9b9ad8 100644
--- a/src/routes/(app)/[username]/(profile)/+layout.svelte
+++ b/src/routes/(app)/[username]/(profile)/+layout.svelte
@@ -1,13 +1,13 @@
<script>
import { f, s, sats } from '$lib/utils';
- import { animatedRate, selectedRate } from '$lib/store';
+ import { animatedRate } from '$lib/store';
import { Icon } from '$comp';
import { t } from '$lib/translations';
import { sign, send } from '$lib/nostr';
export let data;
- let events, user, subject, src, text;
- $: ({ events, user, subject, src, text } = data);
+ let events, user, subject, rates, src, text;
+ $: ({ events, user, rates, subject, src, text } = data);
$: ({ currency, username: n, display } = subject);
$: username = n.length > 60 ? n.substr(0, 6) : display || n;
@@ -42,24 +42,6 @@
$: following = !!user?.follows.find((t) => t.includes(subject.pubkey));
- let ease = (t) => (t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t);
- let i;
-
- let o = $selectedRate;
- $: animate($selectedRate);
- let animate = (n) => {
- clearInterval(i);
-
- let t = 0;
- let d = o - n;
-
- i = setInterval(() => {
- $animatedRate = (o - d * ease(t / 100)).toFixed(2);
- if (t > 80) (o = n) && clearInterval(i);
- t++;
- }, 10);
- };
-
let hideBio = true;
let toggleBio = () => (hideBio = false);
</script>
@@ -115,39 +97,31 @@
</button>
</div>
{/if}
+ {/if}
+ {#if !subject.anon && subject.username !== user?.username}
<div class="w-full flex">
- <a href={`/${subject.username}/messages`} class="mx-auto">
- <button class="rounded-full border py-3 px-6 font-bold hover:opacity-80 flex w-60">
- <div class="mx-auto flex">
- <Icon icon="support" style="mr-2 my-auto" />
- <div class="mt-1 my-auto">{$t('user.message')}</div>
- </div>
- </button>
- </a>
- </div>
-
- <div class="w-full flex">
- <a href={`/${subject.username}/request`} class="mx-auto">
+ <a
+ href={user ? `/send/${subject.username}` : `/${subject.username}/receive`}
+ class="mx-auto"
+ >
<button class="rounded-full border py-3 px-6 font-bold hover:opacity-80 flex w-60">
<div class="mx-auto flex">
- <Icon icon="numpad" style="mr-2 my-auto" />
- <div class="mt-1 my-auto">{$t('payments.requestAnInvoice')}</div>
+ <Icon icon="send" style="mr-2" />
+ <div class="mt-1">{$t('user.pay')}</div>
</div>
</button>
</a>
</div>
{/if}
- {#if !subject.anon && subject.username !== user?.username}
+
+ {#if user && user.username !== subject.username && subject.pubkey}
<div class="w-full flex">
- <a
- href={user ? `/send/${subject.username}` : `/${subject.username}/receive`}
- class="mx-auto"
- >
+ <a href={`/${subject.username}/messages`} class="mx-auto">
<button class="rounded-full border py-3 px-6 font-bold hover:opacity-80 flex w-60">
<div class="mx-auto flex">
- <Icon icon="send" style="mr-2" />
- <div class="mt-1">{$t('user.pay')}</div>
+ <Icon icon="support" style="mr-2 my-auto" />
+ <div class="mt-1 my-auto">{$t('user.message')}</div>
</div>
</button>
</a>
@@ -163,7 +137,7 @@
</div>
</div>
-{#if currency && $animatedRate}
+{#if currency && !isNaN($animatedRate)}
<div class="flex fixed w-full px-4 bg-white py-2 bottom-0 bg-opacity-90 tabular-nums">
<div class="text-secondary flex mr-auto">
<div class="flex mr-1">
diff --git a/src/routes/(app)/[username]/(profile)/+page.svelte b/src/routes/(app)/[username]/(profile)/+page.svelte
index 09335e9c..308289b0 100644
--- a/src/routes/(app)/[username]/(profile)/+page.svelte
+++ b/src/routes/(app)/[username]/(profile)/+page.svelte
@@ -2,24 +2,23 @@
import { onMount } from 'svelte';
import { Icon, Avatar, Balance, Feed } from '$comp';
import { t } from '$lib/translations';
- import { f, sat, sats } from '$lib/utils';
+ import { ease, f, sat, sats } from '$lib/utils';
import { sign, send, encrypt, decrypt } from '$lib/nostr';
- import { event as e, password } from '$lib/store';
+ import { event as e, password, rate, animatedRate } from '$lib/store';
import { browser } from '$app/environment';
export let data;
- let { messages, notes, invoices, sent, received, subject, user } = data;
+ let { messages, notes, invoices, sent, received, subject, user, rates } = data;
$: refresh(data);
- let refresh = (d) => ({ messages, notes, invoices, sent, received, subject, user } = d);
+ let refresh = (d) => ({ messages, notes, invoices, sent, received, subject, user, rates } = d);
let keys = new Set();
let latest = [];
- let i = 0;
let ready;
e.subscribe(async (event) => {
if (!(event && ready)) return;
- if (event.recipient.id === user?.id && !~latest.findIndex((m) => m.id === event.id)) {
+ if (event.recipient?.id === user.id && !~latest.findIndex((m) => m.id === event.id)) {
event.content = await decrypt({ event, user });
let i = latest.findIndex((m) => m.pubkey === event.pubkey);
@@ -34,22 +33,49 @@
$: initialize($password);
let initialize = async (p) => {
+ let i = 0;
ready = false;
- if (!p) return;
+ if (!p || !user) return;
while (i < messages.length) {
let event = messages[i];
- let k = event.author.id === user.id ? event.recipient.pubkey : event.author.pubkey;
+ i++;
+
+ if (!(event.author && event.recipient)) continue;
+
+ let k = event.author.id === user.id ? event.recipient?.pubkey : event.author.pubkey;
if (!keys.has(k)) {
keys.add(k);
event.content = await decrypt({ event, user });
if (event.content) latest.push(event);
}
- i++;
}
latest = latest;
ready = true;
};
+
+ let i;
+ let o;
+
+ rate.subscribe((n) => {
+ if (!user?.currency) return;
+ clearInterval(i);
+
+ let r = ((rates[user.currency] / rates['USD']) * n).toFixed(2);
+
+ if (!r || isNaN(r)) return;
+ if (!o) o = r;
+
+ let t = 0;
+ let d = o - r;
+
+ i = setInterval(() => {
+ if (!r) return;
+ $animatedRate = (o - d * ease(t / 100)).toFixed(2);
+ if (t > 80) (o = r) && clearInterval(i);
+ t++;
+ }, 10);
+ });
</script>
<div class="space-y-8">
diff --git a/src/routes/(app)/[username]/dashboard/+page.server.js b/src/routes/(app)/[username]/dashboard/+page.server.js
deleted file mode 100644
index ae66a20d..00000000
--- a/src/routes/(app)/[username]/dashboard/+page.server.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import { redirect } from '@sveltejs/kit';
-export async function load({ params: { username } }) {
- throw redirect(301, `/${username}`);
-}
diff --git a/src/routes/(app)/[username]/dashboard/+page.svelte b/src/routes/(app)/[username]/dashboard/+page.svelte
deleted file mode 100644
index d8761ea9..00000000
--- a/src/routes/(app)/[username]/dashboard/+page.svelte
+++ /dev/null
@@ -1,163 +0,0 @@
-<script>
- import { enhance } from '$app/forms';
- import { f, s, post, fail, sat, sats } from '$lib/utils';
- import { tick } from 'svelte';
- import { Avatar, Icon } from '$comp';
- import { rate, password, selectedRate } from '$lib/store';
- import { goto } from '$app/navigation';
- import { t } from '$lib/translations';
- import { events } from '$lib/store';
-
- export let data;
- $: ({ invoices, requests } = data);
-
- let ease = (t) => (t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t);
- let interval, rateInterval;
-
- let oldRate = $selectedRate;
- let animatedRate = oldRate;
- $: animateRate($selectedRate);
- let animateRate = (newRate) => {
- if (!accountBalanceFiat) return;
- let t = 0;
- let newBalance = (user.balance * newRate) / sats;
- let oldBalance = parseFloat(accountBalanceFiat);
- let diff = oldBalance - newBalance;
- let rateDiff = oldRate - newRate;
-
- clearInterval(rateInterval);
- rateInterval = setInterval(() => {
- let delta = rateDiff * ease(t / 100);
- animatedRate = (oldRate - delta).toFixed(2);
- if (t > 80) clearInterval(interval);
- t++;
- }, 10);
-
- oldRate = newRate;
-
- clearInterval(interval);
- interval = setInterval(() => {
- let delta = diff * ease(t / 100);
- accountBalanceFiat = (oldBalance - delta).toFixed(2);
- if (t > 80) clearInterval(interval);
- t++;
- }, 10);
- };
-
- $: user = data.user;
- $: accountBalanceFiat =
- accountBalanceFiat ||
- (user && $selectedRate && ((user.balance * $selectedRate) / sats).toFixed(2));
-
- let payreq = '',
- payreqField,
- loading;
-
- $: btcPrice = f($selectedRate, user.currency);
-
- $: accountBalanceBtc = user.balance / sats;
-</script>
-
-<div class="container px-4 max-w-md mx-auto mt-20 space-y-12 mb-8">
- <div class="mt-24 space-y-2">
- <div class="text-5xl font-bold">
- {$selectedRate ? f(accountBalanceFiat, user.currency) : $t('user.dashboard.fetchingRate')}
- </div>
-
- <div class="text-secondary text-2xl">
- ⚡️{s(user.balance)}
- </div>
- </div>
-
- <div class="grid sm:grid-cols-2 gap-2 text-lg">
- <a href="/send">
- <button class="rounded-full border py-4 px-5 font-bold hover:opacity-80 w-full"
- >{$t('user.dashboard.send')}</button
- >
- </a>
- <a href={`/${user.username}/receive`}>
- <button class="rounded-full border py-4 px-5 font-bold hover:opacity-80 w-full"
- >{$t('user.dashboard.receive')}</button
- >
- </a>
- </div>
-
- <!-- <div> -->
- <!-- {#each invoices as { request_id, amount, currency, rate, user: recipient, requester, id }} -->
- <!-- {@const requested = user.username === requester?.username} -->
- <!-- <a href={`/invoice/${id}` + (requested ? '/tip' : '')}> -->
- <!-- <div class="border-b p-2 last:border-b-0 hover:bg-gray-100"> -->
- <!-- <div class="flex gap-2"> -->
- <!-- <div> -->
- <!-- {#if requested} -->
- <!-- <div class="flex"> -->
- <!-- <Avatar user={recipient} size={20} /> -->
- <!-- <div class="my-auto text-left"> -->
- <!-- <p class="text-secondary">{$t('payments.invoiceFrom')}</p> -->
- <!-- <p class="ml-1 text-lg break-words">{recipient.username}</p> -->
- <!-- </div> -->
- <!-- </div> -->
- <!-- {:else} -->
- <!-- <div class="flex"> -->
- <!-- <Avatar user={requester} size={20} /> -->
- <!-- <div class="my-auto text-left"> -->
- <!-- <p class="text-secondary">{$t('payments.awaiting')}</p> -->
- <!-- <p class="ml-1 text-lg break-words">{requester.username}</p> -->
- <!-- </div> -->
- <!-- </div> -->
- <!-- {/if} -->
- <!-- </div> -->
- <!-- <div class="whitespace-nowrap my-auto ml-auto flex gap-2"> -->
- <!-- <div class="font-bold"> -->
- <!-- {f(amount * (rate / sats), currency)} -->
- <!-- </div> -->
- <!-- -->
- <!-- <div class="text-secondary">{sat(amount)}</div> -->
- <!-- </div> -->
- <!-- </div> -->
- <!-- </div> -->
- <!-- </a> -->
- <!-- {/each} -->
- <!-- </div> -->
-
- <!-- <div> -->
- <!-- {#each requests as { id, invoice, memo, requester: r }} -->
- <!-- <a href={`/${user.username}/receive/${id}`}> -->
- <!-- <div class="border-b p-2 last:border-b-0 hover:bg-gray-100"> -->
- <!-- <div class="flex"> -->
- <!-- <div> -->
- <!-- <div class="flex"> -->
- <!-- <Avatar user={r} size={20} /> -->
- <!-- <div class="my-auto text-left"> -->
- <!-- <p class="ml-1 text-lg break-words">{r.username}</p> -->
- <!-- <p class="ml-1 text-secondary">{memo}</p> -->
- <!-- </div> -->
- <!-- </div> -->
- <!-- </div> -->
- <!-- <div class="whitespace-nowrap my-auto ml-auto flex gap-2"> -->
- <!-- <button class="rounded-full border py-2 px-4 font-bold hover:opacity-80 w-full" -->
- <!-- >Invoice</button -->
- <!-- > -->
- <!-- </div> -->
- <!-- </div> -->
- <!-- </div> -->
- <!-- </a> -->
- <!-- {/each} -->
- <!-- </div> -->
-</div>
-
-<div class="flex fixed w-full px-4 bg-white py-2 bottom-0 bg-opacity-90">
- <div class="text-secondary flex mr-auto">
- <div class="flex mr-1">
- <div class="my-auto mr-1">1</div>
- <img src="/images/bitcoin.svg" class="w-5 my-auto" alt="Bitcoin" />
- </div>
- <div>= {f(animatedRate, user.currency)}</div>
- </div>
- <div class="text-secondary flex ml-auto">
- <div class="flex">
- <div class="mr-1">⚡️{s((1 * sats) / animatedRate)} =</div>
- <div>{f(1, user.currency)}</div>
- </div>
- </div>
-</div>
diff --git a/src/routes/(app)/[username]/generate/+page.svelte b/src/routes/(app)/[username]/generate/+page.svelte
index 32a38592..3548ccd4 100644
--- a/src/routes/(app)/[username]/generate/+page.svelte
+++ b/src/routes/(app)/[username]/generate/+page.svelte
@@ -1,9 +1,6 @@
<script>
import { fail, post, wait } from '$lib/utils';
- import { Buffer } from 'buffer';
import { onMount } from 'svelte';
- import { bech32m } from 'bech32';
- import { generateMnemonic, mnemonicToEntropy, mnemonicToSeedSync } from 'bip39';
import { goto, invalidate } from '$app/navigation';
import { Pin } from '$comp';
import { loginRedirect, pin, password, passwordPrompt } from '$lib/store';
diff --git a/src/routes/(app)/[username]/generate/+server.js b/src/routes/(app)/[username]/generate/+server.js
index 1335c3e2..e1df08e3 100644
--- a/src/routes/(app)/[username]/generate/+server.js
+++ b/src/routes/(app)/[username]/generate/+server.js
@@ -3,7 +3,8 @@ import { error, json } from '@sveltejs/kit';
export async function POST({ cookies, request }) {
try {
- return json(await post(`/user`, await request.json(), auth(cookies)));
+ let body = await request.json();
+ return json(await post(`/user`, body, auth(cookies)));
} catch (e) {
throw error(500, e.message);
}
diff --git a/src/routes/(app)/[username]/invoice/[hash]/+layout.server.js b/src/routes/(app)/[username]/invoice/[hash]/+layout.server.js
index 7cf87e14..875c4e11 100644
--- a/src/routes/(app)/[username]/invoice/[hash]/+layout.server.js
+++ b/src/routes/(app)/[username]/invoice/[hash]/+layout.server.js
@@ -12,10 +12,10 @@ export async function load({ depends, params, url, parent }) {
if (user && invoice.uid !== user.id && !url.pathname.includes('tip'))
throw redirect(307, `/send/invoice/${hash}`);
- let { amount, received } = invoice;
+ let { amount, pending, received } = invoice;
amount = parseInt(amount);
- let paid = (!amount && received) || (amount > 0 && received >= amount);
+ let paid = (!amount && received) || (amount > 0 && (pending >= amount || received >= amount));
if (paid && !url.pathname.endsWith('paid'))
throw redirect(307, `/${params.username}/invoice/${hash}/paid`);
diff --git a/src/routes/(app)/[username]/invoice/[hash]/paid/+page.svelte b/src/routes/(app)/[username]/invoice/[hash]/paid/+page.svelte
index 4d7aae51..c9619cee 100644
--- a/src/routes/(app)/[username]/invoice/[hash]/paid/+page.svelte
+++ b/src/routes/(app)/[username]/invoice/[hash]/paid/+page.svelte
@@ -21,7 +21,7 @@
{#if received}
<h1 class="text-3xl md:text-4xl font-bold mb-6">{$t('invoice.paymentSuccessful')}</h1>
<h2 class="text-2xl md:text-3xl font-semibold">
- {f(fiat(received, rate), currency)}
+ {f(fiat(received - tip, rate), currency)}
{#if tip}
<span class="text-lg">
+ {f(fiat(tip, rate), currency)}
@@ -29,7 +29,7 @@
{/if}
</h2>
<h3 class="text-secondary md:text-lg mb-6 mt-1">
- ⚡️{s(received)}
+ ⚡️{s(received - tip)}
{#if tip}
<span class="text-lg">
@@ -42,13 +42,13 @@
{#if pending}
<h1 class="text-3xl md:text-4xl font-bold mb-6">Payment detected</h1>
<h2 class="text-2xl md:text-3xl font-semibold">
- {f(fiat(pending, rate), currency)}
+ {f(fiat(pending - tip, rate), currency)}
{#if tip}
+ {f(fiat(tip, rate), currency)}
{/if}
</h2>
<h3 class="text-secondary md:text-lg mb-6 mt-1">
- ⚡️{s(pending)}
+ ⚡️{s(pending - tip)}
{#if tip}
<span class="text-lg">
+ ⚡️{s(tip)}
diff --git a/src/routes/(app)/[username]/invoice/[hash]/tip/+page.svelte b/src/routes/(app)/[username]/invoice/[hash]/tip/+page.svelte
index 9d9021a6..fe6c67be 100644
--- a/src/routes/(app)/[username]/invoice/[hash]/tip/+page.svelte
+++ b/src/routes/(app)/[username]/invoice/[hash]/tip/+page.svelte
@@ -56,7 +56,7 @@
export let data;
$: refresh(data);
- let { invoice, id, user } = data;
+ let { invoice, id, user, rates } = data;
let {
amount,
hash,
@@ -82,17 +82,19 @@
amount,
hash,
type,
- rate,
received,
prompt,
text,
tip,
- user: { username, currency }
+ user: { username }
} = invoice);
tipPercent = (tip / amount) * 100;
};
+ $: currency = user?.currency || invoice.currency;
+ $: rate = invoice.rate * (rates[currency] / rates[invoice.currency]);
+
$: tip = Math.round((amount / 100) * tipPercent);
$: amountFiat = parseFloat(((amount * rate) / sats).toFixed(2));
@@ -109,7 +111,7 @@
<input type="hidden" name="amount" value={amount} />
<input type="hidden" name="tip" value={tip} />
<input type="hidden" name="username" value={username} />
- <input type="hidden" name="rate" value={rate} />
+ <input type="hidden" name="rate" value={invoice.rate} />
<input type="hidden" name="prompt" value="false" />
<input type="hidden" name="type" value={type} />
<input type="hidden" name="hash" value={hash} />
diff --git a/src/routes/(app)/[username]/messages/+page.server.js b/src/routes/(app)/[username]/messages/+page.server.js
index 8347c184..ec5c5eee 100644
--- a/src/routes/(app)/[username]/messages/+page.server.js
+++ b/src/routes/(app)/[username]/messages/+page.server.js
@@ -8,8 +8,9 @@ export async function load({ params, parent, url }) {
try {
messages = await get(`/${user.pubkey}/${since}/messages`);
+
messages = messages
- .filter((m) => m.recipient.id === subject.id || m.author.id === subject.id)
+ .filter((m) => m.recipient?.id === subject.id || m.author?.id === subject.id)
.sort((a, b) => a.created_at - b.created_at);
if (user.id === subject.id) messages = messages.filter((m) => m.recipient.id === m.author.id);
diff --git a/src/routes/(app)/[username]/messages/+page.svelte b/src/routes/(app)/[username]/messages/+page.svelte
index 7a10d605..cfa7f741 100644
--- a/src/routes/(app)/[username]/messages/+page.svelte
+++ b/src/routes/(app)/[username]/messages/+page.svelte
@@ -10,7 +10,7 @@
import { sign, send, encrypt, decrypt } from '$lib/nostr';
import { event as e, password } from '$lib/store';
import { tick, onMount } from 'svelte';
- import { calculateId } from 'nostr';
+ import { getEventHash } from 'nostr-tools';
export let data;
@@ -77,8 +77,8 @@
tick().then(() => pane && (pane.scrollTop = pane.scrollHeight));
try {
- event.id = await calculateId(event);
event.content = await encrypt({ message: event.message, recipient: subject.pubkey, user });
+ event.id = getEventHash(event);
await sign({ event, user });
await send(event);
diff --git a/src/routes/(app)/[username]/payments/[...page]/+page.svelte b/src/routes/(app)/[username]/payments/[...page]/+page.svelte
index c9cc5c40..744b35ec 100644
--- a/src/routes/(app)/[username]/payments/[...page]/+page.svelte
+++ b/src/routes/(app)/[username]/payments/[...page]/+page.svelte
@@ -148,19 +148,16 @@
<div class="grid grid-cols-3 border-b h-24 hover:bg-gray-100 px-4">
<div class="whitespace-nowrap my-auto">
<div class="font-bold" class:text-red-800={p.amount < 0}>
- {f((Math.abs(p.amount) + (p.tip || 0)) * (p.rate / sats), p.currency)}
+ {f(Math.abs(p.amount) * (p.rate / sats), p.currency)}
{#if p.tip}
- <span class="text-xs text-secondary">
- {f(Math.abs(p.amount) * (p.rate / sats), p.currency)} + {f(
- p.tip * (p.rate / sats),
- p.currency
- )}
+ <span class="text-sm text-secondary">
+ +{Math.round((p.tip / Math.abs(p.amount)) * 100)}%
</span>
{/if}
</div>
<div class="text-secondary">
- {sat(p.amount + (p.tip || 0))}
+ {sat(Math.abs(p.amount) + (p.tip || 0))}
</div>
</div>
diff --git a/src/routes/(app)/[username]/receive/[...param]/+page.svelte b/src/routes/(app)/[username]/receive/[...param]/+page.svelte
index 95495368..27b339aa 100644
--- a/src/routes/(app)/[username]/receive/[...param]/+page.svelte
+++ b/src/routes/(app)/[username]/receive/[...param]/+page.svelte
@@ -18,9 +18,10 @@
let lightning = true;
let { currency, username, prompt } = data.subject;
- let { user } = data;
+ let { rates, user } = data;
let submit;
+ $: rate = rates[currency];
$: type = lightning ? 'lightning' : 'bitcoin';
</script>
@@ -37,7 +38,7 @@
<input type="hidden" name="prompt" value={prompt} />
<div class="space-y-3 w-[300px] mx-auto">
- <Numpad bind:amount bind:currency {submit} />
+ <Numpad bind:amount bind:currency bind:rate {submit} />
<button
bind:this={submit}
type="submit"
diff --git a/src/routes/(app)/[username]/reset/+server.js b/src/routes/(app)/[username]/reset/+server.js
new file mode 100644
index 00000000..52fff367
--- /dev/null
+++ b/src/routes/(app)/[username]/reset/+server.js
@@ -0,0 +1,10 @@
+import { json } from '@sveltejs/kit';
+import { auth, post } from '$lib/utils';
+
+export async function POST({ cookies, request, params }) {
+ let { username } = params;
+ let r = await request.json();
+ let { password } = r;
+ let result = await post('/reset', { password, username }, auth(cookies));
+ return json(result);
+}
diff --git a/src/routes/(app)/[username]/settings/[...tab]/+page.svelte b/src/routes/(app)/[username]/settings/[...tab]/+page.svelte
index 997d8b4a..1b212abe 100644
--- a/src/routes/(app)/[username]/settings/[...tab]/+page.svelte
+++ b/src/routes/(app)/[username]/settings/[...tab]/+page.svelte
@@ -112,13 +112,10 @@
loading = false;
}
-
- let loaded;
- onMount(() => setTimeout(() => (loaded = true), 50));
</script>
-{#if loaded && user.haspin && $pin?.length !== 6}
- <Pin bind:value={$pin} />
+{#if user.haspin && $pin?.length !== 6}
+ <Pin />
{/if}
<form
diff --git a/src/routes/(app)/[username]/settings/[...tab]/_security.svelte b/src/routes/(app)/[username]/settings/[...tab]/_security.svelte
index eb3b405e..40947bda 100644
--- a/src/routes/(app)/[username]/settings/[...tab]/_security.svelte
+++ b/src/routes/(app)/[username]/settings/[...tab]/_security.svelte
@@ -148,9 +148,9 @@
{$t('user.settings.securityPINDescription')}
</p>
{#if verifying}
- <Pin bind:value={verify} {cancel} />
+ <Pin bind:value={verify} {cancel} notify={false} />
{:else if settingPin}
- <Pin bind:value={pin} title={$t('user.settings.setPIN')} {cancel} />
+ <Pin bind:value={pin} title={$t('user.settings.setPIN')} {cancel} notify={false} />
{:else}
<button type="button" class="primary" on:click={togglePin}
><Icon icon="lock" style="mr-1" />
@@ -192,7 +192,7 @@
{/if}
{#if confirming2fa || disabling2fa}
- <Pin bind:value={token} title="Enter 2FA Code" {cancel} />
+ <Pin bind:value={token} title="Enter 2FA Code" {cancel} persist={false} notify={false} />
{/if}
</div>
diff --git a/src/routes/(app)/admin/+page.server.js b/src/routes/(app)/admin/+page.server.js
index c4079a2f..e19f894c 100644
--- a/src/routes/(app)/admin/+page.server.js
+++ b/src/routes/(app)/admin/+page.server.js
@@ -1,10 +1,10 @@
-import { get } from '$lib/utils';
+import { auth, get } from '$lib/utils';
import { redirect } from '@sveltejs/kit';
-export async function load({ parent }) {
+export async function load({ cookies, parent }) {
let { user } = await parent();
if (!user) throw redirect(307, '/login');
- let users = (await get('/users')).sort((a, b) => b.balance - a.balance);
+ let users = (await get('/users', auth(cookies))).sort((a, b) => b.balance - a.balance);
return { users };
}
diff --git a/src/routes/(app)/admin/+page.svelte b/src/routes/(app)/admin/+page.svelte
index 1a747f1f..529d2f77 100644
--- a/src/routes/(app)/admin/+page.svelte
+++ b/src/routes/(app)/admin/+page.svelte
@@ -1,11 +1,22 @@
<script>
+ import { post } from '$lib/utils';
export let data;
+ let reset = (username) => post(`/${username}/reset`, { password });
let { users } = data;
+ let password;
</script>
-{#each users as { balance, username }}
- <div class="grid grid-cols-2">
+{#each users as { balance, username, expected }}
+ <div class="grid grid-cols-5">
<div>{username}</div>
<div>{balance}</div>
+ <div>{expected}</div>
+ <div><input bind:value={password} /></div>
+ <div>
+ <button
+ class="text-sm md:text-lg rounded-full border py-2 px-4 hover:opacity-80 min-w-[72px] bg-black text-white"
+ on:click={() => reset(username)}>Reset</button
+ >
+ </div>
</div>
{/each}
diff --git a/src/routes/(app)/buy/+page.svelte b/src/routes/(app)/buy/+page.svelte
index 2f556ada..22e7e9ec 100644
--- a/src/routes/(app)/buy/+page.svelte
+++ b/src/routes/(app)/buy/+page.svelte
@@ -1,7 +1,7 @@
<script>
import { enhance } from '$app/forms';
import { Icon, Lock, Card, Calendar, Spinner } from '$comp';
- import { animatedRate, selectedRate } from '$lib/store';
+ import { animatedRate } from '$lib/store';
import { f } from '$lib/utils';
export let data, form;
@@ -10,24 +10,6 @@
let loading;
let amount, n, d, cvc;
-
- let ease = (t) => (t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t);
- let i;
-
- let o = $selectedRate;
- $: animate($selectedRate);
- let animate = (n) => {
- clearInterval(i);
-
- let t = 0;
- let d = o - n;
-
- i = setInterval(() => {
- $animatedRate = (o - d * ease(t / 100)).toFixed(2);
- if (t > 80) (o = n) && clearInterval(i);
- t++;
- }, 10);
- };
</script>
<div class="container px-4 max-w-xl mx-auto mt-10 space-y-5">
@@ -141,7 +123,6 @@
<div class="my-auto mr-1">1</div>
<img src="/images/bitcoin.svg" class="w-5 my-auto" alt="Bitcoin" />
</div>
- <div>= {f($animatedRate, currency)}</div>
</div>
<p class="text-secondary">3% credit card fee applies</p>
</div>
diff --git a/src/routes/(app)/launch/purchase/+page.svelte b/src/routes/(app)/launch/purchase/+page.svelte
index 3273752a..fbaa58c0 100644
--- a/src/routes/(app)/launch/purchase/+page.svelte
+++ b/src/routes/(app)/launch/purchase/+page.svelte
@@ -1,7 +1,6 @@
<script>
import { onMount } from 'svelte';
import { enhance } from '$app/forms';
- import { selectedRate } from '$lib/store';
import { post } from '$lib/utils';
import { goto } from '$app/navigation';
diff --git a/src/routes/(app)/login/+page.svelte b/src/routes/(app)/login/+page.svelte
index 75998cd0..eb3ae26b 100644
--- a/src/routes/(app)/login/+page.svelte
+++ b/src/routes/(app)/login/+page.svelte
@@ -1,5 +1,13 @@
<script>
import { RegisterOrLogin } from '$comp';
+ import { onMount } from 'svelte';
+ import { pin } from '$lib/store';
+
+ onMount(() => {
+ $pin = undefined;
+ localStorage.clear();
+ sessionStorage.clear();
+ });
export let form;
</script>
diff --git a/src/routes/(app)/payment/[id]/+page.svelte b/src/routes/(app)/payment/[id]/+page.svelte
index cf30db35..9e61cbd6 100644
--- a/src/routes/(app)/payment/[id]/+page.svelte
+++ b/src/routes/(app)/payment/[id]/+page.svelte
@@ -1,6 +1,6 @@
<script>
import { t } from '$lib/translations';
- import { back, copy, f, s, fiat, sats } from '$lib/utils';
+ import { back, copy, f, s, fiat, post, sats, success } from '$lib/utils';
import { Avatar, Icon } from '$comp';
import { format } from 'date-fns';
import { PUBLIC_EXPLORER as expl } from '$env/static/public';
@@ -12,6 +12,11 @@
let { id, amount, created, rate, type, ref, tip, ourfee, fee, currency } = p;
let a = Math.abs(amount);
+ let print = async () => {
+ await post(`/payment/${id}/print`, { id });
+ success('Printing!');
+ };
+
fee = fee || 0;
</script>
@@ -52,6 +57,7 @@
<span class="text-lg text-secondary">Tip</span>
<div>
{f(fiat(tip, rate), currency)}
+ ({Math.round((tip * 100) / Math.abs(a))}%)
<span class="text-secondary text-lg">
⚡️{s(tip)}
</span>
@@ -106,4 +112,11 @@
</div>
</div>
{/if}
+
+ {#if user.username.toLowerCase() === 'laughingbean'}
+ <button
+ class="text-sm md:text-lg rounded-full border py-2 px-4 hover:opacity-80 min-w-[72px] bg-black text-white"
+ on:click={print}>Print Receipt</button
+ >
+ {/if}
</div>
diff --git a/src/routes/(app)/payment/[id]/print/+server.js b/src/routes/(app)/payment/[id]/print/+server.js
new file mode 100644
index 00000000..fde834d1
--- /dev/null
+++ b/src/routes/(app)/payment/[id]/print/+server.js
@@ -0,0 +1,7 @@
+import { auth, post } from '$lib/utils';
+import { json } from '@sveltejs/kit';
+
+export async function POST({ cookies, request }) {
+ let body = await request.json();
+ return json(post('/print', body, auth(cookies)));
+}
diff --git a/src/routes/(app)/pot/[name]/+page.svelte b/src/routes/(app)/pot/[name]/+page.svelte
index 2d93abfc..7b3d890b 100644
--- a/src/routes/(app)/pot/[name]/+page.svelte
+++ b/src/routes/(app)/pot/[name]/+page.svelte
@@ -6,7 +6,7 @@
import { toast } from '@zerodevx/svelte-toast';
import { t } from '$lib/translations';
import { copy, f, s, sat, sats } from '$lib/utils';
- import { loginRedirect, selectedRate } from '$lib/store';
+ import { loginRedirect } from '$lib/store';
export let data;
diff --git a/src/routes/(app)/send/+layout.svelte b/src/routes/(app)/send/+layout.svelte
index e5c9c051..6192cd40 100644
--- a/src/routes/(app)/send/+layout.svelte
+++ b/src/routes/(app)/send/+layout.svelte
@@ -8,30 +8,11 @@
export let data;
- let loaded;
let { user } = data;
-
- onMount(() => setTimeout(() => (loaded = true), 500));
let cancel = () => goto(`/${user.username}`);
-
- $: browser && loaded && checkPin($pin);
- let checkPin = async (p) => {
- if (p?.length !== 6 || p === JSON.parse(sessionStorage.getItem('pin'))) return;
- let result;
- try {
- result = await post('/pin', { pin: p });
- } catch (e) {}
-
- if (result) {
- success('Pin confirmed');
- } else {
- fail('Invalid pin');
- $pin = '';
- }
- };
</script>
-{#if loaded && user.haspin && (!$pin || $pin?.length !== 6)}
+{#if user.haspin && (!$pin || $pin?.length !== 6)}
<Pin bind:value={$pin} {cancel} />
{/if}
diff --git a/src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.svelte b/src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.svelte
index 77d5fde6..342eeebe 100644
--- a/src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.svelte
+++ b/src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.svelte
@@ -5,15 +5,18 @@
import { Toggle, Slider, Icon, Numpad, Spinner } from '$comp';
import { page } from '$app/stores';
import { fiat as toFiat, f, back, s, sat } from '$lib/utils';
- import { pin, selectedRate } from '$lib/store';
+ import { pin } from '$lib/store';
export let data;
export let form;
+ let { rates } = data;
let { address, amount } = $page.params;
let { balance, currency } = data.user;
let loading, submit, fiat, confirmed, feeRate, min, max, fee, ourfee, stale, subtract, adjusting;
+ $: rate = rates[currency];
+
let toggle = () => (loading = true);
let toggleAdjusting = () => (adjusting = !adjusting);
@@ -64,7 +67,7 @@
{#if confirmed}
<div class="text-center">
<h2 class="text-2xl md:text-3xl font-semibold">
- {f(toFiat(amount, $selectedRate), currency)}
+ {f(toFiat(amount, rate), currency)}
</h2>
<h3 class="text-secondary md:text-lg mb-6 mt-1">⚡️{s(amount)}</h3>
</div>
@@ -74,7 +77,7 @@
<div class="relative">
<h2 class="text-xl font-semibold">
- {f(toFiat(fee + ourfee, $selectedRate), currency)}
+ {f(toFiat(fee + ourfee, rate), currency)}
</h2>
<h3 class="text-secondary mb-6 mt-1">⚡️{s(fee + ourfee)}</h3>
<button class="absolute right-1/4 top-0 text-secondary p-4" on:click={toggleAdjusting}
@@ -83,7 +86,7 @@
</div>
</div>
{:else}
- <Numpad bind:amount bind:fiat {currency} {submit} />
+ <Numpad bind:amount bind:fiat {currency} {submit} bind:rate />
{/if}
<form method="POST" use:enhance on:submit={toggle}>
diff --git a/src/routes/(app)/send/invoice/[id]/+page.server.js b/src/routes/(app)/send/invoice/[id]/+page.server.js
index c9c2b222..4cbbb03f 100644
--- a/src/routes/(app)/send/invoice/[id]/+page.server.js
+++ b/src/routes/(app)/send/invoice/[id]/+page.server.js
@@ -7,6 +7,7 @@ export async function load({ params: { id }, parent, url }) {
let {
amount,
address,
+ currency,
hash,
rate,
prompt,
@@ -17,7 +18,7 @@ export async function load({ params: { id }, parent, url }) {
if (prompt && tip === null) throw redirect(307, `/${recipient.username}/invoice/${id}/tip`);
if (recipient.username === user.username) throw error(500, { message: 'Cannot send to self' });
- return { amount, address, hash, tip, rate, payreq: text, recipient };
+ return { amount, address, currency, hash, tip, rate, payreq: text, recipient };
}
export const actions = {
diff --git a/src/routes/(app)/send/invoice/[id]/+page.svelte b/src/routes/(app)/send/invoice/[id]/+page.svelte
index c9cb9392..d5c548a7 100644
--- a/src/routes/(app)/send/invoice/[id]/+page.svelte
+++ b/src/routes/(app)/send/invoice/[id]/+page.svelte
@@ -1,7 +1,7 @@
<script>
import { t } from '$lib/translations';
import { goto } from '$app/navigation';
- import { pin, selectedRate } from '$lib/store';
+ import { pin } from '$lib/store';
import { enhance } from '$app/forms';
import { Avatar, Icon, Numpad, Spinner } from '$comp';
import { page } from '$app/stores';
@@ -9,13 +9,13 @@
export let data;
export let form;
- let { address, payreq, recipient, rate, tip, user } = data;
+ let { address, rate, payreq, recipient, tip, rates, user } = data;
let { currency } = user;
let amount = form?.amount || data.amount;
let a,
af,
- amountFiat = amount * ($selectedRate / sats),
+ amountFiat = amount * (rate / sats),
fiat = !amount;
let setAmount = () => {
@@ -26,6 +26,8 @@
let loading;
let submit = () => (loading = true);
+ $: rate = data.rate * (rates[user.currency] / rates[data.currency]);
+
$: update(form);
let update = () => {
if (form?.message.includes('pin')) $pin = undefined;
@@ -75,7 +77,7 @@
</div>
</div>
{:else}
- <Numpad bind:amount={a} bind:amountFiat={af} {currency} bind:fiat />
+ <Numpad bind:amount={a} bind:amountFiat={af} {currency} bind:fiat bind:rate />
{/if}
<form method="POST" use:enhance on:submit={submit}>
diff --git a/src/routes/(app)/send/lightning/[payreq]/+page.svelte b/src/routes/(app)/send/lightning/[payreq]/+page.svelte
index af07a565..cb1b539e 100644
--- a/src/routes/(app)/send/lightning/[payreq]/+page.svelte
+++ b/src/routes/(app)/send/lightning/[payreq]/+page.svelte
@@ -10,13 +10,14 @@
export let form;
let { payreq } = $page.params;
- let { alias } = data;
+ let { alias, rates } = data;
let { currency } = data.user;
let a;
let maxfee = 100;
$: amount = form?.amount || data.amount;
+ $: rate = rates[currency];
let loading;
let submit = () => (loading = true);
@@ -91,7 +92,7 @@
{:else}
<form method="POST" action="?/setAmount" class="w-[300px] mx-auto" use:enhance>
<input type="hidden" value={a} name="amount" />
- <Numpad bind:amount={a} {currency} />
+ <Numpad bind:amount={a} {currency} {rate} />
<button
type="submit"
class="bg-black text-white rounded-xl h-[48px] flex w-full justify-center items-center font-semibold
diff --git a/src/routes/(app)/send/pot/[name]/[...amount]/+page.svelte b/src/routes/(app)/send/pot/[name]/[...amount]/+page.svelte
index da761cc2..6aecf8f3 100644
--- a/src/routes/(app)/send/pot/[name]/[...amount]/+page.svelte
+++ b/src/routes/(app)/send/pot/[name]/[...amount]/+page.svelte
@@ -10,9 +10,12 @@
export let form;
let { amount, name } = $page.params;
+ let { rates } = data;
let { currency } = data.user;
let loading;
+ $: rate = rates[currency];
+
let submit = () => (loading = true);
$: update(form);
let update = () => {
@@ -32,7 +35,7 @@
{/if}
<div class="container px-4 mt-20 max-w-xl mx-auto">
- <Numpad bind:amount {currency} />
+ <Numpad bind:amount {currency} bind:rate />
<form method="POST" use:enhance on:submit={submit}>
<input name="name" value={name} type="hidden" />
diff --git a/src/routes/(app)/send/user/[username]/[...amount]/+page.server.js b/src/routes/(app)/send/user/[username]/[...amount]/+page.server.js
index c63328e2..a01cdcfc 100644
--- a/src/routes/(app)/send/user/[username]/[...amount]/+page.server.js
+++ b/src/routes/(app)/send/user/[username]/[...amount]/+page.server.js
@@ -1,12 +1,34 @@
import { error, fail, redirect } from '@sveltejs/kit';
-import { fd, auth, get, post } from '$lib/utils';
+import { types, sats, fd, auth, get, post } from '$lib/utils';
-export async function load({ params, parent }) {
- let { user } = await parent();
- let { amount } = params;
+export async function load({ cookies, params, parent }) {
let subject = await get(`/users/${params.username}`);
+
+ let { rates, user } = await parent();
+ let { username } = params;
+ let [amount, currency] = params.amount.split('/');
+
if (subject.username === user?.username) throw error(500, { message: 'Cannot send to self' });
- return { amount, subject };
+
+ let rate;
+ if (amount) {
+ rate = rates[currency ? currency.toUpperCase() : subject.currency];
+ if (!rate) throw error(500, 'Invalid currency symbol');
+ if (currency) amount = (amount * sats) / rate;
+
+ let { hash } = await post(
+ '/invoice',
+ {
+ invoice: { amount, prompt: false, type: types.lightning },
+ user: { username }
+ },
+ auth(cookies)
+ );
+
+ throw redirect(307, `/${username}/invoice/${hash}`);
+ }
+
+ return { amount, rate, subject };
}
export const actions = {
diff --git a/src/routes/(app)/send/user/[username]/[...amount]/+page.svelte b/src/routes/(app)/send/user/[username]/[...amount]/+page.svelte
index af6a6368..9ce82d2e 100644
--- a/src/routes/(app)/send/user/[username]/[...amount]/+page.svelte
+++ b/src/routes/(app)/send/user/[username]/[...amount]/+page.svelte
@@ -1,7 +1,7 @@
<script>
import { t } from '$lib/translations';
import { goto } from '$app/navigation';
- import { pin, selectedRate } from '$lib/store';
+ import { pin } from '$lib/store';
import { enhance } from '$app/forms';
import { AppHeader, Avatar, Icon, Numpad, Spinner } from '$comp';
import { page } from '$app/stores';
@@ -10,23 +10,22 @@
export let data;
export let form;
- let { subject, rates, user } = data;
- let currency = user?.currency || 'USD';
+ let { subject, rate, rates, user } = data;
+ let currency = user.currency || subject.currency || 'USD';
let amount = form?.amount || data.amount;
let a,
af,
fiat = !amount,
hash,
- rate,
amountFiat = 0;
- selectedRate.subscribe((r) => rate || (amountFiat = amount * (r / sats)));
+ $: r = rate || rates[user.currency || subject.currency];
let setAmount = async () => {
amount = a;
amountFiat = parseFloat(af).toFixed(2);
- rate = fiat ? (sats * amountFiat) / amount : $selectedRate;
+ rate = fiat ? (sats * amountFiat) / amount : r;
({ hash } = await post(`/${subject.username}/invoice`, {
invoice: {
amount,
@@ -60,7 +59,7 @@
{/if}
<div class="container px-4 mt-20 max-w-xl mx-auto space-y-8">
- <Numpad bind:amount={a} bind:amountFiat={af} {currency} bind:fiat />
+ <Numpad bind:amount={a} bind:amountFiat={af} {currency} bind:fiat bind:rate={r} />
<form method="POST" use:enhance on:submit={submit}>
<input name="amount" value={amount} type="hidden" />
diff --git a/src/routes/(app)/support/+page.svelte b/src/routes/(app)/support/+page.svelte
index 8dbfc1af..b2f82e89 100644
--- a/src/routes/(app)/support/+page.svelte
+++ b/src/routes/(app)/support/+page.svelte
@@ -1,4 +1,5 @@
<script>
+ import { onDestroy } from 'svelte';
import { fail, success, post } from '$lib/utils';
import { scale } from 'svelte/transition';
import { AppHeader, Icon } from '$comp';
@@ -14,19 +15,32 @@
let email;
let message;
let sent;
+ let recaptchaSiteKey = '6LfCd8YkAAAAANmVJgzN3SQY3n3fv1RhiS5PgMYM';
let submit = (e) => {
e.preventDefault();
grecaptcha.ready(() => {
- grecaptcha
- .execute('6LfCd8YkAAAAANmVJgzN3SQY3n3fv1RhiS5PgMYM', { action: 'submit' })
- .then((token) =>
- post('/support', { email, message, token })
- .then(() => (sent = true))
- .catch(() => fail('problem submitting'))
- );
+ grecaptcha.execute(recaptchaSiteKey, { action: 'submit' }).then((token) =>
+ post('/support', { username: user?.username, email, message, token })
+ .then(() => (sent = true))
+ .catch(() => fail('problem submitting'))
+ );
});
};
+
+ onDestroy(() => {
+ const nodeBadge = document.querySelector('.grecaptcha-badge');
+ if (nodeBadge) {
+ document.body.removeChild(nodeBadge.parentNode);
+ }
+
+ const scriptSelector =
+ "script[src='https://www.google.com/recaptcha/api.js?render=" + recaptchaSiteKey + "']";
+ const script = document.querySelector(scriptSelector);
+ if (script) {
+ script.remove();
+ }
+ });
</script>
<svelte:head>
diff --git a/src/routes/(static)/docs/+page.svelte b/src/routes/(static)/docs/+page.svelte
index 8ddb98cd..e453464c 100644
--- a/src/routes/(static)/docs/+page.svelte
+++ b/src/routes/(static)/docs/+page.svelte
@@ -3,23 +3,20 @@
import { Code, Icon } from '$comp';
import { PUBLIC_COINOS_URL } from '$env/static/public';
export let data;
- let { token } = data;
- let api = PUBLIC_COINOS_URL + '/api';
+ let { user, token } = data;
+ let api = 'https://coinos.io/api';
- if (!token) token = '<login to see your token here>';
let tokenSample = `export token="${token}"`;
</script>
-<div class="space-y-8 lg:text-xl mt-20 w-full max-w-full">
- <h1 class="text-4xl">API Documentation</h1>
+<div class="space-y-8 lg:text-xl mt-20 pt-20 md:pt-0 w-full max-w-full">
+ <h1 class="text-4xl">Documentation</h1>
<p class="text-secondary">
- Coinos has a simple REST API that can be used to register accounts, fetch data, and make
- payments
+ Coinos has a simple REST API that can be used to register accounts and make payments and
+ queries.
</p>
- <p class="text-secondary">* = required parameter</p>
-
<h2 class="text-2xl">Base URL</h2>
<div class="bg-black text-white rounded-lg p-4 flex gap-4">
<div>{api}</div>
@@ -28,14 +25,16 @@
>
</div>
- <h2 class="text-2xl">Auth Token</h2>
- <p class="text-secondary">This JWT authorizes you to use the API</p>
- <div class="bg-black text-white rounded-lg p-4 flex gap-4">
- <div class="w-full break-all">{tokenSample}</div>
- <button class="ml-auto my-auto invert opacity-90" on:click={() => copy(tokenSample)}
- ><Icon icon="copy" style="w-10 max-w-none" /></button
- >
- </div>
+ {#if token}
+ <h2 class="text-2xl">Auth Token</h2>
+ <p class="text-secondary">This token authorizes you to use the API as <b>{user.username}</b></p>
+ <div class="bg-black text-white rounded-lg p-4 flex gap-4">
+ <div class="w-full break-all">{tokenSample}</div>
+ <button class="ml-auto my-auto invert opacity-90" on:click={() => copy(tokenSample)}
+ ><Icon icon="copy" style="w-10 max-w-none" /></button
+ >
+ </div>
+ {/if}
<h2 class="text-2xl">POST /register</h2>
<p class="text-secondary">Register a new user account with a username and password</p>
@@ -47,91 +46,54 @@
<h2 class="text-2xl">POST /invoice</h2>
<p class="text-secondary">Create an invoice.</p>
- <div>
- <div class="text-secondary">
- <span class="font-mono font-bold">type</span>: bitcoin or lightning
- </div>
- <div class="text-secondary">
- <span class="font-mono font-bold">amount</span>: amount in satoshis
- </div>
- <div class="text-secondary">
- <span class="font-mono font-bold">webhook</span>: an endpoint to hit when the invoice is paid
- </div>
- <div class="text-secondary">
- <span class="font-mono font-bold">secret</span>: a secret string for the webhook to check
+
+ <div class="text-secondary">
+ <div>Request params</div>
+ <div class="grid grid-cols-3 ml-2">
+ <div class="font-bold">type</div>
+ <div class="col-span-2">bitcoin or lightning</div>
+ <div class="font-bold">amount</div>
+ <div class="col-span-2">amount in satoshis</div>
+ <div class="font-bold">webhook</div>
+ <div class="col-span-2">(optional) endpoint to hit when the invoice is paid</div>
+ <div class="font-bold">secret</div>
+ <div class="col-span-2">a secret for the webhook to check</div>
</div>
</div>
- hey
<Code sample="invoice" />
+ <p>Sample response</p>
+ <Code sample="invoiceResponse" />
+ <p>You can check the <b>received</b> field to see how many satoshis have been paid so far</p>
+
<h2 class="text-2xl">GET /invoice/:hash</h2>
<p class="text-secondary">
Fetch an invoice by passing a bitcoin address or lightning payment hash
</p>
<Code sample="fetchInvoice" />
-</div>
-<!-- echo Login and get an API token -->
-<!-- token=$(curl -s "$api/taboggan" -H "$json" -d '{"username": "'$username'", "password": "'$password'"}' | jq -r .token) -->
-<!-- echo $token -->
-<!-- echo "" -->
-<!-- -->
-<!-- username="apidemo" -->
-<!-- token="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFwaWRlbW8iLCJpYXQiOjE2NDAxMzIwNjd9.aBtcrnLjDS_Zixn5_X_N8sqX0KxTDrVySSqh1fa96rk" -->
-<!-- auth="Authorization: Bearer $token" -->
-<!-- -->
-<!-- echo Get account balance in satoshis -->
-<!-- curl -s "$api/me" -H "$json" -H "$auth" | jq '.account.balance' -->
-<!-- echo "" -->
-<!-- -->
-<!-- echo Get the current price of bitcoin in USD -->
-<!-- curl -s "$api/rates" -H "$json" | jq '.USD' -->
-<!-- echo "" -->
-<!-- -->
-<!-- echo Create a legacy Bitcoin address -->
-<!-- address=$(curl -s "$api/address?network=bitcoin&#38;type=legacy" -H "$auth" -H "$json" | jq -r .address) -->
-<!-- echo $address -->
-<!-- echo "" -->
-<!-- -->
-<!-- echo Create an invoice to associate the address with the user -->
-<!-- curl -s "$api/invoice" -H "$json" -d '{"invoice": {"address": "'$address'", "network": "bitcoin"}, "user": {"username": "'$username'"}}' > /dev/null -->
-<!-- echo "" -->
-<!-- -->
-<!-- msg="testingtesting123" -->
-<!-- echo Sign a message with the address: $msg $address -->
-<!-- curl -s "$api/signMessage" -H "$json" -H "$auth" -d '{"address": "'$address'", "message": "'$msg'"}' -->
-<!-- echo "" -->
-<!-- -->
-<!-- echo Create a bech32 Bitcoin address -->
-<!-- address=$(curl -s "$api/address?network=bitcoin&#38;type=bech32" -H "$auth" -H "$json" | jq -r .address) -->
-<!-- echo $address -->
-<!-- echo "" -->
-<!-- -->
-<!-- echo Create a lightning invoice -->
-<!-- text=$(curl -s "$api/lightning/invoice" -H "$auth" -H "$json" -d '{"amount": 100}') -->
-<!-- echo $text -->
-<!-- echo "" -->
-<!-- -->
-<!-- echo Associate the lightning invoice with the user -->
-<!-- curl -s "$api/invoice" -H "$json" -d '{"invoice": {"text": "'$text'", "network": "bitcoin"}, "user": {"username": "'$username'"}}' > /dev/null -->
-<!-- echo "" -->
-<!-- -->
-<!-- echo Get an external invoice -->
-<!-- payreq=$(curl -s https://legend.lnbits.com/api/v1/payments -H "$json" -H "x-api-key: 698e5b6744f8442880ba3ad630756c02" -d '{ "out": false, "amount": 50, "memo": "test", "unit": "sat", "lnurl_callback": null }' | jq -r .payment_request) -->
-<!-- echo $payreq -->
-<!-- echo "" -->
-<!-- -->
-<!-- echo Send a lightning payment -->
-<!-- curl -s "$api/lightning/send" -H "$json" -H "$auth" -d '{"payreq": "'$payreq'"}' | jq -r '{ amount, fee, balance: (.account.balance)}' -->
-<!-- echo "" -->
-<!-- -->
-<!-- echo Send a bitcoin payment -->
-<!-- tx=$(curl -s "$api/bitcoin/fee" -H "$json" -H "$auth" -d '{"address": "bc1qqc9azhdjjpdxenrndt8cw4tw9del5pyrjn0wln", "amount": 1200, "feeRate": 1000 }') -->
-<!-- hex=$(echo $tx | jq -r .tx.hex) -->
-<!-- fee=$(echo $tx | jq -r .tx.fee) -->
-<!-- -->
-<!-- curl -s "$api/bitcoin/send" -H "$json" -H "$auth" -d '{"address": "bc1qqc9azhdjjpdxenrndt8cw4tw9del5pyrjn0wln", "tx": { "hex": "'$hex'", "fee": "'$fee'" }}' | jq -r '{ amount, fee, balance: (.account.balance)}' -->
-<!-- echo "" -->
+ <h2 class="text-2xl">GET /payments</h2>
+ <p class="text-secondary">Get all payments sent or received by the current user</p>
+
+ <div class="text-secondary">
+ <div>Query params</div>
+ <div class="grid grid-cols-3 ml-2">
+ <div class="font-bold">start</div>
+ <div class="col-span-2">only payments after this unix time</div>
+ <div class="font-bold">end</div>
+ <div class="col-span-2">only payments before this unix time</div>
+ <div class="font-bold">limit</div>
+ <div class="col-span-2">limit to this integer number of results</div>
+ <div class="font-bold">offset</div>
+ <div class="col-span-2">start limiting from this integer offset</div>
+ </div>
+ </div>
+ <Code sample="payments" />
-<!-- `} -->
+ <h2 class="text-2xl">Websocket API</h2>
+ <p class="text-secondary">Subscribe to real time rates and payments</p>
+
+ <div>Authenticate</div>
+ <Code sample="socketAuth" />
+</div>
diff --git a/vite.config.js b/vite.config.js
index edb1caae..98da50ab 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -1,13 +1,10 @@
import { sveltekit } from '@sveltejs/kit/vite';
-import { nodePolyfills } from 'vite-plugin-node-polyfills';
-import wasm from 'vite-plugin-wasm';
-import topLevelAwait from 'vite-plugin-top-level-await';
import path from 'path';
/** @type {import('vite').UserConfig} */
const config = {
- plugins: [nodePolyfills(), sveltekit(), topLevelAwait(), wasm()],
+ plugins: [sveltekit()],
resolve: {
alias: {
$comp: path.resolve('src/components/index.js')