0xweb
Version:
Contract package manager and other web3 tools
72 lines (59 loc) • 2.17 kB
text/typescript
import { JsonArrayStore } from '@dequanto/json/JsonArrayStore';
import { IToken } from '@dequanto/models/IToken';
import { ITokenGlob } from '@dequanto/models/ITokenGlob';
import { TPlatform } from '@dequanto/models/TPlatform';
import { TokenUtils } from '../utils/TokenUtils';
import { ITokenProvider } from './ITokenProvider';
import { ATokenProvider } from './ATokenProvider';
import { $path } from '@dequanto/utils/$path';
import { $http } from '@dequanto/utils/$http';
export class TPOneInch extends ATokenProvider implements ITokenProvider {
store = new JsonArrayStore<ITokenGlob> ({
path: $path.resolve('/data/tokens/1inch.json'),
key: x => x.symbol,
format: true,
});
getTokens(): Promise<ITokenGlob[]> {
return this.store.getAll();
}
async redownloadTokens () {
let tokensByPlatform = await Promise.all([
this.downloadForPlatform('eth'),
this.downloadForPlatform('bsc'),
this.downloadForPlatform('polygon'),
]);
let globals = TokenUtils.merge(...tokensByPlatform);
await this.store.saveAll(globals);
return globals;
}
private async downloadForPlatform(platform: TPlatform) {
let url: string;
switch (platform) {
case 'eth':
url = `https://api.1inch.exchange/v3.0/1/tokens`;
break;
case 'bsc':
url = `https://api.1inch.exchange/v3.0/56/tokens`;
break;
case 'polygon':
url = `https://api.1inch.exchange/v3.0/137/tokens`;
break;
default:
throw new Error(`Invalid Platform ${platform}`)
}
let resp = await $http.get(url);
let hash = resp.data.tokens;
let arr = Object.keys(hash).map(key => {
let t = hash[key];
return <IToken> {
symbol: t.symbol,
name: t.name,
decimals: t.decimals,
logo: t.logoURI,
platform: platform,
address: t.address,
}
});
return arr;
}
}