aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--public/css/coinos.css6
-rw-r--r--public/css/coinos.less2
-rw-r--r--public/js/wallet.coffee45
-rw-r--r--public/js/wallet.js61
-rw-r--r--views/users/wallet.html34
5 files changed, 104 insertions, 44 deletions
diff --git a/public/css/coinos.css b/public/css/coinos.css
index 498aea99..b6375221 100644
--- a/public/css/coinos.css
+++ b/public/css/coinos.css
@@ -61,6 +61,12 @@ div.container-fluid {
.form-group .input-group-addon {
color: #000;
}
+.form-group .input-group-btn {
+ padding-top: 24px;
+}
+.form-group .form-control-feedback {
+ margin-top: 24px;
+}
div#calculator #amount {
width: 5em;
}
diff --git a/public/css/coinos.less b/public/css/coinos.less
index 50dddb23..7f202449 100644
--- a/public/css/coinos.less
+++ b/public/css/coinos.less
@@ -25,6 +25,8 @@ div.container-fluid {
span, label { color: #999; }
.form-control { height: auto; padding: 3px; display: inline-block; }
.input-group-addon { color: #000; }
+ .input-group-btn { padding-top: 24px; }
+ .form-control-feedback { margin-top: 24px; }
}
div#calculator {
diff --git a/public/js/wallet.coffee b/public/js/wallet.coffee
index b34aaae1..ebe6826a 100644
--- a/public/js/wallet.coffee
+++ b/public/js/wallet.coffee
@@ -2,8 +2,29 @@ g = exports ? this
g.proceed = false
g.api = 'https://api.blockcypher.com/v1/btc/main'
+validators =
+ address: (e) ->
+ try
+ bitcoin.address.fromBase58Check(e.val())
+ catch
+ return false
+
+ password: (e) ->
+ g.master = null
+ try
+ g.master = bitcoin.HDNode.fromBase58(CryptoJS.AES.decrypt($('#privkey').val(), e.val()).toString(CryptoJS.enc.Utf8))
+ $('#invalid_keys').fadeOut()
+ catch
+ return false
+
+
+errors =
+ address: 'Invalid address'
+ password: 'Wrong password'
+
$(->
getToken()
+ $('form').validator(custom: validators, errors: errors)
$('button[data-toggle=tooltip]').tooltip(trigger: 'hover')
@@ -26,7 +47,7 @@ $(->
name: g.user.username
extended_public_key: $('#pubkey').val()
subchain_indexes: [0,1]
-
+
$.post("#{g.api}/wallets/hd?token=#{g.token}", JSON.stringify(data)).always(->
$.post("#{g.api}/wallets/hd/#{g.user.username}/addresses/derive?token=#{g.token}").always(->
getBalance()
@@ -76,13 +97,6 @@ $(->
)
$('#password').keyup(->
- g.master = null
- try
- g.master = bitcoin.HDNode.fromBase58(CryptoJS.AES.decrypt($('#privkey').val(), $(this).val()).toString(CryptoJS.enc.Utf8))
- $(this).parent().removeClass('has-error').addClass('has-success')
- $('#invalid_keys').fadeOut()
- catch
- $(this).parent().addClass('has-error').removeClass('has-success')
)
$('#new_password').keyup(->
@@ -90,14 +104,14 @@ $(->
try
bitcoin.HDNode.fromBase58(CryptoJS.AES.decrypt(g.user.privkey, $(this).val()).toString(CryptoJS.enc.Utf8))
- $(this).parent().removeClass('has-error').addClass('has-success')
catch
- $(this).parent().addClass('has-error').removeClass('has-success')
)
$('#manage').click(->
- $('#keys, #withdrawal').toggle()
- $('#withdraw, #manage').toggle()
+ $('#withdrawal').hide()
+ $('#keys').show()
+ $('#withdraw').toggle(g.balance > 0)
+ $('#manage').hide()
$('#privkey').val(g.user.privkey)
)
@@ -180,8 +194,13 @@ getBalance = ->
$('#balance').html(g.balance)
$('#fiat').html("#{fiat} #{g.user.currency}")
$('#amount').attr('max', g.balance)
- $('#amount').focus()
$('.wallet').fadeIn()
+
+ if g.balance > 0
+ $('#withdrawal').show()
+ $('#amount').focus()
+ else
+ $('#manage').click()
)
sendTransaction = ->
diff --git a/public/js/wallet.js b/public/js/wallet.js
index 6d880b82..d83b764d 100644
--- a/public/js/wallet.js
+++ b/public/js/wallet.js
@@ -1,6 +1,6 @@
;(function(e,t,n){function i(n,s){if(!t[n]){if(!e[n]){var o=typeof require=="function"&&require;if(!s&&o)return o(n,!0);if(r)return r(n,!0);throw new Error("Cannot find module '"+n+"'")}var u=t[n]={exports:{}};e[n][0](function(t){var r=e[n][1][t];return i(r?r:t)},u,u.exports)}return t[n].exports}var r=typeof require=="function"&&require;for(var s=0;s<n.length;s++)i(n[s]);return i})({1:[function(require,module,exports){
(function(){(function() {
- var check_address, convertedAmount, createWallet, displayErrors, g, getBalance, getExchangeRate, getToken, getUser, isBip32, multiplier, precision, sendTransaction,
+ var check_address, convertedAmount, createWallet, displayErrors, errors, g, getBalance, getExchangeRate, getToken, getUser, isBip32, multiplier, precision, sendTransaction, validators,
__indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
g = typeof exports !== "undefined" && exports !== null ? exports : this;
@@ -9,8 +9,36 @@
g.api = 'https://api.blockcypher.com/v1/btc/main';
+ validators = {
+ address: function(e) {
+ try {
+ return bitcoin.address.fromBase58Check(e.val());
+ } catch (_error) {
+ return false;
+ }
+ },
+ password: function(e) {
+ g.master = null;
+ try {
+ g.master = bitcoin.HDNode.fromBase58(CryptoJS.AES.decrypt($('#privkey').val(), e.val()).toString(CryptoJS.enc.Utf8));
+ return $('#invalid_keys').fadeOut();
+ } catch (_error) {
+ return false;
+ }
+ }
+ };
+
+ errors = {
+ address: 'Invalid address',
+ password: 'Wrong password'
+ };
+
$(function() {
getToken();
+ $('form').validator({
+ custom: validators,
+ errors: errors
+ });
$('button[data-toggle=tooltip]').tooltip({
trigger: 'hover'
});
@@ -81,28 +109,20 @@
return $(this).val($(this).attr('max'));
}
});
- $('#password').keyup(function() {
- g.master = null;
- try {
- g.master = bitcoin.HDNode.fromBase58(CryptoJS.AES.decrypt($('#privkey').val(), $(this).val()).toString(CryptoJS.enc.Utf8));
- $(this).parent().removeClass('has-error').addClass('has-success');
- return $('#invalid_keys').fadeOut();
- } catch (_error) {
- return $(this).parent().addClass('has-error').removeClass('has-success');
- }
- });
+ $('#password').keyup(function() {});
$('#new_password').keyup(function() {
$('#privkey').val(CryptoJS.AES.encrypt(g.privkey, $(this).val()));
try {
- bitcoin.HDNode.fromBase58(CryptoJS.AES.decrypt(g.user.privkey, $(this).val()).toString(CryptoJS.enc.Utf8));
- return $(this).parent().removeClass('has-error').addClass('has-success');
+ return bitcoin.HDNode.fromBase58(CryptoJS.AES.decrypt(g.user.privkey, $(this).val()).toString(CryptoJS.enc.Utf8));
} catch (_error) {
- return $(this).parent().addClass('has-error').removeClass('has-success');
+
}
});
$('#manage').click(function() {
- $('#keys, #withdrawal').toggle();
- $('#withdraw, #manage').toggle();
+ $('#withdrawal').hide();
+ $('#keys').show();
+ $('#withdraw').toggle(g.balance > 0);
+ $('#manage').hide();
return $('#privkey').val(g.user.privkey);
});
$('#withdraw').click(function() {
@@ -189,8 +209,13 @@
$('#balance').html(g.balance);
$('#fiat').html("" + fiat + " " + g.user.currency);
$('#amount').attr('max', g.balance);
- $('#amount').focus();
- return $('.wallet').fadeIn();
+ $('.wallet').fadeIn();
+ if (g.balance > 0) {
+ $('#withdrawal').show();
+ return $('#amount').focus();
+ } else {
+ return $('#manage').click();
+ }
});
};
diff --git a/views/users/wallet.html b/views/users/wallet.html
index 8219c532..4848eedd 100644
--- a/views/users/wallet.html
+++ b/views/users/wallet.html
@@ -59,7 +59,7 @@
</form>
</div>
- <div id="withdrawal">
+ <div id="withdrawal" style="display: none">
<h3>Send Payment / Withdrawal</h3>
<div id="transaction_sent" class="alert alert-success" style="display: none">
@@ -74,10 +74,10 @@
</div>
<form>
- <div class="form-group">
- <label for="amount">Amount:</label>
+ <div class="form-group has-feedback">
<div class="input-group">
- <input type="number" id="amount" name="amount" class="form-control" min="0" />
+ <label for="amount">Amount:</label>
+ <input type="number" id="amount" name="amount" class="form-control" min="0" required />
<span class="input-group-btn">
<button id="currency_toggle" type="button" class="btn btn-primary"></button>
</span>
@@ -85,29 +85,37 @@
<button id="max" type="button" class="btn btn-primary">Max</button>
</span>
</div>
+ <div class="help-block with-errors"></div>
</div>
- <div class="form-group">
- <label for="amount">To Address:</label>
+ <div class="form-group has-feedback">
<div class="input-group" style="width: 100%">
- <input type="text" id="recipient" name="recipient" class="form-control" />
+ <label for="amount">To Address:</label>
+ <input type="text" id="recipient" name="recipient" class="form-control" data-address="true" required />
</div>
+ <span class="glyphicon form-control-feedback" aria-hidden="true"></span>
+ <div class="help-block with-errors"></div>
</div>
- <div class="form-group">
- <label for="priority">Fee Priority for Confirmation Time:</label>
+ <div class="form-group has-feedback">
<div class="input-group" style="width: 100%">
- <select id="priority" name="priority" class="form-control">
+ <label for="priority">Fee Priority for Confirmation Time:</label>
+ <select id="priority" name="priority" class="form-control" required>
<option value="low">Low</option>
<option value="medium">Medium</option>
<option value="high">High</option>
</select>
</div>
+ <span class="glyphicon form-control-feedback" aria-hidden="true"></span>
</div>
- <div class="form-group">
- <label for="password">Password:</label>
- <input id="password" name="password" type="password" class="form-control" />
+ <div class="form-group has-feedback">
+ <div class="input-group" style="width: 100%">
+ <label for="password">Password:</label>
+ <input id="password" name="password" type="password" class="form-control" data-password="true" required />
+ </div>
+ <span class="glyphicon form-control-feedback" aria-hidden="true"></span>
+ <div class="help-block with-errors"></div>
</div>
<input id="send" class="btn btn-primary" type="button" value="Calculate Fee and Confirm Transaction" />