@wormhole-foundation/sdk-evm
Version:
SDK for EVM chains, used in conjunction with @wormhole-foundation/sdk
112 lines • 3.73 kB
JavaScript
// Covalent GoldRush indexer
// https://goldrush.dev/docs/api-reference/overview
//
// We don't use the official @covalenthq/client-sdk client for this because it's over 1MB and all we need
// is a small subset of one endpoint. This is how you know this code isn't AI slop.
const GOLD_RUSH_CHAINS = {
Mainnet: {
Ethereum: 'eth-mainnet',
Polygon: 'matic-mainnet',
Bsc: 'bsc-mainnet',
Optimism: 'optimism-mainnet',
Base: 'base-mainnet',
Worldchain: 'world-mainnet',
Sei: 'sei-mainnet',
Ink: 'ink-mainnet',
Solana: 'solana-mainnet',
},
Testnet: {
Ethereum: 'eth-sepolia',
Polygon: 'polygon-amoy-testnet',
Bsc: 'bsc-testnet',
Optimism: 'optimism-sepolia',
Base: 'base-sepolia-testnet',
Worldchain: 'world-sepolia-testnet',
Unichain: 'unichain-sepolia-testnet',
Berachain: 'berachain-testnet',
Ink: 'ink-sepolia-testnet',
},
Devnet: {},
};
export class GoldRushClient {
key;
constructor(key) {
this.key = key;
}
supportsChain(network, chain) {
const endpoint = GOLD_RUSH_CHAINS[network][chain];
return endpoint !== undefined;
}
async getBalances(network, chain, walletAddr) {
const endpoint = GOLD_RUSH_CHAINS[network][chain];
if (!endpoint)
throw new Error('Chain not supported by GoldRush indexer');
const { data } = await (await fetch(`https://api.covalenthq.com/v1/${endpoint}/address/${walletAddr}/balances_v2/?key=${this.key}`)).json();
const bals = {};
for (let item of data.items) {
let addr = item.contract_address;
if (item.contract_address.toLowerCase() === '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee') {
addr = 'native';
}
bals[addr] = BigInt(item.balance);
}
return bals;
}
}
const ALCHEMY_CHAINS = {
Mainnet: {
Ethereum: 'eth-mainnet',
Base: 'base-mainnet',
Arbitrum: 'arb-mainnet',
Optimism: 'opt-mainnet',
Polygon: 'polygon-mainnet',
Worldchain: 'worldchain-mainnet',
Ink: 'ink-mainnet',
Unichain: 'unichain-mainnet',
Berachain: 'berachain-mainnet',
},
Testnet: {
Ethereum: 'eth-sepolia',
Base: 'base-sepolia',
Arbitrum: 'arb-sepolia',
Optimism: 'opt-sepolia',
Polygon: 'polygon-amoy',
Worldchain: 'worldchain-sepolia',
Ink: 'ink-sepolia',
Unichain: 'unichain-sepolia',
Berachain: 'berachain-bartio',
Monad: 'monad-testnet',
},
Devnet: {},
};
export class AlchemyClient {
key;
constructor(key) {
this.key = key;
}
supportsChain(network, chain) {
const endpoint = ALCHEMY_CHAINS[network][chain];
return endpoint !== undefined;
}
async getBalances(network, chain, walletAddr) {
const endpoint = ALCHEMY_CHAINS[network][chain];
if (!endpoint)
throw new Error('Chain not supported by Alchemy indexer');
const { result } = await (await fetch(`https://${endpoint}.g.alchemy.com/v2/${this.key}`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "alchemy_getTokenBalances",
params: [walletAddr]
})
})).json();
const bals = {};
for (let item of result.tokenBalances) {
bals[item.contractAddress] = BigInt(parseInt(item.balance, 16));
}
return bals;
}
}
//# sourceMappingURL=indexer.js.map