Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add try/catch for assetsContract.getBalanceOf #328

Merged
merged 11 commits into from
Jan 22, 2021
8 changes: 7 additions & 1 deletion src/assets/TokenBalancesController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,13 @@ export class TokenBalancesController extends BaseController<TokenBalancesConfig,
const newContractBalances: { [address: string]: typeof BN } = {};
for (const i in tokens) {
const { address } = tokens[i];
newContractBalances[address] = await assetsContract.getBalanceOf(address, selectedAddress);
try {
newContractBalances[address] = await assetsContract.getBalanceOf(address, selectedAddress);
rickycodes marked this conversation as resolved.
Show resolved Hide resolved
tokens[i].balanceError = null;
} catch (error) {
newContractBalances[address] = 0;
tokens[i].balanceError = error;
}
}
this.update({ contractBalances: newContractBalances });
}
Expand Down
1 change: 1 addition & 0 deletions src/assets/TokenRatesController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ export interface Token {
decimals: number;
symbol: string;
image?: string;
balanceError?: Error | null;
}

/**
Expand Down
35 changes: 35 additions & 0 deletions tests/TokenBalancesController.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@ describe('TokenBalancesController', () => {
let tokenBalances: TokenBalancesController;
const sandbox = createSandbox();

const getToken = (address: string) => {
const { tokens } = tokenBalances.config;
return tokens.find((token) => token.address === address);
};

beforeEach(() => {
tokenBalances = new TokenBalancesController();
});
Expand Down Expand Up @@ -85,6 +90,36 @@ describe('TokenBalancesController', () => {
assetsContract.configure({ provider: MAINNET_PROVIDER });
stub(assetsContract, 'getBalanceOf').returns(new BN(1));
await tokenBalances.updateBalances();
const mytoken = getToken(address);
expect(mytoken?.balanceError).toBeNull();
expect(Object.keys(tokenBalances.state.contractBalances)).toContain(address);
expect(tokenBalances.state.contractBalances[address].toNumber()).toBeGreaterThan(0);
});

it('should handle `getBalanceOf` error case', async () => {
rickycodes marked this conversation as resolved.
Show resolved Hide resolved
const errorMsg = 'Failed to get balance';
const address = '0x86fa049857e0209aa7d9e616f7eb3b3b78ecfdb0';
expect(tokenBalances.state.contractBalances).toEqual({});
tokenBalances.configure({ tokens: [{ address, decimals: 18, symbol: 'EOS' }] });
const assets = new AssetsController();
const assetsContract = new AssetsContractController();
const network = new NetworkController();
const preferences = new PreferencesController();

new ComposableController([assets, assetsContract, network, preferences, tokenBalances]);
assetsContract.configure({ provider: MAINNET_PROVIDER });
const mock = stub(assetsContract, 'getBalanceOf').returns(Promise.reject(new Error(errorMsg)));
await tokenBalances.updateBalances();
const mytoken = getToken(address);
expect(mytoken?.balanceError).toBeInstanceOf(Error);
expect(mytoken?.balanceError?.message).toBe(errorMsg);
expect(tokenBalances.state.contractBalances[address]).toEqual(0);

// test reset case
mock.restore();
stub(assetsContract, 'getBalanceOf').returns(new BN(1));
await tokenBalances.updateBalances();
expect(mytoken?.balanceError).toBeNull();
expect(Object.keys(tokenBalances.state.contractBalances)).toContain(address);
expect(tokenBalances.state.contractBalances[address].toNumber()).toBeGreaterThan(0);
});
Expand Down