@otim/utils 0.0.12 → 0.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/wallet/wagmi/config.ts"],"mappings":";;;;;AAkBA;;;iBAAgB,gBAAA,CAAA,aAA8B,KAAA,KAAU,KAAA;;AA6HxD;;;cAAa,UAAA,EAAY,sBAAA;;AAWzB;;;cAAa,YAAA,EAAc,UAAA,QAAkB,YAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/wallet/wagmi/config.ts"],"mappings":";;;;;AAmBA;;;iBAAgB,gBAAA,CAAA,aAA8B,KAAA,KAAU,KAAA;;AA6HxD;;;cAAa,UAAA,EAAY,sBAAA;;AAWzB;;;cAAa,YAAA,EAAc,UAAA,QAAkB,YAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/wallet/wagmi/config.ts"],"mappings":";;;;;AAkBA;;;iBAAgB,gBAAA,CAAA,aAA8B,KAAA,KAAU,KAAA;;AA6HxD;;;cAAa,UAAA,EAAY,sBAAA;;AAWzB;;;cAAa,YAAA,EAAc,UAAA,QAAkB,YAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/wallet/wagmi/config.ts"],"mappings":";;;;;AAmBA;;;iBAAgB,gBAAA,CAAA,aAA8B,KAAA,KAAU,KAAA;;AA6HxD;;;cAAa,UAAA,EAAY,sBAAA;;AAWzB;;;cAAa,YAAA,EAAc,UAAA,QAAkB,YAAA"}
@@ -73,7 +73,7 @@ function createSafeStorage() {
73
73
  function getTransports() {
74
74
  const chains = (0, _otim_utils_chains.getAllChains)();
75
75
  const transports = {};
76
- for (const { chain } of chains) transports[chain.id] = (0, wagmi.http)();
76
+ for (const { chain } of chains) transports[chain.id] = (0, _otim_utils_chains.getChainTransport)(chain.id);
77
77
  return transports;
78
78
  }
79
79
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["baseSepolia","base","cookieStorage"],"sources":["../../../src/wallet/wagmi/config.ts"],"sourcesContent":["import type { ChainConfig } from \"@otim/utils/chains\";\nimport type { Chain } from \"viem\";\nimport type { CreateConfigParameters } from \"wagmi\";\n\nimport { base, baseSepolia } from \"viem/chains\";\nimport { cookieStorage, createConfig, createStorage, http } from \"wagmi\";\n\nimport {\n getAllChains,\n getMainnetChains,\n getTestnetChains,\n} from \"@otim/utils/chains\";\nimport { logger } from \"@otim/utils/helpers\";\n\n/**\n * Returns chains ordered by priority.\n * Base mainnet and Base Sepolia are prioritized first.\n */\nexport function getOrderedChains(): readonly [Chain, ...Chain[]] {\n const mainnets = getMainnetChains().map(\n (config: ChainConfig) => config.chain,\n );\n const testnets = getTestnetChains().map(\n (config: ChainConfig) => config.chain,\n );\n\n const filteredMainnets = mainnets.filter((chain: Chain) => chain.id !== 8453);\n const filteredTestnets = testnets.filter(\n (chain: Chain) => chain.id !== baseSepolia.id,\n );\n\n return [base, ...filteredMainnets, baseSepolia, ...filteredTestnets].filter(\n (chain): chain is Chain => chain !== undefined,\n ) as unknown as readonly [Chain, ...Chain[]];\n}\n\ninterface WagmiConnection {\n [key: string]: unknown;\n connector?: {\n [key: string]: unknown;\n id: string;\n };\n}\n\ninterface WagmiState {\n [key: string]: unknown;\n connections?: WagmiConnection[];\n state?: {\n [key: string]: unknown;\n connections?: WagmiConnection[];\n };\n}\n\n/**\n * Type guard to identify embedded wallet connections.\n * Embedded connections must be filtered from storage to prevent SSR issues.\n */\nfunction isEmbeddedConnection(connection: unknown): boolean {\n if (!connection || typeof connection !== \"object\") {\n return false;\n }\n\n const conn = connection as WagmiConnection;\n return conn.connector?.id === \"embedded\";\n}\n\nfunction filterEmbeddedConnections<T>(connections: T[]): T[] {\n return connections.filter((conn) => !isEmbeddedConnection(conn));\n}\n\n/**\n * Removes embedded wallet connections from Wagmi state.\n * This prevents SSR hydration mismatches when embedded wallet is used.\n */\nfunction sanitizeWagmiState(state: unknown): WagmiState {\n if (!state || typeof state !== \"object\") {\n return state as WagmiState;\n }\n\n const wagmiState = state as WagmiState;\n const sanitized = { ...wagmiState };\n\n if (Array.isArray(sanitized.connections)) {\n sanitized.connections = filterEmbeddedConnections(sanitized.connections);\n }\n\n if (\n sanitized.state &&\n typeof sanitized.state === \"object\" &&\n Array.isArray(sanitized.state.connections)\n ) {\n sanitized.state = {\n ...sanitized.state,\n connections: filterEmbeddedConnections(sanitized.state.connections),\n };\n }\n\n return sanitized;\n}\n\n/**\n * Creates SSR-safe cookie storage with embedded connection filtering.\n * Ensures embedded connections don't cause hydration mismatches.\n */\nfunction createSafeStorage() {\n const storage = cookieStorage;\n\n return {\n ...storage,\n setItem: (key: string, value: string) => {\n try {\n const parsed = JSON.parse(value);\n const sanitized = sanitizeWagmiState(parsed);\n return storage.setItem(key, JSON.stringify(sanitized));\n } catch (error) {\n logger.logError(error, {\n context: createSafeStorage.name,\n });\n return;\n }\n },\n };\n}\n\n/**\n * Creates HTTP transports for all supported chains.\n * Each chain gets its own transport instance.\n */\nfunction getTransports(): Record<number, ReturnType<typeof http>> {\n const chains = getAllChains();\n const transports: Record<number, ReturnType<typeof http>> = {};\n\n for (const { chain } of chains) {\n transports[chain.id] = http();\n }\n\n return transports;\n}\n\n/**\n * Base Wagmi configuration shared across client and server.\n * Includes SSR support and safe storage handling.\n */\nexport const baseConfig: CreateConfigParameters = {\n chains: getOrderedChains() as [Chain, ...Chain[]],\n ssr: true,\n storage: createStorage({ storage: createSafeStorage() }),\n transports: getTransports(),\n};\n\n/**\n * Server-side Wagmi configuration.\n * Used for SSR and server-side data fetching.\n */\nexport const serverConfig: ReturnType<typeof createConfig> =\n createConfig(baseConfig);\n"],"mappings":";;;;;;;;;;;;AAkBA,SAAgB,mBAAiD;CAC/D,MAAM,qDAA6B,CAAC,KACjC,WAAwB,OAAO,MACjC;CACD,MAAM,qDAA6B,CAAC,KACjC,WAAwB,OAAO,MACjC;CAED,MAAM,mBAAmB,SAAS,QAAQ,UAAiB,MAAM,OAAO,KAAK;CAC7E,MAAM,mBAAmB,SAAS,QAC/B,UAAiB,MAAM,OAAOA,wBAAY,GAC5C;AAED,QAAO;EAACC;EAAM,GAAG;EAAkBD;EAAa,GAAG;EAAiB,CAAC,QAClE,UAA0B,UAAU,OACtC;;;;;;AAwBH,SAAS,qBAAqB,YAA8B;AAC1D,KAAI,CAAC,cAAc,OAAO,eAAe,SACvC,QAAO;AAIT,QADa,WACD,WAAW,OAAO;;AAGhC,SAAS,0BAA6B,aAAuB;AAC3D,QAAO,YAAY,QAAQ,SAAS,CAAC,qBAAqB,KAAK,CAAC;;;;;;AAOlE,SAAS,mBAAmB,OAA4B;AACtD,KAAI,CAAC,SAAS,OAAO,UAAU,SAC7B,QAAO;CAIT,MAAM,YAAY,EAAE,GADD,OACgB;AAEnC,KAAI,MAAM,QAAQ,UAAU,YAAY,CACtC,WAAU,cAAc,0BAA0B,UAAU,YAAY;AAG1E,KACE,UAAU,SACV,OAAO,UAAU,UAAU,YAC3B,MAAM,QAAQ,UAAU,MAAM,YAAY,CAE1C,WAAU,QAAQ;EAChB,GAAG,UAAU;EACb,aAAa,0BAA0B,UAAU,MAAM,YAAY;EACpE;AAGH,QAAO;;;;;;AAOT,SAAS,oBAAoB;CAC3B,MAAM,UAAUE;AAEhB,QAAO;EACL,GAAG;EACH,UAAU,KAAa,UAAkB;AACvC,OAAI;IAEF,MAAM,YAAY,mBADH,KAAK,MAAM,MAAM,CACY;AAC5C,WAAO,QAAQ,QAAQ,KAAK,KAAK,UAAU,UAAU,CAAC;YAC/C,OAAO;AACd,+BAAO,SAAS,OAAO,EACrB,SAAS,kBAAkB,MAC5B,CAAC;AACF;;;EAGL;;;;;;AAOH,SAAS,gBAAyD;CAChE,MAAM,+CAAuB;CAC7B,MAAM,aAAsD,EAAE;AAE9D,MAAK,MAAM,EAAE,WAAW,OACtB,YAAW,MAAM,uBAAY;AAG/B,QAAO;;;;;;AAOT,MAAa,aAAqC;CAChD,QAAQ,kBAAkB;CAC1B,KAAK;CACL,kCAAuB,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACxD,YAAY,eAAe;CAC5B;;;;;AAMD,MAAa,uCACE,WAAW"}
1
+ {"version":3,"file":"index.js","names":["baseSepolia","base","cookieStorage"],"sources":["../../../src/wallet/wagmi/config.ts"],"sourcesContent":["import type { ChainConfig } from \"@otim/utils/chains\";\nimport type { Chain } from \"viem\";\nimport type { CreateConfigParameters, http } from \"wagmi\";\n\nimport { base, baseSepolia } from \"viem/chains\";\nimport { cookieStorage, createConfig, createStorage } from \"wagmi\";\n\nimport {\n getAllChains,\n getChainTransport,\n getMainnetChains,\n getTestnetChains,\n} from \"@otim/utils/chains\";\nimport { logger } from \"@otim/utils/helpers\";\n\n/**\n * Returns chains ordered by priority.\n * Base mainnet and Base Sepolia are prioritized first.\n */\nexport function getOrderedChains(): readonly [Chain, ...Chain[]] {\n const mainnets = getMainnetChains().map(\n (config: ChainConfig) => config.chain,\n );\n const testnets = getTestnetChains().map(\n (config: ChainConfig) => config.chain,\n );\n\n const filteredMainnets = mainnets.filter((chain: Chain) => chain.id !== 8453);\n const filteredTestnets = testnets.filter(\n (chain: Chain) => chain.id !== baseSepolia.id,\n );\n\n return [base, ...filteredMainnets, baseSepolia, ...filteredTestnets].filter(\n (chain): chain is Chain => chain !== undefined,\n ) as unknown as readonly [Chain, ...Chain[]];\n}\n\ninterface WagmiConnection {\n [key: string]: unknown;\n connector?: {\n [key: string]: unknown;\n id: string;\n };\n}\n\ninterface WagmiState {\n [key: string]: unknown;\n connections?: WagmiConnection[];\n state?: {\n [key: string]: unknown;\n connections?: WagmiConnection[];\n };\n}\n\n/**\n * Type guard to identify embedded wallet connections.\n * Embedded connections must be filtered from storage to prevent SSR issues.\n */\nfunction isEmbeddedConnection(connection: unknown): boolean {\n if (!connection || typeof connection !== \"object\") {\n return false;\n }\n\n const conn = connection as WagmiConnection;\n return conn.connector?.id === \"embedded\";\n}\n\nfunction filterEmbeddedConnections<T>(connections: T[]): T[] {\n return connections.filter((conn) => !isEmbeddedConnection(conn));\n}\n\n/**\n * Removes embedded wallet connections from Wagmi state.\n * This prevents SSR hydration mismatches when embedded wallet is used.\n */\nfunction sanitizeWagmiState(state: unknown): WagmiState {\n if (!state || typeof state !== \"object\") {\n return state as WagmiState;\n }\n\n const wagmiState = state as WagmiState;\n const sanitized = { ...wagmiState };\n\n if (Array.isArray(sanitized.connections)) {\n sanitized.connections = filterEmbeddedConnections(sanitized.connections);\n }\n\n if (\n sanitized.state &&\n typeof sanitized.state === \"object\" &&\n Array.isArray(sanitized.state.connections)\n ) {\n sanitized.state = {\n ...sanitized.state,\n connections: filterEmbeddedConnections(sanitized.state.connections),\n };\n }\n\n return sanitized;\n}\n\n/**\n * Creates SSR-safe cookie storage with embedded connection filtering.\n * Ensures embedded connections don't cause hydration mismatches.\n */\nfunction createSafeStorage() {\n const storage = cookieStorage;\n\n return {\n ...storage,\n setItem: (key: string, value: string) => {\n try {\n const parsed = JSON.parse(value);\n const sanitized = sanitizeWagmiState(parsed);\n return storage.setItem(key, JSON.stringify(sanitized));\n } catch (error) {\n logger.logError(error, {\n context: createSafeStorage.name,\n });\n return;\n }\n },\n };\n}\n\n/**\n * Creates HTTP transports for all supported chains.\n * Each chain gets its own transport instance.\n */\nfunction getTransports(): Record<number, ReturnType<typeof http>> {\n const chains = getAllChains();\n const transports: Record<number, ReturnType<typeof http>> = {};\n\n for (const { chain } of chains) {\n transports[chain.id] = getChainTransport(chain.id);\n }\n\n return transports;\n}\n\n/**\n * Base Wagmi configuration shared across client and server.\n * Includes SSR support and safe storage handling.\n */\nexport const baseConfig: CreateConfigParameters = {\n chains: getOrderedChains() as [Chain, ...Chain[]],\n ssr: true,\n storage: createStorage({ storage: createSafeStorage() }),\n transports: getTransports(),\n};\n\n/**\n * Server-side Wagmi configuration.\n * Used for SSR and server-side data fetching.\n */\nexport const serverConfig: ReturnType<typeof createConfig> =\n createConfig(baseConfig);\n"],"mappings":";;;;;;;;;;;;AAmBA,SAAgB,mBAAiD;CAC/D,MAAM,qDAA6B,CAAC,KACjC,WAAwB,OAAO,MACjC;CACD,MAAM,qDAA6B,CAAC,KACjC,WAAwB,OAAO,MACjC;CAED,MAAM,mBAAmB,SAAS,QAAQ,UAAiB,MAAM,OAAO,KAAK;CAC7E,MAAM,mBAAmB,SAAS,QAC/B,UAAiB,MAAM,OAAOA,wBAAY,GAC5C;AAED,QAAO;EAACC;EAAM,GAAG;EAAkBD;EAAa,GAAG;EAAiB,CAAC,QAClE,UAA0B,UAAU,OACtC;;;;;;AAwBH,SAAS,qBAAqB,YAA8B;AAC1D,KAAI,CAAC,cAAc,OAAO,eAAe,SACvC,QAAO;AAIT,QADa,WACD,WAAW,OAAO;;AAGhC,SAAS,0BAA6B,aAAuB;AAC3D,QAAO,YAAY,QAAQ,SAAS,CAAC,qBAAqB,KAAK,CAAC;;;;;;AAOlE,SAAS,mBAAmB,OAA4B;AACtD,KAAI,CAAC,SAAS,OAAO,UAAU,SAC7B,QAAO;CAIT,MAAM,YAAY,EAAE,GADD,OACgB;AAEnC,KAAI,MAAM,QAAQ,UAAU,YAAY,CACtC,WAAU,cAAc,0BAA0B,UAAU,YAAY;AAG1E,KACE,UAAU,SACV,OAAO,UAAU,UAAU,YAC3B,MAAM,QAAQ,UAAU,MAAM,YAAY,CAE1C,WAAU,QAAQ;EAChB,GAAG,UAAU;EACb,aAAa,0BAA0B,UAAU,MAAM,YAAY;EACpE;AAGH,QAAO;;;;;;AAOT,SAAS,oBAAoB;CAC3B,MAAM,UAAUE;AAEhB,QAAO;EACL,GAAG;EACH,UAAU,KAAa,UAAkB;AACvC,OAAI;IAEF,MAAM,YAAY,mBADH,KAAK,MAAM,MAAM,CACY;AAC5C,WAAO,QAAQ,QAAQ,KAAK,KAAK,UAAU,UAAU,CAAC;YAC/C,OAAO;AACd,+BAAO,SAAS,OAAO,EACrB,SAAS,kBAAkB,MAC5B,CAAC;AACF;;;EAGL;;;;;;AAOH,SAAS,gBAAyD;CAChE,MAAM,+CAAuB;CAC7B,MAAM,aAAsD,EAAE;AAE9D,MAAK,MAAM,EAAE,WAAW,OACtB,YAAW,MAAM,gDAAwB,MAAM,GAAG;AAGpD,QAAO;;;;;;AAOT,MAAa,aAAqC;CAChD,QAAQ,kBAAkB;CAC1B,KAAK;CACL,kCAAuB,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACxD,YAAY,eAAe;CAC5B;;;;;AAMD,MAAa,uCACE,WAAW"}
@@ -1,7 +1,7 @@
1
1
  import { logger } from "@otim/utils/helpers";
2
2
  import { base, baseSepolia } from "viem/chains";
3
- import { getAllChains, getMainnetChains, getTestnetChains } from "@otim/utils/chains";
4
- import { cookieStorage, createConfig, createStorage, http } from "wagmi";
3
+ import { getAllChains, getChainTransport, getMainnetChains, getTestnetChains } from "@otim/utils/chains";
4
+ import { cookieStorage, createConfig, createStorage } from "wagmi";
5
5
 
6
6
  //#region src/wallet/wagmi/config.ts
7
7
  /**
@@ -71,7 +71,7 @@ function createSafeStorage() {
71
71
  function getTransports() {
72
72
  const chains = getAllChains();
73
73
  const transports = {};
74
- for (const { chain } of chains) transports[chain.id] = http();
74
+ for (const { chain } of chains) transports[chain.id] = getChainTransport(chain.id);
75
75
  return transports;
76
76
  }
77
77
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/wallet/wagmi/config.ts"],"sourcesContent":["import type { ChainConfig } from \"@otim/utils/chains\";\nimport type { Chain } from \"viem\";\nimport type { CreateConfigParameters } from \"wagmi\";\n\nimport { base, baseSepolia } from \"viem/chains\";\nimport { cookieStorage, createConfig, createStorage, http } from \"wagmi\";\n\nimport {\n getAllChains,\n getMainnetChains,\n getTestnetChains,\n} from \"@otim/utils/chains\";\nimport { logger } from \"@otim/utils/helpers\";\n\n/**\n * Returns chains ordered by priority.\n * Base mainnet and Base Sepolia are prioritized first.\n */\nexport function getOrderedChains(): readonly [Chain, ...Chain[]] {\n const mainnets = getMainnetChains().map(\n (config: ChainConfig) => config.chain,\n );\n const testnets = getTestnetChains().map(\n (config: ChainConfig) => config.chain,\n );\n\n const filteredMainnets = mainnets.filter((chain: Chain) => chain.id !== 8453);\n const filteredTestnets = testnets.filter(\n (chain: Chain) => chain.id !== baseSepolia.id,\n );\n\n return [base, ...filteredMainnets, baseSepolia, ...filteredTestnets].filter(\n (chain): chain is Chain => chain !== undefined,\n ) as unknown as readonly [Chain, ...Chain[]];\n}\n\ninterface WagmiConnection {\n [key: string]: unknown;\n connector?: {\n [key: string]: unknown;\n id: string;\n };\n}\n\ninterface WagmiState {\n [key: string]: unknown;\n connections?: WagmiConnection[];\n state?: {\n [key: string]: unknown;\n connections?: WagmiConnection[];\n };\n}\n\n/**\n * Type guard to identify embedded wallet connections.\n * Embedded connections must be filtered from storage to prevent SSR issues.\n */\nfunction isEmbeddedConnection(connection: unknown): boolean {\n if (!connection || typeof connection !== \"object\") {\n return false;\n }\n\n const conn = connection as WagmiConnection;\n return conn.connector?.id === \"embedded\";\n}\n\nfunction filterEmbeddedConnections<T>(connections: T[]): T[] {\n return connections.filter((conn) => !isEmbeddedConnection(conn));\n}\n\n/**\n * Removes embedded wallet connections from Wagmi state.\n * This prevents SSR hydration mismatches when embedded wallet is used.\n */\nfunction sanitizeWagmiState(state: unknown): WagmiState {\n if (!state || typeof state !== \"object\") {\n return state as WagmiState;\n }\n\n const wagmiState = state as WagmiState;\n const sanitized = { ...wagmiState };\n\n if (Array.isArray(sanitized.connections)) {\n sanitized.connections = filterEmbeddedConnections(sanitized.connections);\n }\n\n if (\n sanitized.state &&\n typeof sanitized.state === \"object\" &&\n Array.isArray(sanitized.state.connections)\n ) {\n sanitized.state = {\n ...sanitized.state,\n connections: filterEmbeddedConnections(sanitized.state.connections),\n };\n }\n\n return sanitized;\n}\n\n/**\n * Creates SSR-safe cookie storage with embedded connection filtering.\n * Ensures embedded connections don't cause hydration mismatches.\n */\nfunction createSafeStorage() {\n const storage = cookieStorage;\n\n return {\n ...storage,\n setItem: (key: string, value: string) => {\n try {\n const parsed = JSON.parse(value);\n const sanitized = sanitizeWagmiState(parsed);\n return storage.setItem(key, JSON.stringify(sanitized));\n } catch (error) {\n logger.logError(error, {\n context: createSafeStorage.name,\n });\n return;\n }\n },\n };\n}\n\n/**\n * Creates HTTP transports for all supported chains.\n * Each chain gets its own transport instance.\n */\nfunction getTransports(): Record<number, ReturnType<typeof http>> {\n const chains = getAllChains();\n const transports: Record<number, ReturnType<typeof http>> = {};\n\n for (const { chain } of chains) {\n transports[chain.id] = http();\n }\n\n return transports;\n}\n\n/**\n * Base Wagmi configuration shared across client and server.\n * Includes SSR support and safe storage handling.\n */\nexport const baseConfig: CreateConfigParameters = {\n chains: getOrderedChains() as [Chain, ...Chain[]],\n ssr: true,\n storage: createStorage({ storage: createSafeStorage() }),\n transports: getTransports(),\n};\n\n/**\n * Server-side Wagmi configuration.\n * Used for SSR and server-side data fetching.\n */\nexport const serverConfig: ReturnType<typeof createConfig> =\n createConfig(baseConfig);\n"],"mappings":";;;;;;;;;;AAkBA,SAAgB,mBAAiD;CAC/D,MAAM,WAAW,kBAAkB,CAAC,KACjC,WAAwB,OAAO,MACjC;CACD,MAAM,WAAW,kBAAkB,CAAC,KACjC,WAAwB,OAAO,MACjC;CAED,MAAM,mBAAmB,SAAS,QAAQ,UAAiB,MAAM,OAAO,KAAK;CAC7E,MAAM,mBAAmB,SAAS,QAC/B,UAAiB,MAAM,OAAO,YAAY,GAC5C;AAED,QAAO;EAAC;EAAM,GAAG;EAAkB;EAAa,GAAG;EAAiB,CAAC,QAClE,UAA0B,UAAU,OACtC;;;;;;AAwBH,SAAS,qBAAqB,YAA8B;AAC1D,KAAI,CAAC,cAAc,OAAO,eAAe,SACvC,QAAO;AAIT,QADa,WACD,WAAW,OAAO;;AAGhC,SAAS,0BAA6B,aAAuB;AAC3D,QAAO,YAAY,QAAQ,SAAS,CAAC,qBAAqB,KAAK,CAAC;;;;;;AAOlE,SAAS,mBAAmB,OAA4B;AACtD,KAAI,CAAC,SAAS,OAAO,UAAU,SAC7B,QAAO;CAIT,MAAM,YAAY,EAAE,GADD,OACgB;AAEnC,KAAI,MAAM,QAAQ,UAAU,YAAY,CACtC,WAAU,cAAc,0BAA0B,UAAU,YAAY;AAG1E,KACE,UAAU,SACV,OAAO,UAAU,UAAU,YAC3B,MAAM,QAAQ,UAAU,MAAM,YAAY,CAE1C,WAAU,QAAQ;EAChB,GAAG,UAAU;EACb,aAAa,0BAA0B,UAAU,MAAM,YAAY;EACpE;AAGH,QAAO;;;;;;AAOT,SAAS,oBAAoB;CAC3B,MAAM,UAAU;AAEhB,QAAO;EACL,GAAG;EACH,UAAU,KAAa,UAAkB;AACvC,OAAI;IAEF,MAAM,YAAY,mBADH,KAAK,MAAM,MAAM,CACY;AAC5C,WAAO,QAAQ,QAAQ,KAAK,KAAK,UAAU,UAAU,CAAC;YAC/C,OAAO;AACd,WAAO,SAAS,OAAO,EACrB,SAAS,kBAAkB,MAC5B,CAAC;AACF;;;EAGL;;;;;;AAOH,SAAS,gBAAyD;CAChE,MAAM,SAAS,cAAc;CAC7B,MAAM,aAAsD,EAAE;AAE9D,MAAK,MAAM,EAAE,WAAW,OACtB,YAAW,MAAM,MAAM,MAAM;AAG/B,QAAO;;;;;;AAOT,MAAa,aAAqC;CAChD,QAAQ,kBAAkB;CAC1B,KAAK;CACL,SAAS,cAAc,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACxD,YAAY,eAAe;CAC5B;;;;;AAMD,MAAa,eACX,aAAa,WAAW"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/wallet/wagmi/config.ts"],"sourcesContent":["import type { ChainConfig } from \"@otim/utils/chains\";\nimport type { Chain } from \"viem\";\nimport type { CreateConfigParameters, http } from \"wagmi\";\n\nimport { base, baseSepolia } from \"viem/chains\";\nimport { cookieStorage, createConfig, createStorage } from \"wagmi\";\n\nimport {\n getAllChains,\n getChainTransport,\n getMainnetChains,\n getTestnetChains,\n} from \"@otim/utils/chains\";\nimport { logger } from \"@otim/utils/helpers\";\n\n/**\n * Returns chains ordered by priority.\n * Base mainnet and Base Sepolia are prioritized first.\n */\nexport function getOrderedChains(): readonly [Chain, ...Chain[]] {\n const mainnets = getMainnetChains().map(\n (config: ChainConfig) => config.chain,\n );\n const testnets = getTestnetChains().map(\n (config: ChainConfig) => config.chain,\n );\n\n const filteredMainnets = mainnets.filter((chain: Chain) => chain.id !== 8453);\n const filteredTestnets = testnets.filter(\n (chain: Chain) => chain.id !== baseSepolia.id,\n );\n\n return [base, ...filteredMainnets, baseSepolia, ...filteredTestnets].filter(\n (chain): chain is Chain => chain !== undefined,\n ) as unknown as readonly [Chain, ...Chain[]];\n}\n\ninterface WagmiConnection {\n [key: string]: unknown;\n connector?: {\n [key: string]: unknown;\n id: string;\n };\n}\n\ninterface WagmiState {\n [key: string]: unknown;\n connections?: WagmiConnection[];\n state?: {\n [key: string]: unknown;\n connections?: WagmiConnection[];\n };\n}\n\n/**\n * Type guard to identify embedded wallet connections.\n * Embedded connections must be filtered from storage to prevent SSR issues.\n */\nfunction isEmbeddedConnection(connection: unknown): boolean {\n if (!connection || typeof connection !== \"object\") {\n return false;\n }\n\n const conn = connection as WagmiConnection;\n return conn.connector?.id === \"embedded\";\n}\n\nfunction filterEmbeddedConnections<T>(connections: T[]): T[] {\n return connections.filter((conn) => !isEmbeddedConnection(conn));\n}\n\n/**\n * Removes embedded wallet connections from Wagmi state.\n * This prevents SSR hydration mismatches when embedded wallet is used.\n */\nfunction sanitizeWagmiState(state: unknown): WagmiState {\n if (!state || typeof state !== \"object\") {\n return state as WagmiState;\n }\n\n const wagmiState = state as WagmiState;\n const sanitized = { ...wagmiState };\n\n if (Array.isArray(sanitized.connections)) {\n sanitized.connections = filterEmbeddedConnections(sanitized.connections);\n }\n\n if (\n sanitized.state &&\n typeof sanitized.state === \"object\" &&\n Array.isArray(sanitized.state.connections)\n ) {\n sanitized.state = {\n ...sanitized.state,\n connections: filterEmbeddedConnections(sanitized.state.connections),\n };\n }\n\n return sanitized;\n}\n\n/**\n * Creates SSR-safe cookie storage with embedded connection filtering.\n * Ensures embedded connections don't cause hydration mismatches.\n */\nfunction createSafeStorage() {\n const storage = cookieStorage;\n\n return {\n ...storage,\n setItem: (key: string, value: string) => {\n try {\n const parsed = JSON.parse(value);\n const sanitized = sanitizeWagmiState(parsed);\n return storage.setItem(key, JSON.stringify(sanitized));\n } catch (error) {\n logger.logError(error, {\n context: createSafeStorage.name,\n });\n return;\n }\n },\n };\n}\n\n/**\n * Creates HTTP transports for all supported chains.\n * Each chain gets its own transport instance.\n */\nfunction getTransports(): Record<number, ReturnType<typeof http>> {\n const chains = getAllChains();\n const transports: Record<number, ReturnType<typeof http>> = {};\n\n for (const { chain } of chains) {\n transports[chain.id] = getChainTransport(chain.id);\n }\n\n return transports;\n}\n\n/**\n * Base Wagmi configuration shared across client and server.\n * Includes SSR support and safe storage handling.\n */\nexport const baseConfig: CreateConfigParameters = {\n chains: getOrderedChains() as [Chain, ...Chain[]],\n ssr: true,\n storage: createStorage({ storage: createSafeStorage() }),\n transports: getTransports(),\n};\n\n/**\n * Server-side Wagmi configuration.\n * Used for SSR and server-side data fetching.\n */\nexport const serverConfig: ReturnType<typeof createConfig> =\n createConfig(baseConfig);\n"],"mappings":";;;;;;;;;;AAmBA,SAAgB,mBAAiD;CAC/D,MAAM,WAAW,kBAAkB,CAAC,KACjC,WAAwB,OAAO,MACjC;CACD,MAAM,WAAW,kBAAkB,CAAC,KACjC,WAAwB,OAAO,MACjC;CAED,MAAM,mBAAmB,SAAS,QAAQ,UAAiB,MAAM,OAAO,KAAK;CAC7E,MAAM,mBAAmB,SAAS,QAC/B,UAAiB,MAAM,OAAO,YAAY,GAC5C;AAED,QAAO;EAAC;EAAM,GAAG;EAAkB;EAAa,GAAG;EAAiB,CAAC,QAClE,UAA0B,UAAU,OACtC;;;;;;AAwBH,SAAS,qBAAqB,YAA8B;AAC1D,KAAI,CAAC,cAAc,OAAO,eAAe,SACvC,QAAO;AAIT,QADa,WACD,WAAW,OAAO;;AAGhC,SAAS,0BAA6B,aAAuB;AAC3D,QAAO,YAAY,QAAQ,SAAS,CAAC,qBAAqB,KAAK,CAAC;;;;;;AAOlE,SAAS,mBAAmB,OAA4B;AACtD,KAAI,CAAC,SAAS,OAAO,UAAU,SAC7B,QAAO;CAIT,MAAM,YAAY,EAAE,GADD,OACgB;AAEnC,KAAI,MAAM,QAAQ,UAAU,YAAY,CACtC,WAAU,cAAc,0BAA0B,UAAU,YAAY;AAG1E,KACE,UAAU,SACV,OAAO,UAAU,UAAU,YAC3B,MAAM,QAAQ,UAAU,MAAM,YAAY,CAE1C,WAAU,QAAQ;EAChB,GAAG,UAAU;EACb,aAAa,0BAA0B,UAAU,MAAM,YAAY;EACpE;AAGH,QAAO;;;;;;AAOT,SAAS,oBAAoB;CAC3B,MAAM,UAAU;AAEhB,QAAO;EACL,GAAG;EACH,UAAU,KAAa,UAAkB;AACvC,OAAI;IAEF,MAAM,YAAY,mBADH,KAAK,MAAM,MAAM,CACY;AAC5C,WAAO,QAAQ,QAAQ,KAAK,KAAK,UAAU,UAAU,CAAC;YAC/C,OAAO;AACd,WAAO,SAAS,OAAO,EACrB,SAAS,kBAAkB,MAC5B,CAAC;AACF;;;EAGL;;;;;;AAOH,SAAS,gBAAyD;CAChE,MAAM,SAAS,cAAc;CAC7B,MAAM,aAAsD,EAAE;AAE9D,MAAK,MAAM,EAAE,WAAW,OACtB,YAAW,MAAM,MAAM,kBAAkB,MAAM,GAAG;AAGpD,QAAO;;;;;;AAOT,MAAa,aAAqC;CAChD,QAAQ,kBAAkB;CAC1B,KAAK;CACL,SAAS,cAAc,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACxD,YAAY,eAAe;CAC5B;;;;;AAMD,MAAa,eACX,aAAa,WAAW"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@otim/utils",
3
- "version": "0.0.12",
3
+ "version": "0.0.13",
4
4
  "description": "Shared utilities for Otim apps and packages",
5
5
  "keywords": [
6
6
  "otim",
@@ -220,8 +220,8 @@
220
220
  "viem": "^2.45.0",
221
221
  "wagmi": "^3.4.1",
222
222
  "ws": "^8.19.0",
223
- "@otim/builder": "0.0.0",
224
223
  "@otim/eslint-config": "0.0.1",
224
+ "@otim/builder": "0.0.0",
225
225
  "@otim/typescript-config": "0.0.1"
226
226
  },
227
227
  "engines": {