UNPKG

@renegade-fi/core

Version:
133 lines 5.63 kB
import invariant from "tiny-invariant"; import { http, createPublicClient } from "viem"; import { arbitrumSepolia } from "viem/chains"; import { persist, subscribeWithSelector } from "zustand/middleware"; import { createStore } from "zustand/vanilla"; import { createStorage, noopStorage } from "./createStorage.js"; import { AuthType } from "./utils/websocket.js"; export function createConfig(parameters) { const { relayerUrl, priceReporterUrl, httpPort = 3000, pollingInterval = 5000, ssr, storage = createStorage({ storage: typeof window !== "undefined" && window.localStorage ? window.localStorage : noopStorage, }), useInsecureTransport = false, viemClient = createPublicClient({ chain: arbitrumSepolia, transport: http(), }), websocketPort = 4000, adminKey, } = parameters; invariant(parameters.utils, "Utils must be provided by the package if not supplied by the user."); ///////////////////////////////////////////////////////////////////////////////////////////////// // Create store ///////////////////////////////////////////////////////////////////////////////////////////////// function getInitialState() { return { seed: undefined, chainId: undefined, status: "disconnected", id: undefined, }; } const store = createStore(subscribeWithSelector( // only use persist middleware if storage exists storage ? persist(getInitialState, { name: "store", partialize(state) { // Only persist "critical" store properties to preserve storage size. return { id: state.id, seed: state.seed, chainId: state.chainId, status: state.status, }; }, skipHydration: ssr, storage: storage, }) : getInitialState)); return { utils: parameters.utils, renegadeKeyType: "internal", storage, relayerUrl, priceReporterUrl, darkPoolAddress: parameters.darkPoolAddress, getBaseUrl: (route = "") => { const protocol = useInsecureTransport || parameters.relayerUrl.includes("localhost") ? "http" : "https"; const baseUrl = parameters.relayerUrl.includes("localhost") ? `127.0.0.1:${httpPort}/v0` : `${parameters.relayerUrl}:${httpPort}/v0`; const formattedRoute = route.startsWith("/") ? route : `/${route}`; return `${protocol}://${baseUrl}${formattedRoute}`; }, getPriceReporterBaseUrl: () => { const baseUrl = parameters.priceReporterUrl.includes("localhost") ? `ws://127.0.0.1:${websocketPort}/` : `wss://${parameters.priceReporterUrl}:${websocketPort}/`; return baseUrl; }, getPriceReporterHTTPBaseUrl: (route = "") => { const baseUrl = parameters.priceReporterUrl.includes("localhost") ? `http://127.0.0.1:${httpPort}` : `https://${parameters.priceReporterUrl}:${httpPort}`; const formattedRoute = route.startsWith("/") ? route : `/${route}`; return `${baseUrl}${formattedRoute}`; }, getWebsocketBaseUrl: () => { const protocol = useInsecureTransport || parameters.relayerUrl.includes("localhost") ? "ws" : "wss"; const baseUrl = parameters.relayerUrl.includes("localhost") ? `127.0.0.1:${websocketPort}` : `${parameters.relayerUrl}:${websocketPort}`; return `${protocol}://${baseUrl}`; }, getSymmetricKey(type) { invariant(parameters.utils, "Utils are required"); if (type === AuthType.Admin) { invariant(parameters.adminKey, "Admin key is required"); const symmetricKey = parameters.utils.b64_to_hex_hmac_key(parameters.adminKey); invariant(symmetricKey, "Admin key is required"); return symmetricKey; } const seed = store.getState().seed; invariant(seed, "Seed is required"); return parameters.utils.get_symmetric_key(seed); }, pollingInterval, get state() { return store.getState(); }, setState(value) { let newState; if (typeof value === "function") newState = value(store.getState()); else newState = value; // Reset state if it got set to something not matching the base state const initialState = getInitialState(); if (typeof newState !== "object") newState = initialState; const isCorrupt = Object.keys(initialState).some((x) => !(x in newState)); if (isCorrupt) newState = initialState; store.setState(newState, true); }, subscribe(selector, listener, options) { return store.subscribe(selector, listener, options ? { ...options, fireImmediately: options.emitImmediately } : undefined); }, viemClient, adminKey, _internal: { store, ssr: Boolean(ssr), }, chainId: parameters.chainId, }; } // The type of keychain a config is using export const keyTypes = { EXTERNAL: "external", INTERNAL: "internal", NONE: "none", }; //# sourceMappingURL=createConfig.js.map