@unilogin/sdk
Version:
SDK is a JS library, that communicates with relayer. SDK allows managing contract, by creating basic contract-calling messages.
56 lines (47 loc) • 1.8 kB
text/typescript
import deepEqual from 'deep-equal';
import clonedeep from 'lodash.clonedeep';
import {BalanceChecker, TokenDetailsWithBalance} from '@unilogin/commons';
import ObserverRunner from './ObserverRunner';
import {TokensDetailsStore} from '../services/TokensDetailsStore';
export type OnBalanceChange = (data: TokenDetailsWithBalance[]) => void;
export class BalanceObserver extends ObserverRunner {
private lastTokenBalances: TokenDetailsWithBalance[] = [];
private callbacks: OnBalanceChange[] = [];
constructor(private balanceChecker: BalanceChecker, private walletAddress: string, private tokenDetailsStore: TokensDetailsStore, tick: number) {
super();
this.tick = tick;
}
async execute() {
await this.checkBalanceNow();
}
async getBalances() {
const tokenBalances: TokenDetailsWithBalance[] = [];
for (const token of this.tokenDetailsStore.tokensDetails) {
const balance = await this.balanceChecker.getBalance(this.walletAddress, token.address);
tokenBalances.push({...token, balance});
}
return tokenBalances;
}
async checkBalanceNow() {
const newTokenBalances = await this.getBalances();
if (!deepEqual(this.lastTokenBalances, newTokenBalances)) {
this.lastTokenBalances = clonedeep(newTokenBalances);
this.callbacks.forEach((callback) => callback(this.lastTokenBalances));
}
}
subscribe(callback: OnBalanceChange) {
this.callbacks.push(callback);
if (this.isStopped()) {
this.start();
}
callback(this.lastTokenBalances);
const unsubscribe = () => {
this.callbacks = this.callbacks.filter((element) => callback !== element);
if (this.callbacks.length === 0) {
this.stop();
this.lastTokenBalances = [];
}
};
return unsubscribe;
}
}