Browse Source

send wip

activeAddress
Matias Alejo Garcia 10 years ago
parent
commit
8208746bb3
  1. 34
      app.js
  2. 1
      bit-wallet/bit
  3. 28
      bit-wallet/bit-send
  4. 52
      lib/clilib.js

34
app.js

@ -42,11 +42,11 @@ app.use(bodyParser.json({
var port = process.env.COPAY_PORT || 3001;
var router = express.Router();
function returnError(err, res) {
function returnError(err, res, req) {
if (err instanceof CopayServer.ClientError) {
console.log('[app.js.47]'); //TODO
var status = (err.code == 'NOTAUTHORIZED') ? 401 : 400;
log.error('Err: ' + status + ':' + req.url + ' :' + err.code + ':' + err.message);
res.status(status).json({
code: err.code,
error: err.message,
@ -57,8 +57,12 @@ console.log('[app.js.47]'); //TODO
code = err.code;
message = err.message;
}
var m = message || err.toString();
console.log('[app.js.60]'); //TODO
log.error('Error: ' + req.url + ' :' + code + ':' + m);
res.status(code || 500).json({
error: message || err.toString(),
error: m,
}).end();
}
};
@ -81,7 +85,7 @@ function getServerWithAuth(req, res, cb) {
signature: credentials.signature,
};
CopayServer.getInstanceWithAuth(auth, function(err, server) {
if (err) return returnError(err, res);
if (err) return returnError(err, res, req);
return cb(server);
});
};
@ -89,7 +93,7 @@ function getServerWithAuth(req, res, cb) {
router.post('/v1/wallets/', function(req, res) {
var server = CopayServer.getInstance();
server.createWallet(req.body, function(err, walletId) {
if (err) return returnError(err, res);
if (err) return returnError(err, res, req);
res.json({
walletId: walletId,
@ -101,7 +105,7 @@ router.post('/v1/wallets/:id/copayers/', function(req, res) {
req.body.walletId = req.params['id'];
var server = CopayServer.getInstance();
server.joinWallet(req.body, function(err, result) {
if (err) return returnError(err, res);
if (err) return returnError(err, res, req);
res.json(result);
});
@ -110,16 +114,26 @@ router.post('/v1/wallets/:id/copayers/', function(req, res) {
router.get('/v1/wallets/', function(req, res) {
getServerWithAuth(req, res, function(server) {
server.getWallet({}, function(err, wallet) {
if (err) returnError(err, res);
if (err) returnError(err, res, req);
res.json(wallet);
});
});
});
router.post('/v1/txproposals/', function(req, res) {
getServerWithAuth(req, res, function(server) {
server.createTx(req.body, function(err, txp) {
if (err) return returnError(err, res, req);
res.json(txp);
});
});
});
router.post('/v1/addresses/', function(req, res) {
getServerWithAuth(req, res, function(server) {
server.createAddress(req.body, function(err, address) {
if (err) return returnError(err, res);
if (err) return returnError(err, res, req);
res.json(address);
});
});
@ -128,7 +142,7 @@ router.post('/v1/addresses/', function(req, res) {
router.get('/v1/addresses/', function(req, res) {
getServerWithAuth(req, res, function(server) {
server.getAddresses({}, function(err, addresses) {
if (err) return returnError(err, res);
if (err) return returnError(err, res, req);
res.json(addresses);
});
});
@ -137,7 +151,7 @@ router.get('/v1/addresses/', function(req, res) {
router.get('/v1/balance/', function(req, res) {
getServerWithAuth(req, res, function(server) {
server.getBalance({}, function(err, balance) {
if (err) return returnError(err, res);
if (err) return returnError(err, res,req);
res.json(balance);
});
});

1
bit-wallet/bit

@ -8,6 +8,7 @@ program
.command('create <walletName> <m-n> [username]', 'creates a wallet')
.command('join <secret> [username]', 'join a wallet')
.command('status', 'get wallet status')
.command('send <address> <amount> <note>', 'send bitcoins')
.parse(process.argv);

28
bit-wallet/bit-send

@ -0,0 +1,28 @@
#!/usr/bin/env node
var program = require('commander');
var CliLib = require('../lib/clilib.js');
var common = require('./common');
program
.version('0.0.1')
.option('-c,--config [file]', 'Wallet config filename')
.usage('[options] <address> <amount> <message>')
.parse(process.argv);
var args = program.args;
if (!args[0] || !args[1] || !args[2])
program.help();
var address = args[0];
var amount = args[1];
var message = args[2];
var cli = new CliLib({
filename: program.config
});
cli.send({toAddress: address, amount: amount, message:message}, function(err, xx) {
common.die(err);
console.log(' * Wallet Joined.', xx || '');
});

52
lib/clilib.js

@ -13,7 +13,11 @@ var SignUtils = require('./signutils');
var BASE_URL = 'http://localhost:3001/copay/api/';
function _createProposalOpts(opts, signingKey) {
var msg = opts.toAddress + '|' + opts.amount + '|' + opts.message;
opts.proposalSignature = SignUtils.sign(msg, signingKey);
return opts;
};
function _getUrl(path) {
return BASE_URL + path;
@ -21,7 +25,11 @@ function _getUrl(path) {
function _parseError(body) {
if (_.isString(body)) {
try {
body = JSON.parse(body);
} catch (e) {
body = {error: body};
}
}
var code = body.code || 'ERROR';
var message = body.error || 'There was an unknown error processing the request';
@ -226,21 +234,31 @@ CliLib.prototype.status = function(cb) {
});
};
CliLib.prototype.send = function(addressTo, amount, message, cb) {
/**
* send
*
* @param inArgs
* @param inArgs.toAddress
* @param inArgs.amount
* @param inArgs.message
*/
CliLib.prototype.send = function(inArgs, cb) {
var self = this;
var data = this._loadAndCheck();
var args = _createProposalOpts(inArgs, data.signingPrivKey);
console.log('[clilib.js.249:args:]',args); //TODO
var url = '/v1/wallets/';
var signature = _signRequest(url, {}, data.signingPrivKey);
var url = '/v1/txproposals/';
var signature = _signRequest(url, args, data.signingPrivKey);
request({
headers: {
'x-identity': data.copayerId,
'x-signature': signature,
},
method: 'get',
method: 'post',
url: _getUrl(url),
body: args,
json: true,
}, function(err, res, body) {
if (err) return cb(err);
@ -248,26 +266,8 @@ CliLib.prototype.send = function(addressTo, amount, message, cb) {
_parseError(body);
return cb('Request error');
}
var wallet = body;
if (wallet.n > 1 && wallet.status === 'complete' && !data.verified) {
var fake = [];
_.each(wallet.copayers, function(copayer) {
// TODO
// if (!SignUtils.verify(copayer.xPubKey, copayer.xPubKeySignature, data.pubKey)) {
// fake.push(copayer);
// }
});
if (fake.length > 0) {
log.error('Some copayers in the wallet could not be verified to have known the wallet secret');
data.verified = 'corrupt';
} else {
data.verified = 'ok';
}
self._save(data);
}
return cb(null, wallet);
console.log('[clilib.js.251:body:]',body); //TODO
return cb(null, body);
});
};

Loading…
Cancel
Save