forked from snapshot-labs/snapshot-v1
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathuseTreasury.ts
59 lines (51 loc) · 1.74 KB
/
useTreasury.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import snapshot from '@snapshot-labs/snapshot.js';
import { getTokenBalances, ETHER_CONTRACT } from '@/helpers/covalent';
import { TreasuryAsset } from '@/helpers/interfaces';
const TOKEN_LIST_URL = 'https://gateway.ipfs.io/ipns/tokens.uniswap.org';
const tokenListContractAddresses = ref<null | string[]>(null);
const treasuryAssets = ref<{ [key: string]: TreasuryAsset[] }>({});
export function useTreasury() {
async function loadTokenList() {
if (tokenListContractAddresses.value) return;
const response = await snapshot.utils.getJSON(TOKEN_LIST_URL);
tokenListContractAddresses.value = [
ETHER_CONTRACT,
...response.tokens.map(token => token.address.toLowerCase())
];
}
const loading = ref(false);
async function loadFilteredTokenBalances(address: string, chainId: string) {
loading.value = true;
try {
await loadTokenList();
if (!tokenListContractAddresses.value)
throw new Error('Token list not found');
if (treasuryAssets.value[address]) return;
const balances = await getTokenBalances(address, chainId)
.then(
balances =>
balances?.filter(
balance =>
tokenListContractAddresses.value?.includes(
balance.contract_address
)
)
)
.catch(() => []);
if (balances) treasuryAssets.value[address] = balances;
} catch (error) {
console.error(error);
} finally {
loading.value = false;
}
}
function resetTreasuryAssets() {
treasuryAssets.value = {};
}
return {
loadFilteredTokenBalances,
resetTreasuryAssets,
treasuryAssets: computed(() => treasuryAssets.value),
loadingBalances: computed(() => loading.value)
};
}