diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 7b70067..ce4e2fe 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -37,7 +37,7 @@ "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist", "type-check": "tsc", "check-exports": "attw --pack . --ignore-rules=cjs-resolves-to-esm", - "test": "vitest run", + "test": "vitest run --reporter=verbose", "ci": "pnpm run build && pnpm run check-exports pnpm npm run lint && pnpm run test", "typedoc": "typedoc --out docs src/index.ts" }, diff --git a/packages/sdk/src/utils/configurePublicClients.ts b/packages/sdk/src/utils/configurePublicClients.ts index b03f38a..c74bbd9 100644 --- a/packages/sdk/src/utils/configurePublicClients.ts +++ b/packages/sdk/src/utils/configurePublicClients.ts @@ -1,25 +1,31 @@ -import { Chain, createPublicClient, http } from "viem"; +import { Chain, createPublicClient, http, Transport, webSocket } from "viem"; import { ConfiguredPublicClientMap } from "../types"; // creates a mapping chainId => publicClient export function configurePublicClients( chains: Chain[], - pollingInterval: number, // milliseconds + pollingInterval?: number, // milliseconds rpcUrls?: { [key: number]: string; }, + transports?: { + [key: number]: Transport; + }, ): ConfiguredPublicClientMap { return new Map( chains.map((chain) => { - // get custom rpc if one is specified, or use default const rpcUrl = rpcUrls?.[chain.id]; + const customTransport = transports?.[chain.id]; + const transport = + customTransport ?? + (rpcUrl?.startsWith("wss") ? webSocket(rpcUrl) : http(rpcUrl)); return [ chain.id, createPublicClient({ chain, pollingInterval, key: chain.id.toString(), - transport: http(rpcUrl), + transport, batch: { multicall: true, }, diff --git a/packages/sdk/test/utils/_utils.ts b/packages/sdk/test/utils/_utils.ts new file mode 100644 index 0000000..6a133d8 --- /dev/null +++ b/packages/sdk/test/utils/_utils.ts @@ -0,0 +1,8 @@ +import { AcrossClient } from "../../src/client"; +import { hardhat } from "viem/chains"; + +export const testSDK = AcrossClient.create({ + useTestnet: true, + logLevel: "WARN", + chains: [hardhat], +}); diff --git a/packages/sdk/test/utils/configurePublicClients.test.ts b/packages/sdk/test/utils/configurePublicClients.test.ts new file mode 100644 index 0000000..c7d049c --- /dev/null +++ b/packages/sdk/test/utils/configurePublicClients.test.ts @@ -0,0 +1,46 @@ +import { arbitrum, mainnet, optimism, polygon } from "viem/chains"; +import { describe, expect, test } from "vitest"; +import { configurePublicClients } from "../../src"; + +const chains = [...[mainnet, optimism, polygon, arbitrum]]; + +const webSocketArgs: Parameters = [ + chains, + undefined, + { + [mainnet.id]: "wss://eth-mainnet.g.alchemy.com/v2/123abc123abc", + [optimism.id]: "wss://opt-mainnet.g.alchemy.com/v2/123abc123abc", + [polygon.id]: "wss://polygon-mainnet.g.alchemy.com/v2/123abc123abc", + [arbitrum.id]: "wss://arb-mainnet.g.alchemy.com/v2/123abc123abc", + }, +]; + +const httpArgs: Parameters = [ + chains, + undefined, + { + [mainnet.id]: "https://eth-mainnet.g.alchemy.com/v2/123abc123abc", + [optimism.id]: "https://opt-mainnet.g.alchemy.com/v2/123abc123abc", + [polygon.id]: "https://polygon-mainnet.g.alchemy.com/v2/123abc123abc", + [arbitrum.id]: "https://arb-mainnet.g.alchemy.com/v2/123abc123abc", + }, +]; + +const webSocketClientsMap = configurePublicClients(...webSocketArgs); +const httpClientsMap = configurePublicClients(...httpArgs); + +describe("Initializes Clients correctly", () => { + test("Resolves web socket url as expected", () => { + const mainnetTransport = webSocketClientsMap.get(mainnet.id); + expect(mainnetTransport).to.not.be.undefined; + const transportType = mainnetTransport?.transport.type; + expect(transportType).toBe("webSocket"); + }); + + test("Resolves http url as expected", () => { + const mainnetTransport = httpClientsMap.get(mainnet.id); + expect(mainnetTransport).to.not.be.undefined; + const transportType = mainnetTransport?.transport.type; + expect(transportType).toBe("http"); + }); +}); diff --git a/packages/sdk/test/utils/logger.test.ts b/packages/sdk/test/utils/logger.test.ts index 26d8887..971d488 100644 --- a/packages/sdk/test/utils/logger.test.ts +++ b/packages/sdk/test/utils/logger.test.ts @@ -1,30 +1,23 @@ import { expect, test, vi } from "vitest"; -import { AcrossClient } from "../../src/client"; -import { hardhat } from "viem/chains"; - -const client = AcrossClient.create({ - useTestnet: true, - logLevel: "WARN", - chains: [hardhat], -}); +import { testSDK } from "./_utils"; test("Higher severity is logged", () => { const consoleLogSpy = vi.spyOn(console, "log"); - client.logger.error("Should be logged"); + testSDK.logger.error("Should be logged"); expect(consoleLogSpy).toHaveBeenCalled(); }); test("Equal severity is logged", () => { const consoleLogSpy = vi.spyOn(console, "log"); - client.logger.warn("Should be logged"); + testSDK.logger.warn("Should be logged"); expect(consoleLogSpy).toHaveBeenCalled(); }); test("Lower severity is not logged", () => { const consoleLogSpy = vi.spyOn(console, "log"); - client.logger.debug("Should not be logged"); + testSDK.logger.debug("Should not be logged"); expect(consoleLogSpy).not.toHaveBeenCalled(); });