wormhole-explorer/onchain_data/src/utils.ts

418 lines
13 KiB
TypeScript

import {
CHAIN_ID_ACALA,
CHAIN_ID_ALGORAND,
CHAIN_ID_APTOS,
CHAIN_ID_AURORA,
CHAIN_ID_AVAX,
CHAIN_ID_BSC,
CHAIN_ID_CELO,
CHAIN_ID_ETH,
CHAIN_ID_FANTOM,
CHAIN_ID_KARURA,
CHAIN_ID_KLAYTN,
CHAIN_ID_MOONBEAM,
CHAIN_ID_NEAR,
CHAIN_ID_OASIS,
CHAIN_ID_POLYGON,
CHAIN_ID_SOLANA,
CHAIN_ID_TERRA,
CHAIN_ID_TERRA2,
CHAIN_ID_XPLA,
} from "@certusone/wormhole-sdk";
export const WORMHOLE_RPC_HOSTS = [
"https://wormhole-v2-mainnet-api.certus.one",
"https://wormhole.inotel.ro",
"https://wormhole-v2-mainnet-api.mcf.rocks",
"https://wormhole-v2-mainnet-api.chainlayer.network",
"https://wormhole-v2-mainnet-api.staking.fund",
"https://wormhole-v2-mainnet.01node.com",
];
export const CHAIN_ID_MAP = {
0: undefined,
1: CHAIN_ID_SOLANA,
2: CHAIN_ID_ETH,
3: CHAIN_ID_TERRA,
4: CHAIN_ID_BSC,
5: CHAIN_ID_POLYGON,
6: CHAIN_ID_AVAX,
7: CHAIN_ID_OASIS,
8: CHAIN_ID_ALGORAND,
9: CHAIN_ID_AURORA,
10: CHAIN_ID_FANTOM,
11: CHAIN_ID_KARURA,
12: CHAIN_ID_ACALA,
13: CHAIN_ID_KLAYTN,
14: CHAIN_ID_CELO,
15: CHAIN_ID_NEAR,
16: CHAIN_ID_MOONBEAM,
18: CHAIN_ID_TERRA2,
22: CHAIN_ID_APTOS,
28: CHAIN_ID_XPLA,
};
import { ethers } from "ethers";
require("dotenv").config();
export const DISALLOWLISTED_ADDRESSES = [
"0x04132bf45511d03a58afd4f1d36a29d229ccc574",
"0xa79bd679ce21a2418be9e6f88b2186c9986bbe7d",
"0x931c3987040c90b6db09981c7c91ba155d3fa31f",
"0x8fb1a59ca2d57b51e5971a85277efe72c4492983",
"0xd52d9ba6fcbadb1fe1e3aca52cbb72c4d9bbb4ec",
"0x1353c55fd2beebd976d7acc4a7083b0618d94689",
"0xf0fbdb8a402ec0fc626db974b8d019c902deb486",
"0x1fd4a95f4335cf36cac85730289579c104544328",
"0x358aa13c52544eccef6b0add0f801012adad5ee3",
"0xbe32b7acd03bcc62f25ebabd169a35e69ef17601",
"0x7ffb3d637014488b63fb9858e279385685afc1e2",
"0x337dc89ebcc33a337307d58a51888af92cfdc81b",
"0x5Cb89Ac06F34f73B1A6b8000CEb0AfBc97d58B6b",
"0xd9F0446AedadCf16A12692E02FA26C617FA4D217",
"0xD7b41531456b636641F7e867eC77120441D1E1E8",
"0x9f607027b69f6e123bc3bd56a686b735fa75f30a",
"0x2a35965bbad6fd3964ef815d011c51ab1c546e67",
"0x053c070f0923a5b770cc59d7bf74ecff991cd0b8",
"0x3dab0f14ea515d5c842b631bd6df0f7f989c47b3",
"0x7ee4f716e3c716d61f6158bde3ed5ab03fb6b90c",
"0x90285e9567be274ae892c88d3ffd76c87d6c7904",
"0x2d4678e71590c56eb37869832a3642c405e1c252", // fake saitama on poly
"0x1e49f85f8f5d4ef948ccb953c0172c648b75222f",
"0x477c7802632f0d38f285a7fd7112a66c11b99db6",
"0xdaff96cc3d5e2fa982812ec12ce74833deb51327", //fake btc on bsc
"0xe389ac691bd2b0228daffff548fbce38470373e8", //fake wrapped matic on poly
"0x7e347498dfef39a88099e3e343140ae17cde260e", //wrapped avax on bsc
"0x86812b970bbdce75b4590243ba2cbff671d0b754", //fake tether on bsc
"0x3d8babf3afd0e1bfc843f9638f650fa50ae6c22b", //fake tether on eth
"0x0749902ae8ed9c6a508271bad18f185dba7185d4", //wrapped eth on polygon
"0x8e1c62f03b995938233ffa3762bd69f889016b3c", //fake luna2.0 on bsc
].map((x) => x.toLowerCase());
export const COIN_GECKO_EXCEPTIONS = [
{
chainId: 2,
tokenAddress: "0x707f9118e33a9b8998bea41dd0d46f38bb963fc8".toLowerCase(),
coinGeckoId: "ethereum",
},
{
chainId: 2,
tokenAddress: "0xdAF566020156297E2837fDfaA6Fbba929A29461E".toLowerCase(),
coinGeckoId: "safe-coin-2",
},
{
chainId: 2,
tokenAddress: "0x5ab6A4F46Ce182356B6FA2661Ed8ebcAFce995aD".toLowerCase(),
coinGeckoId: "sportium",
},
{
chainId: 3,
tokenAddress: "uluna",
coinGeckoId: "terra-luna",
},
{
chainId: 3,
tokenAddress: "ukrw",
coinGeckoId: "terra-krw",
},
{
chainId: 7,
tokenAddress: "0x21c718c22d52d0f3a789b752d4c2fd5908a8a733",
coinGeckoId: "oasis-network", // wrapped-rose does not currently have prices
},
{
chainId: 7,
tokenAddress: "0x366ef31c8dc715cbeff5fa54ad106dc9c25c6153",
coinGeckoId: "tether",
},
{
chainId: 1,
tokenAddress: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
coinGeckoId: "usd-coin",
},
{
chainId: 1,
tokenAddress: "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB",
coinGeckoId: "tether",
},
{
chainId: 11,
tokenAddress: "0x0000000000000000000500000000000000000007",
coinGeckoId: "tether",
},
{
chainId: 12,
tokenAddress: "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee2",
coinGeckoId: "acala",
},
{
chainId: 12,
tokenAddress: "0x0000000000000000000100000000000000000001",
coinGeckoId: "acala-dollar",
},
{
chainId: 12,
tokenAddress: "0x0000000000000000000100000000000000000000",
coinGeckoId: "acala",
},
];
export function newProvider(
url: string,
batch: boolean = false
): ethers.providers.JsonRpcProvider | ethers.providers.JsonRpcBatchProvider {
// only support http(s), not ws(s) as the websocket constructor can blow up the entire process
// it uses a nasty setTimeout(()=>{},0) so we are unable to cleanly catch its errors
if (url.includes("http")) {
if (batch) {
return new ethers.providers.JsonRpcBatchProvider(url);
}
return new ethers.providers.JsonRpcProvider(url);
}
throw new Error("url does not start with http/https!");
}
export var CHAIN_INFO_MAP = {
"1": {
name: "solana",
evm: false,
chain_id: CHAIN_ID_SOLANA,
endpoint_url: process.env.SOLANA_RPC || "https://rpc.ankr.com/solana",
core_bridge: "worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth",
token_bridge_address: "wormDTUJ6AWPNvk59vGQbDvGJmqbDTdgWgAqcLBCgUb",
custody_address: "GugU1tP7doLeTw9hQP51xRJyS8Da1fWxuiy2rVrnMD2m",
platform: "solana",
covalentChain: 1399811149,
},
"2": {
name: "eth",
evm: true,
chain_id: CHAIN_ID_ETH,
endpoint_url: process.env.ETH_RPC || "https://rpc.ankr.com/eth",
core_bridge: "0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B",
token_bridge_address: "0x3ee18B2214AFF97000D974cf647E7C347E8fa585",
custody_address: "0x3ee18B2214AFF97000D974cf647E7C347E8fa585",
api_key: process.env.ETHERSCAN_API,
urlStem: `https://api.etherscan.io`,
platform: "ethereum",
covalentChain: 1,
},
"3": {
name: "terra",
evm: false,
chain_id: CHAIN_ID_TERRA,
endpoint_url: "",
core_bridge: "terra1dq03ugtd40zu9hcgdzrsq6z2z4hwhc9tqk2uy5",
token_bridge_address: "terra10nmmwe8r3g99a9newtqa7a75xfgs2e8z87r2sf",
custody_address: "terra10nmmwe8r3g99a9newtqa7a75xfgs2e8z87r2sf",
urlStem: "https://columbus-fcd.terra.dev",
platform: "terra",
covalentChain: 3,
},
"4": {
name: "bsc",
evm: true,
chain_id: CHAIN_ID_BSC,
endpoint_url: process.env.BSC_RPC || "https://rpc.ankr.com/bsc ", //moralis_url
core_bridge: "0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B",
token_bridge_address: "0xB6F6D86a8f9879A9c87f643768d9efc38c1Da6E7",
custody_address: "0xB6F6D86a8f9879A9c87f643768d9efc38c1Da6E7",
api_key: process.env.BSCSCAN_API,
urlStem: `https://api.bscscan.com`,
platform: "binance-smart-chain",
covalentChain: 56,
},
"5": {
name: "polygon",
evm: true,
chain_id: CHAIN_ID_POLYGON,
endpoint_url: process.env.POLYGON_RPC || "https://rpc.ankr.com/polygon ",
core_bridge: "0x7A4B5a56256163F07b2C80A7cA55aBE66c4ec4d7",
token_bridge_address: "0x5a58505a96D1dbf8dF91cB21B54419FC36e93fdE",
custody_address: "0x5a58505a96D1dbf8dF91cB21B54419FC36e93fdE",
api_key: process.env.POLYSCAN_API,
urlStem: `https://api.polygonscan.com`,
platform: "polygon-pos", //coingecko?,
covalentChain: 137,
},
"6": {
name: "avalanche",
evm: true,
chain_id: CHAIN_ID_AVAX,
endpoint_url: process.env.AVAX_RPC || "https://rpc.ankr.com/avalanche",
core_bridge: "0x54a8e5f9c4CbA08F9943965859F6c34eAF03E26c",
token_bridge_address: "0x0e082F06FF657D94310cB8cE8B0D9a04541d8052",
custody_address: "0x0e082F06FF657D94310cB8cE8B0D9a04541d8052",
api_key: process.env.SNOWTRACE_API,
urlStem: `https://api.snowtrace.io`,
platform: "avalanche", //coingecko?
covalentChain: 43114,
},
"7": {
name: "oasis",
evm: true,
chain_id: CHAIN_ID_OASIS,
endpoint_url: "https://emerald.oasis.dev",
core_bridge: "0xfE8cD454b4A1CA468B57D79c0cc77Ef5B6f64585",
token_bridge_address: "0x5848C791e09901b40A9Ef749f2a6735b418d7564",
custody_address: "0x5848C791e09901b40A9Ef749f2a6735b418d7564",
api_key: "",
urlStem: `https://explorer.emerald.oasis.dev`,
platform: "oasis", //coingecko?
covalentChain: 42262,
},
"8": {
name: "algorand",
evm: false,
chain_id: CHAIN_ID_ALGORAND,
endpoint_url: "https://node.algoexplorerapi.io",
core_bridge: "842125965",
token_bridge_address: "842126029",
custody_address: "842126029",
api_key: "",
urlStem: `https://algoexplorer.io`,
platform: "algorand", //coingecko?
covalentChain: undefined,
},
"9": {
name: "aurora",
evm: true,
chain_id: CHAIN_ID_AURORA,
endpoint_url: "https://mainnet.aurora.dev",
core_bridge: "0xa321448d90d4e5b0A732867c18eA198e75CAC48E",
token_bridge_address: "0x51b5123a7b0F9b2bA265f9c4C8de7D78D52f510F",
custody_address: "0x51b5123a7b0F9b2bA265f9c4C8de7D78D52f510F",
api_key: process.env.AURORA_API,
urlStem: `https://api.aurorascan.dev`, //?module=account&action=txlist&address={addressHash}
covalentChain: 1313161554,
platform: "aurora", //coingecko?
},
"10": {
name: "fantom",
evm: true,
chain_id: CHAIN_ID_FANTOM,
endpoint_url: "https://rpc.ftm.tools",
core_bridge: "0x126783A6Cb203a3E35344528B26ca3a0489a1485",
token_bridge_address: "0x7C9Fc5741288cDFdD83CeB07f3ea7e22618D79D2",
custody_address: "0x7C9Fc5741288cDFdD83CeB07f3ea7e22618D79D2",
api_key: process.env.FTMSCAN_API,
urlStem: `https://api.FtmScan.com`,
platform: "fantom", //coingecko?
covalentChain: 250,
},
"11": {
name: "karura",
evm: true,
chain_id: CHAIN_ID_KARURA,
endpoint_url: "https://eth-rpc-karura.aca-api.network",
core_bridge: "0xa321448d90d4e5b0A732867c18eA198e75CAC48E",
token_bridge_address: "0xae9d7fe007b3327AA64A32824Aaac52C42a6E624",
custody_address: "0xae9d7fe007b3327AA64A32824Aaac52C42a6E624",
api_key: "",
urlStem: `https://blockscout.karura.network`,
platform: "karura", //coingecko?
covalentChain: "",
},
"12": {
name: "acala",
evm: true,
chain_id: CHAIN_ID_ACALA,
endpoint_url: "https://eth-rpc-acala.aca-api.network",
core_bridge: "0xa321448d90d4e5b0A732867c18eA198e75CAC48E",
token_bridge_address: "0xae9d7fe007b3327AA64A32824Aaac52C42a6E624",
custody_address: "0xae9d7fe007b3327AA64A32824Aaac52C42a6E624",
api_key: "",
urlStem: `https://blockscout.acala.network`,
platform: "acala", //coingecko?
covalentChain: "",
},
"13": {
name: "klaytn",
evm: true,
chain_id: CHAIN_ID_KLAYTN,
endpoint_url: "https://klaytn-mainnet-rpc.allthatnode.com:8551",
core_bridge: "0x0C21603c4f3a6387e241c0091A7EA39E43E90bb7",
token_bridge_address: "0x5b08ac39EAED75c0439FC750d9FE7E1F9dD0193F",
custody_address: "0x5b08ac39EAED75c0439FC750d9FE7E1F9dD0193F",
api_key: process.env.KLAYTN_API,
urlStem: `https://scope.klaytn.com`,
platform: "klay-token", //coingecko?
covalentChain: "8217",
},
"14": {
name: "celo",
evm: true,
chain_id: CHAIN_ID_CELO,
endpoint_url: "https://forno.celo.org",
core_bridge: "0xa321448d90d4e5b0A732867c18eA198e75CAC48E",
token_bridge_address: "0x796Dff6D74F3E27060B71255Fe517BFb23C93eed",
custody_address: "0x796Dff6D74F3E27060B71255Fe517BFb23C93eed",
api_key: "",
urlStem: `https://explorer.celo.org`,
platform: "celo", //coingecko?
covalentChain: "42220",
},
"15": {
name: "near",
evm: false,
chain_id: CHAIN_ID_NEAR,
endpoint_url: "https://rpc.ankr.com/near",
core_bridge: "contract.wormhole_crypto.near",
token_bridge_address: "contract.portalbridge.near",
custody_address: "contract.portalbridge.near",
urlStem: "",
platform: "near",
covalentChain: undefined,
},
"16": {
name: "moonbeam",
evm: true,
chain_id: CHAIN_ID_MOONBEAM,
endpoint_url: "https://rpc.api.moonbeam.network",
core_bridge: "0xC8e2b0cD52Cf01b0Ce87d389Daa3d414d4cE29f3",
token_bridge_address: "0xB1731c586ca89a23809861c6103F0b96B3F57D92",
custody_address: "0xB1731c586ca89a23809861c6103F0b96B3F57D92",
api_key: process.env.MOONBEAM_API,
urlStem: "https://api-moonbeam.moonscan.io",
platform: "moonbeam",
covalentChain: 1284,
},
"18": {
name: "terra2",
evm: false,
chain_id: CHAIN_ID_TERRA2,
endpoint_url: "",
core_bridge:
"terra12mrnzvhx3rpej6843uge2yyfppfyd3u9c3uq223q8sl48huz9juqffcnhp",
token_bridge_address:
"terra153366q50k7t8nn7gec00hg66crnhkdggpgdtaxltaq6xrutkkz3s992fw9",
custody_address:
"terra153366q50k7t8nn7gec00hg66crnhkdggpgdtaxltaq6xrutkkz3s992fw9",
urlStem: "https://phoenix-fcd.terra.dev",
platform: "terra",
covalentChain: 3,
},
"22": {
name: "aptos",
evm: false,
chain_id: CHAIN_ID_APTOS,
endpoint_url: "https://fullnode.mainnet.aptoslabs.com/v1",
core_bridge:
"0x5bc11445584a763c1fa7ed39081f1b920954da14e04b32440cba863d03e19625",
token_bridge_address:
"0x576410486a2da45eee6c949c995670112ddf2fbeedab20350d506328eefc9d4f",
custody_address:
"0x576410486a2da45eee6c949c995670112ddf2fbeedab20350d506328eefc9d4f",
api_key: "",
urlStem: "",
platform: "aptos",
covalentChain: 0,
},
};
export async function sleepFor(timeInMs: number): Promise<void> {
return new Promise((resolve) => {
setTimeout(resolve, timeInMs);
});
}