diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9139ffd --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +public +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..1592248 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,6 @@ +# Files Prettier should not format +**/*.log +**/.DS_Store +*. +dist +node_modules diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..df8e147 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,9 @@ +{ + "printWidth": 80, + "tabWidth": 2, + "singleQuote": true, + "bracketSpacing": true, + "proseWrap": "always", + "semi": false, + "trailingComma": "all" + } \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..361493b --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2022 jojobyte +Copyright (c) 2022 Dash Incubator + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..b9fd732 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# CrowdNode UI +### a Graphical User Interface (GUI) for [CrowdNode.js](https://github.com/dashhive/crowdnode.js) using Vanilla HTML, CSS & JS + +Should meet the requirements from https://github.com/dashhive/crowdnode-ui/issues/1 & https://github.com/dashhive/crowdnode.js/issues/47 + diff --git a/index.css b/index.css new file mode 100644 index 0000000..576aeca --- /dev/null +++ b/index.css @@ -0,0 +1,216 @@ + +:root { + color-scheme: light dark; + --c: #111; /* base interactive color */ + --oc: #222; /* off interactive color */ + --hc: #555; /* highlight color */ + --d: #242424; /* base bg color */ + --l: #eee; /* base color */ + --bgc: var(--d); + --fc: var(--l); + + --info: #0bf; + --note: #888; + --dang: #f55; /* danger */ + --succ: #5b5; /* success */ + + --fb: -apple-system, BlinkMacSystemFont, Avenir, "Avenir Next", + "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", + "Droid Sans", "Helvetica Neue", sans-serif; + --fm: "IBM Plex Mono", Consolas, "Andale Mono WT", "Andale Mono", + "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", + "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", Monaco, + "Courier New", Courier, monospace; + font-family: var(--fb); + font-size: 16px; + line-height: 24px; + font-weight: 400; + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +* { box-sizing: border-box; } + +@media (prefers-color-scheme: light) { + html:not(.it),img,video { filter: invert(95%) hue-rotate(180deg); } +} +@media (prefers-color-scheme: dark) { + html.it,img,video { filter: invert(95%) hue-rotate(180deg); } +} + +body { + background: var(--bgc); + color: var(--fc); + margin: 0; + display: flex; + flex-direction: column; + place-items: center; + min-width: 320px; + min-height: 100vh; +} +header { + margin: 0 auto; + padding: 0 2rem; + max-width: 1100px; + min-height: 85px; + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + flex-direction: column-reverse; +} +main { + margin: 0 auto; + padding: 0 2rem; + max-width: 1100px; + /* min-height: 70vh; */ + width: 100%; +} +h1 { text-align: center; } +main form { + display: flex; + margin: 0 auto 1rem; + gap: .5rem; +} +form fieldset { border: 0; + display: flex; + flex-direction: column; + min-width: 200px; + width: 100%; + justify-content: left; + gap: .5rem; +} +/* label { display: flex; + flex-direction: row; + min-width: 100px; +} */ +button { + background-color: var(--oc); + color: var(--fc); + /* border-radius: 8px; */ + border: 1px solid var(--fc); + padding: 0.8rem 1.2rem; + font-size: 1.1em; + font-weight: 500; + font-family: inherit; + cursor: pointer; + transition: border-color 0.25s; +} +button:disabled { + background-color: var(--d); + color: var(--note); + border-color: var(--note); + cursor: not-allowed; +} +button:not(:disabled):hover { + background-color: var(--c); + color: var(--info); + border-color: var(--info); +} +button:not(:disabled):focus, +button:not(:disabled):focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} +input, select { + background-color: var(--c); + color: var(--fc); + border: 1px solid var(--hc); + text-align: center; + line-height: 1; + font-size: 1.5rem; + width: 100%; + height: 3rem; + /* max-width: 24rem; */ +} +table { + width: 100%; + table-layout: fixed; +} +table > tbody td { + padding: 1rem; + word-break: break-word; +} +table th:first-child, +table td:first-child { + width: 120px; +} +a { + color: var(--info); + text-decoration: none; +} +a:hover { + color: var(--info); + text-decoration: dashed; + text-decoration-line: underline; +} +pre { + background-color: var(--c); + font-family: var(--fm); + font-size: 14px; + padding: 1rem; + max-width: 100%; + /* overflow: auto; */ +} +pre code { + white-space: pre-line; +} +pre code > * { + display: inline; +} +pre code .dem { + color: var(--note); +} +pre code em { + color: var(--dang); + font-style: normal; +} +pre code address { + color: var(--succ); + font-style: normal; +} +pre code output { + color: var(--info); + font-style: italic; +} +form[name="network"] { + justify-content: center; +} + +.hide { + display: none; +} +.row { + flex-direction: row; +} +.col { + flex-direction: column; +} +.msg { + display: flex; + flex-direction: column; +} +.center { + align-content: center; + justify-items: center; + text-align: center; +} +.center form { + width: 100%; + flex-direction: column; + margin-bottom: 0; +} +.center input { + max-width: initial; + line-height: 2; +} +@media (min-width: 650px) { + form { + max-width: 60%; + } + header { + flex-direction: row; + } +} \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..e57d6b5 --- /dev/null +++ b/index.html @@ -0,0 +1,56 @@ + + + + + + CrowdNode.js UI + + + + + +
+

CrowdNode.js UI

+ +
+
+ + +
+
+ +
+
+ +
+
+ +
+
+ + +
+
+ +

Enter a valid Ðash address above to get the CrowdNode balance.

+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jsconfig.json b/jsconfig.json new file mode 100755 index 0000000..d775cea --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,41 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "target": "esnext", + "module": "esnext", + "moduleResolution": "node", + "maxNodeModuleJsDepth": 20, + "allowSyntheticDefaultImports": true, + "lib": [ + "DOM", + "DOM.Iterable", + "ESNext", + "WebWorker" + ], + "declaration": true, + "declarationDir": ".", + "declarationMap": true, + "allowJs": true, + "checkJs": true, + "noEmit": true, + "esModuleInterop": true, + // "forceConsistentCasingInFileNames": true, + // "strict": true, + // "strictNullChecks": true, + // "strictFunctionTypes": true, + // "noImplicitAny": true, + // "alwaysStrict": true, + "skipLibCheck": true, + // "types": ["bun-types"], + "types": ["node"], + "typeRoots": [ + "typings", + "node_modules/@types", + // "node_modules/dash" + ] + }, + "include": ["*.js", "bin/**/*.js", "lib/**/*.js", "src/**/*.js"], + "exclude": [ + "node_modules" + ] +} \ No newline at end of file diff --git a/main.js b/main.js new file mode 100644 index 0000000..ad30153 --- /dev/null +++ b/main.js @@ -0,0 +1,129 @@ +// import * as CrowdNode from './node_modules/crowdnode/crowdnode.js' +// import * as CrowdNode from 'crowdnode' +// import { CrowdNode } from "crowdnode"; + +// let DashKeys = window.DashKeys; + +let myPrivateKey + +// @ts-ignore +CrowdNode.init({ + baseUrl: 'https://dashnode.duckdns.org/api/cors/app.crowdnode.io', + insightBaseUrl: 'https://insight.dash.org/insight-api', + dashsocketBaseUrl: 'https://insight.dash.org/socket.io', + dashsightBaseUrl: 'https://dashsight.dashincubator.dev/insight-api', +}) + +async function getPrivateKey(wif) { + // Dash Core Lib Implementation + // @ts-ignore + // const { PrivateKey } = dashcore; + // const key = new PrivateKey(); + // const address = key.toAddress().toString(); + // // const WIF = key.toWIF().trim(); + + let addr + + if (!wif) { + wif = await DashKeys.generate(); + } + // ex: "XEez2HcUhEomZoxzgH7H3LxnRAkqF4kRCVE8mW9q4YSUV4yuADec" + + try { + addr = await DashKeys.wifToAddr(wif); + } catch (err) { + console.error('Invalid private key WIF') + } + // ex: "Xjn9fksLacciynroVhMLKGXMqMJtzJNLvQ" + + return { wif, addr } +} + +async function getBalance(address) { + // @ts-ignore + return await CrowdNode.http.GetBalance( + address + ); +} + +// @ts-ignore +console.log('CrowdNode', CrowdNode) + +// @ts-ignore +document.privKeyForm + .addEventListener('input', async event => { + console.log('change privKeyForm', event) + // @ts-ignore + document.privKeyForm.querySelector('button').disabled = false + }) +document.privKeyForm + .addEventListener('submit', async event => { + event.preventDefault() + // event.stopPropagation() + const privateKey = event.target.privateKey?.value + + myPrivateKey = window.myPrivateKey = await getPrivateKey(privateKey) + + if (myPrivateKey) { + console.log('privKey', myPrivateKey) + // @ts-ignore + document.privKeyForm.querySelector('button').disabled = true + // @ts-ignore + document.initCrowdNodeForm.querySelector('button').disabled = false + // @ts-ignore + document.balanceForm.querySelector('button').disabled = false + } + }) + +// @ts-ignore +document.initCrowdNodeForm.addEventListener('submit', async event => { + event.preventDefault() + // event.stopPropagation() + + // const privKey = getPrivateKey() + // @ts-ignore + const { hotwallet } = CrowdNode.main; + + if (myPrivateKey) { + // @ts-ignore + let cnSignup = await CrowdNode.signup(myPrivateKey.wif, hotwallet); + // @ts-ignore + let cnAccept = await CrowdNode.accept(myPrivateKey.wif, hotwallet); + + console.log('privKey', myPrivateKey, cnSignup, cnAccept) + } +}) + +// @ts-ignore +document.balanceForm.addEventListener('submit', async event => { + event.preventDefault() + // event.stopPropagation() + + // const addr = event.target.address?.value + + if (myPrivateKey) { + const { addr } = myPrivateKey + let balance = await getBalance(addr) + + if (balance?.TotalBalance) { + let msg = `Current CrowdNode balance for "${ + addr + }" is Đ${ + balance.TotalBalance + } with ${ + balance.TotalDividend + } in dividends.` + + console.info( + msg, + balance + ); + + document.querySelector('p.balance').textContent = msg + } else { + console.warn( + balance.value + ); + } + } +}) diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..82f4ac3 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1080 @@ +{ + "name": "crowdnode-ui", + "version": "0.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "crowdnode-ui", + "version": "0.0.0", + "license": "MIT", + "dependencies": { + "crowdnode": "^1.8.0", + "dashkeys": "^0.3.1", + "dashsight": "^1.3.5", + "dashwallet": "^0.2.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@dashevo/dashcore-lib": { + "version": "0.19.44", + "resolved": "https://registry.npmjs.org/@dashevo/dashcore-lib/-/dashcore-lib-0.19.44.tgz", + "integrity": "sha512-t22zf/wSpV5+kgr+rdiEnUCPmX7TEN30s8aLFNPYtPxJb17kLLGBHp+zwC+NQSKjXliT6T8XwX4cqoDT/IikLg==", + "dependencies": { + "@dashevo/x11-hash-js": "^1.0.2", + "@types/node": "^12.12.47", + "bloom-filter": "^0.2.0", + "bls-signatures": "^0.2.5", + "bn.js": "^4.12.0", + "bs58": "=4.0.1", + "elliptic": "^6.5.4", + "inherits": "=2.0.1", + "lodash": "^4.17.20", + "ripemd160": "^2.0.2", + "unorm": "^1.6.0" + } + }, + "node_modules/@dashevo/x11-hash-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@dashevo/x11-hash-js/-/x11-hash-js-1.0.2.tgz", + "integrity": "sha512-3vvnZweBca4URBXHF+FTrM4sdTpp3IMt73G1zUKQEdYm/kJkIKN94qpFai7YZDl87k64RCH+ckRZk6ruQPz5KQ==" + }, + "node_modules/@dashincubator/base58check": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@dashincubator/base58check/-/base58check-1.3.1.tgz", + "integrity": "sha512-v2vYOwsTmbfaADJUg+0Vsw61/P5XtdDnjZtImDIC5DePIA/2lT9V+00nR5GsKfwc40WQ02tFlN+xoFt9cx+P7A==", + "bin": { + "base58check": "bin/base58check.js" + } + }, + "node_modules/@dashincubator/ripemd160": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@dashincubator/ripemd160/-/ripemd160-2.3.0.tgz", + "integrity": "sha512-SfaUhvXti0Ut6ZhlAwurrRAG56phxqWozj72Hixx/v3LSQj1/wjkgTuDaexil672CzLD+RRWoPgp41BSM+DJJA==" + }, + "node_modules/@dashincubator/secp256k1": { + "version": "1.7.1-0", + "resolved": "https://registry.npmjs.org/@dashincubator/secp256k1/-/secp256k1-1.7.1-0.tgz", + "integrity": "sha512-ximJhou6YwJw0UHfsfeoDv1svhgriaWZrTV2yKhdZbs1BR/VaChGt+c+qpvQwPuMiP8MoW5B7n3HbXTtHLhS/w==" + }, + "node_modules/@root/base58check": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@root/base58check/-/base58check-1.0.1.tgz", + "integrity": "sha512-aK2kF0968I2xwewyYOHx5Fq1DVkRIsfb1lZmkjbbv06+dEa1bLpMUwHK/rpK46T43UoiZZU8X0Uv/JyZVNLqig==", + "dependencies": { + "base-x": "^4.0.0" + }, + "bin": { + "base58check": "bin/base58check.js" + } + }, + "node_modules/@root/base58check/node_modules/base-x": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", + "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" + }, + "node_modules/@root/passphrase": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@root/passphrase/-/passphrase-1.1.0.tgz", + "integrity": "sha512-uokMKGQ+wUiqHpvxWRZNj5QtSGvoLOfOND/ny7NZaV2+48mahzJPUbLE9y/xhf/536mi9UvwlnbgTyVqedVHUA==" + }, + "node_modules/@root/request": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@root/request/-/request-1.9.2.tgz", + "integrity": "sha512-wVaL9yVV9oDR9UNbPZa20qgY+4Ch6YN8JUkaE4el/uuS5dmhD8Lusm/ku8qJVNtmQA56XLzEDCRS6/vfpiHK2A==" + }, + "node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + }, + "node_modules/base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/bip39": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz", + "integrity": "sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==", + "dependencies": { + "@types/node": "11.11.6", + "create-hash": "^1.1.0", + "pbkdf2": "^3.0.9", + "randombytes": "^2.0.1" + } + }, + "node_modules/bip39/node_modules/@types/node": { + "version": "11.11.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", + "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==" + }, + "node_modules/bloom-filter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bloom-filter/-/bloom-filter-0.2.0.tgz", + "integrity": "sha512-RMG2RpnKczVzRsEYSPaT5rKsyj0w5/wpQRjaW4vOMe1WyUDQpoqxjNc10uROEjdhu63ytRt6aFRPXFePi/Rd7A==" + }, + "node_modules/bls-signatures": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/bls-signatures/-/bls-signatures-0.2.5.tgz", + "integrity": "sha512-5TzQNCtR4zWE4lM08EOMIT8l3b4h8g5LNKu50fUYP1PnupaLGSLklAcTto4lnH7VXpyhsar+74L9wNJII4E/4Q==" + }, + "node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/crowdnode": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/crowdnode/-/crowdnode-1.8.0.tgz", + "integrity": "sha512-PgP7foeXhQ+omQk6iw92n59zQeTVJ/MzVOQi5rYU4tmvHoRRMD6mbHczNxj7zETZIxxMURRPi38FnKPYtr4j+w==", + "dependencies": { + "@dashevo/dashcore-lib": "^0.19.41", + "dashsight": "^1.3.0-0" + }, + "bin": { + "crowdnode": "bin/crowdnode.js" + }, + "optionalDependencies": { + "@root/request": "^1.9.1", + "dotenv": "^16.0.1", + "qrcode-svg": "^1.1.0", + "tough-cookie": "^4.0.0", + "ws": "^8.8.0" + } + }, + "node_modules/dashkeys": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/dashkeys/-/dashkeys-0.3.1.tgz", + "integrity": "sha512-MErh3/ll7PcsW7e674CvVdF6nSzZSQi8Ryz9fhGvO1kfuou/IWvS+CNUYwxAdNz3PHNbXJ37QVV7QFHJhO1/yA==", + "dependencies": { + "@dashincubator/base58check": "^1.2.0", + "@dashincubator/ripemd160": "^2.3.0", + "@dashincubator/secp256k1": "^1.7.1-0" + }, + "bin": { + "dashkeys": "bin/dashkeys.js" + } + }, + "node_modules/dashsight": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/dashsight/-/dashsight-1.3.5.tgz", + "integrity": "sha512-IAY0KCRbxQ65CIKiRoYRepfh4/Vo1uk+/RIQfMQ5Z08R/r3DNPtZjDazgDaIozJIj0pvO1aYURkXWDE83+xf/Q==", + "dependencies": { + "@root/request": "^1.9.2" + }, + "bin": { + "dashsight-balance": "bin/balance.js", + "dashsight-instantsend": "bin/instantsend.js", + "dashsight-tx": "bin/tx.js", + "dashsight-txs": "bin/txs.js", + "dashsight-utxos": "bin/utxos.js" + }, + "optionalDependencies": { + "dotenv": "^16.0.1" + } + }, + "node_modules/dashwallet": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/dashwallet/-/dashwallet-0.2.1.tgz", + "integrity": "sha512-lBNJFm6sWhlutSTIdPufDenHKKg4oV5d/QD7XESx3hP94deVvH0xF2Bs6y/AKwzapqPGsxCHW24ITpnuRGO8yg==", + "dependencies": { + "@dashevo/dashcore-lib": "^0.19.44", + "@root/base58check": "^1.0.0", + "@root/passphrase": "^1.1.0", + "bip39": "^3.0.4", + "dashsight": "^1.3.5", + "hdkey": "github:dashhive/hdkey", + "ripemd160": "^2.0.2", + "secp256k1": "^4.0.3" + }, + "bin": { + "dashwallet": "bin/wallet.js" + } + }, + "node_modules/dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "optional": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hash.js/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/hdkey": { + "version": "2.0.1", + "resolved": "git+ssh://git@github.com/dashhive/hdkey.git#36ce1e866858df50e1d79950b692f2806e13d4ef", + "license": "MIT", + "dependencies": { + "bs58check": "^2.1.2", + "ripemd160": "^2.0.2", + "safe-buffer": "^5.1.1", + "secp256k1": "^4.0.0" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==" + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + }, + "node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + }, + "node_modules/node-gyp-build": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", + "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "optional": true + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qrcode-svg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/qrcode-svg/-/qrcode-svg-1.1.0.tgz", + "integrity": "sha512-XyQCIXux1zEIA3NPb0AeR8UMYvXZzWEhgdBgBjH9gO7M48H9uoHzviNz8pXw3UzrAcxRRRn9gxHewAVK7bn9qw==", + "optional": true, + "bin": { + "qrcode-svg": "bin/qrcode-svg.js" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "optional": true + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readable-stream/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "optional": true + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "hasInstallScript": true, + "dependencies": { + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", + "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", + "optional": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "optional": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "optional": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "optional": true, + "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 + } + } + } + }, + "dependencies": { + "@dashevo/dashcore-lib": { + "version": "0.19.44", + "resolved": "https://registry.npmjs.org/@dashevo/dashcore-lib/-/dashcore-lib-0.19.44.tgz", + "integrity": "sha512-t22zf/wSpV5+kgr+rdiEnUCPmX7TEN30s8aLFNPYtPxJb17kLLGBHp+zwC+NQSKjXliT6T8XwX4cqoDT/IikLg==", + "requires": { + "@dashevo/x11-hash-js": "^1.0.2", + "@types/node": "^12.12.47", + "bloom-filter": "^0.2.0", + "bls-signatures": "^0.2.5", + "bn.js": "^4.12.0", + "bs58": "=4.0.1", + "elliptic": "^6.5.4", + "inherits": "=2.0.1", + "lodash": "^4.17.20", + "ripemd160": "^2.0.2", + "unorm": "^1.6.0" + } + }, + "@dashevo/x11-hash-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@dashevo/x11-hash-js/-/x11-hash-js-1.0.2.tgz", + "integrity": "sha512-3vvnZweBca4URBXHF+FTrM4sdTpp3IMt73G1zUKQEdYm/kJkIKN94qpFai7YZDl87k64RCH+ckRZk6ruQPz5KQ==" + }, + "@dashincubator/base58check": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@dashincubator/base58check/-/base58check-1.3.1.tgz", + "integrity": "sha512-v2vYOwsTmbfaADJUg+0Vsw61/P5XtdDnjZtImDIC5DePIA/2lT9V+00nR5GsKfwc40WQ02tFlN+xoFt9cx+P7A==" + }, + "@dashincubator/ripemd160": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@dashincubator/ripemd160/-/ripemd160-2.3.0.tgz", + "integrity": "sha512-SfaUhvXti0Ut6ZhlAwurrRAG56phxqWozj72Hixx/v3LSQj1/wjkgTuDaexil672CzLD+RRWoPgp41BSM+DJJA==" + }, + "@dashincubator/secp256k1": { + "version": "1.7.1-0", + "resolved": "https://registry.npmjs.org/@dashincubator/secp256k1/-/secp256k1-1.7.1-0.tgz", + "integrity": "sha512-ximJhou6YwJw0UHfsfeoDv1svhgriaWZrTV2yKhdZbs1BR/VaChGt+c+qpvQwPuMiP8MoW5B7n3HbXTtHLhS/w==" + }, + "@root/base58check": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@root/base58check/-/base58check-1.0.1.tgz", + "integrity": "sha512-aK2kF0968I2xwewyYOHx5Fq1DVkRIsfb1lZmkjbbv06+dEa1bLpMUwHK/rpK46T43UoiZZU8X0Uv/JyZVNLqig==", + "requires": { + "base-x": "^4.0.0" + }, + "dependencies": { + "base-x": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", + "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" + } + } + }, + "@root/passphrase": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@root/passphrase/-/passphrase-1.1.0.tgz", + "integrity": "sha512-uokMKGQ+wUiqHpvxWRZNj5QtSGvoLOfOND/ny7NZaV2+48mahzJPUbLE9y/xhf/536mi9UvwlnbgTyVqedVHUA==" + }, + "@root/request": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@root/request/-/request-1.9.2.tgz", + "integrity": "sha512-wVaL9yVV9oDR9UNbPZa20qgY+4Ch6YN8JUkaE4el/uuS5dmhD8Lusm/ku8qJVNtmQA56XLzEDCRS6/vfpiHK2A==" + }, + "@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + }, + "base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "bip39": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz", + "integrity": "sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==", + "requires": { + "@types/node": "11.11.6", + "create-hash": "^1.1.0", + "pbkdf2": "^3.0.9", + "randombytes": "^2.0.1" + }, + "dependencies": { + "@types/node": { + "version": "11.11.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", + "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==" + } + } + }, + "bloom-filter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bloom-filter/-/bloom-filter-0.2.0.tgz", + "integrity": "sha512-RMG2RpnKczVzRsEYSPaT5rKsyj0w5/wpQRjaW4vOMe1WyUDQpoqxjNc10uROEjdhu63ytRt6aFRPXFePi/Rd7A==" + }, + "bls-signatures": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/bls-signatures/-/bls-signatures-0.2.5.tgz", + "integrity": "sha512-5TzQNCtR4zWE4lM08EOMIT8l3b4h8g5LNKu50fUYP1PnupaLGSLklAcTto4lnH7VXpyhsar+74L9wNJII4E/4Q==" + }, + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, + "bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "requires": { + "base-x": "^3.0.2" + } + }, + "bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "requires": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "crowdnode": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/crowdnode/-/crowdnode-1.8.0.tgz", + "integrity": "sha512-PgP7foeXhQ+omQk6iw92n59zQeTVJ/MzVOQi5rYU4tmvHoRRMD6mbHczNxj7zETZIxxMURRPi38FnKPYtr4j+w==", + "requires": { + "@dashevo/dashcore-lib": "^0.19.41", + "@root/request": "^1.9.1", + "dashsight": "^1.3.0-0", + "dotenv": "^16.0.1", + "qrcode-svg": "^1.1.0", + "tough-cookie": "^4.0.0", + "ws": "^8.8.0" + } + }, + "dashkeys": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/dashkeys/-/dashkeys-0.3.1.tgz", + "integrity": "sha512-MErh3/ll7PcsW7e674CvVdF6nSzZSQi8Ryz9fhGvO1kfuou/IWvS+CNUYwxAdNz3PHNbXJ37QVV7QFHJhO1/yA==", + "requires": { + "@dashincubator/base58check": "^1.2.0", + "@dashincubator/ripemd160": "^2.3.0", + "@dashincubator/secp256k1": "^1.7.1-0" + } + }, + "dashsight": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/dashsight/-/dashsight-1.3.5.tgz", + "integrity": "sha512-IAY0KCRbxQ65CIKiRoYRepfh4/Vo1uk+/RIQfMQ5Z08R/r3DNPtZjDazgDaIozJIj0pvO1aYURkXWDE83+xf/Q==", + "requires": { + "@root/request": "^1.9.2", + "dotenv": "^16.0.1" + } + }, + "dashwallet": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/dashwallet/-/dashwallet-0.2.1.tgz", + "integrity": "sha512-lBNJFm6sWhlutSTIdPufDenHKKg4oV5d/QD7XESx3hP94deVvH0xF2Bs6y/AKwzapqPGsxCHW24ITpnuRGO8yg==", + "requires": { + "@dashevo/dashcore-lib": "^0.19.44", + "@root/base58check": "^1.0.0", + "@root/passphrase": "^1.1.0", + "bip39": "^3.0.4", + "dashsight": "^1.3.5", + "hdkey": "github:dashhive/hdkey", + "ripemd160": "^2.0.2", + "secp256k1": "^4.0.3" + } + }, + "dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "optional": true + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + } + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + } + } + }, + "hdkey": { + "version": "git+ssh://git@github.com/dashhive/hdkey.git#36ce1e866858df50e1d79950b692f2806e13d4ef", + "from": "hdkey@github:dashhive/hdkey", + "requires": { + "bs58check": "^2.1.2", + "ripemd160": "^2.0.2", + "safe-buffer": "^5.1.1", + "secp256k1": "^4.0.0" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==" + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + }, + "node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + }, + "node-gyp-build": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", + "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==" + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "optional": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "optional": true + }, + "qrcode-svg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/qrcode-svg/-/qrcode-svg-1.1.0.tgz", + "integrity": "sha512-XyQCIXux1zEIA3NPb0AeR8UMYvXZzWEhgdBgBjH9gO7M48H9uoHzviNz8pXw3UzrAcxRRRn9gxHewAVK7bn9qw==", + "optional": true + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "optional": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + } + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "optional": true + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "requires": { + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + } + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "tough-cookie": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", + "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", + "optional": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + } + }, + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "optional": true + }, + "unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==" + }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "optional": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "optional": true, + "requires": {} + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..e8121f4 --- /dev/null +++ b/package.json @@ -0,0 +1,36 @@ +{ + "name": "crowdnode-ui", + "description": "a Graphical User Interface (GUI) for CrowdNode.js", + "license": "MIT", + "version": "0.0.0", + "keywords": [ + "crowdnode", + "dash", + "cryptocurrency", + "gui", + "html", + "css", + "js", + "vanilla" + ], + "repository": { + "type": "git", + "url": "https://github.com/dashhive/crowdnode-ui.git" + }, + "author": "jojobyte (https://jojo.io/)", + "type": "module", + "private": true, + "main": "index.html", + "scripts": { + "start": "npx serve -l 5555 ." + }, + "engines": { + "node": ">=18.0.0" + }, + "dependencies": { + "crowdnode": "^1.8.0", + "dashkeys": "^0.3.1", + "dashsight": "^1.3.5", + "dashwallet": "^0.2.1" + } +} diff --git a/utils.js b/utils.js new file mode 100644 index 0000000..39f5b35 --- /dev/null +++ b/utils.js @@ -0,0 +1,123 @@ +// From https://github.com/dashhive/dashkeys.js#helpful-helper-functions + +// let Base58Check = require("@dashincubator/base58check").Base58Check; +let dash58check = Base58Check.create({ + pubKeyHashVersion: "4c", // "8c" for dash testnet, "00" for bitcoin main + privateKeyVersion: "cc", // "ef" for dash testnet, "80" for bitcoin main +}); + +/** +* @param {String} addr +* @returns {Promise} - p2pkh (no magic byte or checksum) +*/ +async function addrToPubKeyHash(addr) { + let b58cAddr = dash58check.decode(addr); + let pubKeyHash = hexToUint8Array(b58cAddr.pubKeyHash); + return pubKeyHash; +} + +/** +* @param {Uint8Array} pubKeyHash - no magic byte or checksum +* @returns {Promise} - Pay Addr +*/ +async function pubKeyHashToAddr(pubKeyHash) { + let hex = uint8ArrayToHex(pubKeyHash); + let addr = await dash58check.encode({ pubkeyHash: hex }); + return addr; +} + +/** +* @param {String} wif +* @returns {Promise} - private key (no magic byte or checksum) +*/ +async function wifToPrivateKey(wif) { + let b58cWif = dash58check.decode(wif); + let privateKey = hexToUint8Array(b58cWif.privateKey); + return privateKey; +} + +/** +* @param {Uint8Array} privKey +* @returns {Promise} - wif +*/ +async function privateKeyToWif(privKey) { + let privateKey = uint8ArrayToHex(privKey); + + let wif = await dash58check.encode({ privateKey: privateKey }); + return wif; +} + +/** +* @param {String} addrOrWif +*/ +async function decode(addrOrWif) { + let parts = await dash58check.decode(addrOrWif); + let check = await dash58check.checksum(parts); + let valid = parts.check === check; + + parts.valid = valid; + //parts.privateKeyBuffer = hexToUint8Array(parts.privateKey); + //parts.pubKeyHashBuffer = hexToUint8Array(parts.pubKeyHash); + + return parts; +} + +/** +* @param {Uint8Array} buf +* @returns {String} - Pay Addr or WIF +* @throws {Error} +*/ +async function encode(buf) { + let hex = uint8ArrayToHex(buf); + + if (32 === buf.length) { + return await dash58check.encode({ + privateKey: hex, + }); + } + + if (20 === buf.length) { + return await dash58check.encode({ + pubKeyHash: hex, + }); + } + + throw new Error("buffer length must be (PubKeyHash) or 32 (PrivateKey)"); +} + +/** +* JS Buffer to Hex that works in browsers and Little-Endian +* (which is most of the - ARM, x64, x86, WASM, etc) +* @param {Uint8Array} buf +* @returns {String} - hex +*/ +function uint8ArrayToHex(buf) { + /** @type {Array} */ + let hex = []; + + buf.forEach(function (b) { + let c = b.toString(16).padStart(2, "0"); + hex.push(c); + }); + + return hex.join(""); +} + +/** +* Hex to JS Buffer that works in browsers and Little-Endian CPUs +* (which is most of the - ARM, x64, x86, WASM, etc) +* @param {String} hex +* @returns {Uint8Array} - JS Buffer (Node and Browsers) +*/ +function hexToUint8Array(hex) { + let buf = new Uint8Array(hex.length / 2); + + for (let i = 0; i < hex.length; i += 2) { + let c = hex.slice(i, i + 2); + let b = parseInt(c, 16); + let index = i / 2; + buf[index] = b; + } + + return buf; +} \ No newline at end of file