import { Injectable } from '@angular/core'; import { CICRegistry } from 'cic-client'; import { TokenRegistry } from '@app/_eth'; import { HttpClient } from '@angular/common/http'; import { RegistryService } from '@app/_services/registry.service'; import { Token } from '@app/_models'; import { BehaviorSubject, Observable, Subject } from 'rxjs'; @Injectable({ providedIn: 'root', }) export class TokenService { registry: CICRegistry; tokenRegistry: TokenRegistry; onload: (status: boolean) => void; tokens: Array = []; private tokensList: BehaviorSubject> = new BehaviorSubject>( this.tokens ); tokensSubject: Observable> = this.tokensList.asObservable(); constructor(private httpClient: HttpClient) {} async init(): Promise { this.registry = await RegistryService.getRegistry(); this.registry.onload = async (address: string): Promise => { this.tokenRegistry = new TokenRegistry( await this.registry.getContractAddressByName('TokenRegistry') ); this.onload(this.tokenRegistry !== undefined); }; } addToken(token: Token): void { const savedIndex = this.tokens.findIndex((tk) => tk.address === token.address); if (savedIndex === 0) { return; } if (savedIndex > 0) { this.tokens.splice(savedIndex, 1); } this.tokens.unshift(token); this.tokensList.next(this.tokens); } async getTokens(): Promise { const count: number = await this.tokenRegistry.totalTokens(); for (let i = 0; i < count; i++) { const token: Token = await this.getTokenByAddress(await this.tokenRegistry.entry(i)); this.addToken(token); } } async getTokenByAddress(address: string): Promise { const token: any = {}; const tokenContract = await this.registry.addToken(address); token.address = address; token.name = await tokenContract.methods.name().call(); token.symbol = await tokenContract.methods.symbol().call(); token.supply = await tokenContract.methods.totalSupply().call(); token.decimals = await tokenContract.methods.decimals().call(); return token; } async getTokenBySymbol(symbol: string): Promise> { const tokenSubject: Subject = new Subject(); await this.getTokens(); this.tokensSubject.subscribe((tokens) => { const queriedToken = tokens.find((token) => token.symbol === symbol); tokenSubject.next(queriedToken); }); return tokenSubject.asObservable(); } async getTokenBalance(address: string): Promise<(address: string) => Promise> { const sarafuToken = await this.registry.addToken(await this.tokenRegistry.entry(0)); return await sarafuToken.methods.balanceOf(address).call(); } }