Merge 4295c5a0ab
into 9d280f7d5f
This commit is contained in:
commit
4115cf0419
|
@ -4,6 +4,36 @@
|
||||||
"logLevel": "debug",
|
"logLevel": "debug",
|
||||||
"dryRun": true,
|
"dryRun": true,
|
||||||
"enabledPlatforms": ["solana", "evm", "sui", "aptos", "wormchain"],
|
"enabledPlatforms": ["solana", "evm", "sui", "aptos", "wormchain"],
|
||||||
|
"enabledJobs": {
|
||||||
|
"WORMCHAIN": "wormchain",
|
||||||
|
"SOLANA": "solana",
|
||||||
|
"APTOS": "aptos",
|
||||||
|
"EVM": "evm",
|
||||||
|
"SUI": "sui",
|
||||||
|
"EVMS": {
|
||||||
|
"ethereum": "evmRepo",
|
||||||
|
"ethereum-sepolia": "evmRepo",
|
||||||
|
"avalanche": "evmRepo",
|
||||||
|
"oasis": "evmRepo",
|
||||||
|
"fantom": "evmRepo",
|
||||||
|
"karura": "evmRepo",
|
||||||
|
"acala": "evmRepo",
|
||||||
|
"klaytn": "evmRepo",
|
||||||
|
"celo": "evmRepo",
|
||||||
|
"optimism": "evmRepo",
|
||||||
|
"optimism-sepolia": "evmRepo",
|
||||||
|
"base": "evmRepo",
|
||||||
|
"base-sepolia": "evmRepo",
|
||||||
|
"bsc": "bsc-evmRepo",
|
||||||
|
"arbitrum": "arbitrum-evmRepo",
|
||||||
|
"arbitrum-sepolia": "arbitrum-evmRepo",
|
||||||
|
"moonbeam": "moonbeam-evmRepo",
|
||||||
|
"polygon": "polygon-evmRepo",
|
||||||
|
"ethereum-holesky": "evmRepo",
|
||||||
|
"scroll": "evmRepo",
|
||||||
|
"polygon-sepolia": "polygon-evmRepo"
|
||||||
|
}
|
||||||
|
},
|
||||||
"sns": {
|
"sns": {
|
||||||
"topicArn": "arn:aws:sns:us-east-1:000000000000:localstack-topic.fifo",
|
"topicArn": "arn:aws:sns:us-east-1:000000000000:localstack-topic.fifo",
|
||||||
"region": "us-east-1",
|
"region": "us-east-1",
|
||||||
|
|
|
@ -19,6 +19,7 @@ export type Config = {
|
||||||
};
|
};
|
||||||
chains: Record<string, ChainRPCConfig>;
|
chains: Record<string, ChainRPCConfig>;
|
||||||
enabledPlatforms: string[];
|
enabledPlatforms: string[];
|
||||||
|
enabledJobs: EnabledJobs;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type ChainRPCConfig = {
|
export type ChainRPCConfig = {
|
||||||
|
@ -34,6 +35,17 @@ export type ChainRPCConfig = {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
type EnabledJobs = {
|
||||||
|
WORMCHAIN: string;
|
||||||
|
SOLANA: string;
|
||||||
|
APTOS: string;
|
||||||
|
EVM: string;
|
||||||
|
SUI: string;
|
||||||
|
EVMS: {
|
||||||
|
[key: string]: string;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
By setting NODE_CONFIG_ENV we can point to a different config directory.
|
By setting NODE_CONFIG_ENV we can point to a different config directory.
|
||||||
Default settings can be customized by definining NODE_ENV=staging|production.
|
Default settings can be customized by definining NODE_ENV=staging|production.
|
||||||
|
@ -56,4 +68,5 @@ export const configuration = {
|
||||||
},
|
},
|
||||||
chains: config.get<Record<string, ChainRPCConfig>>("chains"),
|
chains: config.get<Record<string, ChainRPCConfig>>("chains"),
|
||||||
enabledPlatforms: config.get<string[]>("enabledPlatforms"),
|
enabledPlatforms: config.get<string[]>("enabledPlatforms"),
|
||||||
|
enabledJobs: config.get<EnabledJobs>("enabledJobs"),
|
||||||
} as Config;
|
} as Config;
|
||||||
|
|
|
@ -36,41 +36,12 @@ import {
|
||||||
ProviderPoolMap,
|
ProviderPoolMap,
|
||||||
} from ".";
|
} from ".";
|
||||||
|
|
||||||
const WORMCHAIN_CHAIN = "wormchain";
|
|
||||||
const SOLANA_CHAIN = "solana";
|
|
||||||
const APTOS_CHAIN = "aptos";
|
|
||||||
const EVM_CHAIN = "evm";
|
|
||||||
const SUI_CHAIN = "sui";
|
|
||||||
const EVM_CHAINS = new Map([
|
|
||||||
["ethereum", "evmRepo"],
|
|
||||||
["ethereum-sepolia", "evmRepo"],
|
|
||||||
["avalanche", "evmRepo"],
|
|
||||||
["oasis", "evmRepo"],
|
|
||||||
["fantom", "evmRepo"],
|
|
||||||
["karura", "evmRepo"],
|
|
||||||
["acala", "evmRepo"],
|
|
||||||
["klaytn", "evmRepo"],
|
|
||||||
["celo", "evmRepo"],
|
|
||||||
["optimism", "evmRepo"],
|
|
||||||
["optimism-sepolia", "evmRepo"],
|
|
||||||
["base", "evmRepo"],
|
|
||||||
["base-sepolia", "evmRepo"],
|
|
||||||
["bsc", "bsc-evmRepo"],
|
|
||||||
["arbitrum", "arbitrum-evmRepo"],
|
|
||||||
["arbitrum-sepolia", "arbitrum-evmRepo"],
|
|
||||||
["moonbeam", "moonbeam-evmRepo"],
|
|
||||||
["polygon", "polygon-evmRepo"],
|
|
||||||
["ethereum-holesky", "evmRepo"],
|
|
||||||
["scroll", "evmRepo"],
|
|
||||||
["polygon-sepolia", "polygon-evmRepo"],
|
|
||||||
]);
|
|
||||||
|
|
||||||
const POOL_STRATEGY = "weighted";
|
const POOL_STRATEGY = "weighted";
|
||||||
|
|
||||||
export class RepositoriesBuilder {
|
export class RepositoriesBuilder {
|
||||||
private cfg: Config;
|
|
||||||
private snsClient?: SNSClient;
|
|
||||||
private repositories = new Map();
|
private repositories = new Map();
|
||||||
|
private snsClient?: SNSClient;
|
||||||
|
private cfg: Config;
|
||||||
|
|
||||||
constructor(cfg: Config) {
|
constructor(cfg: Config) {
|
||||||
this.cfg = cfg;
|
this.cfg = cfg;
|
||||||
|
@ -81,93 +52,17 @@ export class RepositoriesBuilder {
|
||||||
this.snsClient = this.createSnsClient();
|
this.snsClient = this.createSnsClient();
|
||||||
this.repositories.set("sns", new SnsEventRepository(this.snsClient, this.cfg.sns));
|
this.repositories.set("sns", new SnsEventRepository(this.snsClient, this.cfg.sns));
|
||||||
|
|
||||||
this.repositories.set("metrics", new PromStatRepository());
|
|
||||||
|
|
||||||
this.cfg.metadata?.dir &&
|
this.cfg.metadata?.dir &&
|
||||||
this.repositories.set("metadata", new FileMetadataRepository(this.cfg.metadata.dir));
|
this.repositories.set("metadata", new FileMetadataRepository(this.cfg.metadata.dir));
|
||||||
|
|
||||||
|
this.repositories.set("metrics", new PromStatRepository());
|
||||||
|
|
||||||
this.cfg.enabledPlatforms.forEach((chain) => {
|
this.cfg.enabledPlatforms.forEach((chain) => {
|
||||||
if (chain === SOLANA_CHAIN) {
|
this.buildWormchainRepository(chain);
|
||||||
const solanaProviderPool = providerPoolSupplier(
|
this.buildSolanaRepository(chain);
|
||||||
this.cfg.chains[chain].rpcs.map((url) => ({ url })),
|
this.buildAptosRepository(chain);
|
||||||
(rpcCfg: RpcConfig) =>
|
this.buildEvmRepository(chain);
|
||||||
new InstrumentedConnection(rpcCfg.url, {
|
this.buildSuiRepository(chain);
|
||||||
commitment: rpcCfg.commitment || "confirmed",
|
|
||||||
}),
|
|
||||||
POOL_STRATEGY
|
|
||||||
);
|
|
||||||
|
|
||||||
const cfg = this.cfg.chains[chain];
|
|
||||||
const solanaSlotRepository = new RateLimitedSolanaSlotRepository(
|
|
||||||
new Web3SolanaSlotRepository(solanaProviderPool),
|
|
||||||
cfg.rateLimit
|
|
||||||
);
|
|
||||||
this.repositories.set("solana-slotRepo", solanaSlotRepository);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (chain === EVM_CHAIN) {
|
|
||||||
const pools = this.createEvmProviderPools();
|
|
||||||
const repoCfg: EvmJsonRPCBlockRepositoryCfg = {
|
|
||||||
chains: this.cfg.chains,
|
|
||||||
environment: this.cfg.environment,
|
|
||||||
};
|
|
||||||
|
|
||||||
const moonbeamRepository = new RateLimitedEvmJsonRPCBlockRepository(
|
|
||||||
new MoonbeamEvmJsonRPCBlockRepository(repoCfg, pools)
|
|
||||||
);
|
|
||||||
const arbitrumRepository = new RateLimitedEvmJsonRPCBlockRepository(
|
|
||||||
new ArbitrumEvmJsonRPCBlockRepository(repoCfg, pools, this.getMetadataRepository())
|
|
||||||
);
|
|
||||||
const polygonRepository = new RateLimitedEvmJsonRPCBlockRepository(
|
|
||||||
new PolygonJsonRPCBlockRepository(repoCfg, pools)
|
|
||||||
);
|
|
||||||
const bscRepository = new RateLimitedEvmJsonRPCBlockRepository(
|
|
||||||
new BscEvmJsonRPCBlockRepository(repoCfg, pools)
|
|
||||||
);
|
|
||||||
const evmRepository = new RateLimitedEvmJsonRPCBlockRepository(
|
|
||||||
new EvmJsonRPCBlockRepository(repoCfg, pools)
|
|
||||||
);
|
|
||||||
|
|
||||||
this.repositories.set("moonbeam-evmRepo", moonbeamRepository);
|
|
||||||
this.repositories.set("arbitrum-evmRepo", arbitrumRepository);
|
|
||||||
this.repositories.set("polygon-evmRepo", polygonRepository);
|
|
||||||
this.repositories.set("bsc-evmRepo", bscRepository);
|
|
||||||
this.repositories.set("evmRepo", evmRepository);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (chain === SUI_CHAIN) {
|
|
||||||
const suiProviderPool = providerPoolSupplier(
|
|
||||||
this.cfg.chains[chain].rpcs.map((url) => ({ url })),
|
|
||||||
(rpcCfg: RpcConfig) => new InstrumentedSuiClient(rpcCfg.url, 2000),
|
|
||||||
POOL_STRATEGY
|
|
||||||
);
|
|
||||||
|
|
||||||
const suiRepository = new RateLimitedSuiJsonRPCBlockRepository(
|
|
||||||
new SuiJsonRPCBlockRepository(suiProviderPool)
|
|
||||||
);
|
|
||||||
|
|
||||||
this.repositories.set("sui-repo", suiRepository);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (chain === APTOS_CHAIN) {
|
|
||||||
const pools = this.createDefaultProviderPools(APTOS_CHAIN);
|
|
||||||
|
|
||||||
const aptosRepository = new RateLimitedAptosJsonRPCBlockRepository(
|
|
||||||
new AptosJsonRPCBlockRepository(pools)
|
|
||||||
);
|
|
||||||
|
|
||||||
this.repositories.set("aptos-repo", aptosRepository);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (chain === WORMCHAIN_CHAIN) {
|
|
||||||
const pools = this.createDefaultProviderPools(WORMCHAIN_CHAIN);
|
|
||||||
|
|
||||||
const wormchainRepository = new RateLimitedWormchainJsonRPCBlockRepository(
|
|
||||||
new WormchainJsonRPCBlockRepository(pools)
|
|
||||||
);
|
|
||||||
|
|
||||||
this.repositories.set("wormchain-repo", wormchainRepository);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
this.repositories.set(
|
this.repositories.set(
|
||||||
|
@ -191,8 +86,9 @@ export class RepositoriesBuilder {
|
||||||
}
|
}
|
||||||
|
|
||||||
public getEvmBlockRepository(chain: string): EvmJsonRPCBlockRepository {
|
public getEvmBlockRepository(chain: string): EvmJsonRPCBlockRepository {
|
||||||
const instanceRepoName = EVM_CHAINS.get(chain);
|
const instanceRepoName = this.cfg.enabledJobs.EVMS[chain];
|
||||||
if (!instanceRepoName) throw new Error(`Chain ${chain} not supported`);
|
if (!instanceRepoName)
|
||||||
|
throw new Error(`[RepositoriesBuilder] Chain ${chain.toLocaleUpperCase()} not supported`);
|
||||||
return this.getRepo(instanceRepoName);
|
return this.getRepo(instanceRepoName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -228,17 +124,110 @@ export class RepositoriesBuilder {
|
||||||
return this.getRepo("wormchain-repo");
|
return this.getRepo("wormchain-repo");
|
||||||
}
|
}
|
||||||
|
|
||||||
private getRepo(name: string): any {
|
|
||||||
const repo = this.repositories.get(name);
|
|
||||||
if (!repo) throw new Error(`No repository ${name}`);
|
|
||||||
|
|
||||||
return repo;
|
|
||||||
}
|
|
||||||
|
|
||||||
public close(): void {
|
public close(): void {
|
||||||
this.snsClient?.destroy();
|
this.snsClient?.destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private buildSolanaRepository(chain: string): void {
|
||||||
|
if (chain == this.cfg.enabledJobs.SOLANA) {
|
||||||
|
const solanaProviderPool = providerPoolSupplier(
|
||||||
|
this.cfg.chains[chain].rpcs.map((url) => ({ url })),
|
||||||
|
(rpcCfg: RpcConfig) =>
|
||||||
|
new InstrumentedConnection(rpcCfg.url, {
|
||||||
|
commitment: rpcCfg.commitment || "confirmed",
|
||||||
|
}),
|
||||||
|
POOL_STRATEGY
|
||||||
|
);
|
||||||
|
|
||||||
|
const cfg = this.cfg.chains[chain];
|
||||||
|
const solanaSlotRepository = new RateLimitedSolanaSlotRepository(
|
||||||
|
new Web3SolanaSlotRepository(solanaProviderPool),
|
||||||
|
cfg.rateLimit
|
||||||
|
);
|
||||||
|
this.repositories.set("solana-slotRepo", solanaSlotRepository);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private buildEvmRepository(chain: string): void {
|
||||||
|
if (chain == this.cfg.enabledJobs.EVM) {
|
||||||
|
const pools = this.createEvmProviderPools();
|
||||||
|
const repoCfg: EvmJsonRPCBlockRepositoryCfg = {
|
||||||
|
chains: this.cfg.chains,
|
||||||
|
environment: this.cfg.environment,
|
||||||
|
};
|
||||||
|
|
||||||
|
const moonbeamRepository = new RateLimitedEvmJsonRPCBlockRepository(
|
||||||
|
new MoonbeamEvmJsonRPCBlockRepository(repoCfg, pools)
|
||||||
|
);
|
||||||
|
const arbitrumRepository = new RateLimitedEvmJsonRPCBlockRepository(
|
||||||
|
new ArbitrumEvmJsonRPCBlockRepository(repoCfg, pools, this.getMetadataRepository())
|
||||||
|
);
|
||||||
|
const polygonRepository = new RateLimitedEvmJsonRPCBlockRepository(
|
||||||
|
new PolygonJsonRPCBlockRepository(repoCfg, pools)
|
||||||
|
);
|
||||||
|
const bscRepository = new RateLimitedEvmJsonRPCBlockRepository(
|
||||||
|
new BscEvmJsonRPCBlockRepository(repoCfg, pools)
|
||||||
|
);
|
||||||
|
const evmRepository = new RateLimitedEvmJsonRPCBlockRepository(
|
||||||
|
new EvmJsonRPCBlockRepository(repoCfg, pools)
|
||||||
|
);
|
||||||
|
|
||||||
|
this.repositories.set("moonbeam-evmRepo", moonbeamRepository);
|
||||||
|
this.repositories.set("arbitrum-evmRepo", arbitrumRepository);
|
||||||
|
this.repositories.set("polygon-evmRepo", polygonRepository);
|
||||||
|
this.repositories.set("bsc-evmRepo", bscRepository);
|
||||||
|
this.repositories.set("evmRepo", evmRepository);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private buildSuiRepository(chain: string): void {
|
||||||
|
if (chain == this.cfg.enabledJobs.SUI) {
|
||||||
|
const suiProviderPool = providerPoolSupplier(
|
||||||
|
this.cfg.chains[chain].rpcs.map((url) => ({ url })),
|
||||||
|
(rpcCfg: RpcConfig) => new InstrumentedSuiClient(rpcCfg.url, 2000),
|
||||||
|
POOL_STRATEGY
|
||||||
|
);
|
||||||
|
|
||||||
|
const suiRepository = new RateLimitedSuiJsonRPCBlockRepository(
|
||||||
|
new SuiJsonRPCBlockRepository(suiProviderPool)
|
||||||
|
);
|
||||||
|
|
||||||
|
this.repositories.set("sui-repo", suiRepository);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private buildAptosRepository(chain: string): void {
|
||||||
|
if (chain == this.cfg.enabledJobs.APTOS) {
|
||||||
|
const pools = this.createDefaultProviderPools(chain);
|
||||||
|
|
||||||
|
const aptosRepository = new RateLimitedAptosJsonRPCBlockRepository(
|
||||||
|
new AptosJsonRPCBlockRepository(pools)
|
||||||
|
);
|
||||||
|
|
||||||
|
this.repositories.set("aptos-repo", aptosRepository);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private buildWormchainRepository(chain: string): void {
|
||||||
|
if (chain == this.cfg.enabledJobs.WORMCHAIN) {
|
||||||
|
const pools = this.createDefaultProviderPools(chain);
|
||||||
|
|
||||||
|
const wormchainRepository = new RateLimitedWormchainJsonRPCBlockRepository(
|
||||||
|
new WormchainJsonRPCBlockRepository(pools)
|
||||||
|
);
|
||||||
|
|
||||||
|
this.repositories.set("wormchain-repo", wormchainRepository);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private getRepo(name: string): any {
|
||||||
|
const repo = this.repositories.get(name);
|
||||||
|
if (!repo)
|
||||||
|
throw new Error(`[RepositoriesBuilder] Repository ${name.toLocaleLowerCase()} not supported`);
|
||||||
|
|
||||||
|
return repo;
|
||||||
|
}
|
||||||
|
|
||||||
private createSnsClient(): SNSClient {
|
private createSnsClient(): SNSClient {
|
||||||
const snsCfg: SNSClientConfig = { region: this.cfg.sns.region };
|
const snsCfg: SNSClientConfig = { region: this.cfg.sns.region };
|
||||||
if (this.cfg.sns.credentials) {
|
if (this.cfg.sns.credentials) {
|
||||||
|
|
|
@ -199,6 +199,36 @@ export const configMock = (): Config => {
|
||||||
},
|
},
|
||||||
chains: chainsRecord,
|
chains: chainsRecord,
|
||||||
enabledPlatforms: ["solana", "evm", "sui", "aptos", "wormchain"],
|
enabledPlatforms: ["solana", "evm", "sui", "aptos", "wormchain"],
|
||||||
|
enabledJobs: {
|
||||||
|
WORMCHAIN: "wormchain",
|
||||||
|
SOLANA: "solana",
|
||||||
|
APTOS: "aptos",
|
||||||
|
EVM: "evm",
|
||||||
|
SUI: "sui",
|
||||||
|
EVMS: {
|
||||||
|
ethereum: "evmRepo",
|
||||||
|
"ethereum-sepolia": "evmRepo",
|
||||||
|
avalanche: "evmRepo",
|
||||||
|
oasis: "evmRepo",
|
||||||
|
fantom: "evmRepo",
|
||||||
|
karura: "evmRepo",
|
||||||
|
acala: "evmRepo",
|
||||||
|
klaytn: "evmRepo",
|
||||||
|
celo: "evmRepo",
|
||||||
|
optimism: "evmRepo",
|
||||||
|
"optimism-sepolia": "evmRepo",
|
||||||
|
base: "evmRepo",
|
||||||
|
"base-sepolia": "evmRepo",
|
||||||
|
bsc: "bsc-evmRepo",
|
||||||
|
arbitrum: "arbitrum-evmRepo",
|
||||||
|
"arbitrum-sepolia": "arbitrum-evmRepo",
|
||||||
|
moonbeam: "moonbeam-evmRepo",
|
||||||
|
polygon: "polygon-evmRepo",
|
||||||
|
"ethereum-holesky": "evmRepo",
|
||||||
|
scroll: "evmRepo",
|
||||||
|
"polygon-sepolia": "polygon-evmRepo",
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
return cfg;
|
return cfg;
|
||||||
|
|
Loading…
Reference in New Issue