forked from InjectiveLabs/injective-lists
-
Notifications
You must be signed in to change notification settings - Fork 0
/
fetchPeggyMetadata.ts
84 lines (70 loc) · 2.12 KB
/
fetchPeggyMetadata.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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import 'dotenv/config'
import { Network, isMainnet } from '@injectivelabs/networks'
import { Alchemy, Network as AlchemyNetwork } from 'alchemy-sdk'
import { TokenType, TokenVerification } from '@injectivelabs/token-metadata'
import {
readJSONFile,
updateJSONFile,
getNetworkFileName
} from './helper/utils'
import { untaggedSymbolMeta } from './data/untaggedSymbolMeta'
import { Token, AlchemyTokenSource } from './types'
const alchemyMainnet = new Alchemy({
apiKey: process.env.ALCHEMY_KEY,
network: AlchemyNetwork.ETH_MAINNET
})
const alchemySepolia = new Alchemy({
apiKey: process.env.ALCHEMY_SEPOLIA_KEY,
network: AlchemyNetwork.ETH_SEPOLIA
})
const formatAlchemyToken = (
denom: string,
token: AlchemyTokenSource
): Token => {
return {
...token,
denom,
coinGeckoId: untaggedSymbolMeta.Unknown.coinGeckoId,
logo: token.logo || untaggedSymbolMeta.Unknown.logo,
address: denom.replace('peggy', ''),
tokenType: TokenType.Erc20,
tokenVerification: TokenVerification.External
}
}
export const fetchPeggyTokenMetaData = async (
denom: string,
network: Network
) => {
const existingPeggyTokensMap = readJSONFile({
path: `tokens/peggyTokens/${getNetworkFileName(network)}.json`,
fallback: {}
})
const existingPeggyToken = existingPeggyTokensMap[denom.toLowerCase()]
if (existingPeggyToken) {
return existingPeggyToken
}
const alchemy = isMainnet(network) ? alchemyMainnet : alchemySepolia
const formattedDenom = denom.replace('peggy', '')
if (!formattedDenom.startsWith('0x')) {
return
}
const token = (await alchemy.core
.getTokenMetadata(formattedDenom)
.catch(() => {
console.warn(
`Peggy: Failed to fetch token metadata for denom: ${formattedDenom} on ${network}`
)
})) as AlchemyTokenSource | undefined
if (!token || !token.symbol || !token.name) {
return
}
const formattedToken = formatAlchemyToken(denom, token)
await updateJSONFile(
`tokens/peggyTokens/${getNetworkFileName(network)}.json`,
{
...existingPeggyTokensMap,
[denom.toLowerCase()]: formattedToken
}
)
return formattedToken
}