From 1d7dc6d7fa53f1d684867e498695f1e56b521020 Mon Sep 17 00:00:00 2001 From: Jeff Garzik Date: Thu, 8 Aug 2013 15:43:35 -0400 Subject: [PATCH] Add Wallet object (required by wally, and soon txtool) --- Wallet.js | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 Wallet.js diff --git a/Wallet.js b/Wallet.js new file mode 100644 index 000000000..5178c577a --- /dev/null +++ b/Wallet.js @@ -0,0 +1,78 @@ +require('classtool'); + +function ClassSpec(b) { + var fs = require('fs'); + var EncFile = require('./util/EncFile'); + var networks = require('./networks'); + var ENC_METHOD = 'aes-256-cbc'; + + var skeleton = { + client: 'libcoin', + client_version: '0.0.1', + network: 'testnet', + version: 1, + best_hash: null, + best_height: -1, + keys: [], + }; + + function Wallet(cfg) { + if (typeof cfg !== 'object') + cfg = {}; + + // deep copy (no references) + if (cfg.datastore) + this.datastore = JSON.parse(JSON.stringify(cfg.datastore)); + else + this.datastore = JSON.parse(JSON.stringify(skeleton)); + + this.network = undefined; + this.dirty = cfg.dirty || true; + }; + + Wallet.prototype.readSync = function(filename, passphrase) { + this.datastore = EncFile.readJFileSync(ENC_METHOD, + passphrase, filename); + this.dirty = false; + }; + + Wallet.prototype.writeSync = function(filename, passphrase) { + var tmp_fn = filename + ".tmp"; + + EncFile.writeJFileSync(ENC_METHOD, passphrase, tmp_fn, + this.datastore); + fs.renameSync(tmp_fn, filename); + + this.dirty = false; + }; + + Wallet.prototype.setNetwork = function(netname) { + if (!netname) + netname = this.datastore.network; + + switch (netname) { + case "mainnet": + case "livenet": + this.network = networks.livenet; + break; + case "testnet": + this.network = networks.testnet; + break; + default: + throw new Error("Unsupported network"); + } + + // store+canonicalize name + this.datastore['network'] = this.network.name; + this.dirty = true; + }; + + Wallet.prototype.addKey = function(wkey) { + this.datastore.keys.push(wkey); + this.dirty = true; + }; + + return Wallet; +}; +module.defineClass(ClassSpec); +