Update docs.

This commit is contained in:
Spencer Ofwiti
2021-06-14 14:28:53 +03:00
parent 7923c63aa8
commit 4ed3d108cb
94 changed files with 10372 additions and 2785 deletions

View File

@@ -78,10 +78,14 @@
<a href="#mutableKeyStore">mutableKeyStore</a>
</li>
<li>
<a href="#sessionLoginCount">sessionLoginCount</a>
<a href="#trustedUsers">trustedUsers</a>
</li>
<li>
<a href="#sessionToken">sessionToken</a>
<span class="modifier">Private</span>
<a href="#trustedUsersList">trustedUsersList</a>
</li>
<li>
<a href="#trustedUsersSubject">trustedUsersSubject</a>
</li>
</ul>
</td>
@@ -95,16 +99,25 @@
<tr>
<td class="col-md-4">
<ul class="index-list">
<li>
<a href="#addTrustedUser">addTrustedUser</a>
</li>
<li>
<a href="#getChallenge">getChallenge</a>
</li>
<li>
<a href="#getPrivateKey">getPrivateKey</a>
</li>
<li>
<a href="#getPrivateKeyInfo">getPrivateKeyInfo</a>
</li>
<li>
<span class="modifier">Async</span>
<a href="#getPublicKeys">getPublicKeys</a>
</li>
<li>
<a href="#getSessionToken">getSessionToken</a>
</li>
<li>
<a href="#getTrustedUsers">getTrustedUsers</a>
</li>
@@ -115,12 +128,9 @@
<span class="modifier">Async</span>
<a href="#init">init</a>
</li>
<li>
<a href="#login">login</a>
</li>
<li>
<span class="modifier">Async</span>
<a href="#loginResponse">loginResponse</a>
<a href="#login">login</a>
</li>
<li>
<a href="#loginView">loginView</a>
@@ -129,12 +139,15 @@
<a href="#logout">logout</a>
</li>
<li>
<a href="#sendResponse">sendResponse</a>
<a href="#sendSignedChallenge">sendSignedChallenge</a>
</li>
<li>
<span class="modifier">Async</span>
<a href="#setKey">setKey</a>
</li>
<li>
<a href="#setSessionToken">setSessionToken</a>
</li>
<li>
<a href="#setState">setState</a>
</li>
@@ -161,7 +174,7 @@
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="17" class="link-to-prism">src/app/_services/auth.service.ts:17</a></div>
<div class="io-line">Defined in <a href="" data-line="22" class="link-to-prism">src/app/_services/auth.service.ts:22</a></div>
</td>
</tr>
@@ -228,6 +241,76 @@
<h3 id="methods">
Methods
</h3>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="addTrustedUser"></a>
<span class="name">
<b>
addTrustedUser
</b>
<a href="#addTrustedUser"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<code>addTrustedUser(user: <a href="../interfaces/Staff.html">Staff</a>)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="173"
class="link-to-prism">src/app/_services/auth.service.ts:173</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Parameters :</b>
<table class="params">
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Optional</td>
</tr>
</thead>
<tbody>
<tr>
<td>user</td>
<td>
<code><a href="../interfaces/Staff.html" target="_self" >Staff</a></code>
</td>
<td>
No
</td>
</tr>
</tbody>
</table>
</div>
<div>
</div>
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >void</a></code>
</div>
<div class="io-description">
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
@@ -250,8 +333,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="84"
class="link-to-prism">src/app/_services/auth.service.ts:84</a></div>
<div class="io-line">Defined in <a href="" data-line="85"
class="link-to-prism">src/app/_services/auth.service.ts:85</a></div>
</td>
</tr>
@@ -260,7 +343,7 @@
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >void</a></code>
<b>Returns : </b> <code>Promise&lt;any&gt;</code>
</div>
</td>
@@ -289,8 +372,47 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="210"
class="link-to-prism">src/app/_services/auth.service.ts:210</a></div>
<div class="io-line">Defined in <a href="" data-line="203"
class="link-to-prism">src/app/_services/auth.service.ts:203</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >any</a></code>
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="getPrivateKeyInfo"></a>
<span class="name">
<b>
getPrivateKeyInfo
</b>
<a href="#getPrivateKeyInfo"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<code>getPrivateKeyInfo()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="207"
class="link-to-prism">src/app/_services/auth.service.ts:207</a></div>
</td>
</tr>
@@ -330,8 +452,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="200"
class="link-to-prism">src/app/_services/auth.service.ts:200</a></div>
<div class="io-line">Defined in <a href="" data-line="191"
class="link-to-prism">src/app/_services/auth.service.ts:191</a></div>
</td>
</tr>
@@ -347,6 +469,45 @@
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="getSessionToken"></a>
<span class="name">
<b>
getSessionToken
</b>
<a href="#getSessionToken"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<code>getSessionToken()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="39"
class="link-to-prism">src/app/_services/auth.service.ts:39</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/string" target="_blank" >string</a></code>
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
@@ -369,8 +530,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="194"
class="link-to-prism">src/app/_services/auth.service.ts:194</a></div>
<div class="io-line">Defined in <a href="" data-line="185"
class="link-to-prism">src/app/_services/auth.service.ts:185</a></div>
</td>
</tr>
@@ -379,7 +540,7 @@
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >any</a></code>
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >void</a></code>
</div>
</td>
@@ -408,8 +569,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="42"
class="link-to-prism">src/app/_services/auth.service.ts:42</a></div>
<div class="io-line">Defined in <a href="" data-line="51"
class="link-to-prism">src/app/_services/auth.service.ts:51</a></div>
</td>
</tr>
@@ -418,7 +579,7 @@
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >void</a></code>
<b>Returns : </b> <code>Promise&lt;boolean&gt;</code>
</div>
</td>
@@ -449,8 +610,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="27"
class="link-to-prism">src/app/_services/auth.service.ts:27</a></div>
<div class="io-line">Defined in <a href="" data-line="32"
class="link-to-prism">src/app/_services/auth.service.ts:32</a></div>
</td>
</tr>
@@ -473,6 +634,7 @@
<a name="login"></a>
<span class="name">
<b>
<span class="modifier">Async</span>
login
</b>
<a href="#login"><span class="icon ion-ios-link"></span></a>
@@ -481,56 +643,16 @@
</tr>
<tr>
<td class="col-md-4">
<code>login()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="98"
class="link-to-prism">src/app/_services/auth.service.ts:98</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/boolean" target="_blank" >boolean</a></code>
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="loginResponse"></a>
<span class="name">
<b>
<span class="modifier">Async</span>
loginResponse
</b>
<a href="#loginResponse"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>loginResponse(o: literal type)</code>
<code>login()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="116"
class="link-to-prism">src/app/_services/auth.service.ts:116</a></div>
<div class="io-line">Defined in <a href="" data-line="94"
class="link-to-prism">src/app/_services/auth.service.ts:94</a></div>
</td>
</tr>
@@ -539,39 +661,8 @@
<td class="col-md-4">
<div class="io-description">
<b>Parameters :</b>
<table class="params">
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Optional</td>
</tr>
</thead>
<tbody>
<tr>
<td>o</td>
<td>
<code>literal type</code>
</td>
<b>Returns : </b> <code>Promise&lt;boolean&gt;</code>
<td>
No
</td>
</tr>
</tbody>
</table>
</div>
<div>
</div>
<div class="io-description">
<b>Returns : </b> <code>Promise&lt;any&gt;</code>
</div>
<div class="io-description">
</div>
</td>
</tr>
@@ -599,8 +690,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="150"
class="link-to-prism">src/app/_services/auth.service.ts:150</a></div>
<div class="io-line">Defined in <a href="" data-line="129"
class="link-to-prism">src/app/_services/auth.service.ts:129</a></div>
</td>
</tr>
@@ -638,8 +729,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="188"
class="link-to-prism">src/app/_services/auth.service.ts:188</a></div>
<div class="io-line">Defined in <a href="" data-line="167"
class="link-to-prism">src/app/_services/auth.service.ts:167</a></div>
</td>
</tr>
@@ -659,26 +750,26 @@
<tbody>
<tr>
<td class="col-md-4">
<a name="sendResponse"></a>
<a name="sendSignedChallenge"></a>
<span class="name">
<b>
sendResponse
sendSignedChallenge
</b>
<a href="#sendResponse"><span class="icon ion-ios-link"></span></a>
<a href="#sendSignedChallenge"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<code>sendResponse(hobaResponseEncoded: <a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank">any</a>)</code>
<code>sendSignedChallenge(hobaResponseEncoded: <a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank">any</a>)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="61"
class="link-to-prism">src/app/_services/auth.service.ts:61</a></div>
<div class="io-line">Defined in <a href="" data-line="73"
class="link-to-prism">src/app/_services/auth.service.ts:73</a></div>
</td>
</tr>
@@ -715,7 +806,7 @@
<div>
</div>
<div class="io-description">
<b>Returns : </b> <code>Promise&lt;boolean&gt;</code>
<b>Returns : </b> <code>Promise&lt;any&gt;</code>
</div>
<div class="io-description">
@@ -749,8 +840,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="160"
class="link-to-prism">src/app/_services/auth.service.ts:160</a></div>
<div class="io-line">Defined in <a href="" data-line="139"
class="link-to-prism">src/app/_services/auth.service.ts:139</a></div>
</td>
</tr>
@@ -800,6 +891,72 @@
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="setSessionToken"></a>
<span class="name">
<b>
setSessionToken
</b>
<a href="#setSessionToken"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<code>setSessionToken(token)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="43"
class="link-to-prism">src/app/_services/auth.service.ts:43</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Parameters :</b>
<table class="params">
<thead>
<tr>
<td>Name</td>
<td>Optional</td>
</tr>
</thead>
<tbody>
<tr>
<td>token</td>
<td>
No
</td>
</tr>
</tbody>
</table>
</div>
<div>
</div>
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >void</a></code>
</div>
<div class="io-description">
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
@@ -822,8 +979,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="38"
class="link-to-prism">src/app/_services/auth.service.ts:38</a></div>
<div class="io-line">Defined in <a href="" data-line="47"
class="link-to-prism">src/app/_services/auth.service.ts:47</a></div>
</td>
</tr>
@@ -903,28 +1060,28 @@
<tbody>
<tr>
<td class="col-md-4">
<a name="sessionLoginCount"></a>
<a name="trustedUsers"></a>
<span class="name">
<b>
sessionLoginCount</b>
<a href="#sessionLoginCount"><span class="icon ion-ios-link"></span></a>
trustedUsers</b>
<a href="#trustedUsers"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/number" target="_blank" >number</a></code>
<i>Type : </i> <code><a href="../interfaces/Staff.html" target="_self" >Array&lt;Staff&gt;</a></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Default value : </i><code>0</code>
<i>Default value : </i><code>[]</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="16" class="link-to-prism">src/app/_services/auth.service.ts:16</a></div>
<div class="io-line">Defined in <a href="" data-line="18" class="link-to-prism">src/app/_services/auth.service.ts:18</a></div>
</td>
</tr>
@@ -935,23 +1092,63 @@
<tbody>
<tr>
<td class="col-md-4">
<a name="sessionToken"></a>
<a name="trustedUsersList"></a>
<span class="name">
<b>
sessionToken</b>
<a href="#sessionToken"><span class="icon ion-ios-link"></span></a>
<span class="modifier">Private</span>
trustedUsersList</b>
<a href="#trustedUsersList"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >any</a></code>
<i>Type : </i> <code><a href="../interfaces/Staff.html" target="_self" >BehaviorSubject&lt;Array&lt;Staff&gt;&gt;</a></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Default value : </i><code>new BehaviorSubject&lt;Array&lt;Staff&gt;&gt;(
this.trustedUsers
)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="15" class="link-to-prism">src/app/_services/auth.service.ts:15</a></div>
<div class="io-line">Defined in <a href="" data-line="19" class="link-to-prism">src/app/_services/auth.service.ts:19</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="trustedUsersSubject"></a>
<span class="name">
<b>
trustedUsersSubject</b>
<a href="#trustedUsersSubject"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code><a href="../interfaces/Staff.html" target="_self" >Observable&lt;Array&lt;Staff&gt;&gt;</a></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Default value : </i><code>this.trustedUsersList.asObservable()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="22" class="link-to-prism">src/app/_services/auth.service.ts:22</a></div>
</td>
</tr>
@@ -972,15 +1169,20 @@ import { LoggingService } from &#x27;@app/_services/logging.service&#x27;;
import { MutableKeyStore, MutablePgpKeyStore } from &#x27;@app/_pgp&#x27;;
import { ErrorDialogService } from &#x27;@app/_services/error-dialog.service&#x27;;
import { HttpClient } from &#x27;@angular/common/http&#x27;;
import { HttpError } from &#x27;@app/_helpers/global-error-handler&#x27;;
import { HttpError, rejectBody } from &#x27;@app/_helpers/global-error-handler&#x27;;
import { Staff } from &#x27;@app/_models&#x27;;
import { BehaviorSubject, Observable } from &#x27;rxjs&#x27;;
@Injectable({
providedIn: &#x27;root&#x27;,
})
export class AuthService {
sessionToken: any;
sessionLoginCount: number &#x3D; 0;
mutableKeyStore: MutableKeyStore;
trustedUsers: Array&lt;Staff&gt; &#x3D; [];
private trustedUsersList: BehaviorSubject&lt;Array&lt;Staff&gt;&gt; &#x3D; new BehaviorSubject&lt;Array&lt;Staff&gt;&gt;(
this.trustedUsers
);
trustedUsersSubject: Observable&lt;Array&lt;Staff&gt;&gt; &#x3D; this.trustedUsersList.asObservable();
constructor(
private httpClient: HttpClient,
@@ -992,127 +1194,101 @@ export class AuthService {
async init(): Promise&lt;void&gt; {
await this.mutableKeyStore.loadKeyring();
// TODO setting these together should be atomic
if (sessionStorage.getItem(btoa(&#x27;CICADA_SESSION_TOKEN&#x27;))) {
this.sessionToken &#x3D; sessionStorage.getItem(btoa(&#x27;CICADA_SESSION_TOKEN&#x27;));
}
if (localStorage.getItem(btoa(&#x27;CICADA_PRIVATE_KEY&#x27;))) {
await this.mutableKeyStore.importPrivateKey(localStorage.getItem(btoa(&#x27;CICADA_PRIVATE_KEY&#x27;)));
}
}
getSessionToken(): string {
return sessionStorage.getItem(btoa(&#x27;CICADA_SESSION_TOKEN&#x27;));
}
setSessionToken(token): void {
sessionStorage.setItem(btoa(&#x27;CICADA_SESSION_TOKEN&#x27;), token);
}
setState(s): void {
document.getElementById(&#x27;state&#x27;).innerHTML &#x3D; s;
}
getWithToken(): void {
const xhr: XMLHttpRequest &#x3D; new XMLHttpRequest();
xhr.responseType &#x3D; &#x27;text&#x27;;
xhr.open(&#x27;GET&#x27;, environment.cicMetaUrl + window.location.search.substring(1));
xhr.setRequestHeader(&#x27;Authorization&#x27;, &#x27;Bearer &#x27; + this.sessionToken);
xhr.setRequestHeader(&#x27;Content-Type&#x27;, &#x27;application/json&#x27;);
xhr.setRequestHeader(&#x27;x-cic-automerge&#x27;, &#x27;none&#x27;);
xhr.addEventListener(&#x27;load&#x27;, (e) &#x3D;&gt; {
if (xhr.status &#x3D;&#x3D;&#x3D; 401) {
throw new Error(&#x27;login rejected&#x27;);
getWithToken(): Promise&lt;boolean&gt; {
const headers &#x3D; {
Authorization: &#x27;Bearer &#x27; + this.getSessionToken,
&#x27;Content-Type&#x27;: &#x27;application/json;charset&#x3D;utf-8&#x27;,
&#x27;x-cic-automerge&#x27;: &#x27;none&#x27;,
};
const options &#x3D; {
headers,
};
return fetch(environment.cicMetaUrl, options).then((response) &#x3D;&gt; {
if (!response.ok) {
this.loggingService.sendErrorLevelMessage(&#x27;failed to get with auth token.&#x27;, this, {
error: &#x27;&#x27;,
});
return false;
}
this.sessionLoginCount++;
this.setState(&#x27;Click button to log in&#x27;);
return;
return true;
});
xhr.send();
}
// TODO rename to send signed challenge and set session. Also separate these responsibilities
sendResponse(hobaResponseEncoded: any): Promise&lt;boolean&gt; {
return new Promise((resolve, reject) &#x3D;&gt; {
const xhr: XMLHttpRequest &#x3D; new XMLHttpRequest();
xhr.responseType &#x3D; &#x27;text&#x27;;
xhr.open(&#x27;GET&#x27;, environment.cicMetaUrl + window.location.search.substring(1));
xhr.setRequestHeader(&#x27;Authorization&#x27;, &#x27;HOBA &#x27; + hobaResponseEncoded);
xhr.setRequestHeader(&#x27;Content-Type&#x27;, &#x27;application/json&#x27;);
xhr.setRequestHeader(&#x27;x-cic-automerge&#x27;, &#x27;none&#x27;);
xhr.addEventListener(&#x27;load&#x27;, (e) &#x3D;&gt; {
if (xhr.status !&#x3D;&#x3D; 200) {
const error &#x3D; new HttpError(xhr.statusText, xhr.status);
return reject(error);
}
this.sessionToken &#x3D; xhr.getResponseHeader(&#x27;Token&#x27;);
sessionStorage.setItem(btoa(&#x27;CICADA_SESSION_TOKEN&#x27;), this.sessionToken);
this.sessionLoginCount++;
this.setState(&#x27;Click button to log in&#x27;);
return resolve(true);
});
xhr.send();
});
}
getChallenge(): void {
const xhr: XMLHttpRequest &#x3D; new XMLHttpRequest();
xhr.responseType &#x3D; &#x27;arraybuffer&#x27;;
xhr.open(&#x27;GET&#x27;, environment.cicMetaUrl + window.location.search.substring(1));
xhr.onload &#x3D; async (e) &#x3D;&gt; {
if (xhr.status &#x3D;&#x3D;&#x3D; 401) {
const authHeader &#x3D; xhr.getResponseHeader(&#x27;WWW-Authenticate&#x27;);
const o &#x3D; hobaParseChallengeHeader(authHeader);
this.loginResponse(o);
}
sendSignedChallenge(hobaResponseEncoded: any): Promise&lt;any&gt; {
const headers &#x3D; {
Authorization: &#x27;HOBA &#x27; + hobaResponseEncoded,
&#x27;Content-Type&#x27;: &#x27;application/json;charset&#x3D;utf-8&#x27;,
&#x27;x-cic-automerge&#x27;: &#x27;none&#x27;,
};
xhr.send();
const options &#x3D; {
headers,
};
return fetch(environment.cicMetaUrl, options);
}
login(): boolean {
if (this.sessionToken !&#x3D;&#x3D; undefined) {
try {
this.getWithToken();
return true;
} catch (e) {
this.loggingService.sendErrorLevelMessage(&#x27;Login token failed&#x27;, this, { error: e });
}
} else {
try {
this.getChallenge();
} catch (e) {
this.loggingService.sendErrorLevelMessage(&#x27;Login challenge failed&#x27;, this, { error: e });
}
}
return false;
}
async loginResponse(o: { challenge: string; realm: any }): Promise&lt;any&gt; {
return new Promise(async (resolve, reject) &#x3D;&gt; {
try {
const r &#x3D; await signChallenge(
o.challenge,
o.realm,
environment.cicMetaUrl,
this.mutableKeyStore
);
const sessionTokenResult: boolean &#x3D; await this.sendResponse(r);
} catch (error) {
if (error instanceof HttpError) {
if (error.status &#x3D;&#x3D;&#x3D; 403) {
this.errorDialogService.openDialog({
message: &#x27;You are not authorized to use this system&#x27;,
});
}
if (error.status &#x3D;&#x3D;&#x3D; 401) {
this.errorDialogService.openDialog({
message:
&#x27;Unable to authenticate with the service. &#x27; +
&#x27;Please speak with the staff at Grassroots &#x27; +
&#x27;Economics for requesting access &#x27; +
&#x27;staff@grassrootseconomics.net.&#x27;,
});
}
}
// TODO define this error
this.errorDialogService.openDialog({ message: &#x27;Incorrect key passphrase.&#x27; });
resolve(false);
getChallenge(): Promise&lt;any&gt; {
return fetch(environment.cicMetaUrl).then((response) &#x3D;&gt; {
if (response.status &#x3D;&#x3D;&#x3D; 401) {
const authHeader: string &#x3D; response.headers.get(&#x27;WWW-Authenticate&#x27;);
return hobaParseChallengeHeader(authHeader);
}
});
}
async login(): Promise&lt;boolean&gt; {
if (this.getSessionToken()) {
sessionStorage.removeItem(btoa(&#x27;CICADA_SESSION_TOKEN&#x27;));
} else {
const o &#x3D; await this.getChallenge();
const r &#x3D; await signChallenge(
o.challenge,
o.realm,
environment.cicMetaUrl,
this.mutableKeyStore
);
const tokenResponse &#x3D; await this.sendSignedChallenge(r).then((response) &#x3D;&gt; {
const token &#x3D; response.headers.get(&#x27;Token&#x27;);
if (token) {
return token;
}
if (response.status &#x3D;&#x3D;&#x3D; 401) {
throw new HttpError(&#x27;You are not authorized to use this system&#x27;, response.status);
}
if (!response.ok) {
throw new HttpError(&#x27;Unknown error from authentication server&#x27;, response.status);
}
});
if (tokenResponse) {
this.setSessionToken(tokenResponse);
this.setState(&#x27;Click button to log in&#x27;);
return true;
}
return false;
}
}
loginView(): void {
document.getElementById(&#x27;one&#x27;).style.display &#x3D; &#x27;none&#x27;;
document.getElementById(&#x27;two&#x27;).style.display &#x3D; &#x27;block&#x27;;
@@ -1153,29 +1329,47 @@ export class AuthService {
logout(): void {
sessionStorage.removeItem(btoa(&#x27;CICADA_SESSION_TOKEN&#x27;));
this.sessionToken &#x3D; undefined;
localStorage.removeItem(btoa(&#x27;CICADA_PRIVATE_KEY&#x27;));
window.location.reload();
}
getTrustedUsers(): any {
const trustedUsers: Array&lt;any&gt; &#x3D; [];
this.mutableKeyStore.getPublicKeys().forEach((key) &#x3D;&gt; trustedUsers.push(key.users[0].userId));
return trustedUsers;
addTrustedUser(user: Staff): void {
const savedIndex &#x3D; this.trustedUsers.findIndex((staff) &#x3D;&gt; staff.userid &#x3D;&#x3D;&#x3D; user.userid);
if (savedIndex &#x3D;&#x3D;&#x3D; 0) {
return;
}
if (savedIndex &gt; 0) {
this.trustedUsers.splice(savedIndex, 1);
}
this.trustedUsers.unshift(user);
this.trustedUsersList.next(this.trustedUsers);
}
getTrustedUsers(): void {
this.mutableKeyStore.getPublicKeys().forEach((key) &#x3D;&gt; {
this.addTrustedUser(key.users[0].userId);
});
}
async getPublicKeys(): Promise&lt;any&gt; {
return await fetch(environment.publicKeysUrl).then((res) &#x3D;&gt; {
if (!res.ok) {
// TODO does angular recommend an error interface?
throw Error(&#x60;${res.statusText} - ${res.status}&#x60;);
}
return res.text();
return new Promise((resolve, reject) &#x3D;&gt; {
fetch(environment.publicKeysUrl).then((res) &#x3D;&gt; {
if (!res.ok) {
// TODO does angular recommend an error interface?
return reject(rejectBody(res));
}
return resolve(res.text());
});
});
}
getPrivateKey(): any {
return this.mutableKeyStore.getPrivateKey();
}
getPrivateKeyInfo(): any {
return this.getPrivateKey().users[0].userId;
}
}
</code></pre>
</div>

View File

@@ -93,16 +93,18 @@
<td class="col-md-4">
<ul class="index-list">
<li>
<span class="modifier">Async</span>
<a href="#blockSync">blockSync</a>
</li>
<li>
<a href="#fetcher">fetcher</a>
</li>
<li>
<a href="#newConversionEvent">newConversionEvent</a>
<span class="modifier">Async</span>
<a href="#init">init</a>
</li>
<li>
<a href="#newTransferEvent">newTransferEvent</a>
<a href="#newEvent">newEvent</a>
</li>
<li>
<a href="#readyStateProcessor">readyStateProcessor</a>
@@ -129,12 +131,12 @@
<tbody>
<tr>
<td class="col-md-4">
<code>constructor(transactionService: <a href="../injectables/TransactionService.html">TransactionService</a>, loggingService: <a href="../injectables/LoggingService.html">LoggingService</a>, registryService: <a href="../injectables/RegistryService.html">RegistryService</a>)</code>
<code>constructor(transactionService: <a href="../injectables/TransactionService.html">TransactionService</a>, loggingService: <a href="../injectables/LoggingService.html">LoggingService</a>)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="15" class="link-to-prism">src/app/_services/block-sync.service.ts:15</a></div>
<div class="io-line">Defined in <a href="" data-line="16" class="link-to-prism">src/app/_services/block-sync.service.ts:16</a></div>
</td>
</tr>
@@ -175,18 +177,6 @@
</td>
</tr>
<tr>
<td>registryService</td>
<td>
<code><a href="../injectables/RegistryService.html" target="_self" >RegistryService</a></code>
</td>
<td>
No
</td>
</tr>
</tbody>
</table>
</div>
@@ -208,6 +198,7 @@
<a name="blockSync"></a>
<span class="name">
<b>
<span class="modifier">Async</span>
blockSync
</b>
<a href="#blockSync"><span class="icon ion-ios-link"></span></a>
@@ -216,15 +207,16 @@
</tr>
<tr>
<td class="col-md-4">
<code>blockSync(address: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/string" target="_blank">string</a>, offset: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/number" target="_blank">number</a>, limit: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/number" target="_blank">number</a>)</code>
<span class="modifier-icon icon ion-ios-reset"></span>
<code>blockSync(address: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/string" target="_blank">string</a>, offset: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/number" target="_blank">number</a>, limit: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/number" target="_blank">number</a>)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="23"
class="link-to-prism">src/app/_services/block-sync.service.ts:23</a></div>
<div class="io-line">Defined in <a href="" data-line="27"
class="link-to-prism">src/app/_services/block-sync.service.ts:27</a></div>
</td>
</tr>
@@ -295,7 +287,7 @@
<div>
</div>
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >void</a></code>
<b>Returns : </b> <code>Promise&lt;void&gt;</code>
</div>
<div class="io-description">
@@ -327,8 +319,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="118"
class="link-to-prism">src/app/_services/block-sync.service.ts:118</a></div>
<div class="io-line">Defined in <a href="" data-line="109"
class="link-to-prism">src/app/_services/block-sync.service.ts:109</a></div>
</td>
</tr>
@@ -391,26 +383,67 @@
<tbody>
<tr>
<td class="col-md-4">
<a name="newConversionEvent"></a>
<a name="init"></a>
<span class="name">
<b>
newConversionEvent
<span class="modifier">Async</span>
init
</b>
<a href="#newConversionEvent"><span class="icon ion-ios-link"></span></a>
<a href="#init"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<code>newConversionEvent(tx: <a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank">any</a>)</code>
<span class="modifier-icon icon ion-ios-reset"></span>
<code>init()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="89"
class="link-to-prism">src/app/_services/block-sync.service.ts:89</a></div>
<div class="io-line">Defined in <a href="" data-line="23"
class="link-to-prism">src/app/_services/block-sync.service.ts:23</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code>Promise&lt;void&gt;</code>
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="newEvent"></a>
<span class="name">
<b>
newEvent
</b>
<a href="#newEvent"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<code>newEvent(tx: <a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank">any</a>, eventType: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/string" target="_blank">string</a>)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="80"
class="link-to-prism">src/app/_services/block-sync.service.ts:80</a></div>
</td>
</tr>
@@ -441,68 +474,10 @@
</tr>
</tbody>
</table>
</div>
<div>
</div>
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >any</a></code>
</div>
<div class="io-description">
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="newTransferEvent"></a>
<span class="name">
<b>
newTransferEvent
</b>
<a href="#newTransferEvent"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<code>newTransferEvent(tx: <a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank">any</a>)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="81"
class="link-to-prism">src/app/_services/block-sync.service.ts:81</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Parameters :</b>
<table class="params">
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Optional</td>
</tr>
</thead>
<tbody>
<tr>
<td>tx</td>
<td>eventType</td>
<td>
<code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >any</a></code>
<code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/string" target="_blank" >string</a></code>
</td>
<td>
@@ -549,8 +524,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="46"
class="link-to-prism">src/app/_services/block-sync.service.ts:46</a></div>
<div class="io-line">Defined in <a href="" data-line="45"
class="link-to-prism">src/app/_services/block-sync.service.ts:45</a></div>
</td>
</tr>
@@ -669,8 +644,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="97"
class="link-to-prism">src/app/_services/block-sync.service.ts:97</a></div>
<div class="io-line">Defined in <a href="" data-line="88"
class="link-to-prism">src/app/_services/block-sync.service.ts:88</a></div>
</td>
</tr>
@@ -808,7 +783,7 @@
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="15" class="link-to-prism">src/app/_services/block-sync.service.ts:15</a></div>
<div class="io-line">Defined in <a href="" data-line="16" class="link-to-prism">src/app/_services/block-sync.service.ts:16</a></div>
</td>
</tr>
@@ -840,7 +815,7 @@
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="14" class="link-to-prism">src/app/_services/block-sync.service.ts:14</a></div>
<div class="io-line">Defined in <a href="" data-line="15" class="link-to-prism">src/app/_services/block-sync.service.ts:15</a></div>
</td>
</tr>
@@ -855,12 +830,13 @@
<div class="tab-pane fade tab-source-code" id="c-source">
<pre class="line-numbers compodoc-sourcecode"><code class="language-typescript">import { Injectable } from &#x27;@angular/core&#x27;;
import { Settings } from &#x27;@app/_models&#x27;;
import { TransactionHelper } from &#x27;cic-client&#x27;;
import { TransactionHelper } from &#x27;@cicnet/cic-client&#x27;;
import { first } from &#x27;rxjs/operators&#x27;;
import { TransactionService } from &#x27;@app/_services/transaction.service&#x27;;
import { environment } from &#x27;@src/environments/environment&#x27;;
import { LoggingService } from &#x27;@app/_services/logging.service&#x27;;
import { RegistryService } from &#x27;@app/_services/registry.service&#x27;;
import { Web3Service } from &#x27;@app/_services/web3.service&#x27;;
@Injectable({
providedIn: &#x27;root&#x27;,
@@ -871,31 +847,29 @@ export class BlockSyncService {
constructor(
private transactionService: TransactionService,
private loggingService: LoggingService,
private registryService: RegistryService
private loggingService: LoggingService
) {}
blockSync(address: string &#x3D; null, offset: number &#x3D; 0, limit: number &#x3D; 100): void {
async init(): Promise&lt;void&gt; {
await this.transactionService.init();
}
async blockSync(address: string &#x3D; null, offset: number &#x3D; 0, limit: number &#x3D; 100): Promise&lt;void&gt; {
this.transactionService.resetTransactionsList();
const settings: Settings &#x3D; new Settings(this.scan);
const readyStateElements: { network: number } &#x3D; { network: 2 };
settings.w3.provider &#x3D; environment.web3Provider;
settings.w3.engine &#x3D; this.registryService.getWeb3();
settings.registry &#x3D; this.registryService.getRegistry();
settings.w3.engine &#x3D; Web3Service.getInstance();
settings.registry &#x3D; await RegistryService.getRegistry();
settings.txHelper &#x3D; new TransactionHelper(settings.w3.engine, settings.registry);
settings.txHelper.ontransfer &#x3D; async (transaction: any): Promise&lt;void&gt; &#x3D;&gt; {
window.dispatchEvent(this.newTransferEvent(transaction));
window.dispatchEvent(this.newEvent(transaction, &#x27;cic_transfer&#x27;));
};
settings.txHelper.onconversion &#x3D; async (transaction: any): Promise&lt;any&gt; &#x3D;&gt; {
window.dispatchEvent(this.newConversionEvent(transaction));
window.dispatchEvent(this.newEvent(transaction, &#x27;cic_convert&#x27;));
};
settings.registry.onload &#x3D; (addressReturned: number): void &#x3D;&gt; {
this.loggingService.sendInfoLevelMessage(&#x60;Loaded network contracts ${addressReturned}&#x60;);
this.readyStateProcessor(settings, readyStateElements.network, address, offset, limit);
};
settings.registry.load();
this.readyStateProcessor(settings, readyStateElements.network, address, offset, limit);
}
readyStateProcessor(
@@ -933,16 +907,8 @@ export class BlockSyncService {
}
}
newTransferEvent(tx: any): any {
return new CustomEvent(&#x27;cic_transfer&#x27;, {
detail: {
tx,
},
});
}
newConversionEvent(tx: any): any {
return new CustomEvent(&#x27;cic_convert&#x27;, {
newEvent(tx: any, eventType: string): any {
return new CustomEvent(eventType, {
detail: {
tx,
},

View File

@@ -635,6 +635,13 @@ export class GlobalErrorHandler extends ErrorHandler {
}
}
}
export function rejectBody(error): { status: any; statusText: any } {
return {
status: error.status,
statusText: error.statusText,
};
}
</code></pre>
</div>

View File

@@ -75,14 +75,14 @@
<td class="col-md-4">
<ul class="index-list">
<li>
<span class="modifier">Static</span>
<a href="#fileGetter">fileGetter</a>
</li>
<li>
<span class="modifier">Private</span>
<span class="modifier">Static</span>
<a href="#registry">registry</a>
</li>
<li>
<a href="#web3">web3</a>
</li>
</ul>
</td>
</tr>
@@ -96,11 +96,10 @@
<td class="col-md-4">
<ul class="index-list">
<li>
<span class="modifier">Static</span>
<span class="modifier">Async</span>
<a href="#getRegistry">getRegistry</a>
</li>
<li>
<a href="#getWeb3">getWeb3</a>
</li>
</ul>
</td>
</tr>
@@ -124,7 +123,7 @@
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="19" class="link-to-prism">src/app/_services/registry.service.ts:19</a></div>
<div class="io-line">Defined in <a href="" data-line="12" class="link-to-prism">src/app/_services/registry.service.ts:12</a></div>
</td>
</tr>
@@ -144,6 +143,8 @@
<a name="getRegistry"></a>
<span class="name">
<b>
<span class="modifier">Static</span>
<span class="modifier">Async</span>
getRegistry
</b>
<a href="#getRegistry"><span class="icon ion-ios-link"></span></a>
@@ -152,15 +153,16 @@
</tr>
<tr>
<td class="col-md-4">
<code>getRegistry()</code>
<span class="modifier-icon icon ion-ios-reset"></span>
<code>getRegistry()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="26"
class="link-to-prism">src/app/_services/registry.service.ts:26</a></div>
<div class="io-line">Defined in <a href="" data-line="16"
class="link-to-prism">src/app/_services/registry.service.ts:16</a></div>
</td>
</tr>
@@ -169,46 +171,7 @@
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >any</a></code>
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="getWeb3"></a>
<span class="name">
<b>
getWeb3
</b>
<a href="#getWeb3"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<code>getWeb3()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="30"
class="link-to-prism">src/app/_services/registry.service.ts:30</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >any</a></code>
<b>Returns : </b> <code>Promise&lt;CICRegistry&gt;</code>
</div>
</td>
@@ -228,6 +191,7 @@
<a name="fileGetter"></a>
<span class="name">
<b>
<span class="modifier">Static</span>
fileGetter</b>
<a href="#fileGetter"><span class="icon ion-ios-link"></span></a>
</span>
@@ -246,7 +210,7 @@
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="12" class="link-to-prism">src/app/_services/registry.service.ts:12</a></div>
<div class="io-line">Defined in <a href="" data-line="11" class="link-to-prism">src/app/_services/registry.service.ts:11</a></div>
</td>
</tr>
@@ -260,6 +224,8 @@
<a name="registry"></a>
<span class="name">
<b>
<span class="modifier">Private</span>
<span class="modifier">Static</span>
registry</b>
<a href="#registry"><span class="icon ion-ios-link"></span></a>
</span>
@@ -271,52 +237,9 @@
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Default value : </i><code>new CICRegistry(
this.web3,
environment.registryAddress,
&#x27;Registry&#x27;,
this.fileGetter,
[&#x27;../../assets/js/block-sync/data&#x27;]
)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="13" class="link-to-prism">src/app/_services/registry.service.ts:13</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="web3"></a>
<span class="name">
<b>
web3</b>
<a href="#web3"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code>Web3</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Default value : </i><code>new Web3(environment.web3Provider)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="11" class="link-to-prism">src/app/_services/registry.service.ts:11</a></div>
<div class="io-line">Defined in <a href="" data-line="12" class="link-to-prism">src/app/_services/registry.service.ts:12</a></div>
</td>
</tr>
@@ -330,36 +253,33 @@
<div class="tab-pane fade tab-source-code" id="c-source">
<pre class="line-numbers compodoc-sourcecode"><code class="language-typescript">import { Injectable } from &#x27;@angular/core&#x27;;
import Web3 from &#x27;web3&#x27;;
import { environment } from &#x27;@src/environments/environment&#x27;;
import { CICRegistry, FileGetter } from &#x27;cic-client&#x27;;
import { CICRegistry, FileGetter } from &#x27;@cicnet/cic-client&#x27;;
import { HttpGetter } from &#x27;@app/_helpers&#x27;;
import { Web3Service } from &#x27;@app/_services/web3.service&#x27;;
@Injectable({
providedIn: &#x27;root&#x27;,
})
export class RegistryService {
web3: Web3 &#x3D; new Web3(environment.web3Provider);
fileGetter: FileGetter &#x3D; new HttpGetter();
registry: CICRegistry &#x3D; new CICRegistry(
this.web3,
environment.registryAddress,
&#x27;Registry&#x27;,
this.fileGetter,
[&#x27;../../assets/js/block-sync/data&#x27;]
);
static fileGetter: FileGetter &#x3D; new HttpGetter();
private static registry: CICRegistry;
constructor() {
this.registry.declaratorHelper.addTrust(environment.trustedDeclaratorAddress);
this.registry.load();
}
constructor() {}
getRegistry(): any {
return this.registry;
}
getWeb3(): any {
return this.web3;
public static async getRegistry(): Promise&lt;CICRegistry&gt; {
if (!RegistryService.registry) {
RegistryService.registry &#x3D; new CICRegistry(
Web3Service.getInstance(),
environment.registryAddress,
&#x27;Registry&#x27;,
RegistryService.fileGetter,
[&#x27;../../assets/js/block-sync/data&#x27;]
);
RegistryService.registry.declaratorHelper.addTrust(environment.trustedDeclaratorAddress);
await RegistryService.registry.load();
}
return RegistryService.registry;
}
}
</code></pre>

View File

@@ -75,7 +75,7 @@
<td class="col-md-4">
<ul class="index-list">
<li>
<a href="#LoadEvent">LoadEvent</a>
<a href="#load">load</a>
</li>
<li>
<a href="#registry">registry</a>
@@ -83,6 +83,16 @@
<li>
<a href="#tokenRegistry">tokenRegistry</a>
</li>
<li>
<a href="#tokens">tokens</a>
</li>
<li>
<span class="modifier">Private</span>
<a href="#tokensList">tokensList</a>
</li>
<li>
<a href="#tokensSubject">tokensSubject</a>
</li>
</ul>
</td>
</tr>
@@ -95,17 +105,37 @@
<tr>
<td class="col-md-4">
<ul class="index-list">
<li>
<a href="#addToken">addToken</a>
</li>
<li>
<span class="modifier">Async</span>
<a href="#getTokenBalance">getTokenBalance</a>
</li>
<li>
<span class="modifier">Async</span>
<a href="#getTokenByAddress">getTokenByAddress</a>
</li>
<li>
<span class="modifier">Async</span>
<a href="#getTokenBySymbol">getTokenBySymbol</a>
</li>
<li>
<span class="modifier">Async</span>
<a href="#getTokenName">getTokenName</a>
</li>
<li>
<span class="modifier">Async</span>
<a href="#getTokens">getTokens</a>
</li>
<li>
<span class="modifier">Async</span>
<a href="#getTokenSymbol">getTokenSymbol</a>
</li>
<li>
<span class="modifier">Async</span>
<a href="#init">init</a>
</li>
</ul>
</td>
</tr>
@@ -124,12 +154,12 @@
<tbody>
<tr>
<td class="col-md-4">
<code>constructor(httpClient: <a href="https://angular.io/api/common/http/HttpClient" target="_blank">HttpClient</a>, registryService: <a href="../injectables/RegistryService.html">RegistryService</a>)</code>
<code>constructor(httpClient: <a href="https://angular.io/api/common/http/HttpClient" target="_blank">HttpClient</a>)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="15" class="link-to-prism">src/app/_services/token.service.ts:15</a></div>
<div class="io-line">Defined in <a href="" data-line="20" class="link-to-prism">src/app/_services/token.service.ts:20</a></div>
</td>
</tr>
@@ -158,18 +188,6 @@
</td>
</tr>
<tr>
<td>registryService</td>
<td>
<code><a href="../injectables/RegistryService.html" target="_self" >RegistryService</a></code>
</td>
<td>
No
</td>
</tr>
</tbody>
</table>
</div>
@@ -184,6 +202,76 @@
<h3 id="methods">
Methods
</h3>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="addToken"></a>
<span class="name">
<b>
addToken
</b>
<a href="#addToken"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<code>addToken(token: <a href="../interfaces/Token.html">Token</a>)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="32"
class="link-to-prism">src/app/_services/token.service.ts:32</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Parameters :</b>
<table class="params">
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Optional</td>
</tr>
</thead>
<tbody>
<tr>
<td>token</td>
<td>
<code><a href="../interfaces/Token.html" target="_self" >Token</a></code>
</td>
<td>
No
</td>
</tr>
</tbody>
</table>
</div>
<div>
</div>
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >void</a></code>
</div>
<div class="io-description">
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
@@ -208,8 +296,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="37"
class="link-to-prism">src/app/_services/token.service.ts:37</a></div>
<div class="io-line">Defined in <a href="" data-line="73"
class="link-to-prism">src/app/_services/token.service.ts:73</a></div>
</td>
</tr>
@@ -246,7 +334,79 @@
<div>
</div>
<div class="io-description">
<b>Returns : </b> <code>Promise&lt;number&gt;</code>
<b>Returns : </b> <code>Promise&lt;Promise&lt;number&gt;&gt;</code>
</div>
<div class="io-description">
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="getTokenByAddress"></a>
<span class="name">
<b>
<span class="modifier">Async</span>
getTokenByAddress
</b>
<a href="#getTokenByAddress"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>getTokenByAddress(address: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/string" target="_blank">string</a>)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="52"
class="link-to-prism">src/app/_services/token.service.ts:52</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Parameters :</b>
<table class="params">
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Optional</td>
</tr>
</thead>
<tbody>
<tr>
<td>address</td>
<td>
<code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/string" target="_blank" >string</a></code>
</td>
<td>
No
</td>
</tr>
</tbody>
</table>
</div>
<div>
</div>
<div class="io-description">
<b>Returns : </b> <code><a href="../interfaces/Token.html" target="_self" >Promise&lt;Token&gt;</a></code>
</div>
<div class="io-description">
@@ -263,6 +423,7 @@
<a name="getTokenBySymbol"></a>
<span class="name">
<b>
<span class="modifier">Async</span>
getTokenBySymbol
</b>
<a href="#getTokenBySymbol"><span class="icon ion-ios-link"></span></a>
@@ -271,15 +432,16 @@
</tr>
<tr>
<td class="col-md-4">
<code>getTokenBySymbol(symbol: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/string" target="_blank">string</a>)</code>
<span class="modifier-icon icon ion-ios-reset"></span>
<code>getTokenBySymbol(symbol: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/string" target="_blank">string</a>)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="33"
class="link-to-prism">src/app/_services/token.service.ts:33</a></div>
<div class="io-line">Defined in <a href="" data-line="63"
class="link-to-prism">src/app/_services/token.service.ts:63</a></div>
</td>
</tr>
@@ -316,7 +478,7 @@
<div>
</div>
<div class="io-description">
<b>Returns : </b> <code>Observable&lt;any&gt;</code>
<b>Returns : </b> <code><a href="../interfaces/Token.html" target="_self" >Promise&lt;Observable&lt;Token&gt;&gt;</a></code>
</div>
<div class="io-description">
@@ -326,6 +488,47 @@
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="getTokenName"></a>
<span class="name">
<b>
<span class="modifier">Async</span>
getTokenName
</b>
<a href="#getTokenName"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>getTokenName()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="78"
class="link-to-prism">src/app/_services/token.service.ts:78</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code>Promise&lt;string&gt;</code>
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
@@ -350,8 +553,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="28"
class="link-to-prism">src/app/_services/token.service.ts:28</a></div>
<div class="io-line">Defined in <a href="" data-line="44"
class="link-to-prism">src/app/_services/token.service.ts:44</a></div>
</td>
</tr>
@@ -360,7 +563,89 @@
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code>Promise&lt;Array&lt;Promise&lt;string&gt;&gt;&gt;</code>
<b>Returns : </b> <code>Promise&lt;void&gt;</code>
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="getTokenSymbol"></a>
<span class="name">
<b>
<span class="modifier">Async</span>
getTokenSymbol
</b>
<a href="#getTokenSymbol"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>getTokenSymbol()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="83"
class="link-to-prism">src/app/_services/token.service.ts:83</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code>Promise&lt;string&gt;</code>
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="init"></a>
<span class="name">
<b>
<span class="modifier">Async</span>
init
</b>
<a href="#init"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>init()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="24"
class="link-to-prism">src/app/_services/token.service.ts:24</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code>Promise&lt;void&gt;</code>
</div>
</td>
@@ -377,28 +662,28 @@
<tbody>
<tr>
<td class="col-md-4">
<a name="LoadEvent"></a>
<a name="load"></a>
<span class="name">
<b>
LoadEvent</b>
<a href="#LoadEvent"><span class="icon ion-ios-link"></span></a>
load</b>
<a href="#load"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code>EventEmitter&lt;number&gt;</code>
<i>Type : </i> <code>BehaviorSubject&lt;any&gt;</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Default value : </i><code>new EventEmitter&lt;number&gt;()</code>
<i>Default value : </i><code>new BehaviorSubject&lt;any&gt;(false)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="15" class="link-to-prism">src/app/_services/token.service.ts:15</a></div>
<div class="io-line">Defined in <a href="" data-line="20" class="link-to-prism">src/app/_services/token.service.ts:20</a></div>
</td>
</tr>
@@ -457,6 +742,105 @@
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="tokens"></a>
<span class="name">
<b>
tokens</b>
<a href="#tokens"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code><a href="../interfaces/Token.html" target="_self" >Array&lt;Token&gt;</a></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Default value : </i><code>[]</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="15" class="link-to-prism">src/app/_services/token.service.ts:15</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="tokensList"></a>
<span class="name">
<b>
<span class="modifier">Private</span>
tokensList</b>
<a href="#tokensList"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code><a href="../interfaces/Token.html" target="_self" >BehaviorSubject&lt;Array&lt;Token&gt;&gt;</a></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Default value : </i><code>new BehaviorSubject&lt;Array&lt;Token&gt;&gt;(
this.tokens
)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="16" class="link-to-prism">src/app/_services/token.service.ts:16</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="tokensSubject"></a>
<span class="name">
<b>
tokensSubject</b>
<a href="#tokensSubject"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code><a href="../interfaces/Token.html" target="_self" >Observable&lt;Array&lt;Token&gt;&gt;</a></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Default value : </i><code>this.tokensList.asObservable()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="19" class="link-to-prism">src/app/_services/token.service.ts:19</a></div>
</td>
</tr>
</tbody>
</table>
</section>
@@ -465,13 +849,13 @@
<div class="tab-pane fade tab-source-code" id="c-source">
<pre class="line-numbers compodoc-sourcecode"><code class="language-typescript">import { EventEmitter, Injectable } from &#x27;@angular/core&#x27;;
import { environment } from &#x27;@src/environments/environment&#x27;;
import { BehaviorSubject, Observable } from &#x27;rxjs&#x27;;
import { CICRegistry } from &#x27;cic-client&#x27;;
<pre class="line-numbers compodoc-sourcecode"><code class="language-typescript">import { Injectable } from &#x27;@angular/core&#x27;;
import { CICRegistry } from &#x27;@cicnet/cic-client&#x27;;
import { TokenRegistry } from &#x27;@app/_eth&#x27;;
import { HttpClient } from &#x27;@angular/common/http&#x27;;
import { RegistryService } from &#x27;@app/_services/registry.service&#x27;;
import { Token } from &#x27;@app/_models&#x27;;
import { BehaviorSubject, Observable, Subject } from &#x27;rxjs&#x27;;
@Injectable({
providedIn: &#x27;root&#x27;,
@@ -479,31 +863,77 @@ import { RegistryService } from &#x27;@app/_services/registry.service&#x27;;
export class TokenService {
registry: CICRegistry;
tokenRegistry: TokenRegistry;
LoadEvent: EventEmitter&lt;number&gt; &#x3D; new EventEmitter&lt;number&gt;();
tokens: Array&lt;Token&gt; &#x3D; [];
private tokensList: BehaviorSubject&lt;Array&lt;Token&gt;&gt; &#x3D; new BehaviorSubject&lt;Array&lt;Token&gt;&gt;(
this.tokens
);
tokensSubject: Observable&lt;Array&lt;Token&gt;&gt; &#x3D; this.tokensList.asObservable();
load: BehaviorSubject&lt;any&gt; &#x3D; new BehaviorSubject&lt;any&gt;(false);
constructor(private httpClient: HttpClient, private registryService: RegistryService) {
this.registry &#x3D; registryService.getRegistry();
this.registry.load();
this.registry.onload &#x3D; async (address: string): Promise&lt;void&gt; &#x3D;&gt; {
this.tokenRegistry &#x3D; new TokenRegistry(
await this.registry.getContractAddressByName(&#x27;TokenRegistry&#x27;)
);
this.LoadEvent.next(Date.now());
};
constructor(private httpClient: HttpClient) {}
async init(): Promise&lt;void&gt; {
this.registry &#x3D; await RegistryService.getRegistry();
this.tokenRegistry &#x3D; new TokenRegistry(
await this.registry.getContractAddressByName(&#x27;TokenRegistry&#x27;)
);
this.load.next(true);
}
async getTokens(): Promise&lt;Array&lt;Promise&lt;string&gt;&gt;&gt; {
addToken(token: Token): void {
const savedIndex &#x3D; this.tokens.findIndex((tk) &#x3D;&gt; tk.address &#x3D;&#x3D;&#x3D; token.address);
if (savedIndex &#x3D;&#x3D;&#x3D; 0) {
return;
}
if (savedIndex &gt; 0) {
this.tokens.splice(savedIndex, 1);
}
this.tokens.unshift(token);
this.tokensList.next(this.tokens);
}
async getTokens(): Promise&lt;void&gt; {
const count: number &#x3D; await this.tokenRegistry.totalTokens();
return Array.from({ length: count }, async (v, i) &#x3D;&gt; await this.tokenRegistry.entry(i));
for (let i &#x3D; 0; i &lt; count; i++) {
const token: Token &#x3D; await this.getTokenByAddress(await this.tokenRegistry.entry(i));
this.addToken(token);
}
}
getTokenBySymbol(symbol: string): Observable&lt;any&gt; {
return this.httpClient.get(&#x60;${environment.cicCacheUrl}/tokens/${symbol}&#x60;);
async getTokenByAddress(address: string): Promise&lt;Token&gt; {
const token: any &#x3D; {};
const tokenContract &#x3D; await this.registry.addToken(address);
token.address &#x3D; address;
token.name &#x3D; await tokenContract.methods.name().call();
token.symbol &#x3D; await tokenContract.methods.symbol().call();
token.supply &#x3D; await tokenContract.methods.totalSupply().call();
token.decimals &#x3D; await tokenContract.methods.decimals().call();
return token;
}
async getTokenBalance(address: string): Promise&lt;number&gt; {
const sarafuToken &#x3D; await this.registry.addToken(await this.tokenRegistry.entry(0));
return await sarafuToken.methods.balanceOf(address).call();
async getTokenBySymbol(symbol: string): Promise&lt;Observable&lt;Token&gt;&gt; {
const tokenSubject: Subject&lt;Token&gt; &#x3D; new Subject&lt;Token&gt;();
await this.getTokens();
this.tokensSubject.subscribe((tokens) &#x3D;&gt; {
const queriedToken &#x3D; tokens.find((token) &#x3D;&gt; token.symbol &#x3D;&#x3D;&#x3D; symbol);
tokenSubject.next(queriedToken);
});
return tokenSubject.asObservable();
}
async getTokenBalance(address: string): Promise&lt;(address: string) &#x3D;&gt; Promise&lt;number&gt;&gt; {
const token &#x3D; await this.registry.addToken(await this.tokenRegistry.entry(0));
return await token.methods.balanceOf(address).call();
}
async getTokenName(): Promise&lt;string&gt; {
const token &#x3D; await this.registry.addToken(await this.tokenRegistry.entry(0));
return await token.methods.name().call();
}
async getTokenSymbol(): Promise&lt;string&gt; {
const token &#x3D; await this.registry.addToken(await this.tokenRegistry.entry(0));
return await token.methods.symbol().call();
}
}
</code></pre>

View File

@@ -117,6 +117,10 @@
<li>
<a href="#getAllTransactions">getAllTransactions</a>
</li>
<li>
<span class="modifier">Async</span>
<a href="#init">init</a>
</li>
<li>
<a href="#resetTransactionsList">resetTransactionsList</a>
</li>
@@ -150,12 +154,12 @@
<tbody>
<tr>
<td class="col-md-4">
<code>constructor(httpClient: <a href="https://angular.io/api/common/http/HttpClient" target="_blank">HttpClient</a>, authService: <a href="../injectables/AuthService.html">AuthService</a>, userService: <a href="../injectables/UserService.html">UserService</a>, loggingService: <a href="../injectables/LoggingService.html">LoggingService</a>, registryService: <a href="../injectables/RegistryService.html">RegistryService</a>)</code>
<code>constructor(httpClient: <a href="https://angular.io/api/common/http/HttpClient" target="_blank">HttpClient</a>, authService: <a href="../injectables/AuthService.html">AuthService</a>, userService: <a href="../injectables/UserService.html">UserService</a>, loggingService: <a href="../injectables/LoggingService.html">LoggingService</a>)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="31" class="link-to-prism">src/app/_services/transaction.service.ts:31</a></div>
<div class="io-line">Defined in <a href="" data-line="32" class="link-to-prism">src/app/_services/transaction.service.ts:32</a></div>
</td>
</tr>
@@ -220,18 +224,6 @@
</td>
</tr>
<tr>
<td>registryService</td>
<td>
<code><a href="../injectables/RegistryService.html" target="_self" >RegistryService</a></code>
</td>
<td>
No
</td>
</tr>
</tbody>
</table>
</div>
@@ -268,8 +260,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="111"
class="link-to-prism">src/app/_services/transaction.service.ts:111</a></div>
<div class="io-line">Defined in <a href="" data-line="118"
class="link-to-prism">src/app/_services/transaction.service.ts:118</a></div>
</td>
</tr>
@@ -342,15 +334,15 @@
</tr>
<tr>
<td class="col-md-4">
<code>getAccountInfo(account: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/string" target="_blank">string</a>)</code>
<code>getAccountInfo(account: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/string" target="_blank">string</a>, cacheSize: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/number" target="_blank">number</a>)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="124"
class="link-to-prism">src/app/_services/transaction.service.ts:124</a></div>
<div class="io-line">Defined in <a href="" data-line="138"
class="link-to-prism">src/app/_services/transaction.service.ts:138</a></div>
</td>
</tr>
@@ -366,6 +358,7 @@
<td>Name</td>
<td>Type</td>
<td>Optional</td>
<td>Default value</td>
</tr>
</thead>
<tbody>
@@ -379,6 +372,23 @@
No
</td>
<td>
</td>
</tr>
<tr>
<td>cacheSize</td>
<td>
<code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/number" target="_blank" >number</a></code>
</td>
<td>
No
</td>
<td>
<code>100</code>
</td>
</tr>
</tbody>
@@ -419,8 +429,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="49"
class="link-to-prism">src/app/_services/transaction.service.ts:49</a></div>
<div class="io-line">Defined in <a href="" data-line="53"
class="link-to-prism">src/app/_services/transaction.service.ts:53</a></div>
</td>
</tr>
@@ -513,8 +523,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="45"
class="link-to-prism">src/app/_services/transaction.service.ts:45</a></div>
<div class="io-line">Defined in <a href="" data-line="49"
class="link-to-prism">src/app/_services/transaction.service.ts:49</a></div>
</td>
</tr>
@@ -573,6 +583,47 @@
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="init"></a>
<span class="name">
<b>
<span class="modifier">Async</span>
init
</b>
<a href="#init"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>init()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="43"
class="link-to-prism">src/app/_services/transaction.service.ts:43</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code>Promise&lt;void&gt;</code>
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
@@ -595,8 +646,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="119"
class="link-to-prism">src/app/_services/transaction.service.ts:119</a></div>
<div class="io-line">Defined in <a href="" data-line="133"
class="link-to-prism">src/app/_services/transaction.service.ts:133</a></div>
</td>
</tr>
@@ -636,8 +687,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="87"
class="link-to-prism">src/app/_services/transaction.service.ts:87</a></div>
<div class="io-line">Defined in <a href="" data-line="93"
class="link-to-prism">src/app/_services/transaction.service.ts:93</a></div>
</td>
</tr>
@@ -713,8 +764,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="53"
class="link-to-prism">src/app/_services/transaction.service.ts:53</a></div>
<div class="io-line">Defined in <a href="" data-line="57"
class="link-to-prism">src/app/_services/transaction.service.ts:57</a></div>
</td>
</tr>
@@ -796,8 +847,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="130"
class="link-to-prism">src/app/_services/transaction.service.ts:130</a></div>
<div class="io-line">Defined in <a href="" data-line="145"
class="link-to-prism">src/app/_services/transaction.service.ts:145</a></div>
</td>
</tr>
@@ -906,7 +957,7 @@
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="31" class="link-to-prism">src/app/_services/transaction.service.ts:31</a></div>
<div class="io-line">Defined in <a href="" data-line="32" class="link-to-prism">src/app/_services/transaction.service.ts:32</a></div>
</td>
</tr>
@@ -933,7 +984,7 @@
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="27" class="link-to-prism">src/app/_services/transaction.service.ts:27</a></div>
<div class="io-line">Defined in <a href="" data-line="28" class="link-to-prism">src/app/_services/transaction.service.ts:28</a></div>
</td>
</tr>
@@ -965,7 +1016,7 @@
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="26" class="link-to-prism">src/app/_services/transaction.service.ts:26</a></div>
<div class="io-line">Defined in <a href="" data-line="27" class="link-to-prism">src/app/_services/transaction.service.ts:27</a></div>
</td>
</tr>
@@ -991,7 +1042,7 @@
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="28" class="link-to-prism">src/app/_services/transaction.service.ts:28</a></div>
<div class="io-line">Defined in <a href="" data-line="29" class="link-to-prism">src/app/_services/transaction.service.ts:29</a></div>
</td>
</tr>
@@ -1018,7 +1069,7 @@
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="29" class="link-to-prism">src/app/_services/transaction.service.ts:29</a></div>
<div class="io-line">Defined in <a href="" data-line="30" class="link-to-prism">src/app/_services/transaction.service.ts:30</a></div>
</td>
</tr>
@@ -1045,7 +1096,7 @@
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="30" class="link-to-prism">src/app/_services/transaction.service.ts:30</a></div>
<div class="io-line">Defined in <a href="" data-line="31" class="link-to-prism">src/app/_services/transaction.service.ts:31</a></div>
</td>
</tr>
@@ -1074,9 +1125,10 @@ import { AuthService } from &#x27;@app/_services/auth.service&#x27;;
import { defaultAccount } from &#x27;@app/_models&#x27;;
import { LoggingService } from &#x27;@app/_services/logging.service&#x27;;
import { HttpClient } from &#x27;@angular/common/http&#x27;;
import { CICRegistry } from &#x27;cic-client&#x27;;
import { CICRegistry } from &#x27;@cicnet/cic-client&#x27;;
import { RegistryService } from &#x27;@app/_services/registry.service&#x27;;
import Web3 from &#x27;web3&#x27;;
import { Web3Service } from &#x27;@app/_services/web3.service&#x27;;
const vCard &#x3D; require(&#x27;vcard-parser&#x27;);
@Injectable({
@@ -1094,12 +1146,15 @@ export class TransactionService {
private httpClient: HttpClient,
private authService: AuthService,
private userService: UserService,
private loggingService: LoggingService,
private registryService: RegistryService
private loggingService: LoggingService
) {
this.web3 &#x3D; this.registryService.getWeb3();
this.registry &#x3D; registryService.getRegistry();
this.registry.load();
this.web3 &#x3D; Web3Service.getInstance();
}
async init(): Promise&lt;void&gt; {
await this.authService.init();
await this.userService.init();
this.registry &#x3D; await RegistryService.getRegistry();
}
getAllTransactions(offset: number, limit: number): Observable&lt;any&gt; {
@@ -1107,7 +1162,7 @@ export class TransactionService {
}
getAddressTransactions(address: string, offset: number, limit: number): Observable&lt;any&gt; {
return this.httpClient.get(&#x60;${environment.cicCacheUrl}/tx/${address}/${offset}/${limit}&#x60;);
return this.httpClient.get(&#x60;${environment.cicCacheUrl}/tx/user/${address}/${offset}/${limit}&#x60;);
}
async setTransaction(transaction, cacheSize: number): Promise&lt;void&gt; {
@@ -1122,10 +1177,11 @@ export class TransactionService {
.pipe(first())
.subscribe(
(res) &#x3D;&gt; {
transaction.sender &#x3D; this.getAccountInfo(res.body);
transaction.sender &#x3D; this.getAccountInfo(res, cacheSize);
},
(error) &#x3D;&gt; {
transaction.sender &#x3D; defaultAccount;
this.userService.addAccount(defaultAccount, cacheSize);
}
);
this.userService
@@ -1133,10 +1189,11 @@ export class TransactionService {
.pipe(first())
.subscribe(
(res) &#x3D;&gt; {
transaction.recipient &#x3D; this.getAccountInfo(res.body);
transaction.recipient &#x3D; this.getAccountInfo(res, cacheSize);
},
(error) &#x3D;&gt; {
transaction.recipient &#x3D; defaultAccount;
this.userService.addAccount(defaultAccount, cacheSize);
}
);
} finally {
@@ -1157,10 +1214,11 @@ export class TransactionService {
.pipe(first())
.subscribe(
(res) &#x3D;&gt; {
conversion.sender &#x3D; conversion.recipient &#x3D; this.getAccountInfo(res.body);
conversion.sender &#x3D; conversion.recipient &#x3D; this.getAccountInfo(res);
},
(error) &#x3D;&gt; {
conversion.sender &#x3D; conversion.recipient &#x3D; defaultAccount;
this.userService.addAccount(defaultAccount, cacheSize);
}
);
} finally {
@@ -1169,9 +1227,16 @@ export class TransactionService {
}
addTransaction(transaction, cacheSize: number): void {
const savedIndex &#x3D; this.transactions.findIndex((tx) &#x3D;&gt; tx.tx.txHash &#x3D;&#x3D;&#x3D; transaction.tx.txHash);
if (savedIndex &#x3D;&#x3D;&#x3D; 0) {
return;
}
if (savedIndex &gt; 0) {
this.transactions.splice(savedIndex, 1);
}
this.transactions.unshift(transaction);
if (this.transactions.length &gt; cacheSize) {
this.transactions.length &#x3D; cacheSize;
this.transactions.length &#x3D; Math.min(this.transactions.length, cacheSize);
}
this.transactionList.next(this.transactions);
}
@@ -1181,9 +1246,10 @@ export class TransactionService {
this.transactionList.next(this.transactions);
}
getAccountInfo(account: string): any {
getAccountInfo(account: string, cacheSize: number &#x3D; 100): any {
const accountInfo &#x3D; Envelope.fromJSON(JSON.stringify(account)).unwrap().m.data;
accountInfo.vcard &#x3D; vCard.parse(atob(accountInfo.vcard));
this.userService.addAccount(accountInfo, cacheSize);
return accountInfo;
}

View File

@@ -118,6 +118,9 @@
<tr>
<td class="col-md-4">
<ul class="index-list">
<li>
<a href="#addAccount">addAccount</a>
</li>
<li>
<a href="#approveAction">approveAction</a>
</li>
@@ -163,6 +166,10 @@
<li>
<a href="#getTransactionTypes">getTransactionTypes</a>
</li>
<li>
<span class="modifier">Async</span>
<a href="#init">init</a>
</li>
<li>
<span class="modifier">Async</span>
<a href="#loadAccounts">loadAccounts</a>
@@ -204,7 +211,7 @@
<tbody>
<tr>
<td class="col-md-4">
<code>constructor(httpClient: <a href="https://angular.io/api/common/http/HttpClient" target="_blank">HttpClient</a>, loggingService: <a href="../injectables/LoggingService.html">LoggingService</a>, tokenService: <a href="../injectables/TokenService.html">TokenService</a>, registryService: <a href="../injectables/RegistryService.html">RegistryService</a>, authService: <a href="../injectables/AuthService.html">AuthService</a>)</code>
<code>constructor(httpClient: <a href="https://angular.io/api/common/http/HttpClient" target="_blank">HttpClient</a>, loggingService: <a href="../injectables/LoggingService.html">LoggingService</a>, tokenService: <a href="../injectables/TokenService.html">TokenService</a>, authService: <a href="../injectables/AuthService.html">AuthService</a>)</code>
</td>
</tr>
<tr>
@@ -261,18 +268,6 @@
No
</td>
</tr>
<tr>
<td>registryService</td>
<td>
<code><a href="../injectables/RegistryService.html" target="_self" >RegistryService</a></code>
</td>
<td>
No
</td>
</tr>
<tr>
<td>authService</td>
@@ -300,6 +295,88 @@
<h3 id="methods">
Methods
</h3>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="addAccount"></a>
<span class="name">
<b>
addAccount
</b>
<a href="#addAccount"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<code>addAccount(account: <a href="../interfaces/AccountDetails.html">AccountDetails</a>, cacheSize: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/number" target="_blank">number</a>)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="266"
class="link-to-prism">src/app/_services/user.service.ts:266</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Parameters :</b>
<table class="params">
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Optional</td>
</tr>
</thead>
<tbody>
<tr>
<td>account</td>
<td>
<code><a href="../interfaces/AccountDetails.html" target="_self" >AccountDetails</a></code>
</td>
<td>
No
</td>
</tr>
<tr>
<td>cacheSize</td>
<td>
<code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/number" target="_blank" >number</a></code>
</td>
<td>
No
</td>
</tr>
</tbody>
</table>
</div>
<div>
</div>
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >void</a></code>
</div>
<div class="io-description">
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
@@ -586,8 +663,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="195"
class="link-to-prism">src/app/_services/user.service.ts:195</a></div>
<div class="io-line">Defined in <a href="" data-line="193"
class="link-to-prism">src/app/_services/user.service.ts:193</a></div>
</td>
</tr>
@@ -676,8 +753,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="221"
class="link-to-prism">src/app/_services/user.service.ts:221</a></div>
<div class="io-line">Defined in <a href="" data-line="219"
class="link-to-prism">src/app/_services/user.service.ts:219</a></div>
</td>
</tr>
@@ -904,8 +981,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="256"
class="link-to-prism">src/app/_services/user.service.ts:256</a></div>
<div class="io-line">Defined in <a href="" data-line="254"
class="link-to-prism">src/app/_services/user.service.ts:254</a></div>
</td>
</tr>
@@ -1052,8 +1129,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="248"
class="link-to-prism">src/app/_services/user.service.ts:248</a></div>
<div class="io-line">Defined in <a href="" data-line="246"
class="link-to-prism">src/app/_services/user.service.ts:246</a></div>
</td>
</tr>
@@ -1091,8 +1168,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="252"
class="link-to-prism">src/app/_services/user.service.ts:252</a></div>
<div class="io-line">Defined in <a href="" data-line="250"
class="link-to-prism">src/app/_services/user.service.ts:250</a></div>
</td>
</tr>
@@ -1161,8 +1238,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="264"
class="link-to-prism">src/app/_services/user.service.ts:264</a></div>
<div class="io-line">Defined in <a href="" data-line="262"
class="link-to-prism">src/app/_services/user.service.ts:262</a></div>
</td>
</tr>
@@ -1282,8 +1359,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="260"
class="link-to-prism">src/app/_services/user.service.ts:260</a></div>
<div class="io-line">Defined in <a href="" data-line="258"
class="link-to-prism">src/app/_services/user.service.ts:258</a></div>
</td>
</tr>
@@ -1299,6 +1376,47 @@
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="init"></a>
<span class="name">
<b>
<span class="modifier">Async</span>
init
</b>
<a href="#init"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>init()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="45"
class="link-to-prism">src/app/_services/user.service.ts:45</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code>Promise&lt;void&gt;</code>
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
@@ -1412,8 +1530,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="239"
class="link-to-prism">src/app/_services/user.service.ts:239</a></div>
<div class="io-line">Defined in <a href="" data-line="237"
class="link-to-prism">src/app/_services/user.service.ts:237</a></div>
</td>
</tr>
@@ -1591,8 +1709,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="244"
class="link-to-prism">src/app/_services/user.service.ts:244</a></div>
<div class="io-line">Defined in <a href="" data-line="242"
class="link-to-prism">src/app/_services/user.service.ts:242</a></div>
</td>
</tr>
@@ -2150,7 +2268,7 @@ import { TokenService } from &#x27;@app/_services/token.service&#x27;;
import { AccountIndex } from &#x27;@app/_eth&#x27;;
import { MutableKeyStore, PGPSigner, Signer } from &#x27;@app/_pgp&#x27;;
import { RegistryService } from &#x27;@app/_services/registry.service&#x27;;
import { CICRegistry } from &#x27;cic-client&#x27;;
import { CICRegistry } from &#x27;@cicnet/cic-client&#x27;;
import { AuthService } from &#x27;@app/_services/auth.service&#x27;;
import { personValidation, vcardValidation } from &#x27;@app/_helpers&#x27;;
import { add0x } from &#x27;@src/assets/js/ethtx/dist/hex&#x27;;
@@ -2179,20 +2297,20 @@ export class UserService {
private httpClient: HttpClient,
private loggingService: LoggingService,
private tokenService: TokenService,
private registryService: RegistryService,
private authService: AuthService
) {
this.authService.init().then(() &#x3D;&gt; {
this.keystore &#x3D; authService.mutableKeyStore;
this.signer &#x3D; new PGPSigner(this.keystore);
});
this.registry &#x3D; registryService.getRegistry();
this.registry.load();
) {}
async init(): Promise&lt;void&gt; {
await this.authService.init();
await this.tokenService.init();
this.keystore &#x3D; this.authService.mutableKeyStore;
this.signer &#x3D; new PGPSigner(this.keystore);
this.registry &#x3D; await RegistryService.getRegistry();
}
resetPin(phone: string): Observable&lt;any&gt; {
const params: HttpParams &#x3D; new HttpParams().set(&#x27;phoneNumber&#x27;, phone);
return this.httpClient.get(&#x60;${environment.cicUssdUrl}/pin&#x60;, { params });
return this.httpClient.put(&#x60;${environment.cicUssdUrl}/pin&#x60;, { params });
}
getAccountStatus(phone: string): Observable&lt;any&gt; {
@@ -2323,9 +2441,7 @@ export class UserService {
&#x27;AccountRegistry&#x27;
);
const accountIndexQuery &#x3D; new AccountIndex(accountIndexAddress);
const accountAddresses: Array&lt;string&gt; &#x3D; await accountIndexQuery.last(
await accountIndexQuery.totalAccounts()
);
const accountAddresses: Array&lt;string&gt; &#x3D; await accountIndexQuery.last(limit);
this.loggingService.sendInfoLevelMessage(accountAddresses);
for (const accountAddress of accountAddresses.slice(offset, offset + limit)) {
await this.getAccountByAddress(accountAddress, limit);
@@ -2343,16 +2459,16 @@ export class UserService {
const account: Syncable &#x3D; Envelope.fromJSON(JSON.stringify(res)).unwrap();
const accountInfo &#x3D; account.m.data;
await personValidation(accountInfo);
accountInfo.balance &#x3D; await this.tokenService.getTokenBalance(
accountInfo.identities.evm[&#x60;bloxberg:${environment.bloxbergChainId}&#x60;][0]
);
this.tokenService.load.subscribe(async (status: boolean) &#x3D;&gt; {
if (status) {
accountInfo.balance &#x3D; await this.tokenService.getTokenBalance(
accountInfo.identities.evm[&#x60;bloxberg:${environment.bloxbergChainId}&#x60;][0]
);
}
});
accountInfo.vcard &#x3D; vCard.parse(atob(accountInfo.vcard));
await vcardValidation(accountInfo.vcard);
this.accounts.unshift(accountInfo);
if (this.accounts.length &gt; limit) {
this.accounts.length &#x3D; limit;
}
this.accountsList.next(this.accounts);
this.addAccount(accountInfo, limit);
accountSubject.next(accountInfo);
});
return accountSubject.asObservable();
@@ -2404,6 +2520,25 @@ export class UserService {
getGenders(): Observable&lt;any&gt; {
return this.httpClient.get(&#x60;${environment.cicMetaUrl}/genders&#x60;);
}
addAccount(account: AccountDetails, cacheSize: number): void {
const savedIndex &#x3D; this.accounts.findIndex(
(acc) &#x3D;&gt;
acc.identities.evm[&#x60;bloxberg:${environment.bloxbergChainId}&#x60;][0] &#x3D;&#x3D;&#x3D;
account.identities.evm[&#x60;bloxberg:${environment.bloxbergChainId}&#x60;][0]
);
if (savedIndex &#x3D;&#x3D;&#x3D; 0) {
return;
}
if (savedIndex &gt; 0) {
this.accounts.splice(savedIndex, 1);
}
this.accounts.unshift(account);
if (this.accounts.length &gt; cacheSize) {
this.accounts.length &#x3D; Math.min(this.accounts.length, cacheSize);
}
this.accountsList.next(this.accounts);
}
}
</code></pre>
</div>

View File

@@ -0,0 +1,300 @@
<!doctype html>
<html class="no-js" lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>CICADA</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="../images/favicon.ico">
<link rel="stylesheet" href="../styles/style.css">
</head>
<body>
<div class="navbar navbar-default navbar-fixed-top visible-xs">
<a href="../" class="navbar-brand">CICADA</a>
<button type="button" class="btn btn-default btn-menu ion-ios-menu" id="btn-menu"></button>
</div>
<div class="xs-menu menu" id="mobile-menu">
<div id="book-search-input" role="search"><input type="text" placeholder="Type to search"></div> <compodoc-menu></compodoc-menu>
</div>
<div class="container-fluid main">
<div class="row main">
<div class="hidden-xs menu">
<compodoc-menu mode="normal"></compodoc-menu>
</div>
<!-- START CONTENT -->
<div class="content injectable">
<div class="content-data">
<ol class="breadcrumb">
<li>Injectables</li>
<li>Web3Service</li>
</ol>
<ul class="nav nav-tabs" role="tablist">
<li class="active">
<a href="#info" role="tab" id="info-tab" data-toggle="tab" data-link="info">Info</a>
</li>
<li >
<a href="#source" role="tab" id="source-tab" data-toggle="tab" data-link="source">Source</a>
</li>
</ul>
<div class="tab-content">
<div class="tab-pane fade active in" id="c-info">
<p class="comment">
<h3>File</h3>
</p>
<p class="comment">
<code>src/app/_services/web3.service.ts</code>
</p>
<section>
<h3 id="index">Index</h3>
<table class="table table-sm table-bordered index-table">
<tbody>
<tr>
<td class="col-md-4">
<h6><b>Properties</b></h6>
</td>
</tr>
<tr>
<td class="col-md-4">
<ul class="index-list">
<li>
<span class="modifier">Private</span>
<span class="modifier">Static</span>
<a href="#web3">web3</a>
</li>
</ul>
</td>
</tr>
<tr>
<td class="col-md-4">
<h6><b>Methods</b></h6>
</td>
</tr>
<tr>
<td class="col-md-4">
<ul class="index-list">
<li>
<span class="modifier">Static</span>
<a href="#getInstance">getInstance</a>
</li>
</ul>
</td>
</tr>
</tbody>
</table>
</section>
<section>
<h3 id="constructor">Constructor</h3>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<code>constructor()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="9" class="link-to-prism">src/app/_services/web3.service.ts:9</a></div>
</td>
</tr>
</tbody>
</table>
</section>
<section>
<h3 id="methods">
Methods
</h3>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="getInstance"></a>
<span class="name">
<b>
<span class="modifier">Static</span>
getInstance
</b>
<a href="#getInstance"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>getInstance()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="13"
class="link-to-prism">src/app/_services/web3.service.ts:13</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code>Web3</code>
</div>
</td>
</tr>
</tbody>
</table>
</section>
<section>
<h3 id="inputs">
Properties
</h3>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="web3"></a>
<span class="name">
<b>
<span class="modifier">Private</span>
<span class="modifier">Static</span>
web3</b>
<a href="#web3"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code>Web3</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="9" class="link-to-prism">src/app/_services/web3.service.ts:9</a></div>
</td>
</tr>
</tbody>
</table>
</section>
</div>
<div class="tab-pane fade tab-source-code" id="c-source">
<pre class="line-numbers compodoc-sourcecode"><code class="language-typescript">import { Injectable } from &#x27;@angular/core&#x27;;
import Web3 from &#x27;web3&#x27;;
import { environment } from &#x27;@src/environments/environment&#x27;;
@Injectable({
providedIn: &#x27;root&#x27;,
})
export class Web3Service {
private static web3: Web3;
constructor() {}
public static getInstance(): Web3 {
if (!Web3Service.web3) {
Web3Service.web3 &#x3D; new Web3(environment.web3Provider);
}
return Web3Service.web3;
}
}
</code></pre>
</div>
</div>
</div><div class="search-results">
<div class="has-results">
<h1 class="search-results-title"><span class='search-results-count'></span> result-matching "<span class='search-query'></span>"</h1>
<ul class="search-results-list"></ul>
</div>
<div class="no-results">
<h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
</div>
</div>
</div>
<!-- END CONTENT -->
</div>
</div>
<script>
var COMPODOC_CURRENT_PAGE_DEPTH = 1;
var COMPODOC_CURRENT_PAGE_CONTEXT = 'injectable';
var COMPODOC_CURRENT_PAGE_URL = 'Web3Service.html';
var MAX_SEARCH_RESULTS = 15;
</script>
<script src="../js/libs/custom-elements.min.js"></script>
<script src="../js/libs/lit-html.js"></script>
<!-- Required to polyfill modern browsers as code is ES5 for IE... -->
<script src="../js/libs/custom-elements-es5-adapter.js" charset="utf-8" defer></script>
<script src="../js/menu-wc.js" defer></script>
<script src="../js/libs/bootstrap-native.js"></script>
<script src="../js/libs/es6-shim.min.js"></script>
<script src="../js/libs/EventDispatcher.js"></script>
<script src="../js/libs/promise.min.js"></script>
<script src="../js/libs/zepto.min.js"></script>
<script src="../js/compodoc.js"></script>
<script src="../js/tabs.js"></script>
<script src="../js/menu.js"></script>
<script src="../js/libs/clipboard.min.js"></script>
<script src="../js/libs/prism.js"></script>
<script src="../js/sourceCode.js"></script>
<script src="../js/search/search.js"></script>
<script src="../js/search/lunr.min.js"></script>
<script src="../js/search/search-lunr.js"></script>
<script src="../js/search/search_index.js"></script>
<script src="../js/lazy-load-graphs.js"></script>
</body>
</html>