Update ticker to XNO, display XNO symbol where appropriate, refer to nano in lower case (#498)

* remove unused duplicate string

* replace ticker in the nano card

* keypair generator: fix secret phrases being cropped on small viewports

update terms to secret recovery seed/mnemonic

* manage wallet - backup: update terms to secret recovery seed/mnemonic

* new wallet: use existing translation for overwrite alert

* "Nano" -> "nano" / "Ӿ"

"seed/mnemonic" -> "secret recovery seed and/or mnemonic"
account details: "wallet login" -> "wallet import"
unit converter: NANO -> XNO
import wallet: update wording to match "configure wallet" page

* add symbol to account details balance, "NANO" -> "XNO"

* fix ticker misplaced by 1px on both gecko and chromium

* amount inputs: replace nf logo with xno symbol

* "seed/mnemonic" -> "secret recovery seed/mnemonic"

* remove unused array of wallet import options

* "No login is needed" -> "No wallet import needed"

* no private key in this field oops

* account details: fix amount-fractional being 18px instead of 16px

* use ticker XNO instead of symbol Ӿ in the auto-receive notification
This commit is contained in:
keeri 2021-11-26 17:38:38 +00:00 committed by GitHub
commit bcf2e11455
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
48 changed files with 197 additions and 293 deletions

View file

@ -3,7 +3,7 @@
## Application Structure
- [Nault](https://github.com/Nault/Nault) - The main wallet application (UI + Seed Generation/Block Signing/Etc).
- Communication with the network is done via Nano RPC and Websocket protocols, private or public on any nano network.
- Communication with the network is done via nano RPC and Websocket protocols, private or public on any nano network.
## Development Prerequisites
- [NodeJS](https://nodejs.org) v14.x + NPM v6.x

View file

@ -4,11 +4,11 @@
[![GitHub All Releases](https://img.shields.io/github/downloads/nault/nault/total)](https://github.com/Nault/Nault/releases/latest)
[![Discord](https://img.shields.io/badge/discord-join%20chat-orange.svg?logo=discord&color=7289DA)](https://discord.nanocenter.org)
Nault is a community driven fork of the popular Nano wallet [NanoVault](https://github.com/cronoh/nanovault) 💙
Nault is a community driven fork of the popular nano wallet [NanoVault](https://github.com/cronoh/nanovault) 💙
It's a fully client-side signing wallet for sending and receiving [Nano](https://github.com/nanocurrency/nano-node/) either directly in your browser at [nault.cc](https://nault.cc) or with the [desktop app](https://github.com/Nault/Nault/releases/latest).
It's a fully client-side signing wallet for sending and receiving [nano](https://github.com/nanocurrency/nano-node/) either directly in your browser at [nault.cc](https://nault.cc) or with the [desktop app](https://github.com/Nault/Nault/releases/latest).
Seamless integration with any Nano compatible RPC backend/websocket and the aim to be more frequently maintained are some of the main features. Those together will greatly increase the stability, performance and uptime.
Seamless integration with any nano compatible RPC backend/websocket and the aim to be more frequently maintained are some of the main features. Those together will greatly increase the stability, performance and uptime.
![Nault Screenshot](/src/assets/img/preview.png)
___

View file

@ -2,7 +2,7 @@
"name": "nault",
"version": "1.16.0",
"license": "MIT",
"description": "Wallet for interacting with Nano",
"description": "Wallet for interacting with nano",
"author": "The Nano Community / Andrew Steele",
"main": "desktop-app/dist/desktop-app.js",
"scripts": {

View file

@ -24,7 +24,7 @@
<div class="balance-column">
<ng-container *ngIf="(walletService.wallet.updatingBalance === false) else balanceLoading">
<div class="balance primary">
{{ wallet.selectedAccount.balance | rai: 'mnano,true' | amountsplit: 0 }}{{ wallet.selectedAccount.balance | rai: 'mnano,true' | amountsplit: 1 }} NANO
{{ wallet.selectedAccount.balance | rai: 'mnano,true' | amountsplit: 0 }}{{ wallet.selectedAccount.balance | rai: 'mnano,true' | amountsplit: 1 }} XNO
</div>
<div class="balance converted">{{ wallet.selectedAccount.balanceFiat | fiat: settings.settings.displayCurrency }}</div>
</ng-container>
@ -42,7 +42,7 @@
</div>
<div class="balance-column">
<ng-container *ngIf="(walletService.wallet.updatingBalance === false) else balanceLoading">
<div class="balance primary">{{ wallet.balance | rai: 'mnano,true' | amountsplit: 0 }}{{ wallet.balance | rai: 'mnano,true' | amountsplit: 1 }} NANO</div>
<div class="balance primary">{{ wallet.balance | rai: 'mnano,true' | amountsplit: 0 }}{{ wallet.balance | rai: 'mnano,true' | amountsplit: 1 }} XNO</div>
<div class="balance converted">{{ wallet.balanceFiat | fiat: settings.settings.displayCurrency }}</div>
</ng-container>
<ng-template #balanceLoading>
@ -63,9 +63,9 @@
<div class="balance primary">
<span class="incoming-label" *ngIf="account.pending.gt(0)">
<span class="text-snippet">{{ 'general.new' | transloco }}</span>
<span class="text-full">+{{ account.pending | rai: 'mnano,true' | amountsplit: 0 }}{{ account.pending | rai: 'mnano,true' | amountsplit: 1 }} NANO</span>
<span class="text-full">+{{ account.pending | rai: 'mnano,true' | amountsplit: 0 }}{{ account.pending | rai: 'mnano,true' | amountsplit: 1 }} XNO</span>
</span>
{{ account.balance | rai: 'mnano,true' | amountsplit: 0 }}{{ account.balance | rai: 'mnano,true' | amountsplit: 1 }} NANO
{{ account.balance | rai: 'mnano,true' | amountsplit: 0 }}{{ account.balance | rai: 'mnano,true' | amountsplit: 1 }} XNO
</div>
<div class="balance converted">{{ account.balanceFiat | fiat: settings.settings.displayCurrency }}</div>
</ng-container>
@ -124,7 +124,7 @@
<div class="account-balances">
<ng-container *ngIf="( ( node.status && (wallet.balanceInitialized === true) ) || !isConfigured() ) else balancesLoading">
<div class="balance-container primary">
<div class="currency-name">NANO</div>
<div class="currency-name">XNO</div>
<div class="amount-container">
<div class="amount-integer">{{ (wallet.selectedAccount !== null ? wallet.selectedAccount.balance : wallet.balance) | rai: 'mnano,true' | amountsplit: 0 }}</div>
<div class="amount-fractional">{{ (wallet.selectedAccount !== null ? wallet.selectedAccount.balance : wallet.balance) | rai: 'mnano,true' | amountsplit: 1 }}</div>
@ -176,7 +176,7 @@
</div>
<div class="account-balances">
<div class="balance-container primary">
<div class="currency-name">NANO</div>
<div class="currency-name">XNO</div>
<div class="amount-container">
<div class="amount-integer">{{ (wallet.selectedAccount ? wallet.selectedAccount.pending : wallet.pending) | rai: 'mnano,true' | amountsplit: 0 }}</div>
<div class="amount-fractional">{{ (wallet.selectedAccount ? wallet.selectedAccount.pending : wallet.pending) | rai: 'mnano,true' | amountsplit: 1 }}</div>

View file

@ -204,7 +204,7 @@ export class AppComponent implements OnInit {
if (!this.settings.settings.serverAPI) return;
await this.updateFiatPrices();
} catch (err) {
this.notifications.sendWarning(`There was an issue retrieving latest Nano price. Ensure your AdBlocker is disabled on this page then reload to see accurate FIAT values.`, { length: 0, identifier: `price-adblock` });
this.notifications.sendWarning(`There was an issue retrieving latest nano price. Ensure your AdBlocker is disabled on this page then reload to see accurate FIAT values.`, { length: 0, identifier: `price-adblock` });
}
}
@ -324,7 +324,7 @@ export class AppComponent implements OnInit {
return;
}
this.notifications.sendWarning(`Invalid Nano address or block hash! Please double check your input`);
this.notifications.sendWarning(`Invalid nano address or block hash! Please double check your input`);
}
updateIdleTime() {
@ -337,7 +337,7 @@ export class AppComponent implements OnInit {
return;
}
this.walletService.reloadBalances();
this.notifications.sendInfo(`Attempting to reconnect to Nano node`);
this.notifications.sendInfo(`Attempting to reconnect to nano node`);
}
async updateFiatPrices() {

View file

@ -69,7 +69,7 @@
background: #4a90e2;
border-radius: 20px;
font-size: 12px;
padding: 2px 10px;
padding: 2px 14px;
margin-left: 7px;
vertical-align: 1px;
padding-bottom: 1px;
@ -95,13 +95,13 @@
font-weight: 700;
}
.incoming-label > .text-full > .amount-fractional,
.incoming-label > .text-full > .amount-currency-name {
.incoming-label > .text-full > .amount-fractional {
display: inline-block;
}
.incoming-label > .text-full > .amount-currency-name {
margin-left: 4px;
.incoming-label > .text-full > .amount-currency-symbol {
font-size: 16px;
margin: 0 2px -1px 1px;
}
.incoming-label > .text-snippet {
@ -139,13 +139,13 @@
font-weight: 700;
}
.account-amounts-primary-confirmed > .amount-fractional,
.account-amounts-primary-confirmed > .amount-currency-name {
.account-amounts-primary-confirmed > .amount-fractional {
font-size: 16px;
}
.account-amounts-primary-confirmed > .amount-currency-name {
margin-left: 4px;
.account-amounts-primary-confirmed > .amount-currency-symbol {
font-size: 18px;
margin-right: 3px;
}
.representative-details {

View file

@ -22,7 +22,7 @@
<div class="account-balances">
<ng-container *ngIf="!loadingAccountDetails else cardBalancesLoading">
<div class="balance-container primary">
<div class="currency-name">NANO</div>
<div class="currency-name">XNO</div>
<div class="amount-container">
<div class="amount-integer">{{ !account ? 0 : (account.balance || 0 | rai: 'mnano,true') | amountsplit: 0 }}</div>
<div class="amount-fractional">{{ !account ? 0 : (account.balance || 0 | rai: 'mnano,true') | amountsplit: 1 }}</div>
@ -175,9 +175,9 @@
class="account-amounts-primary-confirmed"
[title]="( (account && account.balanceRaw && account.balanceRaw.gt(0) ) ? ( '+' + ( account.balanceRaw.toString(10) ) + ' raw' ) : '' )"
>
<span class="amount-currency-symbol xno-symbol"></span>
<span class="amount-integer">{{ !account ? 0 : (account.balance || 0 | rai: 'mnano,true') | amountsplit: 0 }}</span>
<span class="amount-fractional">{{ !account ? 0 : (account.balance || 0 | rai: 'mnano,true') | amountsplit: 1 }}</span>
<span class="amount-currency-name">NANO</span>
</div>
<div
*ngIf="account && account.pending && (account.pending > 0)"
@ -187,9 +187,9 @@
<div class="text-snippet">{{ 'general.new' | transloco }}</div>
<div class="text-full">
<div class="amount-sign">+</div>
<div class="amount-currency-symbol xno-symbol"></div>
<div class="amount-integer">{{ account.pending | rai: 'mnano,true' | amountsplit: 0 }}</div>
<div class="amount-fractional">{{ account.pending | rai: 'mnano,true' | amountsplit: 1 }}</div>
<div class="amount-currency-name">NANO</div>
</div>
</div>
</div>
@ -388,7 +388,7 @@
<span class="uk-text-small">{{ 'general.actions.ready-to-receive' | transloco }}</span><br>
<span class="amount-integer">{{ pending.amount | rai: 'mnano,true' | amountsplit: 0 }}</span>
<span class="amount-fractional">{{ pending.amount | rai: 'mnano,true' | amountsplit: 1 }}</span>
<span class="currency-name">NANO</span>
<span class="currency-name">XNO</span>
<div class="compact-actions-date">
<ng-template [ngTemplateOutlet]="transactionActionsOrDate"></ng-template>
</div>
@ -484,7 +484,7 @@
</ng-container>
<span class="amount-integer">{{ history.amount | rai: 'mnano,true' | amountsplit: 0 }}</span>
<span class="amount-fractional">{{ history.amount | rai: 'mnano,true' | amountsplit: 1 }}</span>
<span class="currency-name">NANO</span>
<span class="currency-name">XNO</span>
<div class="compact-actions-date text-half-muted">
<ng-template [ngTemplateOutlet]="transactionActionsOrDate"></ng-template>
</div>
@ -555,7 +555,7 @@
</div>
<div class="uk-modal-body modal-block-body">
<ol>
<li>Generate a Nano block below. No wallet login needed.</li>
<li>Generate a nano block below. No wallet import needed.</li>
<li><a routerLink="/qr-scan" routerLinkActive="active" class="uk-modal-close">Scan</a> the unsigned QR with an offline Nault, or copy the "Unsigned Block" to <a routerLink="/remote-signing" routerLinkActive="active" class="uk-modal-close">Step 2</a>.</li>
</ol>
@ -609,7 +609,7 @@
</div>
<div class="uk-width-1-1" style="margin-top: 10px;" *ngIf="settings.settings.displayCurrency">
<div class="uk-width-1-1 uk-inline">
<a class="uk-form-icon uk-link-reset uk-link-muted" style="padding-left: 7px;" uk-tooltip title="Last Price: {{ price.price.lastPrice | fiat: settings.settings.displayCurrency }} / NANO">{{ settings.settings.displayCurrency | currencySymbol }}</a>
<a class="uk-form-icon uk-link-reset uk-link-muted" style="padding-left: 7px;" uk-tooltip title="Last Price: {{ price.price.lastPrice | fiat: settings.settings.displayCurrency }} / XNO">{{ settings.settings.displayCurrency | currencySymbol }}</a>
<input [(ngModel)]="amountFiat" (input)="syncNanoPrice()" style="padding-left: 50px !important;" class="uk-input" id="form-horizontal-text-fiat" type="text" placeholder="Amount of {{ settings.settings.displayCurrency }} to send">
</div>
</div>

View file

@ -75,7 +75,7 @@ export class AccountDetailsComponent implements OnInit, OnDestroy {
showAddressBook = false;
addressBookMatch = '';
amounts = [
{ name: 'NANO', shortName: 'NANO', value: 'mnano' },
{ name: 'XNO', shortName: 'XNO', value: 'mnano' },
{ name: 'knano', shortName: 'knano', value: 'knano' },
{ name: 'nano', shortName: 'nano', value: 'nano' },
];
@ -778,7 +778,7 @@ export class AccountDetailsComponent implements OnInit, OnDestroy {
receivableBlock.received = true;
this.mobileTransactionMenuModal.hide();
this.notifications.removeNotification('success-receive');
this.notifications.sendSuccess(`Successfully received Nano!`, { identifier: 'success-receive' });
this.notifications.sendSuccess(`Successfully received nano!`, { identifier: 'success-receive' });
// clear the list of pending blocks. Updated again with reloadBalances()
this.wallet.clearPendingBlocks();
} else {
@ -796,7 +796,7 @@ export class AccountDetailsComponent implements OnInit, OnDestroy {
const isValid = this.util.account.isValidAccount(this.toAccountID);
if (!isValid) return this.notifications.sendWarning(`To account address is not valid`);
if (!this.accountID || !this.toAccountID) return this.notifications.sendWarning(`From and to account are required`);
if (!this.validateAmount()) return this.notifications.sendWarning(`Invalid NANO Amount`);
if (!this.validateAmount()) return this.notifications.sendWarning(`Invalid XNO Amount`);
this.qrCodeImageBlock = null;
@ -816,7 +816,7 @@ export class AccountDetailsComponent implements OnInit, OnDestroy {
const nanoAmount = this.rawAmount.div(this.nano);
if (this.amount < 0 || rawAmount.lessThan(0)) return this.notifications.sendWarning(`Amount is invalid`);
if (from.balanceBN.minus(rawAmount).lessThan(0)) return this.notifications.sendError(`From account does not have enough NANO`);
if (from.balanceBN.minus(rawAmount).lessThan(0)) return this.notifications.sendError(`From account does not have enough XNO`);
// Determine a proper raw amount to show in the UI, if a decimal was entered
this.amountRaw = this.rawAmount.mod(this.nano);

View file

@ -47,12 +47,12 @@
<div class="account-amounts-primary uk-width-1-1">
<div *ngIf="account.pending.gt(0)" class="incoming-label">
<div class="text-snippet">{{ 'general.new' | transloco }}</div>
<div class="text-full">+{{ account.pending | rai: 'mnano,true' | amountsplit: 0 }}{{ account.pending | rai: 'mnano,true' | amountsplit: 1 }} NANO</div>
<div class="text-full">+{{ account.pending | rai: 'mnano,true' | amountsplit: 0 }}{{ account.pending | rai: 'mnano,true' | amountsplit: 1 }} XNO</div>
</div>
<span class="amounts" [title]="( account.balanceRaw.gt(0) ? ( '+' + ( account.balanceRaw.toString(10) ) + ' raw' ) : '' )">
<span class="amount-integer">{{ account.balance | rai: 'mnano,true' | amountsplit: 0 }}</span>
<span class="amount-fractional">{{ account.balance | rai: 'mnano,true' | amountsplit: 1 }}</span>
<span class="currency-name">NANO</span>
<span class="currency-name">XNO</span>
</span>
</div>
<div class="account-amounts-converted uk-width-1-1 text-half-muted">

View file

@ -28,11 +28,11 @@
<span [title]="( totalTrackedBalanceRaw.gt(0) ? ( '+' + ( totalTrackedBalanceRaw.toString(10) ) + ' raw' ) : '' )">
<span class="amount-integer">{{ totalTrackedBalance | rai: 'mnano,true' | amountsplit: 0 }}</span>
<span class="amount-fractional">{{ totalTrackedBalance | rai: 'mnano,true' | amountsplit: 1 }}</span>
<span class="currency-name">NANO</span>
<span class="currency-name">XNO</span>
</span>
<div *ngIf="totalTrackedPending.gt(0)" class="incoming-label">
<div class="text-snippet">New</div>
<div class="text-full">+{{ totalTrackedPending | rai: 'mnano,true' | amountsplit: 0 }}{{ totalTrackedPending | rai: 'mnano,true' | amountsplit: 1 }} NANO</div>
<div class="text-full">+{{ totalTrackedPending | rai: 'mnano,true' | amountsplit: 0 }}{{ totalTrackedPending | rai: 'mnano,true' | amountsplit: 1 }} XNO</div>
</div>
<div class="account-amounts-converted uk-width-1-1 text-half-muted">
{{ totalTrackedBalanceFiat | fiat: appSettings.settings.displayCurrency }}
@ -109,11 +109,11 @@
<span [title]="( accounts[addressBook.account]?.balanceRaw.gt(0) ? ( '+' + ( accounts[addressBook.account]?.balanceRaw.toString(10) ) + ' raw' ) : '' )">
<span class="amount-integer">{{ accounts[addressBook.account]?.balance | rai: 'mnano,true' | amountsplit: 0 }}</span>
<span class="amount-fractional">{{ accounts[addressBook.account]?.balance | rai: 'mnano,true' | amountsplit: 1 }}</span>
<span class="currency-name">NANO</span>
<span class="currency-name">XNO</span>
</span>
<div *ngIf="accounts[addressBook.account]?.pending.gt(0)" class="incoming-label">
<div class="text-snippet">New</div>
<div class="text-full">+{{ accounts[addressBook.account]?.pending | rai: 'mnano,true' | amountsplit: 0 }}{{ accounts[addressBook.account]?.pending | rai: 'mnano,true' | amountsplit: 1 }} NANO</div>
<div class="text-full">+{{ accounts[addressBook.account]?.pending | rai: 'mnano,true' | amountsplit: 0 }}{{ accounts[addressBook.account]?.pending | rai: 'mnano,true' | amountsplit: 1 }} XNO</div>
</div>
</div>
<div class="account-amounts-converted uk-width-1-1 text-half-muted">

View file

@ -9,11 +9,3 @@
#node-stats-table td {
padding-right: 20px;
}
.icon-nano-logo {
margin: 13px 11px;
width: 32px;
background-color: currentcolor;
-webkit-mask-image: url('assets/img/nano-mark-simple.svg');
mask-image: url('assets/img/nano-mark-simple.svg');
}

View file

@ -186,7 +186,7 @@
<div uk-grid>
<div class="uk-width-1-1">
<div class="uk-inline uk-width-1-1">
<label class="uk-form-icon uk-link-reset uk-link-muted icon-nano-logo" for="form-horizontal-amount"></label>
<label class="uk-form-icon uk-link-reset uk-link-muted xno-symbol" for="form-horizontal-amount"></label>
<input [(ngModel)]="minimumReceive" class="uk-input" style="padding-left: 52px !important;" id="form-horizontal-text4" type="text" [placeholder]="t('configure-app.leave-blank-to-accept-transactions-of-any-amount')">
</div>

View file

@ -47,7 +47,7 @@ export class ConfigureAppComponent implements OnInit {
selectedLanguage = this.languages[0].id;
denominations = [
{ name: 'NANO', value: 'mnano' },
{ name: 'XNO', value: 'mnano' },
{ name: 'knano', value: 'knano' },
{ name: 'nano', value: 'nano' },
];

View file

@ -7,7 +7,7 @@
</div>
<p>
<b>You already have a local Nault wallet configured</b><br>
Before going any further, be 100% certain you have backed up the seed to your current wallet!<br>
Before going any further, be 100% certain you have backed up the secret recovery phrase for your current wallet!<br>
Without it, <b>any funds you have will become completely unrecoverable!</b>
</p>
</div>
@ -221,7 +221,7 @@
<div uk-icon="icon: info; ratio: 2;"></div>
</div>
<p style="max-width: 580px;">
<b>Note:</b> A secret seed provides access to 4,294,967,295 accounts.<br>
<b>Note:</b> A secret recovery seed provides access to 4,294,967,295 accounts.<br>
To import a single-account private key instead, <a class="inline-link" (click)="selectedImportOption = 'privateKey';">click here</a>
</p>
</div>
@ -236,7 +236,7 @@
</div>
<p style="max-width: 580px;">
<b>Note:</b> A private key provides access to exactly one account.<br>
To import a multi-account secret seed instead, <a class="inline-link" (click)="selectedImportOption = 'seed';">click here</a>
To import a multi-account secret recovery seed instead, <a class="inline-link" (click)="selectedImportOption = 'seed';">click here</a>
</p>
</div>
</div>
@ -253,33 +253,33 @@
</div>
<div uk-grid *ngIf="selectedImportOption === 'seed'" class="uk-margin-top">
<div class="uk-width-1-1">
<h3>Import Seed</h3>
<h3>Import Secret Recovery Seed</h3>
<p>
Enter your Nano secret seed below.
Enter your secret recovery seed below.
</p>
<div class="uk-inline uk-width-1-1">
<a class="uk-form-icon uk-form-icon-flip" uk-icon="icon: camera" (click)="openQR('seed1','hash')" uk-tooltip title="Scan from QR code"></a>
<input type="text" class="uk-input" (keyup.enter)="setPasswordInit()" [(ngModel)]="importSeedModel" placeholder="64 hex character Nano Seed">
<input type="text" class="uk-input" (keyup.enter)="setPasswordInit()" [(ngModel)]="importSeedModel" placeholder="64 hex character secret recovery seed">
</div>
</div>
</div>
<div uk-grid *ngIf="selectedImportOption === 'mnemonic'" class="uk-margin-top">
<div class="uk-width-1-1">
<h3>Import Nano Mnemonic</h3>
<h3>Import Secret Recovery Mnemonic</h3>
<p>
Enter your Nano mnemonic phrase below.<br>If it came from a Ledger device or certain multi-currency wallets, use <a (click)="selectedImportOption = 'bip39-mnemonic';">BIP39 Mnemonic</a> import type instead.
Enter your secret recovery mnemonic below.<br>If it came from a Ledger device or certain multi-currency wallets, use <a (click)="selectedImportOption = 'bip39-mnemonic';">BIP39 Mnemonic</a> import type instead.
</p>
<div class="uk-inline uk-width-1-1">
<a class="uk-form-icon uk-form-icon-flip" uk-icon="icon: camera" (click)="openQR('mnemo1','mnemonic')" uk-tooltip title="Scan from QR code"></a>
<textarea class="uk-textarea" rows="3" [(ngModel)]="importSeedMnemonicModel" placeholder="24-words mnemonic phrase"></textarea>
<textarea class="uk-textarea" rows="3" [(ngModel)]="importSeedMnemonicModel" placeholder="24-words secret recovery mnemonic"></textarea>
</div>
</div>
</div>
<div uk-grid *ngIf="selectedImportOption === 'bip39-mnemonic'" class="uk-margin-top">
<div class="uk-width-1-1">
<h3>Import BIP39 Mnemonic</h3>
<h3>Import Secret Recovery BIP39 Mnemonic</h3>
<p>
Enter your BIP39 mnemonic phrase below. It is typically generated by Ledger devices and certain multi-currency wallets.<br>If it was generated in Nault, use <a (click)="selectedImportOption = 'mnemonic';">Nano Mnemonic</a> import type instead.
Enter your secret recovery BIP39 mnemonic below. It is typically generated by Ledger devices and certain multi-currency wallets.<br>If it was generated in Nault, use <a (click)="selectedImportOption = 'mnemonic';">Nano Mnemonic</a> import type instead.
</p>
<div class="uk-form-horizontal">
<div class="uk-margin">
@ -287,7 +287,7 @@
<div class="uk-form-controls">
<div class="uk-inline uk-width-expand">
<a class="uk-form-icon uk-form-icon-flip" uk-icon="icon: camera" (click)="openQR('mnemo2','mnemonic')" uk-tooltip title="Scan from QR code"></a>
<textarea class="uk-textarea" rows="2" [(ngModel)]="importSeedBip39MnemonicModel" placeholder="12,15,18,21 or 24-words mnemonic phrase" autocomplete="off"></textarea>
<textarea class="uk-textarea" rows="2" [(ngModel)]="importSeedBip39MnemonicModel" placeholder="12,15,18,21 or 24-words secret recovery BIP39 mnemonic" autocomplete="off"></textarea>
</div>
</div>
</div>
@ -314,7 +314,7 @@
<div class="uk-width-1-1">
<h3>Use Ledger Hardware Wallet</h3>
<p>
Make sure you have the Nano app installed and running on your Ledger, then click one of the buttons below to connect via either USB or Bluetooth.<br>
Make sure you have the nano app installed and running on your Ledger, then click one of the buttons below to connect via either USB or Bluetooth.<br>
<a href="https://docs.nault.cc/2020/08/04/ledger-guide.html" target="_blank" rel="noopener noreferrer">Ledger/Nault User Guide and Troubleshooting</a><br>
<br>
</p>
@ -338,7 +338,7 @@
</div>
<p>
<b>Ledger Device Not Connected</b><br>
Connect your Ledger device and make sure you have the Nano app installed and running, then press the button below.<br>
Connect your Ledger device and make sure you have the nano app installed and running, then press the button below.<br>
<span *ngIf=!ledgerService.supportsBluetooth>Bluetooth is currently not supported by your browser, please use Google Chrome or <a href="https://github.com/Nault/Nault/releases/latest" target="_blank" rel="noopener noreferrer">download the Desktop App</a></span>
</p>
</div>
@ -372,7 +372,7 @@
<div class="uk-width-1-1">
<h3>Import Private Key</h3>
<p>
Enter your Nano private key below.
Enter your nano account's private key below.
</p>
<div class="uk-inline uk-width-1-1">
<a class="uk-form-icon uk-form-icon-flip" uk-icon="icon: camera" (click)="openQR('priv1','hash')" uk-tooltip title="Scan from QR code"></a>
@ -384,7 +384,7 @@
<div class="uk-width-1-1">
<h3>Import Expanded Private Key</h3>
<p>
Enter your expanded private key below. These are rare, and are usually generated from multi-party cryptography magic.
Enter your nano account's expanded private key below. These are rare, and are usually generated from multi-party cryptography magic.
</p>
<div class="uk-inline uk-width-1-1">
<a class="uk-form-icon uk-form-icon-flip" uk-icon="icon: camera" (click)="openQR('expanded1','hash')" uk-tooltip title="Scan from QR code"></a>
@ -507,7 +507,7 @@
</div>
<div class="uk-card-body">
<p>
Your wallet has been created and you are ready to send and receive Nano!<br>
Your wallet has been created and you are ready to send and receive nano!<br>
It will lock after a certain amount of inactivity which can be changed in the <a routerLink="/configure-app" routerLinkActive="active">app settings</a>.
</p>
</div>

View file

@ -58,15 +58,6 @@ export class ConfigureWalletComponent implements OnInit {
indexMax = INDEX_MAX;
selectedImportOption = 'seed';
importOptions = [
{ name: 'Nano Seed', value: 'seed' },
{ name: 'Nano Mnemonic Phrase', value: 'mnemonic' },
{ name: 'BIP39 Mnemonic Phrase', value: 'bip39-mnemonic' },
{ name: 'Nault Wallet File', value: 'file' },
{ name: 'Ledger Nano S / Nano X', value: 'ledger' },
{ name: 'Private Key', value: 'privateKey' },
{ name: 'Expanded Private Key', value: 'expandedKey' },
];
ledgerStatus = LedgerStatus;
ledger = this.ledgerService.ledger;
@ -168,11 +159,11 @@ export class ConfigureWalletComponent implements OnInit {
if (this.ledger.status === LedgerStatus.NOT_CONNECTED) {
this.ledgerService.resetLedger();
return this.notifications.sendWarning(`Failed to connect the Ledger device. Make sure the Nano app is running on the Ledger. If the error persists: Check the <a href="https://docs.nault.cc/2020/08/04/ledger-guide.html#troubleshooting" target="_blank" rel="noopener noreferrer">troubleshooting guide</a>`, { identifier: 'ledger-error', length: 0 });
return this.notifications.sendWarning(`Failed to connect the Ledger device. Make sure the nano app is running on the Ledger. If the error persists: Check the <a href="https://docs.nault.cc/2020/08/04/ledger-guide.html#troubleshooting" target="_blank" rel="noopener noreferrer">troubleshooting guide</a>`, { identifier: 'ledger-error', length: 0 });
}
if (this.ledger.status === LedgerStatus.LOCKED) {
return this.notifications.sendWarning(`Unlock your Ledger device and open the Nano app to continue`);
return this.notifications.sendWarning(`Unlock your Ledger device and open the nano app to continue`);
}
if (this.ledger.status === LedgerStatus.READY) {
@ -203,13 +194,13 @@ export class ConfigureWalletComponent implements OnInit {
if (this.walletService.isLedgerWallet()) {
msg = '<p class="uk-alert uk-alert-danger"><br><span class="uk-flex"><span uk-icon="icon: warning; ratio: 3;" class="uk-align-center"></span></span><span style="font-size: 18px;">You are about to configure a new wallet, which will <b>disconnect your Ledger device from Nault</b>.</span><br><br>If you need to use the Ledger wallet, simply import your device again.<br><br><b style="font-size: 18px;">Make sure you have saved the recovery phrase you got when initially setting up your Ledger device</b>.<br><br><span style="font-size: 18px;"><b>YOU WILL NOT BE ABLE TO RECOVER THE FUNDS</b><br>if you lose both the recovery phrase and access to your Ledger device.</span></p><br>';
} else {
msg = '<p class="uk-alert uk-alert-danger"><br><span class="uk-flex"><span uk-icon="icon: warning; ratio: 3;" class="uk-align-center"></span></span><span style="font-size: 18px;">You are about to configure a new wallet, which will <b>replace your currently configured wallet</b>.</span><br><br><b style="font-size: 18px;">Before continuing, make sure you have saved the Nano seed and/or mnemonic of your current wallet</b>.<br><br><span style="font-size: 18px;"><b>YOU WILL NOT BE ABLE TO RECOVER THE FUNDS</b><br>without a backup of your currently configured wallet.</span></p><br>';
msg = '<p class="uk-alert uk-alert-danger"><br><span class="uk-flex"><span uk-icon="icon: warning; ratio: 3;" class="uk-align-center"></span></span><span style="font-size: 18px;">You are about to configure a new wallet, which will <b>replace your currently configured wallet</b>.</span><br><br><b style="font-size: 18px;">' + this.translocoService.translate('reset-wallet.before-continuing-make-sure-you-have-saved-the-nano-seed') + '</b><br><br><b style="font-size: 18px;">' + this.translocoService.translate('reset-wallet.you-will-not-be-able-to-recover-the-funds-without-a-backup') + '</b></p><br>';
}
await UIkit.modal.confirm(msg);
return true;
} catch (err) {
if (!this.walletService.isLedgerWallet()) {
this.notifications.sendInfo(`You can use the 'Manage Wallet' page to backup your Nano seed and/or mnemonic`);
this.notifications.sendInfo(`You can use the 'Manage Wallet' page to backup your wallet's secret recovery seed and/or mnemonic`);
}
return false;
}
@ -352,7 +343,7 @@ export class ConfigureWalletComponent implements OnInit {
this.walletService.saveWalletExport();
this.walletService.informNewWallet();
this.notifications.sendSuccess(`Successfully created new wallet! Do not lose the seed/mnemonic!`);
this.notifications.sendSuccess(`Successfully created new wallet! Do not lose the secret recovery seed/mnemonic!`);
}
setPanel(panel) {

View file

@ -9,7 +9,7 @@
<div class="uk-width-1-1 narrow-div">
<div class="uk-form-horizontal">
<div class="uk-margin">
<label class="uk-form-label" for="mnano">NANO <span uk-icon="icon: info;" uk-tooltip title="The main unit used in Nano wallets and exchanges. Also known as Mnano."></span></label>
<label class="uk-form-label" for="mnano">XNO <span uk-icon="icon: info;" uk-tooltip title="The main unit used in nano wallets and exchanges."></span></label>
<div class="uk-form-controls">
<div uk-grid>
<div class="uk-width-1-1">
@ -27,7 +27,7 @@
<div class="uk-width-1-1 narrow-div">
<div class="uk-form-horizontal">
<div class="uk-margin">
<label class="uk-form-label" for="raw">raw <span uk-icon="icon: info;" uk-tooltip title="The smallest possible Nano unit"></span></label>
<label class="uk-form-label" for="raw">raw <span uk-icon="icon: info;" uk-tooltip title="The smallest possible unit of XNO."></span></label>
<div class="uk-form-controls">
<div uk-grid>
<div class="uk-width-1-1">

View file

@ -121,7 +121,7 @@
<div class="amount" *ngIf="isReceivableTransaction || isSendTransaction || isReceiveTransaction">
<span class="amount-integer">{{ transaction.amount | rai: 'mnano,true' | amountsplit: 0 }}</span>
<span class="amount-fractional">{{ transaction.amount | rai: 'mnano,true' | amountsplit: 1 }}</span>
<span class="currency-name">NANO</span>
<span class="currency-name">XNO</span>
</div>
</div>
<div class="column account-date uk-text-truncate">

View file

@ -13,8 +13,8 @@
<div class="uk-card uk-card-default uk-margin" *ngIf="activePanel == 'import'">
<div *ngIf="walletService.isConfigured()" class="uk-alert uk-alert-danger">
<b>You already have a wallet configured</b><br>
Before going any further, be 100% certain you have backed up the seed to your current wallet!<br>
<b>You already have a local Nault wallet configured</b><br>
Before going any further, be 100% certain you have backed up the secret recovery phrase for your current wallet!<br>
Without it, <b>any funds you have will become completely unrecoverable!</b>
</div>
<div class="uk-card-header">

View file

@ -1,3 +1,7 @@
.word-wrap-anywhere {
word-wrap: anywhere;
}
pre.mnemonic {
white-space: pre-wrap;
}

View file

@ -8,7 +8,7 @@
You will need to manually store the recovery options for each generated address that you want to retain access to.</p>
<div>
<ul>
<li>The account can receive incoming funds at any time and live transactions can happen in any wallet that supports import of a Nano seed, mnemonic or private key.</li>
<li>The account can receive incoming funds at any time and live transactions can happen in any wallet that supports import of nano secret recovery seed/mnemonic or private key.</li>
<li>For additional security the keys can be generated and stored offline to be utilized in methods such as <a routerLink="/remote-signing" class="name">Remote Signing</a> and <a routerLink="/multisig" class="name">Multisig</a></li>
</ul>
</div>
@ -23,12 +23,12 @@
<div class="uk-card-body">
<div uk-grid>
<div class="uk-width-1-4">Nano Seed <span uk-icon="icon: info;" uk-tooltip title="Can be used to derive many private keys with different indexes or converted to a mnemonic. It's NOT bip39/44."></span></div>
<div class="uk-width-3-4 uk-text-truncate">
<div class="uk-width-1-4@m">{{ 'configure-wallet.new-wallet.secret-recovery-seed' | transloco }} <span uk-icon="icon: info;" uk-tooltip title="Can be used to derive many private keys with different indexes or converted to a secret recovery mnemonic. It's NOT bip39/44."></span></div>
<div class="uk-width-3-4@m">
<div *ngIf="seed == ''" class="uk-margin-small-bottom">...</div>
<div *ngIf="seed !== ''">
<div class="uk-margin-small-bottom">{{ seed }}</div>
<a title="Copy seed To Clipboard" ngxClipboard [cbContent]="seed" (cbOnSuccess)="copied()" uk-tooltip>Copy seed to clipboard</a>
<div class="uk-margin-small-bottom word-wrap-anywhere">{{ seed }}</div>
<a [title]="( 'configure-wallet.new-wallet.copy-secret-recovery-seed' | transloco )" ngxClipboard [cbContent]="seed" (cbOnSuccess)="copied()" uk-tooltip>{{ 'configure-wallet.new-wallet.copy-secret-recovery-seed' | transloco }}</a>
</div>
</div>
</div>
@ -36,13 +36,13 @@
<div uk-grid>
<div class="uk-width-1-4@m">
Nano Mnemonic <span uk-icon="icon: info;" uk-tooltip title="Can be used to derive many private keys with different indexes or converted to a Nano seed. It's NOT bip39/44."></span>
{{ 'configure-wallet.new-wallet.secret-recovery-mnemonic' | transloco }} <span uk-icon="icon: info;" uk-tooltip title="Can be used to derive many private keys with different indexes or converted to a secret recovery seed. It's NOT bip39/44."></span>
</div>
<div class="uk-width-3-4@m">
<div *ngIf="mnemonic == ''" class="uk-margin-small-bottom">...</div>
<div *ngIf="mnemonic !== ''">
<pre class="mne-box"><span *ngFor="let line of newWalletMnemonicLines; let l = index" class="mne-cont"><span *ngFor="let word of line; let i = index" class="mne-word"><span class="mne-num">{{ (l * 4) + i + 1 }}</span> {{ word }}</span></span></pre>
<a title="Copy mnemonic To Clipboard" ngxClipboard [cbContent]="mnemonic" (cbOnSuccess)="copied()" uk-tooltip>Copy mnemonic to clipboard</a>
<a [title]="('configure-wallet.new-wallet.copy-secret-recovery-mnemonic' | transloco)" ngxClipboard [cbContent]="mnemonic" (cbOnSuccess)="copied()" uk-tooltip>{{ 'configure-wallet.new-wallet.copy-secret-recovery-mnemonic' | transloco }}</a>
</div>
</div>
</div>
@ -52,11 +52,11 @@
<div class="uk-width-1-4@m">
Private Key - Index 0
</div>
<div class="uk-width-3-4@m uk-text-truncate">
<div class="uk-width-3-4@m">
<div *ngIf="privateKey == ''" class="uk-margin-small-bottom">...</div>
<div *ngIf="privateKey !== ''">
<div class="uk-margin-small-bottom">{{ privateKey }}</div>
<a title="Copy Private Key To Clipboard" ngxClipboard [cbContent]="privateKey" (cbOnSuccess)="copied()" uk-tooltip>Copy private key to clipboard</a>
<div class="uk-margin-small-bottom word-wrap-anywhere">{{ privateKey }}</div>
<a title="Copy Private Key" ngxClipboard [cbContent]="privateKey" (cbOnSuccess)="copied()" uk-tooltip>Copy Private Key</a>
</div>
</div>
</div>
@ -68,8 +68,8 @@
<div uk-icon="icon: warning; ratio: 2;"></div>
</div>
<p>
You will NOT be able to access any funds on the address below, without a seed, mnemonic or a private key written above.<br>
Make sure to securely store any of the seed, mnemonic or private key, save it somewhere safe and <strong>never share it with anyone!</strong>
You will NOT be able to access any funds on the address below, without a secret recovery seed/mnemonic or a private key written above.<br>
Make sure to securely store any of the secret recovery seed, mnemonic or private key, save it somewhere safe and <strong>never share it with anyone!</strong>
</p>
</div>
</div>
@ -82,8 +82,8 @@
<div class="uk-width-3-4@m uk-text-truncate">
<div *ngIf="account == ''" class="uk-margin-small-bottom">...</div>
<div *ngIf="account !== ''">
<div class="uk-margin-small-bottom"><app-nano-account-id [accountID]="account" middle="on" class="nano-address-monospace"></app-nano-account-id></div>
<a title="Copy address To Clipboard" ngxClipboard [cbContent]="account" (cbOnSuccess)="copied()" uk-tooltip>Copy address to clipboard</a>
<div class="uk-margin-small-bottom"><app-nano-account-id [accountID]="account" middle="auto" class="nano-address-monospace"></app-nano-account-id></div>
<a title="Copy Address" ngxClipboard [cbContent]="account" (cbOnSuccess)="copied()" uk-tooltip>Copy Address</a>
</div>
</div>
</div>

View file

@ -31,19 +31,19 @@
</div>
<div class="uk-card-body">
<p *ngIf="wallet.locked && wallet.type === 'seed'">
<span uk-icon="icon: lock;"></span> Unlock wallet to access the seed/mnemonic.
<span uk-icon="icon: lock;"></span> Unlock wallet to access the secret recovery seed/mnemonic.
</p>
<p *ngIf="wallet.locked && (wallet.type === 'privateKey' || wallet.type === 'expandedKey')">
<span uk-icon="icon: lock;"></span> Unlock wallet to access the private key.
</p>
<p *ngIf="!wallet.locked && wallet.type === 'seed'">
To backup your wallet mnemonic phrase, <a title="Copy Mnemonic To Clipboard" ngxClipboard [cbContent]="seedMnemonic()" (cbOnSuccess)="notifications.sendSuccess('Wallet mnemonic copied to clipboard!')" uk-tooltip>click here</a> to copy it to your clipboard.
To backup your wallet's secret recovery mnemonic, <a [title]="('configure-wallet.new-wallet.copy-secret-recovery-mnemonic' | transloco)" ngxClipboard [cbContent]="seedMnemonic()" (cbOnSuccess)="notifications.sendSuccess('Wallet mnemonic copied to clipboard!')" uk-tooltip>click here</a> to copy it to your clipboard.
</p>
<p *ngIf="!wallet.locked && wallet.type === 'seed'">
To backup your wallet seed, <a title="Copy Seed To Clipboard" ngxClipboard [cbContent]="wallet.seed" (cbOnSuccess)="notifications.sendSuccess('Wallet seed copied to clipboard!')" uk-tooltip>click here</a> to copy it to your clipboard.<br>
To backup your wallet's secret recovery seed, <a [title]="( 'configure-wallet.new-wallet.copy-secret-recovery-seed' | transloco )" ngxClipboard [cbContent]="wallet.seed" (cbOnSuccess)="notifications.sendSuccess('Wallet seed copied to clipboard!')" uk-tooltip>click here</a> to copy it to your clipboard.<br>
</p>
<p *ngIf="!wallet.locked && (wallet.type === 'privateKey' || wallet.type === 'expandedKey')">
To backup your private key, <a title="Copy Private Key To Clipboard" ngxClipboard [cbContent]="wallet.seed" (cbOnSuccess)="notifications.sendSuccess('Private Key copied to clipboard!')" uk-tooltip>click here</a> to copy it to your clipboard.<br>
To backup your wallet account's private key, <a title="Copy Private Key" ngxClipboard [cbContent]="wallet.seed" (cbOnSuccess)="notifications.sendSuccess('Private Key copied to clipboard!')" uk-tooltip>click here</a> to copy it to your clipboard.<br>
</p>
</div>
</div>
@ -75,7 +75,7 @@
<p>
<b>If you forget the wallet password used at the time of this export, you will NOT be able to restore your wallet.</b>
<br><br>
For backup purposes, <b>always store the seed and/or mnemonic</b> from the "Backup Wallet" section above.
For backup purposes, <b>always store the secret recovery seed and/or mnemonic</b> from the "Backup Wallet" section above.
</p>
</div>
</div>
@ -130,7 +130,7 @@
<label class="uk-form-label" for="account">Account</label>
<div class="uk-form-controls">
<select class="uk-select" id="account" [(ngModel)]="csvAccount">
<option *ngFor="let account of accounts" [value]="account.id">{{account.addressBookName ? account.addressBookName + ' - ' : '#' + account.index + ' - ' }} {{ account.id | squeeze }} ({{ account.balance | rai: 'mnano,true' | amountsplit: 0 }}{{ account.balance | rai: 'mnano,true' | amountsplit: 1 }} NANO)</option>
<option *ngFor="let account of accounts" [value]="account.id">{{account.addressBookName ? account.addressBookName + ' - ' : '#' + account.index + ' - ' }} {{ account.id | squeeze }} ({{ account.balance | rai: 'mnano,true' | amountsplit: 0 }}{{ account.balance | rai: 'mnano,true' | amountsplit: 1 }} XNO)</option>
</select>
</div>
</div>

View file

@ -12,7 +12,7 @@
</p>
<h4>1 - Create a Multisig Address</h4>
<p>Add 2 or more Nano addresses to form a new multisig address.<br>
<p>Add 2 or more nano addresses to form a new multisig address.<br>
If you (or the participants) don't have any, they can be generated with the <a routerLink="/keygenerator" class="name">Keypair Generator</a> and stored safely.
</p>
<div>

View file

@ -52,7 +52,7 @@ export class MultisigComponent implements OnInit {
addAccount() {
if (this.accountAddStatus !== 1) {
this.notificationService.removeNotification('account-invalid');
this.notificationService.sendWarning('Invalid Nano address!', {identifier: 'account-invalid'});
this.notificationService.sendWarning('Invalid nano address!', {identifier: 'account-invalid'});
return;
}
if (this.storedAccounts.includes(this.accountAdd.replace('xrb_', 'nano_').toLocaleLowerCase())) {
@ -133,7 +133,7 @@ export class MultisigComponent implements OnInit {
if (this.validateMultisig()) {
this.router.navigate(['account', this.multisigAccount], { queryParams: {sign: 1}});
} else {
this.notificationService.sendWarning('Invalid Nano account!');
this.notificationService.sendWarning('Invalid nano account!');
}
}

View file

@ -30,14 +30,6 @@
max-width: 450px;
}
.icon-nano-logo {
margin: 13px 11px;
width: 32px;
background-color: currentcolor;
-webkit-mask-image: url('assets/img/nano-mark-simple.svg');
mask-image: url('assets/img/nano-mark-simple.svg');
}
.receive-columns {
display: flex;
flex-direction: column;

View file

@ -13,7 +13,7 @@
<div class="form-account">
<select id="form-horizontal-select" class="uk-select" [(ngModel)]="pendingAccountModel" (change)="onSelectedAccountChange(pendingAccountModel)">
<option [value]="0">All Accounts</option>
<option *ngFor="let account of accounts" [value]="account.id">{{account.addressBookName ? account.addressBookName + ' - ' : '#' + account.index + ' - ' }} {{ account.id | squeeze }} ({{ account.balance | rai: 'mnano,true' | amountsplit: 0 }}{{ account.balance | rai: 'mnano,true' | amountsplit: 1 }} NANO)</option>
<option *ngFor="let account of accounts" [value]="account.id">{{account.addressBookName ? account.addressBookName + ' - ' : '#' + account.index + ' - ' }} {{ account.id | squeeze }} ({{ account.balance | rai: 'mnano,true' | amountsplit: 0 }}{{ account.balance | rai: 'mnano,true' | amountsplit: 1 }} XNO)</option>
</select>
</div>
</div>
@ -22,12 +22,12 @@
<label for="form-horizontal-amount" class="uk-form-label label-block">Requested Amount <span class="uk-text-muted label-optional">optional</span></label>
<div class="form-amount">
<div class="uk-width-1-1 uk-inline">
<label class="uk-form-icon uk-link-reset uk-link-muted icon-nano-logo" for="form-horizontal-amount"></label>
<input [(ngModel)]="amountNano" [ngClass]="{ 'uk-form-danger': !validNano }" [attr.disabled]="pendingAccountModel == '0' || null" autocomplete="off" class="uk-input" id="form-horizontal-amount" (input)="nanoAmountChange()" style="padding-left: 52px !important;" type="number" step="any" placeholder="Amount of NANO" maxlength="40">
<label class="uk-form-icon uk-link-reset uk-link-muted xno-symbol" for="form-horizontal-amount"></label>
<input [(ngModel)]="amountNano" [ngClass]="{ 'uk-form-danger': !validNano }" [attr.disabled]="pendingAccountModel == '0' || null" autocomplete="off" class="uk-input" id="form-horizontal-amount" (input)="nanoAmountChange()" style="padding-left: 52px !important;" type="number" step="any" placeholder="Amount of XNO" maxlength="40">
</div>
<div style="margin-top: 10px;" *ngIf="settings.settings.displayCurrency">
<div class="uk-width-1-1 uk-inline">
<a class="uk-form-icon uk-link-reset uk-link-muted fiat-currency-ticker" uk-tooltip title="Last Price: {{ price.price.lastPrice | fiat: settings.settings.displayCurrency }} / NANO">{{ settings.settings.displayCurrency | currencySymbol }}</a>
<a class="uk-form-icon uk-link-reset uk-link-muted fiat-currency-ticker" uk-tooltip title="Last Price: {{ price.price.lastPrice | fiat: settings.settings.displayCurrency }} / XNO">{{ settings.settings.displayCurrency | currencySymbol }}</a>
<input [(ngModel)]="amountFiat" [ngClass]="{ 'uk-form-danger': !validFiat }" [attr.disabled]="pendingAccountModel == '0' || null" autocomplete="off" (input)="fiatAmountChange()" style="padding-left: 52px !important;" class="uk-input" id="form-horizontal-text-fiat" type="number" step="any" placeholder="Amount of {{ settings.settings.displayCurrency }}">
</div>
</div>
@ -202,7 +202,7 @@
<span class="uk-text-small">Ready to receive</span><br>
<span class="amount-integer">{{ pending.amount | rai: 'mnano,true' | amountsplit: 0 }}</span>
<span class="amount-fractional">{{ pending.amount | rai: 'mnano,true' | amountsplit: 1 }}</span>
<span class="currency-name">NANO</span>
<span class="currency-name">XNO</span>
<div class="compact-actions-date">
<ng-template [ngTemplateOutlet]="transactionActions"></ng-template>
</div>
@ -226,7 +226,7 @@
<table class="uk-table uk-table-striped uk-table-small" *ngIf="settings.settings.minimumReceive">
<thead>
<tr class="uk-alert uk-alert-primary missing-accounts-hint">
<td colspan="4" style="text-align: center;"><span uk-icon="icon: info"></span> Minimum Receive is set to <a class="hint-action" routerLink="/configure-app" routerLinkActive="active" *ngIf="( util.nano.mnanoToRaw(this.settings.settings.minimumReceive).toFixed().length > 24 ) else amountInRaw">{{ util.nano.mnanoToRaw(this.settings.settings.minimumReceive).toFixed() | rai: 'mnano,true' | amountsplit: 0 }}{{ util.nano.mnanoToRaw(this.settings.settings.minimumReceive).toFixed() | rai: 'mnano,true' | amountsplit: 1 }} NANO</a><ng-template #amountInRaw><a class="hint-action" routerLink="/configure-app" routerLinkActive="active">{{ util.nano.mnanoToRaw(this.settings.settings.minimumReceive).toFixed() }} raw</a></ng-template>, transactions below this amount will be hidden.</td>
<td colspan="4" style="text-align: center;"><span uk-icon="icon: info"></span> Minimum Receive is set to <a class="hint-action" routerLink="/configure-app" routerLinkActive="active" *ngIf="( util.nano.mnanoToRaw(this.settings.settings.minimumReceive).toFixed().length > 24 ) else amountInRaw">{{ util.nano.mnanoToRaw(this.settings.settings.minimumReceive).toFixed() | rai: 'mnano,true' | amountsplit: 0 }}{{ util.nano.mnanoToRaw(this.settings.settings.minimumReceive).toFixed() | rai: 'mnano,true' | amountsplit: 1 }} XNO</a><ng-template #amountInRaw><a class="hint-action" routerLink="/configure-app" routerLinkActive="active">{{ util.nano.mnanoToRaw(this.settings.settings.minimumReceive).toFixed() }} raw</a></ng-template>, transactions below this amount will be hidden.</td>
</tr>
</thead>
</table>

View file

@ -319,7 +319,7 @@ export class ReceiveComponent implements OnInit, OnDestroy {
receivableBlock.received = true;
this.mobileTransactionMenuModal.hide();
this.notificationService.removeNotification('success-receive');
this.notificationService.sendSuccess(`Successfully received Nano!`, { identifier: 'success-receive' });
this.notificationService.sendSuccess(`Successfully received nano!`, { identifier: 'success-receive' });
// pending has been processed, can be removed from the list
// list also updated with reloadBalances but not if called too fast
this.walletService.removePendingBlock(receivableBlock.hash);

View file

@ -6,13 +6,13 @@
<div class="uk-width-1-1">
<div class="uk-card uk-card-default">
<div class="uk-card-header uk-form-horizontal">
<p><strong>An extremely secure way of transacting on the Nano network without exposing your private keys to the Internet, ensuring only non-sensitive data is transferred between devices.</strong>
<p><strong>An extremely secure way of transacting on the nano network without exposing your private keys to the Internet, ensuring only non-sensitive data is transferred between devices.</strong>
<br>
A full security and user guide is found <a href="https://docs.nault.cc/2020/08/05/security-of-nano.html#transact-using-a-remote-signing-procedure" target="_blank" rel="noopener noreferrer">here</a>.
</p>
<h4>STEP 1 - Create Block (Online Device)</h4>
<p>Create a SEND, RECEIVE or CHANGE block from a "watch-only" account. No login is needed.</p>
<p>Create a SEND, RECEIVE or CHANGE block from a "watch-only" account. No wallet import needed.</p>
<div class="uk-form-horizontal">
<div class="uk-margin">

View file

@ -108,7 +108,7 @@ export class RemoteSigningComponent implements OnInit {
if (this.validateDestination()) {
this.router.navigate(['account', this.toAccountID], { queryParams: {sign: 1}});
} else {
this.notificationService.sendWarning('Invalid Nano account!');
this.notificationService.sendWarning('Invalid nano account!');
}
}

View file

@ -14,7 +14,7 @@
<div class="uk-width-1-1">
<div class="uk-card uk-overflow-auto" *ngIf="!hideOverview">
<p>Representatives participate in the <a href="https://docs.nano.org/protocol-design/orv-consensus/" target="_blank" rel="noopener noreferrer">Nano consensus protocol</a> on your behalf. You can change them at any time.</p>
<p>Representatives participate in the <a href="https://docs.nano.org/protocol-design/orv-consensus/" target="_blank" rel="noopener noreferrer">nano consensus protocol</a> on your behalf. You can change them at any time.</p>
<table class="uk-table uk-table-striped uk-table-small">
<thead>
@ -74,7 +74,7 @@
<div class="amounts">
<span class="amount-integer">{{ rep.delegatedWeight | rai: 'mnano,true' | amountsplit: 0 }}</span>
<span class="amount-fractional">{{ rep.delegatedWeight | rai: 'mnano,true' | amountsplit: 1 }}</span>
<span class="currency-name">NANO</span>
<span class="currency-name">XNO</span>
</div>
</td>
</tr>
@ -97,7 +97,7 @@
<div class="amounts">
<span class="amount-integer">{{ delegatingAccount.balance | rai: 'mnano,true' | amountsplit: 0 }}</span>
<span class="amount-fractional">{{ delegatingAccount.balance | rai: 'mnano,true' | amountsplit: 1 }}</span>
<span class="currency-name">NANO</span>
<span class="currency-name">XNO</span>
</div>
</td>
</tr>
@ -136,7 +136,7 @@
<select class="uk-select" [(ngModel)]="changeAccountID" (change)="newAccountID()" id="form-horizontal-select">
<option [value]="null">Select Accounts to Change</option>
<option [value]="'all'">All Current Accounts</option>
<option *ngFor="let account of walletService.wallet.accounts" [value]="account.id">{{account.addressBookName ? account.addressBookName + ' - ' : '#' + account.index + ' - ' }} {{ account.id | squeeze }} ({{ account.balance | rai: 'mnano,true' | amountsplit: 0 }}{{ account.balance | rai: 'mnano,true' | amountsplit: 1 }} NANO)</option>
<option *ngFor="let account of walletService.wallet.accounts" [value]="account.id">{{account.addressBookName ? account.addressBookName + ' - ' : '#' + account.index + ' - ' }} {{ account.id | squeeze }} ({{ account.balance | rai: 'mnano,true' | amountsplit: 0 }}{{ account.balance | rai: 'mnano,true' | amountsplit: 1 }} XNO)</option>
</select>
<ul class="uk-list uk-list-striped">
<li *ngFor="let account of selectedAccounts">

View file

@ -88,11 +88,3 @@
.send-types-tab-active {
border-color: transparent;
}
.icon-nano-logo {
margin: 13px 11px;
width: 32px;
background-color: currentcolor;
-webkit-mask-image: url('assets/img/nano-mark-simple.svg');
mask-image: url('assets/img/nano-mark-simple.svg');
}

View file

@ -1,6 +1,6 @@
<div class="uk-animation-slide-left-small" uk-grid>
<div class="uk-width-1-1">
<h2 class="uk-heading-divider">{{ (sendDestinationType === 'own-address') ? 'Transfer Nano between own accounts' : 'Send Nano' }}</h2>
<h2 class="uk-heading-divider">{{ (sendDestinationType === 'own-address') ? 'Transfer Nano Between Own Accounts' : 'Send Nano' }}</h2>
<!-- Send Panel -->
<div uk-grid *ngIf="activePanel == 'send'" class="uk-animation-slide-left-small">
@ -22,7 +22,7 @@
<label class="uk-form-label" for="form-horizontal-select">From Account</label>
<div class="uk-form-controls">
<select class="form-select-source uk-select" [(ngModel)]="fromAccountID" (change)="resetRaw()" id="form-horizontal-select">
<option *ngFor="let account of accounts" [value]="account.id">{{account.addressBookName ? account.addressBookName + ' - ' : '#' + account.index + ' - ' }} {{ account.id | squeeze }} ({{ account.balance | rai: 'mnano,true' | amountsplit: 0 }}{{ account.balance | rai: 'mnano,true' | amountsplit: 1 }} NANO)</option>
<option *ngFor="let account of accounts" [value]="account.id">{{account.addressBookName ? account.addressBookName + ' - ' : '#' + account.index + ' - ' }} {{ account.id | squeeze }} ({{ account.balance | rai: 'mnano,true' | amountsplit: 0 }}{{ account.balance | rai: 'mnano,true' | amountsplit: 1 }} XNO)</option>
</select>
</div>
</div>
@ -59,7 +59,7 @@
<select required class="form-select-destination uk-select" [(ngModel)]="toOwnAccountID" id="form-horizontal-select">
<option value="" disabled selected hidden>Account to transfer to</option>
<ng-container *ngFor="let account of accounts">
<option [value]="account.id" *ngIf="account.id !== fromAccountID">{{account.addressBookName ? account.addressBookName + ' - ' : '#' + account.index + ' - ' }} {{ account.id | squeeze }} ({{ account.balance | rai: 'mnano,true' | amountsplit: 0 }}{{ account.balance | rai: 'mnano,true' | amountsplit: 1 }} NANO)</option>
<option [value]="account.id" *ngIf="account.id !== fromAccountID">{{account.addressBookName ? account.addressBookName + ' - ' : '#' + account.index + ' - ' }} {{ account.id | squeeze }} ({{ account.balance | rai: 'mnano,true' | amountsplit: 0 }}{{ account.balance | rai: 'mnano,true' | amountsplit: 1 }} XNO)</option>
</ng-container>
</select>
</div>
@ -73,7 +73,7 @@
<div class="uk-width-1-1">
<div class="uk-inline uk-width-1-1">
<a class="max-amt-button uk-form-icon uk-form-icon-flip form-icon-btn" (click)="setMaxAmount()" uk-tooltip title="Set Maximum Amount">Max</a>
<label class="uk-form-icon uk-link-reset uk-link-muted icon-nano-logo" for="form-horizontal-amount"></label>
<label class="uk-form-icon uk-link-reset uk-link-muted xno-symbol" for="form-horizontal-amount"></label>
<input [(ngModel)]="amount" [ngClass]="{ 'uk-form-danger': amountStatus === 0 }" style="padding-left: 52px !important;" class="uk-input" id="form-horizontal-text" (input)="syncFiatPrice()" type="number" step="any" placeholder="Amount of {{ selectedAmount.name }}" maxlength="40">
</div>
@ -85,7 +85,7 @@
<div class="uk-width-1-1" style="margin-top: 10px;" *ngIf="settings.settings.displayCurrency">
<div class="uk-width-1-1 uk-inline">
<a class="uk-form-icon uk-link-reset uk-link-muted fiat-currency-ticker" uk-tooltip title="Last Price: {{ price.price.lastPrice | fiat: settings.settings.displayCurrency }} / NANO">{{ settings.settings.displayCurrency | currencySymbol }}</a>
<a class="uk-form-icon uk-link-reset uk-link-muted fiat-currency-ticker" uk-tooltip title="Last Price: {{ price.price.lastPrice | fiat: settings.settings.displayCurrency }} / XNO">{{ settings.settings.displayCurrency | currencySymbol }}</a>
<input [(ngModel)]="amountFiat" (input)="syncNanoPrice()" style="padding-left: 52px !important;" class="uk-input" id="form-horizontal-text-fiat" type="number" step="any" placeholder="Amount of {{ settings.settings.displayCurrency }}">
</div>
</div>
@ -101,7 +101,7 @@
<div class="uk-card-footer">
<div class="uk-text-right@s nlt-button-group">
<button class="uk-button uk-button-primary uk-width-1-1@s uk-width-auto@m uk-float-right nlt-icon-button" type="button" (click)="sendTransaction()" *ngIf="!preparingTransaction">
{{ (sendDestinationType === 'own-address') ? 'Transfer Nano' : 'Send Nano' }}
{{ (sendDestinationType === 'own-address') ? 'Transfer nano' : 'Send nano' }}
</button>
<button class="uk-button uk-button-secondary uk-disabled uk-width-1-1@s uk-width-auto@m uk-float-right nlt-icon-button" type="button" *ngIf="preparingTransaction">
<span class="spinner" uk-spinner="ratio: 0.5;"></span>
@ -132,11 +132,11 @@
<div class="block-amount-primary uk-text-danger">
<span class="amount-integer">{{ rawAmount | rai: 'mnano,true' | amountsplit: 0 }}</span>
<span class="amount-fractional">{{ rawAmount | rai: 'mnano,true' | amountsplit: 1 }}</span>
<span class="currency-name">NANO</span>
<span class="currency-name">XNO</span>
</div>
<div *ngIf="amountExtraRaw.gt(0)" class="uk-text-small text-half-muted" style="margin: 2px 0 -2px 0;">+{{ amountExtraRaw.toString(10) }} raw</div>
<div style="margin: 8px 0 -1px 0;" class="text-half-muted" *ngIf="settings.settings.displayCurrency">{{ amountFiat | fiat: settings.settings.displayCurrency }}</div>
<div style="margin: 1px 0 -1px 0;" class="uk-text-muted" *ngIf="settings.settings.displayCurrency">{{ price.price.lastPrice | fiat: settings.settings.displayCurrency }} / NANO</div>
<div style="margin: 1px 0 -1px 0;" class="uk-text-muted" *ngIf="settings.settings.displayCurrency">{{ price.price.lastPrice | fiat: settings.settings.displayCurrency }} / XNO</div>
</div>
</div>
@ -168,7 +168,7 @@
<span class="balance-amount-primary">
<span class="amount-integer">{{ (fromAccount.balance || 0) | rai: 'mnano,true' | amountsplit: 0 }}</span>
<span class="amount-fractional">{{ (fromAccount.balance || 0) | rai: 'mnano,true' | amountsplit: 1 }}</span>
<span class="currency-name">NANO</span>
<span class="currency-name">XNO</span>
</span>
</span>
</div>
@ -179,7 +179,7 @@
<span class="amount-sign">-</span>
<span class="amount-integer">{{ rawAmount | rai: 'mnano,true' | amountsplit: 0 }}</span>
<span class="amount-fractional">{{ rawAmount | rai: 'mnano,true' | amountsplit: 1 }}</span>
<span class="currency-name">NANO</span>
<span class="currency-name">XNO</span>
</span>
</span>
</div>
@ -215,7 +215,7 @@
<span class="balance-amount-primary">
<span class="amount-integer">{{ (toAccount.balance || 0) | rai: 'mnano,true' | amountsplit: 0 }}</span>
<span class="amount-fractional">{{ (toAccount.balance || 0) | rai: 'mnano,true' | amountsplit: 1 }}</span>
<span class="currency-name">NANO</span>
<span class="currency-name">XNO</span>
</span>
</span>
</div>
@ -226,7 +226,7 @@
<span class="amount-sign">+</span>
<span class="amount-integer">{{ rawAmount | rai: 'mnano,true' | amountsplit: 0 }}</span>
<span class="amount-fractional">{{ rawAmount | rai: 'mnano,true' | amountsplit: 1 }}</span>
<span class="currency-name">NANO</span>
<span class="currency-name">XNO</span>
</span>
</span>
</div>

View file

@ -34,7 +34,7 @@ export class SendComponent implements OnInit {
addressBookMatch = '';
amounts = [
{ name: 'NANO', shortName: 'NANO', value: 'mnano' },
{ name: 'XNO', shortName: 'XNO', value: 'mnano' },
{ name: 'knano', shortName: 'knano', value: 'knano' },
{ name: 'nano', shortName: 'nano', value: 'nano' },
];
@ -299,7 +299,7 @@ export class SendComponent implements OnInit {
return this.notificationService.sendWarning(`From and to account are required`);
}
if (!this.validateAmount()) {
return this.notificationService.sendWarning(`Invalid NANO Amount`);
return this.notificationService.sendWarning(`Invalid XNO amount`);
}
this.preparingTransaction = true;
@ -328,7 +328,7 @@ export class SendComponent implements OnInit {
return this.notificationService.sendWarning(`Amount is invalid`);
}
if (from.balanceBN.minus(rawAmount).lessThan(0)) {
return this.notificationService.sendError(`From account does not have enough NANO`);
return this.notificationService.sendError(`From account does not have enough XNO`);
}
// Determine a proper raw amount to show in the UI, if a decimal was entered

View file

@ -20,10 +20,10 @@
<div class="block-amount-primary" [class.uk-text-danger]="txType == txTypes.send" [class.uk-text-success]="txType == txTypes.receive">
<span class="amount-integer">{{ rawAmount | rai: 'mnano,true' | amountsplit: 0 }}</span>
<span class="amount-fractional">{{ rawAmount | rai: 'mnano,true' | amountsplit: 1 }}</span>
<span class="currency-name">NANO</span>
<span class="currency-name">XNO</span>
</div>
<div style="margin: 8px 0 -1px 0;" class="text-half-muted" *ngIf="settings.settings.displayCurrency && amountFiat !== null">{{ amountFiat | fiat: settings.settings.displayCurrency }}</div>
<div style="margin: 1px 0 -1px 0;" class="uk-text-muted" *ngIf="settings.settings.displayCurrency && amountFiat !== null">{{ price.price.lastPrice | fiat: settings.settings.displayCurrency }} / NANO</div>
<div style="margin: 1px 0 -1px 0;" class="uk-text-muted" *ngIf="settings.settings.displayCurrency && amountFiat !== null">{{ price.price.lastPrice | fiat: settings.settings.displayCurrency }} / XNO</div>
</div>
</div>
</div>
@ -57,7 +57,7 @@
<span class="balance-amount-primary">
<span class="amount-integer">{{ fromAccountBalance ? (fromAccountBalance | rai: 'mnano,true' | amountsplit: 0) : 'N/A' }}</span>
<span class="amount-fractional">{{ fromAccountBalance ? (fromAccountBalance | rai: 'mnano,true' | amountsplit: 1) : '' }}</span>
<span class="currency-name">{{ fromAccountBalance ? 'NANO' : '' }}</span>
<span class="currency-name">{{ fromAccountBalance ? 'XNO' : '' }}</span>
</span>
</span>
</div>
@ -68,7 +68,7 @@
<span class="amount-sign">-</span>
<span class="amount-integer">{{ rawAmount | rai: 'mnano,true' | amountsplit: 0 }}</span>
<span class="amount-fractional">{{ rawAmount | rai: 'mnano,true' | amountsplit: 1 }}</span>
<span class="currency-name">NANO</span>
<span class="currency-name">XNO</span>
</span>
</span>
</div>
@ -119,7 +119,7 @@
<span class="balance-amount-primary">
<span class="amount-integer">{{ toAccountBalance && txType === txTypes.receive ? (toAccountBalance | rai: 'mnano,true' | amountsplit: 0) : 'N/A' }}</span>
<span class="amount-fractional">{{ toAccountBalance && txType === txTypes.receive ? (toAccountBalance | rai: 'mnano,true' | amountsplit: 1) : '' }}</span>
<span class="currency-name">{{ toAccountBalance && txType === txTypes.receive ? 'NANO' : '' }}</span>
<span class="currency-name">{{ toAccountBalance && txType === txTypes.receive ? 'XNO' : '' }}</span>
</span>
</span>
</div>
@ -130,7 +130,7 @@
<span class="amount-sign">+</span>
<span class="amount-integer">{{ rawAmount | rai: 'mnano,true' | amountsplit: 0 }}</span>
<span class="amount-fractional">{{ rawAmount | rai: 'mnano,true' | amountsplit: 1 }}</span>
<span class="currency-name">NANO</span>
<span class="currency-name">XNO</span>
</span>
</span>
</div>
@ -169,7 +169,7 @@
<div class="uk-form-controls">
<div class="uk-inline uk-width-1-1" style="height: 40px;">
<a class="uk-form-icon uk-form-icon-flip" uk-icon="icon: camera" (click)="openQR('seed1','generic')" uk-tooltip title="Scan from QR code"></a>
<input [(ngModel)]="sourceSecret" class="uk-input uk-margin-small-bottom {{validSeed ? '':'uk-form-danger'}}" id="source-wallet" type="text" (ngModelChange)="seedChange(sourceSecret)" placeholder="Nano seed, BIP39 seed or 24-word mnemonic" autocomplete="off">
<input [(ngModel)]="sourceSecret" class="uk-input uk-margin-small-bottom {{validSeed ? '':'uk-form-danger'}}" id="source-wallet" type="text" (ngModelChange)="seedChange(sourceSecret)" placeholder="Secret recovery seed, BIP39 seed or 24-word secret recovery mnemonic" autocomplete="off">
</div>
</div>
</div>

View file

@ -1061,7 +1061,7 @@ export class SignComponent implements OnInit {
multiSign() {
const result = this.musigService.runMultiSign(this.privateKey, this.blockHash, this.inputMultisigData);
// used for validation when the final Nano block is created
// used for validation when the final nano block is created
if (result && result.multisig !== '') {
this.multisigAccount = result.multisig;
}

View file

@ -14,7 +14,7 @@
Even a mnemonic from a Ledger hardware wallet or other multicurrency wallets using BIP39/44 can be recovered using this tool.
</p>
<p>
<strong>Please use with caution if you are using an external destination. Make sure you have access to the seed on the receiving side!</strong>
<strong>Please use with caution if you are using an external destination. Make sure you have access to the secret recovery seed on the receiving side!</strong>
</p>
</div>
@ -29,7 +29,7 @@
<div uk-grid>
<div class="uk-width-1-1">
<div class="uk-inline uk-width-1-1">
<input [(ngModel)]="sourceWallet" class="uk-input uk-margin-small-bottom {{validSeed ? '':'uk-form-danger'}}" id="source-wallet" type="text" (ngModelChange)="seedChange(sourceWallet)" placeholder="Nano seed, BIP39 seed, private key or 12,15,18,21,24-word mnemonic" autocomplete="off">
<input [(ngModel)]="sourceWallet" class="uk-input uk-margin-small-bottom {{validSeed ? '':'uk-form-danger'}}" id="source-wallet" type="text" (ngModelChange)="seedChange(sourceWallet)" placeholder="Secret recovery seed, BIP39 seed, private key or 12,15,18,21,24-word secret recovery mnemonic" autocomplete="off">
</div>
</div>
</div>
@ -44,7 +44,7 @@
<label class="uk-form-label" for="destination-account">Local Destination <span uk-icon="icon: info;" uk-tooltip title="Local accounts that can be used as destination for the swept funds. Make sure you are able to unlock your Nault wallet."></span></label>
<div class="uk-form-controls">
<select class="uk-select" id="destination-account" [(ngModel)]="myAccountModel" (change)="setDestination(myAccountModel)">
<option *ngFor="let account of accounts" [value]="account.id">{{account.addressBookName ? account.addressBookName + ' - ' : '#' + account.index + ' - ' }} {{ account.id | squeeze }} ({{ account.balance | rai: 'mnano,true' | amountsplit: 0 }}{{ account.balance | rai: 'mnano,true' | amountsplit: 1 }} NANO)</option>
<option *ngFor="let account of accounts" [value]="account.id">{{account.addressBookName ? account.addressBookName + ' - ' : '#' + account.index + ' - ' }} {{ account.id | squeeze }} ({{ account.balance | rai: 'mnano,true' | amountsplit: 0 }}{{ account.balance | rai: 'mnano,true' | amountsplit: 1 }} XNO)</option>
<option [value]="0">Custom Destination</option>
</select>
</div>

View file

@ -272,8 +272,8 @@ export class SweeperComponent implements OnInit {
this.totalSwept = this.util.big.add(this.totalSwept, nanoAmountSent);
}
this.notificationService.sendInfo('Account ' + address + ' was swept and ' +
(nanoAmountSent ? (nanoAmountSent.toString(10) + ' Nano') : '') + ' transferred to ' + this.destinationAccount, {length: 15000});
this.appendLog('Funds transferred ' + (nanoAmountSent ? ('(' + nanoAmountSent.toString(10) + ' Nano)') : '') + ': ' + data.hash);
(nanoAmountSent ? ( 'Ӿ' + nanoAmountSent.toString(10) ) : '') + ' transferred to ' + this.destinationAccount, {length: 15000});
this.appendLog('Funds transferred ' + (nanoAmountSent ? ('(Ӿ' + nanoAmountSent.toString(10) + ')') : '') + ': ' + data.hash);
console.log(this.adjustedBalance + ' raw transferred to ' + this.destinationAccount);
} else {
this.notificationService.sendWarning(`Failed processing block.`);
@ -379,8 +379,8 @@ export class SweeperComponent implements OnInit {
raw = this.util.big.add(raw, data.blocks[key].amount);
}.bind(this));
const nanoAmount = this.util.nano.rawToMnano(raw);
const pending = {count: Object.keys(data.blocks).length, raw: raw, NANO: nanoAmount, blocks: data.blocks};
const row = 'Found ' + pending.count + ' pending containing total ' + pending.NANO + ' NANO';
const pending = {count: Object.keys(data.blocks).length, raw: raw, XNO: nanoAmount, blocks: data.blocks};
const row = 'Found ' + pending.count + ' pending containing total ' + pending.XNO + ' XNO';
this.appendLog(row);
// create receive blocks for all pending
@ -469,8 +469,8 @@ export class SweeperComponent implements OnInit {
} else {
// all private keys have been processed
this.appendLog('Finished processing all accounts');
this.appendLog(this.totalSwept + ' Nano transferred');
this.notificationService.sendInfo('Finished processing all accounts. ' + this.totalSwept + ' Nano transferred', {length: 0});
this.appendLog('Ӿ' + this.totalSwept + ' transferred');
this.notificationService.sendInfo('Finished processing all accounts. Ӿ' + this.totalSwept + ' transferred', {length: 0});
this.sweeping = false;
}
}.bind(this));
@ -567,7 +567,7 @@ export class SweeperComponent implements OnInit {
// let user confirm account
const UIkit = window['UIkit'];
try {
const msg = '<p class="uk-alert uk-alert-danger"><br><span class="uk-flex"><span uk-icon="icon: warning; ratio: 3;" class="uk-align-center"></span></span><span style="font-size: 18px;">You are about to empty the source wallet, which will <b>transfer all funds from it to the destination address</b>.</span><br><br><b style="font-size: 18px;">Before continuing, make sure you (or someone) have saved the Nano seed and/or mnemonic of the specified destination address</b>.<br><br><span style="font-size: 18px;"><b>YOU WILL NOT BE ABLE TO RECOVER THE FUNDS</b><br>without a backup of the specified destination address.</span></p><br>';
const msg = '<p class="uk-alert uk-alert-danger"><br><span class="uk-flex"><span uk-icon="icon: warning; ratio: 3;" class="uk-align-center"></span></span><span style="font-size: 18px;">You are about to empty the source wallet, which will <b>transfer all funds from it to the destination address</b>.</span><br><br><b style="font-size: 18px;">Before continuing, make sure you (or someone) have saved the secret recovery seed and/or mnemonic of the specified destination address</b>.<br><br><span style="font-size: 18px;"><b>YOU WILL NOT BE ABLE TO RECOVER THE FUNDS</b><br>without a backup of the specified destination address.</span></p><br>';
await UIkit.modal.confirm(msg);
this.sweepContinue();
} catch (err) {

View file

@ -49,7 +49,7 @@
>
<span class="amount-integer">{{ transaction?.amount | rai: 'mnano,true' | amountsplit: 0 }}</span>
<span class="amount-fractional">{{ transaction?.amount | rai: 'mnano,true' | amountsplit: 1 }}</span>
<span class="currency-name">NANO</span>
<span class="currency-name">XNO</span>
</div>
<div *ngIf="amountRaw.gt(0)" class="uk-text-small text-half-muted" style="margin: 2px 0 -2px 0;">+{{ amountRaw.toString(10) }} raw</div>
</div>
@ -157,7 +157,7 @@
<div class="balance-amount-primary uk-text-truncate">
<span class="amount-integer">{{ ( isStateBlock ? getBalanceFromDec(transaction?.contents?.balance) : getBalanceFromHex(transaction?.contents?.balance )) | rai: 'mnano,true' | amountsplit: 0 }}</span>
<span class="amount-fractional">{{ ( isStateBlock ? getBalanceFromDec(transaction?.contents?.balance) : getBalanceFromHex(transaction?.contents?.balance )) | rai: 'mnano,true' | amountsplit: 1 }}</span>
<span class="currency-name">NANO</span>
<span class="currency-name">XNO</span>
</div>
<div class="uk-text-small block-hash-monospace"><span class="text-half-muted" style="margin-right: 4px;">=</span>{{ transaction?.contents?.balance }} raw</div>
</div>

View file

@ -17,15 +17,15 @@ export class RaiPipe implements PipeTransform {
switch (denomination.toLowerCase()) {
default:
case 'xrb': return `${(value / this.mrai).toFixed(6)}${!hideText ? ' NANO' : ''}`;
case 'xrb': return `${(value / this.mrai).toFixed(6)}${!hideText ? ' XNO' : ''}`;
case 'mnano':
const hasRawValue = (value / this.rai) % 1;
if (hasRawValue) {
// New more precise toFixed function, but bugs on huge raw numbers
const newVal = value / this.mrai < 0.000001 ? 0 : value / this.mrai;
return `${this.toFixed(newVal, this.precision)}${!hideText ? ' NANO' : ''}`;
return `${this.toFixed(newVal, this.precision)}${!hideText ? ' XNO' : ''}`;
} else {
return `${(value / this.mrai).toFixed(6)}${!hideText ? ' NANO' : ''}`;
return `${(value / this.mrai).toFixed(6)}${!hideText ? ' XNO' : ''}`;
}
case 'knano': return `${(value / this.krai).toFixed(3)}${!hideText ? ' knano' : ''}`;
case 'nano': return `${(value / this.rai).toFixed(0)}${!hideText ? ' nano' : ''}`;

View file

@ -345,7 +345,7 @@ export class LedgerService {
this.ledger.status = LedgerStatus.NOT_CONNECTED;
this.ledgerStatus$.next({ status: this.ledger.status, statusText: `Unable to detect Nano Ledger application (Timeout)` });
if (!hideNotifications) {
this.notifications.sendWarning(`Unable to connect to the Ledger device. Make sure it is unlocked and the Nano application is open`);
this.notifications.sendWarning(`Unable to connect to the Ledger device. Make sure it is unlocked and the nano application is open`);
}
resolved = true;
return resolve(false);
@ -367,7 +367,7 @@ export class LedgerService {
this.resetLedger();
}
if (!hideNotifications && !resolved) {
this.notifications.sendWarning(`Unable to connect to the Ledger device. Make sure your Ledger is unlocked. Restart the Nano App on your Ledger if the error persists`);
this.notifications.sendWarning(`Unable to connect to the Ledger device. Make sure your Ledger is unlocked. Restart the nano app on your Ledger if the error persists`);
}
resolved = true;
return resolve(false);
@ -388,7 +388,7 @@ export class LedgerService {
if (err.statusCode === STATUS_CODES.SECURITY_STATUS_NOT_SATISFIED) {
this.ledger.status = LedgerStatus.LOCKED;
if (!hideNotifications) {
this.notifications.sendWarning(`Ledger device locked. Unlock and open the Nano application`);
this.notifications.sendWarning(`Ledger device locked. Unlock and open the nano application`);
}
}
}

View file

@ -10,7 +10,7 @@ export class NodeService {
constructor(private notifications: NotificationService) { }
setOffline(msg = `Unable to connect to the Nano node, your balances may be inaccurate!`) {
setOffline(msg = `Unable to connect to the nano node, your balances may be inaccurate!`) {
if (this.node.status === false) return; // Already offline
this.node.status = false;

View file

@ -306,7 +306,7 @@ function isValidAccount(account: string): boolean {
return nanocurrency.checkAddress(account);
}
// Check if a string is a numeric and larger than 0 but less than Nano supply
// Check if a string is a numeric and larger than 0 but less than nano supply
function isValidNanoAmount(val: string) {
// numerics and last character is not a dot and number of dots is 0 or 1
const isnum = /^-?\d*\.?\d*$/.test(val);
@ -328,11 +328,11 @@ function isValidAmount(val: string) {
function getAccountPublicKey(account) {
if (!isValidAccount(account)) {
throw new Error(`Invalid Nano Account`);
throw new Error(`Invalid nano account`);
}
const account_crop = account.length === 64 ? account.substring(4, 64) : account.substring(5, 65);
const isValid = /^[13456789abcdefghijkmnopqrstuwxyz]+$/.test(account_crop);
if (!isValid) throw new Error(`Invalid NANO account`);
if (!isValid) throw new Error(`Invalid nano account`);
const key_uint4 = array_crop(uint5ToUint4(stringToUint5(account_crop.substring(0, 52))));
const hash_uint4 = uint5ToUint4(stringToUint5(account_crop.substring(52, 60)));

View file

@ -186,18 +186,18 @@ export class WalletService {
if (transaction.block.subtype === 'send') {
// Incoming transaction
if (this.addressBook.getTransactionTrackingById(addressLink)) {
this.notifications.sendInfo(`Tracked address ${accountHrefLink} can now receive ${trackedAmount} NANO`, { length: 10000 });
console.log(`Tracked incoming block to: ${address} - ${trackedAmount} Nano`);
this.notifications.sendInfo(`Tracked address ${accountHrefLink} can now receive ${trackedAmount} XNO`, { length: 10000 });
console.log(`Tracked incoming block to: ${address} - Ӿ${trackedAmount}`);
}
// Outgoing transaction
if (this.addressBook.getTransactionTrackingById(address)) {
this.notifications.sendInfo(`Tracked address ${accountHref} sent ${trackedAmount} NANO`, { length: 10000 });
console.log(`Tracked send block from: ${address} - ${trackedAmount} Nano`);
this.notifications.sendInfo(`Tracked address ${accountHref} sent ${trackedAmount} XNO`, { length: 10000 });
console.log(`Tracked send block from: ${address} - Ӿ${trackedAmount}`);
}
} else if (transaction.block.subtype === 'receive' && this.addressBook.getTransactionTrackingById(address)) {
// Receive transaction
this.notifications.sendInfo(`Tracked address ${accountHref} received incoming ${trackedAmount} NANO`, { length: 10000 });
console.log(`Tracked receive block to: ${address} - ${trackedAmount} Nano`);
this.notifications.sendInfo(`Tracked address ${accountHref} received incoming ${trackedAmount} XNO`, { length: 10000 });
console.log(`Tracked receive block to: ${address} - Ӿ${trackedAmount}`);
} else if (transaction.block.subtype === 'change' && this.addressBook.getTransactionTrackingById(address)) {
// Change transaction
this.notifications.sendInfo(`Tracked address ${accountHref} changed its representative to ${rep}`, { length: 10000 });
@ -1002,7 +1002,7 @@ export class WalletService {
const receiveAmount = this.util.nano.rawToMnano(nextBlock.amount);
this.notifications.removeNotification('success-receive');
this.notifications.sendSuccess(`Successfully received ${receiveAmount.isZero() ? '' : receiveAmount.toFixed(6)} Nano!`, { identifier: 'success-receive' });
this.notifications.sendSuccess(`Successfully received ${receiveAmount.isZero() ? '' : receiveAmount.toFixed(6)} XNO!`, { identifier: 'success-receive' });
// remove after processing
// list also updated with reloadBalances but not if called too fast

View file

@ -60,13 +60,13 @@
"checking-status": "Checking Status...",
"good-representative": "Good Representative",
"health": "Health",
"it-is-highly-advised-to-switch-to-a-different-representative": "It is highly advised to switch to a different representative, in order to improve security and decentralization of the Nano network.",
"it-is-highly-advised-to-switch-to-a-different-representative": "It is highly advised to switch to a different representative, in order to improve security and decentralization of the nano network.",
"receive-a-transaction-to-configure": "Receive a transaction to configure",
"rep-represents-you": "{{ name }} represents you in the Nano consensus protocol by voting on your behalf.",
"rep-represents-you": "{{ name }} represents you in the nano consensus protocol by voting on your behalf.",
"representative-change-required": "Representative Change Required",
"representative-for-account": "Representative for {{ account }}",
"representative-none": "None",
"switching-to-a-different-representative-could-improve": "Switching to a different representative could improve security and decentralization of the Nano network.",
"switching-to-a-different-representative-could-improve": "Switching to a different representative could improve security and decentralization of the nano network.",
"this-representative-has-a-high-voting-weight": "This representative has a high voting weight (over {{ percent }}%).",
"this-representative-has-a-very-high-voting-weight": "This representative has a very high voting weight (over {{ percent }}%).",
"this-representative-has-announced-plans-to-permanently-shutdown": "This representative has announced plans to permanently shutdown.",
@ -92,10 +92,9 @@
"change-if-your-wallet-should-be-locked-automatically-after": "Change if your wallet should be locked automatically after you have not interacted with it for a certain period of time",
"change-the-currency-pair-used-when-showing-fiat-values": "Change the currency pair used when showing fiat values in the application. Select None to hide fiat pairs.",
"change-where-your-wallet-is-stored-if-you-select-none-your": "Change where your wallet is stored. If you select none, your wallet is reset every time you reload.",
"change-which-server-is-used-to-communicate-with-the-nano": "Change which server is used to communicate with the Nano network",
"change-which-server-is-used-to-communicate-with-the-nano": "Change which server is used to communicate with the nano network",
"clear-all-data": {
"1": "You are about to delete all data stored in Nault, which includes all locally stored data about your currently configured wallet, all entries from your address and representative books, and any other cached data. All settings will be reset to default.",
"2": "Before continuing, make sure you have saved the Nano seed and/or mnemonic of your current wallet.",
"successfully-deleted-locally-stored-data-and-reset-the": "Successfully deleted locally stored data and reset the settings!"
},
"clear-work-cache": "Clear Work Cache",
@ -134,7 +133,7 @@
"leave-blank-to-use-a-recommended-one": "Leave blank to use a recommended one",
"lock-after-inactivity": "Lock After Inactivity",
"min-receive-amount": "Min. Receive Amount",
"minimum-nano-amount-to-receive-transactions-below-this": "Minimum NANO amount to receive. Transactions below this amount will be ignored by the wallet both for receiving and in the transactions list. Set to blank or 0 to accept all transactions.",
"minimum-nano-amount-to-receive-transactions-below-this": "Minimum XNO amount to receive. Transactions below this amount will be ignored by the wallet both for receiving and in the transactions list. Set to blank or 0 to accept all transactions.",
"multiplier-options": {
"default-1x-or-1-64x": "Default (1x or 1/64x)"
},
@ -177,7 +176,7 @@
"this-has-to-be-a-valid-authorization-header": "This has to be a valid Authorization header.",
"this-has-to-be-a-valid-rpc": {
"1": "This has to be a valid",
"2-link-rpc": "Nano RPC endpoint",
"2-link-rpc": "nano RPC endpoint",
"3": "or an API compliant with it."
},
"this-has-to-be-a-valid-websocket": {
@ -191,7 +190,7 @@
"3": "endpoint or an API compliant with it. If your server on localhost does not work, try the desktop app instead."
},
"this-representative-will-be-used-for-any-new-account": "This representative will be used for any new account",
"this-server-is-used-for-rpc-communication-with-the-nano-node": "This server is used for RPC communication with the Nano Node",
"this-server-is-used-for-rpc-communication-with-the-nano-node": "This server is used for RPC communication with the nano node",
"this-server-is-used-to-notify-the-wallet-in-real-time-when": "This server is used to notify the wallet in real time when new transactions arrive",
"this-will-delete-all-data-related-to-your-wallet-your-seed-a": "This will delete all data related to your wallet (Your seed and accounts)",
"this-will-delete-all-locally-cached-proof-of-work-values": "This will delete all locally cached Proof of Work values",
@ -289,11 +288,11 @@
"representative-list-results": "Representative List Results"
},
"reset-wallet": {
"before-continuing-make-sure-you-have-saved-the-nano-seed": "Before continuing, make sure you have saved the Nano seed and/or mnemonic of your current wallet.",
"before-continuing-make-sure-you-have-saved-the-nano-seed": "Before continuing, make sure you have saved the secret recovery seed and/or mnemonic of your current wallet.",
"you-will-not-be-able-to-recover-the-funds-without-a-backup": "YOU WILL NOT BE ABLE TO RECOVER THE FUNDS without a backup of your currently configured wallet."
},
"welcome": {
"a-secure-open-source-wallet-for-nano": "A secure open source wallet for Nano",
"a-secure-open-source-wallet-for-nano": "A secure open source wallet for nano",
"advanced-security-features": {
"1": "Support for Ledger Nano S / Nano X hardware wallets",
"2": "Ability to create multi-signature addresses where multiple private keys are required to access and transfer the funds",
@ -327,7 +326,7 @@
},
"2": {
"1": "In Nault there is no single source of truth. All information is provided by the server that's set in app settings. That also means there is no single point of failure you may choose any public or self-hosted",
"2-link-nano-node": "Nano node",
"2-link-nano-node": "nano node",
"3": "as the server."
},
"title": "Any Node, Always Available"

View file

@ -1,87 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
sodipodi:docname="nano-mark.svg"
xml:space="preserve"
style="enable-background:new 0 0 1770.2 780.1;"
viewBox="0 0 1770.2 780.1"
y="0px"
x="0px"
id="Layer_1"
version="1.1"><metadata
id="metadata17"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs15"><linearGradient
id="linearGradient846"
inkscape:collect="always"><stop
id="stop842"
offset="0"
style="stop-color:#6ea6e8;stop-opacity:0" /><stop
id="stop844"
offset="1"
style="stop-color:#6ea6e8;stop-opacity:1" /></linearGradient><linearGradient
gradientUnits="userSpaceOnUse"
y2="392.90436"
x2="1228.0087"
y1="392.90436"
x1="273.53915"
id="linearGradient848"
xlink:href="#linearGradient846"
inkscape:collect="always" /></defs><sodipodi:namedview
inkscape:current-layer="Layer_1"
inkscape:window-maximized="1"
inkscape:window-y="-8"
inkscape:window-x="-8"
inkscape:cy="390.04999"
inkscape:cx="885.09998"
inkscape:zoom="0.68862277"
showgrid="false"
id="namedview13"
inkscape:window-height="1017"
inkscape:window-width="1920"
inkscape:pageshadow="2"
inkscape:pageopacity="0"
guidetolerance="10"
gridtolerance="10"
objecttolerance="10"
borderopacity="1"
bordercolor="#666666"
pagecolor="#ffffff" />
<style
id="style2"
type="text/css">
.st0{fill:#4A90E2;}
.st1{fill:#000034;}
.st2{fill:#FFFFFF;}
</style>
<g
style="fill-opacity:1;"
id="g10">
<path
style="fill-opacity:1;"
id="path4"
d="M985.7,390c0,55.6-45.1,100.6-100.6,100.6S784.4,445.6,784.4,390c0-75.5-25.2-100.6-100.6-100.6 S583.2,314.6,583.2,390c0,55.6-45.1,100.6-100.6,100.6S381.9,445.6,381.9,390c0-55.6,45.1-100.6,100.6-100.6 c75.5,0,100.6-25.2,100.6-100.6c0-55.6,45.1-100.6,100.6-100.6s100.6,45.1,100.6,100.6c0,75.5,25.2,100.6,100.6,100.6 C940.7,289.4,985.7,334.5,985.7,390z"
class="st0" />
<circle
style="fill-opacity:1;"
id="circle6"
r="100.6"
cy="591.3"
cx="281.2"
class="st0" />
<path
style="fill-opacity:1;"
id="path8"
d="M1589.6,188.7c0,55.6-45.1,100.6-100.6,100.6c-75.5,0-100.6,25.2-100.6,100.6c0,55.6-45.1,100.6-100.6,100.6 c-75.5,0-100.6,25.2-100.6,100.6c0,55.6-45.1,100.6-100.6,100.6c-55.6,0-100.6-45.1-100.6-100.6c0-55.6,45.1-100.6,100.6-100.6 c75.5,0,100.6-25.2,100.6-100.6c0-55.6,45.1-100.6,100.6-100.6c75.5,0,100.6-25.2,100.6-100.6c0-55.6,45.1-100.6,100.6-100.6 C1544.5,88.1,1589.6,133.2,1589.6,188.7z"
class="st0" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.1 KiB

View file

@ -0,0 +1,6 @@
<svg width="620" height="820" fill="none" version="1.1" viewBox="0 0 620 820" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(-229.8 -130.61)" fill="#000">
<path d="m839.59 940.22h-62.2l-236.05-367.69-239.65 367.69h-61.686l268.59-416.56-244.67-382.66h63.411l215.01 336.58 219.56-336.58h59.497l-247.3 381.57z"/>
<path d="m298.99 499.31h483.62v45.456h-483.62zm0 136.37h483.64v45.457h-483.66z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 423 B

View file

@ -7,8 +7,8 @@
<meta property="og:title" content="Nault" />
<meta name="author" content="The Nano Community" />
<meta name="description" content="A client-side open source wallet for Nano, focused on security, speed and robustness" />
<meta property="og:description" content="A client-side open source wallet for Nano, focused on security, speed and robustness" />
<meta name="description" content="A client-side open source wallet for nano, focused on security, speed and robustness" />
<meta property="og:description" content="A client-side open source wallet for nano, focused on security, speed and robustness" />
<link rel="canonical" href="https://nault.cc/" />
<meta property="og:url" content="https://nault.cc/" />
<meta property="og:site_name" content="Nault" />

View file

@ -214,9 +214,9 @@
}
> .currency-name {
width: 55px;
width: 41px;
@media (min-width: 1500px) {
width: 70px;
width: 49px;
}
margin-right: 15px;

View file

@ -146,6 +146,21 @@ h1, h2, h3, h4, h5, .uk-text-lead, .uk-button, .uk-alert, .uk-description-list d
color: #A478E3;
}
.xno-symbol {
display: inline-block;
width: 0.756em;
height: 1em;
background-color: currentcolor;
-webkit-mask-image: url('../assets/img/xno-symbol.svg');
mask-image: url('../assets/img/xno-symbol.svg');
-webkit-mask-size: cover;
mask-size: cover;
&.uk-form-icon {
margin: 12px 21px;
}
}
a.fiat-currency-ticker {
font-family: 'Montserrat', Arial, Helvetica, sans-serif;
color: #81809f !important;