Skip to content

Commit 1060cef

Browse files
committed
Poll services token balance directly in UserDepositService
1 parent 797f8ce commit 1060cef

3 files changed

Lines changed: 66 additions & 31 deletions

File tree

src/app/services/token-info-retriever.service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ export class TokenInfoRetrieverService {
3737
async createBatch(
3838
tokenAddresses: string[],
3939
raidenAddress: string,
40-
userTokens: { [address: string]: UserToken | null }
40+
userTokens: { [address: string]: UserToken | null } = {}
4141
): Promise<{ [address: string]: UserToken }> {
4242
const batchManager = this.batchManagerFactory.create(
4343
this.raidenConfig.web3.currentProvider

src/app/services/user-deposit.service.spec.ts

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,19 @@ import { ContractOptions } from 'web3-eth-contract/types';
1717
import { AbiItem } from 'web3-utils/types';
1818
import Spy = jasmine.Spy;
1919
import { TokenInfoRetrieverService } from './token-info-retriever.service';
20+
import { UserToken } from '../models/usertoken';
2021

2122
describe('UserDepositService', () => {
2223
let service: UserDepositService;
2324
let reconnectedSubject: BehaviorSubject<void>;
2425
let rpcConnectedSubject: Subject<void>;
25-
let tokenResult: Promise<string>;
26+
let tokenAddressResult: Promise<string>;
2627
let balanceResult: Promise<string>;
28+
let tokenBalanceResult: Promise<string>;
2729
let tokenRetrieverSpy: Spy;
2830

2931
const balance = '40000000';
30-
const token = createToken();
32+
let token: UserToken;
3133

3234
beforeEach(() => {
3335
const raidenServiceMock = stub<RaidenService>();
@@ -54,31 +56,47 @@ describe('UserDepositService', () => {
5456
});
5557
const raidenConfig = TestBed.inject(RaidenConfig);
5658

57-
tokenResult = Promise.resolve(token.address);
59+
token = createToken();
60+
tokenAddressResult = Promise.resolve(token.address);
5861
balanceResult = Promise.resolve(balance);
62+
tokenBalanceResult = Promise.resolve(token.balance.toString());
5963

6064
// @ts-ignore
6165
raidenConfig.web3.eth.Contract = function (
62-
jsonInterface: AbiItem[] | AbiItem,
66+
jsonInterface: AbiItem[],
6367
address?: string,
6468
options?: ContractOptions
6569
) {
66-
return {
70+
const contractMock = {
6771
address: address,
6872
options: {},
69-
methods: {
73+
methods: {},
74+
};
75+
if (
76+
jsonInterface.find((item: AbiItem) => item.name === 'balanceOf')
77+
) {
78+
contractMock.methods = {
79+
balanceOf: () => {
80+
return {
81+
call: () => tokenBalanceResult,
82+
};
83+
},
84+
};
85+
} else {
86+
contractMock.methods = {
7087
token: () => {
7188
return {
72-
call: () => tokenResult,
89+
call: () => tokenAddressResult,
7390
};
7491
},
7592
balances: () => {
7693
return {
7794
call: () => balanceResult,
7895
};
7996
},
80-
},
81-
};
97+
};
98+
}
99+
return contractMock;
82100
};
83101

84102
tokenRetrieverSpy = spyOn(
@@ -123,13 +141,17 @@ describe('UserDepositService', () => {
123141
tokenRetrieverSpy.and.returnValue(
124142
Promise.resolve({ [token.address]: token })
125143
);
144+
tokenBalanceResult = Promise.resolve('999999');
145+
const tokenWithFetchedBalance = Object.assign({}, token, {
146+
balance: new BigNumber('999999'),
147+
});
126148

127149
const spy = jasmine.createSpy();
128150
const subscription = service.servicesToken$.subscribe(spy);
129151

130152
tick(15000);
131153
expect(spy).toHaveBeenCalledTimes(2);
132-
expect(spy).toHaveBeenCalledWith(token);
154+
expect(spy).toHaveBeenCalledWith(tokenWithFetchedBalance);
133155
flush();
134156
subscription.unsubscribe();
135157
}));
@@ -140,10 +162,10 @@ describe('UserDepositService', () => {
140162
);
141163

142164
const spy = jasmine.createSpy();
143-
tokenResult = Promise.reject();
165+
tokenAddressResult = Promise.reject();
144166
const subscription = service.servicesToken$.subscribe(spy);
145167

146-
tokenResult = Promise.resolve(token.address);
168+
tokenAddressResult = Promise.resolve(token.address);
147169
rpcConnectedSubject.next();
148170

149171
tick();

src/app/services/user-deposit.service.ts

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Injectable } from '@angular/core';
22
import { RaidenService } from './raiden.service';
33
import { TokenInfoRetrieverService } from './token-info-retriever.service';
4-
import { Observable, zip, interval } from 'rxjs';
4+
import { Observable, zip, interval, of } from 'rxjs';
55
import { UserToken } from '../models/usertoken';
66
import {
77
switchMap,
@@ -10,14 +10,14 @@ import {
1010
startWith,
1111
retryWhen,
1212
switchMapTo,
13-
tap,
1413
} from 'rxjs/operators';
1514
import { backoff } from '../shared/backoff.operator';
1615
import { RaidenConfig } from './raiden.config';
1716
import { userDepositAbi } from '../models/userDepositAbi';
1817
import { fromPromise } from 'rxjs/internal-compatibility';
1918
import BigNumber from 'bignumber.js';
2019
import { Contract } from 'web3-eth-contract';
20+
import { tokenabi } from '../models/tokenabi';
2121

2222
@Injectable({
2323
providedIn: 'root',
@@ -26,8 +26,6 @@ export class UserDepositService {
2626
readonly balance$: Observable<BigNumber>;
2727
readonly servicesToken$: Observable<UserToken>;
2828

29-
private servicesToken: UserToken;
30-
3129
constructor(
3230
private raidenService: RaidenService,
3331
private tokenInfoRetriever: TokenInfoRetrieverService,
@@ -87,32 +85,47 @@ export class UserDepositService {
8785
const servicesTokenAddress$ = userDepositContract$.pipe(
8886
switchMap((userDepositContract) =>
8987
fromPromise<string>(userDepositContract.methods.token().call())
90-
),
91-
tap(() => {
92-
this.servicesToken = undefined;
93-
}),
94-
retryWhen((errors) =>
95-
errors.pipe(switchMapTo(this.raidenService.rpcConnected$))
96-
),
97-
shareReplay(1)
88+
)
9889
);
9990

100-
const fetchTokenInfo$ = zip(
91+
const servicesTokenInfo$ = zip(
10192
this.raidenService.raidenAddress$,
10293
servicesTokenAddress$
10394
).pipe(
10495
switchMap(([raidenAddress, tokenAddress]) =>
10596
fromPromise(
10697
this.tokenInfoRetriever.createBatch(
10798
[tokenAddress],
108-
raidenAddress,
109-
{ [tokenAddress]: this.servicesToken }
99+
raidenAddress
110100
)
111101
)
112102
),
113103
map((result) => Object.values(result)[0]),
114-
tap((token) => {
115-
this.servicesToken = token;
104+
retryWhen((errors) =>
105+
errors.pipe(switchMapTo(this.raidenService.rpcConnected$))
106+
),
107+
shareReplay(1)
108+
);
109+
110+
const fetchTokenBalance$ = zip(
111+
this.raidenService.raidenAddress$,
112+
servicesTokenInfo$
113+
).pipe(
114+
switchMap(([raidenAddress, servicesTokenInfo]) => {
115+
const tokenContract = new this.raidenConfig.web3.eth.Contract(
116+
tokenabi,
117+
servicesTokenInfo.address
118+
);
119+
return zip(
120+
of(servicesTokenInfo),
121+
fromPromise<string>(
122+
tokenContract.methods.balanceOf(raidenAddress).call()
123+
)
124+
);
125+
}),
126+
map(([servicesTokenInfo, balance]) => {
127+
servicesTokenInfo.balance = new BigNumber(balance);
128+
return servicesTokenInfo;
116129
}),
117130
retryWhen((errors) =>
118131
errors.pipe(switchMapTo(this.raidenService.rpcConnected$))
@@ -121,7 +134,7 @@ export class UserDepositService {
121134

122135
return interval(15000).pipe(
123136
startWith(0),
124-
switchMapTo(fetchTokenInfo$),
137+
switchMapTo(fetchTokenBalance$),
125138
shareReplay({ bufferSize: 1, refCount: true })
126139
);
127140
}

0 commit comments

Comments
 (0)