Commit 20d4beef authored by Jeremy Bokobza's avatar Jeremy Bokobza

merge from master

parents 317813fd 25588866
...@@ -22,35 +22,35 @@ ...@@ -22,35 +22,35 @@
}, },
"private": true, "private": true,
"dependencies": { "dependencies": {
"@angular/animations": "^4.1.0", "@angular/animations": "^4.1.2",
"@angular/common": "^4.1.0", "@angular/common": "^4.1.2",
"@angular/compiler": "^4.1.0", "@angular/compiler": "^4.1.2",
"@angular/compiler-cli": "^4.1.0", "@angular/compiler-cli": "^4.1.2",
"@angular/core": "^4.1.0", "@angular/core": "^4.1.2",
"@angular/forms": "^4.1.0", "@angular/forms": "^4.1.2",
"@angular/http": "^4.1.0", "@angular/http": "^4.1.2",
"@angular/platform-browser": "^4.1.0", "@angular/platform-browser": "^4.1.2",
"@angular/platform-browser-dynamic": "^4.1.0", "@angular/platform-browser-dynamic": "^4.1.2",
"@angular/platform-server": "^4.1.0", "@angular/platform-server": "^4.1.2",
"@angular/router": "^4.1.0", "@angular/router": "^4.1.2",
"bootstrap": "^4.0.0-alpha.6", "bootstrap": "^4.0.0-alpha.6",
"core-js": "^2.4.1", "core-js": "^2.4.1",
"rxjs": "^5.3.0", "rxjs": "^5.4.0",
"zone.js": "^0.8.9" "zone.js": "^0.8.10"
}, },
"devDependencies": { "devDependencies": {
"@angular/cli": "^1.0.1", "@angular/cli": "^1.0.3",
"@angular/compiler-cli": "^4.1.0", "@angular/compiler-cli": "^4.1.2",
"@types/electron": "^1.4.37", "@types/electron": "^1.4.37",
"@types/jasmine": "2.5.47", "@types/jasmine": "2.5.47",
"@types/node": "~7.0.15", "@types/node": "~7.0.18",
"autoprefixer": "^6.7.7", "autoprefixer": "^7.0.1",
"codelyzer": "3.0.1", "codelyzer": "3.0.1",
"concurrently": "^3.4.0", "concurrently": "^3.4.0",
"copy-webpack-plugin": "4.0.1", "copy-webpack-plugin": "4.0.1",
"css-loader": "^0.28.1", "css-loader": "^0.28.1",
"cssnano": "^3.10.0", "cssnano": "^3.10.0",
"electron": "^1.6.6", "electron": "^1.6.7",
"electron-packager": "^8.7.0", "electron-packager": "^8.7.0",
"exports-loader": "^0.6.4", "exports-loader": "^0.6.4",
"extract-text-webpack-plugin": "^2.1.0", "extract-text-webpack-plugin": "^2.1.0",
...@@ -60,11 +60,11 @@ ...@@ -60,11 +60,11 @@
"jasmine-core": "~2.6.1", "jasmine-core": "~2.6.1",
"jasmine-spec-reporter": "~4.1.0", "jasmine-spec-reporter": "~4.1.0",
"json-loader": "^0.5.4", "json-loader": "^0.5.4",
"karma": "~1.6.0", "karma": "~1.7.0",
"karma-chrome-launcher": "~2.0.0", "karma-chrome-launcher": "~2.1.1",
"karma-cli": "~1.0.1", "karma-cli": "~1.0.1",
"karma-coverage-istanbul-reporter": "^1.2.1", "karma-coverage-istanbul-reporter": "^1.2.1",
"karma-electron": "^5.1.1", "karma-electron": "^5.2.1",
"karma-jasmine": "~1.1.0", "karma-jasmine": "~1.1.0",
"karma-jasmine-html-reporter": "^0.2.2", "karma-jasmine-html-reporter": "^0.2.2",
"karma-sourcemap-loader": "^0.3.7", "karma-sourcemap-loader": "^0.3.7",
...@@ -73,16 +73,16 @@ ...@@ -73,16 +73,16 @@
"postcss-url": "^6.0.4", "postcss-url": "^6.0.4",
"protractor": "~5.1.1", "protractor": "~5.1.1",
"raw-loader": "^0.5.1", "raw-loader": "^0.5.1",
"sass-loader": "^6.0.3", "sass-loader": "^6.0.5",
"script-loader": "^0.7.0", "script-loader": "^0.7.0",
"source-map-loader": "^0.2.1", "source-map-loader": "^0.2.1",
"style-loader": "^0.17.0", "style-loader": "^0.17.0",
"stylus-loader": "^3.0.1", "stylus-loader": "^3.0.1",
"ts-node": "~3.0.2", "ts-node": "~3.0.4",
"tslint": "~5.1.0", "tslint": "~5.2.0",
"typescript": "^2.3.2", "typescript": "^2.3.2",
"url-loader": "^0.5.8", "url-loader": "^0.5.8",
"webpack": "^2.4.1", "webpack": "^2.5.1",
"webpack-dev-server": "~2.4.5" "webpack-dev-server": "~2.4.5"
} }
} }
...@@ -85,7 +85,7 @@ export class LoginComponent implements OnInit { ...@@ -85,7 +85,7 @@ export class LoginComponent implements OnInit {
if (response.status >= 200 && response.status < 400) { if (response.status >= 200 && response.status < 400) {
let responseMessage = response.json(); let responseMessage = response.json();
this.globalService.setWalletName(walletLoad.name) this.globalService.setWalletName(walletLoad.name)
this.globalService.setCoinType(0); this.globalService.setCoinType(1);
this.router.navigate(['/wallet']); this.router.navigate(['/wallet']);
} }
}, },
......
<div class="container">
<div class="row">
<div class="col">
<div>Active Balance</div>
<div>Balance: {{confirmedBalance | coinNotation | coinAbbreviation}}</div>
</div>
<div class="col">
<div>Current Value</div>
<div>Over 9000</div>
</div>
</div>
<div class="row">
<div class="col">
<div>Transactions</div>
<table *ngIf="transactions; else noTransactions">
<thead>
<th>Timestamp</th>
<th>Amount</th>
<th>Confirmed</th>
<th>Transaction ID</th>
</thead>
<tr *ngFor="let transaction of transactions; let i=index">
<div *ngIf="i<5">
<!--<td *ngIf="{{ transaction.amount }} < 0; else received">SENT</td>
<td #received>RECEIVED</td>-->
<td>{{ transaction.timestamp }}</td>
<td>{{ transaction.amount }}</td>
<td>{{ transaction.confirmed }}</td>
<td>{{ transaction.txId }}</td>
</div>
</tr>
</table>
<ng-template #noTransactions>Looks like you haven't had any transactions yet</ng-template>
</div>
</div>
</div>
import { Component, OnInit } from '@angular/core';
import { ApiService } from '../../shared/services/api.service';
import { GlobalService } from '../../shared/services/global.service';
import { WalletInfo } from '../../shared/classes/wallet-info';
@Component({
selector: 'dashboard-component',
templateUrl: './dashboard.component.html',
styleUrls: ['./dashboard.component.css'],
})
export class DashboardComponent {
constructor(private apiService: ApiService, private globalService: GlobalService) {}
private balanceResponse: any;
private confirmedBalance: number;
private unconfirmedBalance: number;
private transactions: any;
private errorMessage: string;
ngOnInit() {
this.getWalletBalance();
this.getHistory();
};
private getWalletBalance() {
let walletInfo = new WalletInfo(this.globalService.getWalletName(), this.globalService.getCoinType())
this.apiService.getWalletBalance(walletInfo)
.subscribe(
response => {
if (response.status >= 200 && response.status < 400) {
this.balanceResponse = response.json();
this.confirmedBalance = this.balanceResponse.balances[0].amountConfirmed;
this.unconfirmedBalance = this.balanceResponse.balances[0].amountUnconfirmed;
}
},
error => {
if (error.status >= 400) {
this.errorMessage = <any>error;
console.log(this.errorMessage);
}
}
);
};
private getHistory() {
let walletInfo = new WalletInfo(this.globalService.getWalletName(), this.globalService.getCoinType())
this.apiService.getWalletHistory(walletInfo)
.subscribe(
response => {
if (response.status >= 200 && response.status < 400) {
if (response.json().transactions.length > 0) {
this.transactions = response.json().transactions;
}
}
},
error => {
if (error.status >= 400) {
this.errorMessage = <any>error;
console.log(this.errorMessage);
}
}
);
};
}
<h1>History</h1> <h1>History</h1>
<table *ngIf="transactions"> <table *ngIf="transactions; else noTransactions">
<thead> <thead>
<th>Timestamp</th> <th>Timestamp</th>
<th>Amount</th> <th>Amount</th>
...@@ -7,9 +7,12 @@ ...@@ -7,9 +7,12 @@
<th>Transaction ID</th> <th>Transaction ID</th>
</thead> </thead>
<tr *ngFor="let transaction of transactions"> <tr *ngFor="let transaction of transactions">
<!--<td *ngIf="{{ transaction.amount }} < 0; else received">SENT</td>
<td #received>RECEIVED</td>-->
<td>{{ transaction.timestamp }}</td> <td>{{ transaction.timestamp }}</td>
<td>{{ transaction.amount }}</td> <td>{{ transaction.amount }}</td>
<td>{{ transaction.confirmed }}</td> <td>{{ transaction.confirmed }}</td>
<td>{{ transaction.txId }}</td> <td>{{ transaction.txId }}</td>
</tr> </tr>
</table> </table>
<ng-template #noTransactions>Looks like you haven't made any transactions yet.</ng-template>
...@@ -18,17 +18,19 @@ export class HistoryComponent { ...@@ -18,17 +18,19 @@ export class HistoryComponent {
private errorMessage: string; private errorMessage: string;
ngOnInit() { ngOnInit() {
this.getWalletHistory(); this.getHistory();
} }
private getWalletHistory() { private getHistory() {
let walletInfo = new WalletInfo(this.globalService.getWalletName(), this.globalService.getCoinType()) let walletInfo = new WalletInfo(this.globalService.getWalletName(), this.globalService.getCoinType())
this.apiService.getWalletHistory(walletInfo) this.apiService.getWalletHistory(walletInfo)
.subscribe( .subscribe(
response => { response => {
if (response.status >= 200 && response.status < 400) { if (response.status >= 200 && response.status < 400) {
if (response.json().transactions.length > 0) {
this.transactions = response.json().transactions; this.transactions = response.json().transactions;
} }
}
}, },
error => { error => {
if (error.status >= 400) { if (error.status >= 400) {
......
<p>Balance: {{confirmedBalance | coinNotation | coinAbbreviation}}</p>
<p>Unconfirmed: {{unconfirmedBalance | coinNotation | coinAbbreviation}}<p>
import { Component, OnInit } from '@angular/core';
import { ApiService } from '../../shared/services/api.service';
import { GlobalService } from '../../shared/services/global.service';
import { WalletInfo } from '../../shared/classes/wallet-info';
@Component({
selector: 'dashboard-component',
templateUrl: './dashboard.component.html',
styleUrls: ['./dashboard.component.css'],
})
export class DashboardComponent {
constructor(private apiService: ApiService, private globalService: GlobalService) {}
private balanceResponse: any;
private confirmedBalance: number;
private unconfirmedBalance: number;
private errorMessage: string;
ngOnInit() {
this.getWalletBalance();
}
private getWalletBalance() {
let walletInfo = new WalletInfo(this.globalService.getWalletName(), this.globalService.getCoinType())
this.apiService.getWalletBalance(walletInfo)
.subscribe(
response => {
if (response.status >= 200 && response.status < 400) {
this.balanceResponse = response.json();
this.confirmedBalance = this.balanceResponse.balances[0].amountConfirmed;
this.unconfirmedBalance = this.balanceResponse.balances[0].amountUnconfirmed;
}
},
error => {
if (error.status >= 400) {
this.errorMessage = <any>error;
console.log(this.errorMessage);
}
}
);
}
}
.navbar {
height: 100px;
width: 100%;
margin: 0;
padding: 0;
}
<nav class="navbar navbar-fixed-top"> <nav class="navbar navbar-toggleable-sm navbar-fixed-top navbar-light bg-faded ">
<div class="container"> <div class="container">
<a class="navbar-brand">Breeze</a> <ul class="navbar-nav mr-auto" routerLinkActive="active">
<dashboard-component></dashboard-component> <li class="nav-item"><a class="nav-link" routerLink="dashboard">Dashboard</a></li>
<ul class="nav navbar-nav" routerLinkActive="active">
<li class="nav-item"><a class="nav-link" routerLink="send">Send</a></li> <li class="nav-item"><a class="nav-link" routerLink="send">Send</a></li>
<li class="nav-item"><a class="nav-link" routerLink="receive">Receive</a></li> <li class="nav-item"><a class="nav-link" routerLink="receive">Receive</a></li>
<li class="nav-item"><a class="nav-link" routerLink="history">History</a></li> <li class="nav-item"><a class="nav-link" routerLink="history">History</a></li>
<li class="nav-item"><a class="nav-link" (click)="logOut()">Logout</a></li> <li class="nav-item"><a class="nav-link" (click)="logOut()">Logout</a></li>
</ul> </ul>
<div class="navbar-brand">Breeze</div>
</div> </div>
</nav> </nav>
...@@ -5,12 +5,14 @@ import { WalletComponent } from './wallet.component'; ...@@ -5,12 +5,14 @@ import { WalletComponent } from './wallet.component';
import { SendComponent } from './send/send.component'; import { SendComponent } from './send/send.component';
import { ReceiveComponent } from './receive/receive.component'; import { ReceiveComponent } from './receive/receive.component';
import { HistoryComponent } from './history/history.component'; import { HistoryComponent } from './history/history.component';
import { DashboardComponent } from './dashboard/dashboard.component';
const routes: Routes = [ const routes: Routes = [
{ path: '', redirectTo: 'wallet', pathMatch: 'full' }, { path: '', redirectTo: 'wallet', pathMatch: 'full' },
{ path: 'wallet', component: WalletComponent, { path: 'wallet', component: WalletComponent,
children: [ children: [
{ path: '', redirectTo:'history', pathMatch:'full' }, { path: '', redirectTo:'dashboard', pathMatch:'full' },
{ path: 'dashboard', component: DashboardComponent},
{ path: 'send', component: SendComponent}, { path: 'send', component: SendComponent},
{ path: 'receive', component: ReceiveComponent}, { path: 'receive', component: ReceiveComponent},
{ path: 'history', component: HistoryComponent} { path: 'history', component: HistoryComponent}
......
#sidepanel {
margin: 0;
padding: 0;
height: 100%;
width: 200px;
position: fixed;
overflow: auto;
}
#content {
margin-left: 200px;
}
\ No newline at end of file
<div id="container"> <div id="container">
<div id="sidepanel"> <div id="navigation">
<app-menu></app-menu> <app-menu></app-menu>
</div> </div>
<div id="content"> <div id="content">
......
...@@ -4,7 +4,7 @@ import { FormsModule, ReactiveFormsModule } from '@angular/forms'; ...@@ -4,7 +4,7 @@ import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { WalletComponent } from './wallet.component'; import { WalletComponent } from './wallet.component';
import { MenuComponent } from './menu/menu.component'; import { MenuComponent } from './menu/menu.component';
import { DashboardComponent } from './menu/dashboard.component'; import { DashboardComponent } from './dashboard/dashboard.component';
import { SendComponent } from './send/send.component'; import { SendComponent } from './send/send.component';
import { ReceiveComponent } from './receive/receive.component'; import { ReceiveComponent } from './receive/receive.component';
import { HistoryComponent } from './history/history.component'; import { HistoryComponent } from './history/history.component';
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="1.1.1" /> <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="1.1.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="1.1.1" /> <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="1.1.1" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="1.1.1" /> <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="1.1.1" />
<PackageReference Include="Stratis.Bitcoin" Version="1.0.1.5-alpha" /> <PackageReference Include="Stratis.Bitcoin" Version="1.0.1.6-alpha" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="1.0.0-rc3" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="1.0.0-rc3" />
<PackageReference Include="System.Reactive" Version="3.1.1" /> <PackageReference Include="System.Reactive" Version="3.1.1" />
<PackageReference Include="System.Runtime.Loader" Version="4.3.0" /> <PackageReference Include="System.Runtime.Loader" Version="4.3.0" />
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="1.1.1" /> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="1.1.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="1.1.1" /> <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="1.1.1" />
<PackageReference Include="Stratis.Bitcoin" Version="1.0.1.5-alpha" /> <PackageReference Include="Stratis.Bitcoin" Version="1.0.1.6-alpha" />
</ItemGroup> </ItemGroup>
</Project> </Project>
...@@ -18,8 +18,8 @@ ...@@ -18,8 +18,8 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="ConcurrentHashSet" Version="1.0.1" /> <PackageReference Include="ConcurrentHashSet" Version="1.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="1.0.3" /> <PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="1.0.3" />
<PackageReference Include="Stratis.Bitcoin" Version="1.0.1.5-alpha" />
<PackageReference Include="System.ValueTuple" Version="4.3.1" /> <PackageReference Include="System.ValueTuple" Version="4.3.1" />
<PackageReference Include="Stratis.Bitcoin" Version="1.0.1.6-alpha" />
</ItemGroup> </ItemGroup>
</Project> </Project>
...@@ -16,30 +16,6 @@ namespace Breeze.Wallet ...@@ -16,30 +16,6 @@ namespace Breeze.Wallet
return chain.Tip.Header.BlockTime.ToUnixTimeSeconds() > (DateTimeOffset.Now.ToUnixTimeSeconds() - TimeSpan.FromHours(1).TotalSeconds); return chain.Tip.Header.BlockTime.ToUnixTimeSeconds() > (DateTimeOffset.Now.ToUnixTimeSeconds() - TimeSpan.FromHours(1).TotalSeconds);
} }
/// <summary>
/// Gets the type of the coin this chain relates to.
/// Obviously this method and how we figure out what coin we're on needs to be revisited.
/// </summary>
/// <param name="chain">The chain.</param>
/// <returns></returns>
/// <exception cref="System.Exception">No support for this coin.</exception>
public static CoinType GetCoinType(this ConcurrentChain chain)
{
uint256 genesis = chain.Genesis.Header.GetHash();
switch (genesis.ToString())
{
case "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f":
return CoinType.Bitcoin;
case "b0e511e965aeb40614ca65a1b79bd6e4e7ef299fa23e575a64b079691e9d4690":
return CoinType.Stratis;
case "000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943":
return CoinType.Testnet;
default:
throw new Exception("No support for this coin.");
}
}
/// <summary> /// <summary>
/// Gets the height of the first block created after this date. /// Gets the height of the first block created after this date.
/// </summary> /// </summary>
......
...@@ -22,13 +22,13 @@ namespace Breeze.Wallet ...@@ -22,13 +22,13 @@ namespace Breeze.Wallet
private readonly BlockNotification blockNotification; private readonly BlockNotification blockNotification;
private readonly CoinType coinType; private readonly CoinType coinType;
public Tracker(IWalletManager walletManager, ConcurrentChain chain, Signals signals, BlockNotification blockNotification) public Tracker(IWalletManager walletManager, ConcurrentChain chain, Signals signals, BlockNotification blockNotification, Network network)
{ {
this.walletManager = walletManager as WalletManager; this.walletManager = walletManager as WalletManager;
this.chain = chain; this.chain = chain;
this.signals = signals; this.signals = signals;
this.blockNotification = blockNotification; this.blockNotification = blockNotification;
this.coinType = chain.GetCoinType(); this.coinType = (CoinType)network.Consensus.CoinType;
} }
/// <inheritdoc /> /// <inheritdoc />
......
...@@ -36,7 +36,7 @@ namespace Breeze.Wallet ...@@ -36,7 +36,7 @@ namespace Breeze.Wallet
/// </summary> /// </summary>
public event EventHandler<TransactionFoundEventArgs> TransactionFound; public event EventHandler<TransactionFoundEventArgs> TransactionFound;
public WalletManager(ConcurrentChain chain) public WalletManager(ConcurrentChain chain, Network netwrok)
{ {
this.Wallets = new List<Wallet>(); this.Wallets = new List<Wallet>();
...@@ -46,7 +46,7 @@ namespace Breeze.Wallet ...@@ -46,7 +46,7 @@ namespace Breeze.Wallet
this.Load(this.DeserializeWallet(path)); this.Load(this.DeserializeWallet(path));
} }
this.coinType = chain.GetCoinType(); this.coinType = (CoinType)netwrok.Consensus.CoinType;
// load data in memory for faster lookups // load data in memory for faster lookups
// TODO get the coin type from somewhere else // TODO get the coin type from somewhere else
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment