diff --git a/bower.json b/bower.json index c0bb256ef..d9ad490ab 100644 --- a/bower.json +++ b/bower.json @@ -17,7 +17,7 @@ "ng-lodash": "~0.2.0", "angular-moment": "0.10.1", "moment": "2.10.3", - "angular-bitcore-wallet-client": "^0.1.2", + "angular-bitcore-wallet-client": "0.1.2", "angular-ui-router": "~0.2.13", "qrcode-decoder-js": "*", "fastclick": "*", diff --git a/public/views/buyGlidera.html b/public/views/buyGlidera.html index 8776a1515..76b21b9d5 100644 --- a/public/views/buyGlidera.html +++ b/public/views/buyGlidera.html @@ -11,18 +11,41 @@

Buy Bitcoin

-
- - + + + + + +
-
- {{buyPrice}} -- +

Buy Price

+ +
+ destinationAddress: {{buy.addr[index.walletId]}}
+ +

Send 2FA Code

+ + +

Buy

+
+ + +
+
diff --git a/public/views/glidera.html b/public/views/glidera.html index 93c66931f..4ef91bcb6 100644 --- a/public/views/glidera.html +++ b/public/views/glidera.html @@ -24,18 +24,18 @@

Transactions

diff --git a/public/views/sellGlidera.html b/public/views/sellGlidera.html index 35c87d034..862b4a551 100644 --- a/public/views/sellGlidera.html +++ b/public/views/sellGlidera.html @@ -5,24 +5,58 @@ -
+

Sell Bitcoin

- - + + + + +
-
- {{sellPrice}} -- +

Sell Price

+
    +
  • qty: {{sell.sellPrice.qty}} +
  • price: {{sell.sellPrice.price}} +
  • subtotal: {{sell.sellPrice.subtotal}} +
  • fees: {{sell.sellPrice.fees}} +
  • total: {{sell.sellPrice.total}} +
  • currency: {{sell.sellPrice.currency}} +
  • expires: {{sell.sellPrice.expires}} +
  • priceUuid: {{sell.sellPrice.priceUuid}} +
+

Create Tx

+ +
+ refundAddress: {{sell.addr[index.walletId]}}
+ sellAddress: {{sell.sellAddress}}
+ + + + +
{{sell.raw}}
+ +

Send 2FA Code

+ + +

Send TX to Glider

+
+ + +
diff --git a/src/js/controllers/buyGlidera.js b/src/js/controllers/buyGlidera.js index 4064c59b8..931f36711 100644 --- a/src/js/controllers/buyGlidera.js +++ b/src/js/controllers/buyGlidera.js @@ -1,13 +1,60 @@ 'use strict'; angular.module('copayApp.controllers').controller('buyGlideraController', - function() { + function($scope, $timeout, profileService, addressService, glideraService) { + + this.addr = {}; + + this.setDestinationAddress = function() { + var self = this; + this.addrError = null; + var fc = profileService.focusedClient; + if (!fc) return; + + $timeout(function() { + addressService.getAddress(fc.credentials.walletId, null, function(err, addr) { + if (err) { + self.addrError = err; + } else { + if (addr) self.addr[fc.credentials.walletId] = addr; + } + $scope.$digest(); + }); + }); + }; this.getBuyPrice = function(token, price) { var self = this; - glideraService.buyPrice(token, price, function(error, sellPrice) { - self.sellPrice = sellPrice; + this.buyAmount = price.qty; + glideraService.buyPrice(token, price, function(error, buyPrice) { + self.buyPrice = buyPrice; + self.setDestinationAddress(); }); - }; + }; + + this.get2faCode = function(token, cb) { + var self = this; + glideraService.get2faCode(token, function(error, sent) { + self.show2faCodeInput = sent; + }); + }; + + this.send = function(token, twoFaCode) { + var fc = profileService.focusedClient; + var self = this; + var data = { + destinationAddress: self.addr[fc.credentials.walletId], + qty: self.buyPrice.qty, + priceUuid: self.buyPrice.priceUuid, + useCurrentPrice: false, + ip: null + }; +console.log('[sellGlidera.js:128]',token, twoFaCode, data); //TODO + glideraService.buy(token, twoFaCode, data, function(error, data) { +console.log('[sellGlidera.js:116]',data); //TODO + + }); + + }; }); diff --git a/src/js/controllers/sellGlidera.js b/src/js/controllers/sellGlidera.js index e2ac49514..e8ef73943 100644 --- a/src/js/controllers/sellGlidera.js +++ b/src/js/controllers/sellGlidera.js @@ -1,14 +1,148 @@ 'use strict'; angular.module('copayApp.controllers').controller('sellGlideraController', - function(glideraService) { + function($scope, $timeout, $log, gettext, configService, profileService, addressService, feeService, glideraService) { + + var config = configService.getSync(); + this.addr = {}; + this.data = {}; + this.sellAddress = null; + this.show2faCodeInput = null; + this.currentSpendUnconfirmed = config.wallet.spendUnconfirmed; + this.currentFeeLevel = config.wallet.settings.feeLevel || 'normal'; + + this.setRefundAddress = function() { + var self = this; + this.addrError = null; + var fc = profileService.focusedClient; + if (!fc) return; + + $timeout(function() { + addressService.getAddress(fc.credentials.walletId, null, function(err, addr) { + if (err) { + self.addrError = err; + } else { + if (addr) self.addr[fc.credentials.walletId] = addr; + } + $scope.$digest(); + }); + }); + }; + + this.setSellAddress = function(token) { + var self = this; + glideraService.getSellAddress(token, function(error, addr) { + self.sellAddress = addr.sellAddress; + }); + }; this.getSellPrice = function(token, price) { var self = this; + this.sellAmount = price.qty; glideraService.sellPrice(token, price, function(error, sellPrice) { self.sellPrice = sellPrice; + self.setSellAddress(token); + self.setRefundAddress(); }); }; + this.createTx = function() { + var self = this; + var fc = profileService.focusedClient; + + $timeout(function() { + var address = self.sellAddress; + var amount = parseInt((self.sellAmount * 100000000).toFixed(0)); + + feeService.getCurrentFeeValue(self.currentFeeLevel, function(err, feePerKb) { + if (err) $log.debug(err); + fc.sendTxProposal({ + toAddress: address, + amount: amount, + message: 'Glidera', + payProUrl: null, + feePerKb: feePerKb, + excludeUnconfirmedUtxos: self.currentSpendUnconfirmed ? false : true + }, function(err, txp) { +console.log('[sellGlidera.js:62]',txp); //TODO + if (err) { + profileService.lockFC(); + $log.error(err); + return; + } + + if (!fc.canSign()) { + $log.info('No signing proposal: No private key'); + return; + } + + self.signTx(txp, function(err, raw) { + profileService.lockFC(); + if (err) { + self.error = err.message ? err.message : gettext('The payment was created but could not be completed. Please try again from home screen'); + $timeout(function() { + $scope.$digest(); + }, 1); + } + else { + return raw; + } + }); + }); + }); + + }, 100); + + }; + + this.signTx = function(txp, cb) { + var self = this; + var fc = profileService.focusedClient; + fc.signTxProposal(txp, function(err, signedTx) { + console.log('[sellGlidera.js:96]',signedTx); //TODO + profileService.lockFC(); + if (err) { + err.message = bwsError.msg(err, gettextCatalog.getString('The payment was created but could not be signed. Please try again from home screen')); + return cb(err); + } + + if (signedTx.status == 'accepted') { + var t = profileService.getUtils().buildTx(signedTx); + var raw = t.uncheckedSerialize(); + console.log('[sellGlidera.js:104]',raw); //TODO + return cb(null, raw); + + } else { + console.log('NO ACCEPTED TX'); + + } + }); + }; + + this.get2faCode = function(token, cb) { + var self = this; + glideraService.get2faCode(token, function(error, sent) { + self.show2faCodeInput = sent; + }); + }; + + this.sendTx = function(token, twoFaCode, raw) { + var fc = profileService.focusedClient; + var self = this; + var data = { + refundAddress: self.addr[fc.credentials.walletId], + signedTransaction: raw, + priceUuid: self.sellPrice.priceUuid, + useCurrentPrice: false, + ip: null + }; +console.log('[sellGlidera.js:128]',token, twoFaCode, data); //TODO + glideraService.sell(token, twoFaCode, data, function(error, data) { +console.log('[sellGlidera.js:116]',data); //TODO + + }); + + }; + }); diff --git a/src/js/services/glideraService.js b/src/js/services/glideraService.js index 60f5e127d..d1943ef64 100644 --- a/src/js/services/glideraService.js +++ b/src/js/services/glideraService.js @@ -112,7 +112,7 @@ angular.module('copayApp.services').factory('glideraService', function($http, $l if (!token) return cb('Invalid Token'); $http(_get('/transaction', token)).then(function(data) { $log.info('Glidera Transaction: SUCCESS'); - return cb(null, data.data); + return cb(null, data.data.transactions); }, function(data) { $log.error('Glidera Transaction: ERROR ' + data.statusText); return cb(data.statusText); @@ -130,14 +130,26 @@ angular.module('copayApp.services').factory('glideraService', function($http, $l }); }; - var _post = function(endpoint, token, data) { + root.get2faCode = function(token, cb) { + if (!token) return cb('Invalid Token'); + $http(_get('/authentication/get2faCode', token)).then(function(data) { + $log.info('Glidera Sent 2FA code by SMS: SUCCESS'); + return cb(null, data.status == 200 ? true : false); + }, function(data) { + $log.error('Glidera Sent 2FA code by SMS: ERROR ' + data.statusText); + return cb(data.statusText); + }); + }; + + var _post = function(endpoint, token, twoFaCode, data) { return { method: 'POST', url: HOST + '/api/v1' + endpoint, headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', - 'Authorization': 'Bearer ' + token + 'Authorization': 'Bearer ' + token, + '2FA_CODE': twoFaCode }, data: data }; @@ -148,16 +160,16 @@ angular.module('copayApp.services').factory('glideraService', function($http, $l qty: price.qty, fiat: price.fiat }; - $http(_post('/prices/sell', token, data)).then(function(data) { + $http(_post('/prices/sell', token, null, data)).then(function(data) { $log.info('Glidera Sell Price: SUCCESS'); - return cb(null, data); + return cb(null, data.data); }, function(data) { $log.error('Glidera Sell Price: ERROR ' + data.statusText); return cb(data.statusText); }); }; - root.sell = function(token, data, cb) { + root.sell = function(token, twoFaCode, data, cb) { var data = { refundAddress: data.refundAddress, signedTransaction: data.signedTransaction, @@ -165,11 +177,13 @@ angular.module('copayApp.services').factory('glideraService', function($http, $l useCurrentPrice: data.useCurrentPrice, ip: data.ip }; - $http(_post('/prices/buy', token, data)).then(function(data) { - $log.info('Glidera Buy: SUCCESS'); +console.log('[glideraService.js:161]',data); //TODO + $http(_post('/sell', token, twoFaCode, data)).then(function(data) { +console.log('[glideraService.js:168]',data); //TODO + $log.info('Glidera Sell: SUCCESS'); return cb(null, data); }, function(data) { - $log.error('Glidera Buy: ERROR ' + data.statusText); + $log.error('Glidera Sell: ERROR ' + data.statusText); return cb(data.statusText); }); }; @@ -179,16 +193,16 @@ angular.module('copayApp.services').factory('glideraService', function($http, $l qty: price.qty, fiat: price.fiat }; - $http(_post('/prices/buy', token, data)).then(function(data) { + $http(_post('/prices/buy', token, null, data)).then(function(data) { $log.info('Glidera Buy Price: SUCCESS'); - return cb(null, data); + return cb(null, data.data); }, function(data) { $log.error('Glidera Buy Price: ERROR ' + data.statusText); return cb(data.statusText); }); }; - root.buy = function(token, data, cb) { + root.buy = function(token, twoFaCode, data, cb) { var data = { destinationAddress: data.destinationAddress, qty: data.qty, @@ -196,7 +210,7 @@ angular.module('copayApp.services').factory('glideraService', function($http, $l useCurrentPrice: data.useCurrentPrice, ip: data.ip }; - $http(_post('/prices/buy', token, data)).then(function(data) { + $http(_post('/buy', token, twoFaCode, data)).then(function(data) { $log.info('Glidera Buy: SUCCESS'); return cb(null, data); }, function(data) {