49 lines
1.5 KiB
JavaScript
49 lines
1.5 KiB
JavaScript
// keeps a list of known tokens
|
|
|
|
// todo load standard known tokens
|
|
|
|
import {ethers} from "ethers";
|
|
import {getProvider} from "./blockchain.js";
|
|
import {newContract} from "./contract.js";
|
|
|
|
const std_arbitrum_tokens = {}
|
|
const tokens = {
|
|
42161: std_arbitrum_tokens,
|
|
31337: std_arbitrum_tokens,
|
|
1337: {},
|
|
}
|
|
|
|
export async function erc20(chainId, addr, provider=null) {
|
|
return await newContract(addr, 'IERC20Metadata', provider?provider:getProvider(chainId));
|
|
}
|
|
|
|
let _loggedNoTokensForChain = false
|
|
export async function lookupToken(chainId, address) {
|
|
// console.log('lookupToken', chainId, address)
|
|
const chainTokens = tokens[chainId]
|
|
if( chainTokens === undefined ) {
|
|
if( !_loggedNoTokensForChain ) {
|
|
console.log('no tokens for chain', chainId)
|
|
_loggedNoTokensForChain = true
|
|
}
|
|
return null
|
|
}
|
|
try {
|
|
let result = chainTokens[address]
|
|
// console.log('found', result)
|
|
if (result === undefined) {
|
|
// todo look in tokens project?
|
|
const addr = ethers.getAddress(address)
|
|
const token = await erc20(chainId, addr)
|
|
let [name, symbol, decimals] = await Promise.all([token.name(), token.symbol(), token.decimals()])
|
|
name = Number(name)
|
|
decimals = Number(decimals)
|
|
result = {a: addr, n: name, s:symbol, d:decimals}
|
|
chainTokens[addr] = result
|
|
}
|
|
return result
|
|
} catch {
|
|
return null
|
|
}
|
|
}
|