diff --git a/create-wallet.js b/create-wallet.js index 248674b..228a838 100644 --- a/create-wallet.js +++ b/create-wallet.js @@ -1,34 +1,52 @@ +"use strict"; + +require("dotenv").config({ path: ".env" }); + // See https://dashplatform.readme.io/docs/tutorial-create-and-fund-a-wallet -const Dash = require('dash'); - -const clientOpts = { - network: 'testnet', - wallet: { - mnemonic: null, // this indicates that we want a new wallet to be generated - // if you want to get a new address for an existing wallet - // replace 'null' with an existing wallet mnemonic - offlineMode: true, // this indicates we don't want to sync the chain - // it can only be used when the mnemonic is set to 'null' - }, -}; - -const client = new Dash.Client(clientOpts); - -const createWallet = async () => { +const Dash = require("dash"); + +const Mnemonic = require("./lib/mnemonic.js"); +const store = require("./lib/store.js").create({ + filepath: "./db.json", + namespace: "dash", +}); + +async function main() { + const clientOpts = { + network: "testnet", + wallet: { + adapter: store, + // `null` would indicates that we want a new wallet to be generated + mnemonic: await Mnemonic.getOrCreate(process.env.MNEMONIC), + offlineMode: true, // this indicates we don't want to sync the chain + // it can only be used when the mnemonic is set to 'null' + }, + }; + + const client = new Dash.Client(clientOpts); + // Handle wallet async errors + client.on("error", (error, context) => { + console.error(`Client error: ${error.name}`); + console.error(context); + }); + + let err = await createWallet(client).catch(function (e) { + return e; + }); + client.disconnect(); + if (err) { + throw err; + } +} + +async function createWallet(client) { const account = await client.getWalletAccount(); - const mnemonic = client.wallet.exportWallet(); const address = account.getUnusedAddress(); - console.log('Mnemonic:', mnemonic); - console.log('Unused address:', address.address); -}; - -createWallet() - .catch((e) => console.error('Something went wrong:\n', e)) - .finally(() => client.disconnect()); - -// Handle wallet async errors -client.on('error', (error, context) => { - console.error(`Client error: ${error.name}`); - console.error(context); -}); \ No newline at end of file + console.log("Unused address:", address.address); +} + +main().catch(function (err) { + console.error("Something went wrong:"); + console.error(err.stack); +}); diff --git a/lib/mnemonic.js b/lib/mnemonic.js new file mode 100644 index 0000000..0892402 --- /dev/null +++ b/lib/mnemonic.js @@ -0,0 +1,34 @@ +"use strict"; + +let Mnemonic = module.exports; + +let Fs = require("fs").promises; +let CoreMnemonic = require("@dashevo/dashcore-lib/lib/mnemonic/"); + +/** + * @param {String} [mnemonic] - string of 12 whitespace-delimited words + * @returns {Promise} + */ +Mnemonic.getOrCreate = async function (mnemonic) { + if (mnemonic) { + return mnemonic; + } + + mnemonic = new CoreMnemonic().toString(); + + let txt = await Fs.readFile(".env", "utf8").catch(function (err) { + if ("ENOENT" !== err.code) { + throw err; + } + return ""; + }); + + if (!txt.endsWith("\n")) { + txt += "\n"; + } + txt += `MNEMONIC='${mnemonic}'\n`; + await Fs.writeFile(".env", txt, "utf8"); + console.info("Wrote MNEMONIC='' to .env"); + + return mnemonic; +}; diff --git a/lib/store.js b/lib/store.js new file mode 100644 index 0000000..6d00ab6 --- /dev/null +++ b/lib/store.js @@ -0,0 +1,45 @@ +"use strict"; + +let Store = module.exports; + +let DomStorage = require("dom-storage"); +let JsonStorage = require("json-storage").JsonStorage; + +/** + * @typedef {Object} CoreStorage + * @property {CoreStorageGetItem} getItem + * @property {CoreStorageSetItem} setItem + */ + +/** + * @typedef {Function} CoreStorageGetItem + * @param {String} key + */ + +/** + * @typedef {Function} CoreStorageSetItem + * @param {String} key + * @param {any} value + */ + +/** + * @param {Object} opts + * @param {String} opts.filepath - path of JSON db file + * @param {String} opts.namespace - namespace prefix for JSON storage + * @returns {CoreStorage} + */ +Store.create = function ({ filepath, namespace }) { + let myLocalStorage = new DomStorage(filepath, { strict: true, ws: " " }); + /** @type {CoreStorage} */ + //@ts-ignore + let store = JsonStorage.create(myLocalStorage, namespace, { + stringify: true, + }); + + //@ts-ignore + store.getItem = store.get; + //@ts-ignore + store.setItem = store.set; + + return store; +}; diff --git a/package-lock.json b/package-lock.json index 758ff14..3158ef9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,9 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "dash": "^3.22.7" + "dash": "^3.22.7", + "dom-storage": "^2.1.0", + "json-storage": "^2.1.2" }, "devDependencies": { "dotenv": "^16.0.0", @@ -873,6 +875,14 @@ "node": ">=6.0.0" } }, + "node_modules/dom-storage": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/dom-storage/-/dom-storage-2.1.0.tgz", + "integrity": "sha512-g6RpyWXzl0RR6OTElHKBl7nwnK87GUyZMYC7JWsB/IA73vpqK2K6LT39x4VepLxlSsWBFrPVLnsSR5Jyty0+2Q==", + "engines": { + "node": "*" + } + }, "node_modules/dotenv": { "version": "16.0.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.0.tgz", @@ -1521,6 +1531,14 @@ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" }, + "node_modules/json-storage": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/json-storage/-/json-storage-2.1.2.tgz", + "integrity": "sha512-jUCntp87bttsDzO2RCHEFtv3CabycupCcXknPkvUwWW5UBHqc6gIl2g52w9U5efxT9imNUk/R+XT2wZouKfNFQ==", + "engines": { + "node": ">= v0.2.0" + } + }, "node_modules/kuler": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", @@ -3053,6 +3071,11 @@ "esutils": "^2.0.2" } }, + "dom-storage": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/dom-storage/-/dom-storage-2.1.0.tgz", + "integrity": "sha512-g6RpyWXzl0RR6OTElHKBl7nwnK87GUyZMYC7JWsB/IA73vpqK2K6LT39x4VepLxlSsWBFrPVLnsSR5Jyty0+2Q==" + }, "dotenv": { "version": "16.0.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.0.tgz", @@ -3541,6 +3564,11 @@ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" }, + "json-storage": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/json-storage/-/json-storage-2.1.2.tgz", + "integrity": "sha512-jUCntp87bttsDzO2RCHEFtv3CabycupCcXknPkvUwWW5UBHqc6gIl2g52w9U5efxT9imNUk/R+XT2wZouKfNFQ==" + }, "kuler": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", diff --git a/package.json b/package.json index 9241144..d0fab54 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,9 @@ }, "homepage": "https://github.com/dashevo/platform-readme-tutorials#readme", "dependencies": { - "dash": "^3.22.7" + "dash": "^3.22.7", + "dom-storage": "^2.1.0", + "json-storage": "^2.1.2" }, "devDependencies": { "dotenv": "^16.0.0",