Merge pull request #6 from moneroexamples/show_offline_keys

Show offline keys and add private tx key
pull/9/head
moneroexamples 7 years ago committed by GitHub
commit cb4f0a2c8c

@ -23,6 +23,8 @@ They include:
- added dynamic fees for testnet.
- minimum mixin set to 4 for the next hard fork.
- view only mode added.
- ability to offline show your address and private view and spend keys, based on the mnemonic seed,
in case backend is dead.
## Testnet version
@ -176,7 +178,9 @@ Before running `openmonero`:
Time library used in Open Monero stores there time zone offsets database that it uses.
- edit `config/confing.js` file with your settings. Especially set `frontend-url` and `database`
connection details.
- set `apiUrl` in `html\js\config.js`. Last slash `/` in `apiUrl` is important.
- set `apiUrl` in `html\js\config.js` and `testnet` flag. Last slash `/` in `apiUrl` is important.
If running backend for testnet network, frontend `testnet` flag must be set to `true`.
For mainnet, it is set to `false`.
- make sure monero daemon is running and fully sync. If using testnet network, use daemon
with testnet flag!

@ -1452,7 +1452,8 @@ var cnUtil = (function(initConfig) {
var hash = this.cn_fast_hash(hashes);
return {
raw: buf,
hash: hash
hash: hash,
prvkey: tx.prvkey
};
};
@ -1615,6 +1616,7 @@ var cnUtil = (function(initConfig) {
unlock_time: unlock_time,
version: rct ? CURRENT_TX_VERSION : OLD_TX_VERSION,
extra: extra,
prvkey: '',
vin: [],
vout: []
};
@ -1624,6 +1626,7 @@ var cnUtil = (function(initConfig) {
tx.signatures = [];
}
tx.extra = this.add_pub_key_to_extra(tx.extra, txkey.pub);
tx.prvkey = txkey.sec;
var in_contexts = [];

@ -37,35 +37,51 @@ thinwalletCtrls.controller("LoginCtrl", function($scope, $location, AccountServi
$scope.mnemonic_language = 'english';
var decode_seed = function(mnemonic, language)
{
var seed;
var keys;
switch (language) {
case 'english':
try {
seed = mn_decode(mnemonic);
} catch (e) {
// Try decoding as an electrum seed, on failure throw the original exception
try {
seed = mn_decode(mnemonic, "electrum");
} catch (ee) {
throw e;
}
}
break;
default:
seed = mn_decode(mnemonic, language);
break;
}
keys = cnUtil.create_address(seed);
return [seed, keys];
};
$scope.login_mnemonic = function(mnemonic, language) {
$scope.error = '';
var seed;
var keys;
mnemonic = mnemonic.toLowerCase() || "";
try {
switch (language) {
case 'english':
try {
seed = mn_decode(mnemonic);
} catch (e) {
// Try decoding as an electrum seed, on failure throw the original exception
try {
seed = mn_decode(mnemonic, "electrum");
} catch (ee) {
throw e;
}
}
break;
default:
seed = mn_decode(mnemonic, language);
break;
}
keys = cnUtil.create_address(seed);
var seed_key = decode_seed(mnemonic, language);
seed = seed_key[0];
keys = seed_key[1];
} catch (e) {
console.log("Invalid mnemonic!");
$scope.error = e;
return;
}
AccountService.login(keys.public_addr, keys.view.sec, keys.spend.sec, seed, false)
.then(function() {
ModalService.hide('login');
@ -79,6 +95,34 @@ thinwalletCtrls.controller("LoginCtrl", function($scope, $location, AccountServi
});
};
$scope.decodeSeed = function(mnemonic, language)
{
$scope.error = '';
var seed;
var keys;
mnemonic = mnemonic.toLowerCase() || "";
try
{
var seed_key = decode_seed(mnemonic, language);
seed = seed_key[0];
keys = seed_key[1];
$scope.address = keys.public_addr;
$scope.view_key = keys.view.sec;
$scope.spend_key = keys.spend.sec;
} catch (e) {
console.log("Invalid mnemonic!");
$scope.error = e;
return;
}
};
$scope.login_keys = function(address, view_key, spend_key) {
$scope.error = '';
AccountService.login(address, view_key, spend_key, undefined, false)

@ -299,6 +299,7 @@ thinwalletCtrls.controller('SendCoinsCtrl', function($scope, $http, $q, AccountS
var prevFee = neededFee;
var raw_tx = tx_h.raw;
var tx_hash = tx_h.hash;
var tx_prvkey = tx_h.prvkey;
// work out per-kb fee for transaction
var txBlobBytes = raw_tx.length / 2;
var numKB = Math.floor((txBlobBytes) / 1024);
@ -340,6 +341,7 @@ thinwalletCtrls.controller('SendCoinsCtrl', function($scope, $http, $q, AccountS
amount: realDsts[0].amount,
payment_id: payment_id,
tx_id: tx_hash,
tx_prvkey: tx_prvkey,
tx_fee: neededFee/*.add(getTxCharge(neededFee))*/
};
$scope.success_page = true;
@ -540,6 +542,7 @@ thinwalletCtrls.controller('SendCoinsCtrl', function($scope, $http, $q, AccountS
if (signed.version === 1) {
raw_tx_and_hash.raw = cnUtil.serialize_tx(signed);
raw_tx_and_hash.hash = cnUtil.cn_fast_hash(raw_tx);
raw_tx_and_hash.prvkey = signed.prvkey;
} else {
raw_tx_and_hash = cnUtil.serialize_rct_tx_with_hash(signed);
}

@ -44,7 +44,30 @@
<div class="submit-div">
<input class="w-button login-btn pointer" id="form-submit" type="submit" value="Enter my account"
data-wait="Please wait...">
<input class="w-button login-btn pointer" id="form-submit-decode" type="button"
value="Decode the login key (works offline)" ng-click="decodeSeed(mnemonic, mnemonic_language)">
</div>
<div class="w-form form-wrapper" ng-show="address">
<form id="email-form" name="email-form" data-name="Email Form">
<label class="field-label review" for="Mnemonic-2">Account Address (Public)</label>
<div class="move-text-div">
<div class="review-text address">{{address}} </div>
</div>
<label class="field-label review" for="Mnemonic-2">View Key (Private)</label>
<div class="move-text-div">
<div class="review-text">{{view_key}} </div>
</div>
<label class="field-label review" for="Mnemonic-2">Spend Key (Private)</label>
<div class="move-text-div">
<div class="review-text">{{spend_key}} </div>
</div>
<div class="submit-div">
<a class="login-btn modals pointer" data-ix="close-review-details" hide-modal>Ok, thanks!</a>
</div>
</form>
</div>
<div class="w-form-fail error-backing" style="display: block;" ng-show="!!error">
<p>{{error}}</p>
</div>

@ -24,22 +24,6 @@
<div class="move-text-div">
<div class="review-text">{{spend_key}} </div>
</div>
<!--
<label class="field-label review" for="Mnemonic-2">Importing to <i>monero-wallet-cli</i> using the seed</label>
<div class="move-text-div">
<div class="review-text">
<i>monero-wallet-cli {{testnet ? "--testnet" : "" }} --restore-deterministic-wallet</i> and follow the prompts
<br/> note: <i>monero-wallet-cli</i> in Windows is <i>monero-wallet-cli.exe</i>
</div>
</div>
<label class="field-label review" for="Mnemonic-2">Importing to <i>monero-wallet-cli</i> using the private keys</label>
<div class="move-text-div">
<div class="review-text">
<i>monero-wallet-cli {{testnet ? "--testnet" : "" }} --generate-from-keys your_new_wallets_name</i> and follow the prompts
<br/> note: <i>monero-wallet-cli</i> in Windows is <i>monero-wallet-cli.exe</i>
</div>
</div>
-->
<div class="submit-div">
<a class="login-btn modals pointer" data-ix="close-review-details" hide-modal>Ok, thanks!</a>
</div>

@ -91,14 +91,18 @@
<div class="middle-text receive">{{sent_tx.amount | money}} (+{{sent_tx.tx_fee | money}} fee)</div>
</div>
<div class="w-col w-col-6 responsive-column">
<label class="send-label" for="Receiver-address-2">Payment ID</label>
<label class="send-label" >Payment ID</label>
<div class="middle-text receive">{{sent_tx.payment_id || "N/A"}}</div>
</div>
</div>
<label class="send-label" for="Select-a-number">Transaction ID</label>
<label class="send-label" >Transaction ID/Hash</label>
<div class="move-text-div">
<div class="middle-text receive">{{sent_tx.tx_id}}</div>
</div>
label class="send-label" >Transaction Private Key (save it, as it is needed to prove the recipient that you sent him xmr)</label>
<div class="move-text-div">
<div class="middle-text receive">{{sent_tx.tx_prvkey}}</div>
</div>
<input class="w-button send-btn" type="submit" value="Send Another Payment" data-wait="Please wait...">
</form>
</div>

Loading…
Cancel
Save