2015-02-12 11:42:32 -08:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
var _ = require('lodash');
|
|
|
|
var async = require('async');
|
|
|
|
var log = require('npmlog');
|
|
|
|
var request = require('request')
|
|
|
|
log.debug = log.verbose;
|
|
|
|
log.level = 'debug';
|
|
|
|
var fs = require('fs')
|
|
|
|
|
|
|
|
var Bitcore = require('bitcore')
|
2015-02-12 11:50:10 -08:00
|
|
|
var SignUtils = require('./signutils');
|
2015-02-12 11:42:32 -08:00
|
|
|
|
|
|
|
var BASE_URL = 'http://localhost:3001/copay/api/';
|
|
|
|
|
2015-02-12 13:54:17 -08:00
|
|
|
var clilib = {};
|
2015-02-12 11:50:10 -08:00
|
|
|
|
|
|
|
|
|
|
|
function _getUrl(path) {
|
2015-02-12 11:42:32 -08:00
|
|
|
return BASE_URL + path;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2015-02-12 13:54:17 -08:00
|
|
|
function _signRequest(url, args) {
|
2015-02-12 11:42:32 -08:00
|
|
|
|
|
|
|
};
|
|
|
|
|
2015-02-12 13:54:17 -08:00
|
|
|
function _save(data) {
|
|
|
|
fs.writeFileSync('.bit', JSON.stringify(data));
|
2015-02-12 11:42:32 -08:00
|
|
|
};
|
|
|
|
|
2015-02-12 13:54:17 -08:00
|
|
|
function _load() {
|
2015-02-12 11:42:32 -08:00
|
|
|
try {
|
2015-02-12 13:54:17 -08:00
|
|
|
return JSON.parse(fs.readFileSync('.bit'));
|
2015-02-12 11:42:32 -08:00
|
|
|
} catch (ex) {}
|
|
|
|
};
|
|
|
|
|
2015-02-12 13:54:17 -08:00
|
|
|
function _createXPrivKey() {
|
|
|
|
return new Bitcore.HDPrivateKey().toString();
|
|
|
|
};
|
2015-02-12 11:42:32 -08:00
|
|
|
|
2015-02-12 11:50:10 -08:00
|
|
|
clilib.createWallet = function(walletName, copayerName, m, n, cb) {
|
2015-02-12 13:54:17 -08:00
|
|
|
var data = _load();
|
|
|
|
if (data) return cb('Only one wallet can exist');
|
|
|
|
|
|
|
|
data = {
|
|
|
|
xPrivKey: _createXPrivKey(),
|
|
|
|
m: m,
|
|
|
|
};
|
|
|
|
|
2015-02-12 11:42:32 -08:00
|
|
|
var privKey = new Bitcore.PrivateKey();
|
|
|
|
var pubKey = privKey.toPublicKey();
|
|
|
|
|
|
|
|
var args = {
|
|
|
|
name: walletName,
|
|
|
|
m: m,
|
|
|
|
n: n,
|
|
|
|
pubKey: pubKey.toString(),
|
|
|
|
};
|
|
|
|
|
|
|
|
request({
|
|
|
|
method: 'post',
|
2015-02-12 11:50:10 -08:00
|
|
|
url: _getUrl('v1/wallets'),
|
2015-02-12 11:42:32 -08:00
|
|
|
body: args,
|
|
|
|
json: true,
|
|
|
|
}, function(err, res, body) {
|
|
|
|
if (err) return cb(err);
|
|
|
|
var walletId = body;
|
2015-02-12 13:54:17 -08:00
|
|
|
data.secret = walletId + '|' + privKey.toString();
|
2015-02-12 11:42:32 -08:00
|
|
|
|
2015-02-12 13:54:17 -08:00
|
|
|
_save(data);
|
|
|
|
|
|
|
|
clilib.joinWallet(data.secret, copayerName, function(err) {
|
2015-02-12 11:42:32 -08:00
|
|
|
if (err) return cb(err);
|
|
|
|
|
2015-02-12 13:54:17 -08:00
|
|
|
return cb(null, data.secret);
|
2015-02-12 11:42:32 -08:00
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2015-02-12 11:50:10 -08:00
|
|
|
clilib.joinWallet = function(secret, copayerName, cb) {
|
2015-02-12 13:54:17 -08:00
|
|
|
var data = _load();
|
|
|
|
if (data && data.copayerId) return cb('Only one wallet can exist');
|
2015-02-12 11:42:32 -08:00
|
|
|
if (!data) {
|
2015-02-12 13:54:17 -08:00
|
|
|
data = {
|
|
|
|
xPrivKey: _createXPrivKey(),
|
|
|
|
};
|
2015-02-12 11:42:32 -08:00
|
|
|
}
|
2015-02-12 13:54:17 -08:00
|
|
|
|
2015-02-12 11:42:32 -08:00
|
|
|
var secretSplit = secret.split('|');
|
|
|
|
var walletId = secretSplit[0];
|
|
|
|
var privKey = Bitcore.PrivateKey.fromString(secretSplit[1]);
|
|
|
|
var pubKey = privKey.toPublicKey();
|
|
|
|
|
|
|
|
var xPubKey = new Bitcore.HDPublicKey(data.xPrivKey).toString();
|
|
|
|
var xPubKeySignature = SignUtils.sign(xPubKey, privKey);
|
|
|
|
|
|
|
|
var args = {
|
|
|
|
walletId: walletId,
|
|
|
|
name: copayerName,
|
|
|
|
xPubKey: xPubKey,
|
|
|
|
xPubKeySignature: xPubKeySignature,
|
|
|
|
};
|
|
|
|
|
|
|
|
request({
|
|
|
|
method: 'post',
|
2015-02-12 11:50:10 -08:00
|
|
|
url: _getUrl('v1/wallets/' + walletId + '/copayers'),
|
2015-02-12 11:42:32 -08:00
|
|
|
body: args,
|
|
|
|
json: true,
|
|
|
|
}, function(err, res, body) {
|
|
|
|
if (err) return cb(err);
|
|
|
|
var copayerId = body;
|
|
|
|
data.copayerId = copayerId;
|
2015-02-12 13:54:17 -08:00
|
|
|
|
|
|
|
_save(data);
|
|
|
|
|
|
|
|
// TODO: call status to retrieve wallet.m
|
|
|
|
|
|
|
|
return clilib.status(cb);
|
2015-02-12 11:42:32 -08:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2015-02-12 11:50:10 -08:00
|
|
|
clilib.status = function(cb) {
|
2015-02-12 13:54:17 -08:00
|
|
|
var data = _load();
|
|
|
|
if (!data || !data.copayerId) return cb('Not a part of an active wallet');
|
|
|
|
|
|
|
|
var url = 'v1/dump/';
|
|
|
|
var signature = _signRequest(url);
|
|
|
|
|
2015-02-12 11:42:32 -08:00
|
|
|
request({
|
2015-02-12 13:54:17 -08:00
|
|
|
headers: {
|
|
|
|
'x-identity': data.copayerId,
|
|
|
|
'x-signature': signature,
|
|
|
|
},
|
2015-02-12 11:42:32 -08:00
|
|
|
method: 'get',
|
2015-02-12 13:54:17 -08:00
|
|
|
url: _getUrl(url),
|
2015-02-12 11:42:32 -08:00
|
|
|
}, function(err, res, body) {
|
|
|
|
if (err) return cb(err);
|
|
|
|
|
2015-02-12 13:54:17 -08:00
|
|
|
return cb(null, body);
|
2015-02-12 11:42:32 -08:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2015-02-12 11:50:10 -08:00
|
|
|
clilib.send = function(addressTo, amount, message, cb) {
|
2015-02-12 11:42:32 -08:00
|
|
|
|
|
|
|
};
|
|
|
|
|
2015-02-12 11:50:10 -08:00
|
|
|
clilib.sign = function(proposalId, cb) {
|
2015-02-12 11:42:32 -08:00
|
|
|
|
|
|
|
};
|
|
|
|
|
2015-02-12 11:50:10 -08:00
|
|
|
clilib.reject = function(proposalId, cb) {
|
2015-02-12 11:42:32 -08:00
|
|
|
|
|
|
|
};
|
|
|
|
|
2015-02-12 11:50:10 -08:00
|
|
|
clilib.address = function(cb) {
|
2015-02-12 11:42:32 -08:00
|
|
|
|
|
|
|
};
|
|
|
|
|
2015-02-12 11:50:10 -08:00
|
|
|
clilib.history = function(limit, cb) {
|
2015-02-12 11:42:32 -08:00
|
|
|
|
|
|
|
};
|
|
|
|
|
2015-02-12 11:50:10 -08:00
|
|
|
module.exports = clilib;
|