@otim/utils 0.0.11 → 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.
Files changed (103) hide show
  1. package/dist/api/index.d.mts +25 -25
  2. package/dist/api/index.d.mts.map +1 -1
  3. package/dist/api/index.d.ts +25 -25
  4. package/dist/api/index.d.ts.map +1 -1
  5. package/dist/api/index.js +7 -6
  6. package/dist/api/index.js.map +1 -1
  7. package/dist/api/index.mjs +6 -6
  8. package/dist/api/index.mjs.map +1 -1
  9. package/dist/{api-urls-DJcIKBCy.mjs → api-urls-B6RnXSRD.mjs} +1 -1
  10. package/dist/{api-urls-DJcIKBCy.mjs.map → api-urls-B6RnXSRD.mjs.map} +1 -1
  11. package/dist/{api-urls-B-GTEiT3.d.mts → api-urls-DacG9Q5P.d.mts} +1 -1
  12. package/dist/api-urls-DacG9Q5P.d.mts.map +1 -0
  13. package/dist/{api-urls-SKeIQMoZ.d.ts → api-urls-Dgxfefmy.d.ts} +1 -1
  14. package/dist/api-urls-Dgxfefmy.d.ts.map +1 -0
  15. package/dist/chains/index.d.mts +1459 -8804
  16. package/dist/chains/index.d.mts.map +1 -1
  17. package/dist/chains/index.d.ts +1459 -8804
  18. package/dist/chains/index.d.ts.map +1 -1
  19. package/dist/chains/index.js +32 -11
  20. package/dist/chains/index.js.map +1 -1
  21. package/dist/chains/index.mjs +23 -5
  22. package/dist/chains/index.mjs.map +1 -1
  23. package/dist/{chunk-kSYXY2_d.js → chunk-BE-pF4vm.js} +1 -1
  24. package/dist/{client-factory-C3A4RPdj.d.ts → client-factory-B12uLPUI.d.ts} +2 -2
  25. package/dist/client-factory-B12uLPUI.d.ts.map +1 -0
  26. package/dist/{client-factory-7xUSPC9I.mjs → client-factory-DY6UNuuV.mjs} +2 -2
  27. package/dist/{client-factory-7xUSPC9I.mjs.map → client-factory-DY6UNuuV.mjs.map} +1 -1
  28. package/dist/{client-factory-CTI_Nt35.js → client-factory-Drsy2vfF.js} +2 -2
  29. package/dist/{client-factory-CTI_Nt35.js.map → client-factory-Drsy2vfF.js.map} +1 -1
  30. package/dist/{client-factory-DOL0ZTWy.d.mts → client-factory-Dt4S4yZY.d.mts} +2 -2
  31. package/dist/client-factory-Dt4S4yZY.d.mts.map +1 -0
  32. package/dist/constants.d.mts.map +1 -1
  33. package/dist/constants.d.ts.map +1 -1
  34. package/dist/constants.js +1 -0
  35. package/dist/constants.js.map +1 -1
  36. package/dist/{date-gBac-Om9.mjs → date-BGw9dSBT.mjs} +1 -1
  37. package/dist/{date-gBac-Om9.mjs.map → date-BGw9dSBT.mjs.map} +1 -1
  38. package/dist/{date-CFzrYcjE.js → date-G7-DHP8t.js} +2 -2
  39. package/dist/{date-CFzrYcjE.js.map → date-G7-DHP8t.js.map} +1 -1
  40. package/dist/{defineProperty-DbMdhrDE.js → defineProperty-DXYX3Aus.js} +8 -8
  41. package/dist/{defineProperty-DzhmunJg.mjs → defineProperty-D_Wrem5y.mjs} +8 -8
  42. package/dist/helpers/index.d.mts +2 -2
  43. package/dist/helpers/index.d.mts.map +1 -1
  44. package/dist/helpers/index.d.ts +2 -2
  45. package/dist/helpers/index.d.ts.map +1 -1
  46. package/dist/helpers/index.js +69 -68
  47. package/dist/helpers/index.mjs +2 -2
  48. package/dist/instructions/index.d.mts.map +1 -1
  49. package/dist/instructions/index.d.ts.map +1 -1
  50. package/dist/instructions/index.js +2 -1
  51. package/dist/instructions/index.js.map +1 -1
  52. package/dist/payments/index.d.mts +4 -3
  53. package/dist/payments/index.d.mts.map +1 -1
  54. package/dist/payments/index.d.ts +4 -3
  55. package/dist/payments/index.d.ts.map +1 -1
  56. package/dist/payments/index.js +4 -3
  57. package/dist/payments/index.js.map +1 -1
  58. package/dist/payments/index.mjs +2 -2
  59. package/dist/schemas/index.d.mts +1 -1
  60. package/dist/schemas/index.d.ts +1 -1
  61. package/dist/schemas/index.js +4 -3
  62. package/dist/schemas/index.js.map +1 -1
  63. package/dist/schemas/index.mjs +2 -2
  64. package/dist/schemas/index.mjs.map +1 -1
  65. package/dist/server/index.d.mts +2 -3
  66. package/dist/server/index.d.mts.map +1 -1
  67. package/dist/server/index.d.ts +2 -3
  68. package/dist/server/index.d.ts.map +1 -1
  69. package/dist/server/index.js +2 -1
  70. package/dist/server/index.js.map +1 -1
  71. package/dist/server/index.mjs +2 -2
  72. package/dist/server/react.d.mts +1 -1
  73. package/dist/server/react.d.mts.map +1 -1
  74. package/dist/server/react.d.ts +1 -1
  75. package/dist/server/react.d.ts.map +1 -1
  76. package/dist/server/react.js +3 -2
  77. package/dist/server/react.js.map +1 -1
  78. package/dist/server/react.mjs +1 -1
  79. package/dist/{index-Bv0kUz4w.d.ts → user-51cHZRG2.d.ts} +8 -8
  80. package/dist/user-51cHZRG2.d.ts.map +1 -0
  81. package/dist/{index-DartTKk2.d.mts → user-WyDDDlcy.d.mts} +8 -8
  82. package/dist/user-WyDDDlcy.d.mts.map +1 -0
  83. package/dist/wallet/wagmi/index.d.mts +0 -1
  84. package/dist/wallet/wagmi/index.d.mts.map +1 -1
  85. package/dist/wallet/wagmi/index.d.ts +0 -1
  86. package/dist/wallet/wagmi/index.d.ts.map +1 -1
  87. package/dist/wallet/wagmi/index.js +3 -2
  88. package/dist/wallet/wagmi/index.js.map +1 -1
  89. package/dist/wallet/wagmi/index.mjs +3 -3
  90. package/dist/wallet/wagmi/index.mjs.map +1 -1
  91. package/dist/{helpers-BNiSxjGq.mjs → zod-CFr-iyX9.mjs} +3 -3
  92. package/dist/zod-CFr-iyX9.mjs.map +1 -0
  93. package/dist/{helpers-DoC7Xl12.js → zod-CjftwcOJ.js} +4 -4
  94. package/dist/zod-CjftwcOJ.js.map +1 -0
  95. package/package.json +6 -6
  96. package/dist/api-urls-B-GTEiT3.d.mts.map +0 -1
  97. package/dist/api-urls-SKeIQMoZ.d.ts.map +0 -1
  98. package/dist/client-factory-C3A4RPdj.d.ts.map +0 -1
  99. package/dist/client-factory-DOL0ZTWy.d.mts.map +0 -1
  100. package/dist/helpers-BNiSxjGq.mjs.map +0 -1
  101. package/dist/helpers-DoC7Xl12.js.map +0 -1
  102. package/dist/index-Bv0kUz4w.d.ts.map +0 -1
  103. package/dist/index-DartTKk2.d.mts.map +0 -1
@@ -1,7 +1,9 @@
1
- const require_chunk = require('../chunk-kSYXY2_d.js');
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_chunk = require('../chunk-BE-pF4vm.js');
2
3
  const require_api_urls = require('../api-urls-Cd20DG4i.js');
3
- const require_helpers = require('../helpers-DoC7Xl12.js');
4
+ const require_zod = require('../zod-CjftwcOJ.js');
4
5
  let viem_chains = require("viem/chains");
6
+ let viem = require("viem");
5
7
 
6
8
  //#region src/chains/config/custom-chains.ts
7
9
  const pecorinoSignet = {
@@ -48,8 +50,6 @@ const supportedChains = {
48
50
  mainnet: viem_chains.mainnet,
49
51
  base: viem_chains.base,
50
52
  arbitrum: viem_chains.arbitrum,
51
- optimism: viem_chains.optimism,
52
- bsc: viem_chains.bsc,
53
53
  polygon: viem_chains.polygon
54
54
  },
55
55
  testnet: {
@@ -132,34 +132,34 @@ function isTestnetChain(chainId) {
132
132
  */
133
133
  const testnetTokenAddresses = {
134
134
  [viem_chains.sepolia.id]: {
135
- ETH: require_helpers.DEFAULT_ADDRESS,
135
+ ETH: require_zod.DEFAULT_ADDRESS,
136
136
  WETH: "0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14",
137
137
  USDC: "0x1c7d4b196cb0c7b01d743fbc6116a902379c7238",
138
138
  USDT: "0xaa8e23fb1079ea71e0a56f48a2aa51851d8433d0"
139
139
  },
140
140
  [viem_chains.baseSepolia.id]: {
141
- ETH: require_helpers.DEFAULT_ADDRESS,
141
+ ETH: require_zod.DEFAULT_ADDRESS,
142
142
  WETH: "0x4200000000000000000000000000000000000006",
143
143
  USDC: "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
144
144
  USDT: "0x323e78f944A9a1FcF3a10efcC5319DBb0bB6e673"
145
145
  },
146
146
  [viem_chains.bscTestnet.id]: {
147
- BNB: require_helpers.DEFAULT_ADDRESS,
147
+ BNB: require_zod.DEFAULT_ADDRESS,
148
148
  WBNB: "0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd",
149
149
  USDC: "0x64544969ed7EBf5f083679233325356EbE738930"
150
150
  },
151
151
  [viem_chains.polygonAmoy.id]: {
152
- POL: require_helpers.DEFAULT_ADDRESS,
152
+ POL: require_zod.DEFAULT_ADDRESS,
153
153
  WMATIC: "0x360ad4f9a9A8EFe9A8DCB5f461c4Cc1047E1Dcf9",
154
154
  USDC: "0x41E94Eb019C0762f9Bfcf9Fb1E58725BfB0e7582"
155
155
  },
156
156
  [viem_chains.unichain.id]: {
157
- ETH: require_helpers.DEFAULT_ADDRESS,
157
+ ETH: require_zod.DEFAULT_ADDRESS,
158
158
  WETH: "0x4200000000000000000000000000000000000006",
159
159
  USDC: "0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA"
160
160
  },
161
- [pecorinoSignet.id]: { USD: require_helpers.DEFAULT_ADDRESS },
162
- [pecorinoHost.id]: { ETH: require_helpers.DEFAULT_ADDRESS }
161
+ [pecorinoSignet.id]: { USD: require_zod.DEFAULT_ADDRESS },
162
+ [pecorinoHost.id]: { ETH: require_zod.DEFAULT_ADDRESS }
163
163
  };
164
164
  function getTestnetTokenAddresses(chainId) {
165
165
  return testnetTokenAddresses[chainId] || {};
@@ -3483,6 +3483,25 @@ function isStablecoin(symbol) {
3483
3483
  return symbol.every((s) => stablecoinSymbols.includes(s));
3484
3484
  }
3485
3485
 
3486
+ //#endregion
3487
+ //#region src/chains/transport.ts
3488
+ /**
3489
+ * Default custom RPC URL overrides per chain ID.
3490
+ * Used by {@link getChainTransport} when no caller-provided override exists.
3491
+ */
3492
+ const customRpcUrls = { [viem_chains.polygon.id]: "https://polygon.drpc.org" };
3493
+ /**
3494
+ * Returns an HTTP transport for the given chain.
3495
+ * Resolves the RPC URL in priority order:
3496
+ * 1. Caller-provided `overrides`
3497
+ * 2. {@link customRpcUrls} defaults
3498
+ * 3. viem's built-in public RPC (bare `http()`)
3499
+ */
3500
+ function getChainTransport(chainId, overrides) {
3501
+ const rpcUrl = overrides?.[chainId] ?? customRpcUrls[chainId];
3502
+ return rpcUrl ? (0, viem.http)(rpcUrl) : (0, viem.http)();
3503
+ }
3504
+
3486
3505
  //#endregion
3487
3506
  //#region src/chains/lambda/chain-mapping.ts
3488
3507
  /**
@@ -3639,6 +3658,7 @@ exports.chainById = chainById;
3639
3658
  exports.chainIdToLambdaId = chainIdToLambdaId;
3640
3659
  exports.chainMetadata = chainMetadata;
3641
3660
  exports.createTokenMaps = createTokenMaps;
3661
+ exports.customRpcUrls = customRpcUrls;
3642
3662
  exports.filterTokens = filterTokens;
3643
3663
  exports.getAllChains = getAllChains;
3644
3664
  exports.getChainById = getChainById;
@@ -3649,6 +3669,7 @@ exports.getChainMetadata = getChainMetadata;
3649
3669
  exports.getChainToken = getChainToken;
3650
3670
  exports.getChainTokenByAddress = getChainTokenByAddress;
3651
3671
  exports.getChainTokens = getChainTokens;
3672
+ exports.getChainTransport = getChainTransport;
3652
3673
  exports.getDefaultChain = getDefaultChain;
3653
3674
  exports.getDefaultChainId = getDefaultChainId;
3654
3675
  exports.getLambdaChainIds = getLambdaChainIds;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["OtimEnvironment","base","baseSepolia","mainnet","base","arbitrum","optimism","bsc","unichain","polygon","sepolia","baseSepolia","sepolia","DEFAULT_ADDRESS","baseSepolia","bscTestnet","polygonAmoy","unichain","mainnet","ethereumTokens","base","baseTokens","arbitrum","arbitrumTokens","optimism","optimismTokens","bsc","bscTokens","polygon","polygonTokens","mainnet","base","arbitrum","optimism","bsc","polygon","avalanche","unichain","sepolia","baseSepolia","polygonAmoy"],"sources":["../../src/chains/config/custom-chains.ts","../../src/chains/config/all-chains.ts","../../src/chains/config/mainnet-chains.ts","../../src/chains/config/testnet-chains.ts","../../src/chains/tokens/testnet-token-addresses.ts","../../src/chains/tokens/testnet-token-metadata.ts","../../src/chains/tokens/arbitrum-token-list.json","../../src/chains/tokens/base-token-list.json","../../src/chains/tokens/bsc-token-list.json","../../src/chains/tokens/ethereum-token-list.json","../../src/chains/tokens/optimism-token-list.json","../../src/chains/tokens/polygon-token-list.json","../../src/chains/tokens/token-lists.ts","../../src/chains/tokens/chain-tokens.ts","../../src/chains/config/supported-chains.ts","../../src/chains/utils/filter-tokens.ts","../../src/chains/utils/token-maps.ts","../../src/chains/utils/stablecoin.ts","../../src/chains/lambda/chain-mapping.ts","../../src/chains/config/chain-metadata.ts"],"sourcesContent":["import type { Chain } from \"viem/chains\";\n\nexport const pecorinoSignet = {\n id: 14174,\n name: \"Pecorino Signet\",\n nativeCurrency: {\n decimals: 18,\n name: \"USD\",\n symbol: \"USD\",\n },\n rpcUrls: {\n default: { http: [\"https://rpc.pecorino.signet.sh/\"] },\n public: { http: [\"https://rpc.pecorino.signet.sh/\"] },\n },\n blockExplorers: {\n default: {\n name: \"Pecorino Signet Explorer\",\n url: \"https://explorer.pecorino.signet.sh/\",\n },\n },\n testnet: true,\n} as const satisfies Chain;\n\nexport const pecorinoHost = {\n id: 3151908,\n name: \"Pecorino Host\",\n nativeCurrency: {\n decimals: 18,\n name: \"ETH\",\n symbol: \"ETH\",\n },\n rpcUrls: {\n default: { http: [\"https://host-rpc.pecorino.signet.sh/\"] },\n public: { http: [\"https://host-rpc.pecorino.signet.sh/\"] },\n },\n blockExplorers: {\n default: {\n name: \"Pecorino Host Explorer\",\n url: \"https://explorer-host.pecorino.signet.sh/\",\n },\n },\n testnet: true,\n} as const satisfies Chain;\n","import {\n arbitrum,\n base,\n baseSepolia,\n bsc,\n mainnet,\n optimism,\n polygon,\n polygonAmoy,\n sepolia,\n unichain,\n} from \"viem/chains\";\n\nimport { pecorinoHost, pecorinoSignet } from \"./custom-chains\";\nimport { OtimEnvironment } from \"../../config/api-urls\";\n\nexport const supportedChains = {\n mainnet: {\n mainnet,\n base,\n arbitrum,\n optimism,\n bsc,\n polygon,\n },\n testnet: {\n sepolia,\n baseSepolia,\n },\n} as const;\n\nexport const allSupportedChains = {\n mainnet,\n base,\n arbitrum,\n optimism,\n bsc,\n unichain,\n polygon,\n sepolia,\n baseSepolia,\n polygonAmoy,\n pecorinoHost,\n pecorinoSignet,\n} as const;\n\n/**\n * Get the default chain ID based on the provided environment.\n * Production: Base mainnet (8453)\n * Local/Sandbox: Base Sepolia (84532)\n *\n * @param environment - The Otim environment (local | sandbox | production)\n * @returns The default chain ID for the environment\n */\nexport const getDefaultChainId = (environment: OtimEnvironment): number => {\n return environment === OtimEnvironment.Production ? base.id : baseSepolia.id;\n};\n\n/**\n * Get the default chain based on the provided environment.\n * Production: Base mainnet\n * Local/Sandbox: Base Sepolia\n *\n * @param environment - The Otim environment (local | sandbox | production)\n * @returns The default chain for the environment\n */\nexport const getDefaultChain = (environment: OtimEnvironment) => {\n return environment === OtimEnvironment.Production ? base : baseSepolia;\n};\n\nexport type SupportedChainName = keyof typeof allSupportedChains;\nexport type MainnetChainName = keyof typeof supportedChains.mainnet;\nexport type TestnetChainName = keyof typeof supportedChains.testnet;\n","import type { Optional } from \"@otim/utils/helpers\";\nimport type { Chain } from \"viem/chains\";\n\nimport {\n arbitrum,\n base,\n bsc,\n mainnet,\n optimism,\n polygon,\n unichain,\n} from \"viem/chains\";\n\nexport const mainnetChains = [\n mainnet,\n base,\n arbitrum,\n optimism,\n bsc,\n unichain,\n polygon,\n] as const;\n\nexport const mainnetChainsById = new Map<number, Chain>(\n mainnetChains.map((chain) => [chain.id, chain]),\n);\n\nexport function getMainnetChain(chainId: number): Optional<Chain> {\n return mainnetChainsById.get(chainId);\n}\n\nexport function isMainnetChain(chainId: number): boolean {\n return mainnetChainsById.has(chainId);\n}\n","import type { Optional } from \"@otim/utils/helpers\";\nimport type { Chain } from \"viem/chains\";\n\nimport {\n baseSepolia,\n sepolia,\n} from \"viem/chains\";\n\nexport const testnetChains = [\n sepolia,\n baseSepolia,\n] as const;\n\nexport const testnetChainsById = new Map<number, Chain>(\n testnetChains.map((chain) => [chain.id, chain]),\n);\n\nexport function getTestnetChain(chainId: number): Optional<Chain> {\n return testnetChainsById.get(chainId);\n}\n\nexport function isTestnetChain(chainId: number): boolean {\n return testnetChainsById.has(chainId);\n}\n","import type { ChainTokenAddresses } from \"../types\";\nimport type { Optional } from \"@otim/utils/helpers\";\nimport type { Address } from \"@otim/utils/schemas\";\n\nimport {\n baseSepolia,\n bscTestnet,\n polygonAmoy,\n sepolia,\n unichain,\n} from \"viem/chains\";\n\nimport { DEFAULT_ADDRESS } from \"../../helpers\";\nimport { pecorinoHost, pecorinoSignet } from \"../config/custom-chains\";\n\n/**\n * Token addresses for testnets and custom chains.\n * Mainnets use JSON token lists (see token-lists.ts).\n */\nexport const testnetTokenAddresses: Record<number, ChainTokenAddresses> = {\n // TESTNETS\n [sepolia.id]: {\n ETH: DEFAULT_ADDRESS,\n WETH: \"0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14\",\n USDC: \"0x1c7d4b196cb0c7b01d743fbc6116a902379c7238\",\n USDT: \"0xaa8e23fb1079ea71e0a56f48a2aa51851d8433d0\",\n },\n [baseSepolia.id]: {\n ETH: DEFAULT_ADDRESS,\n WETH: \"0x4200000000000000000000000000000000000006\",\n USDC: \"0x036CbD53842c5426634e7929541eC2318f3dCF7e\",\n USDT: \"0x323e78f944A9a1FcF3a10efcC5319DBb0bB6e673\",\n },\n [bscTestnet.id]: {\n BNB: DEFAULT_ADDRESS,\n WBNB: \"0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd\",\n USDC: \"0x64544969ed7EBf5f083679233325356EbE738930\",\n },\n [polygonAmoy.id]: {\n POL: DEFAULT_ADDRESS,\n WMATIC: \"0x360ad4f9a9A8EFe9A8DCB5f461c4Cc1047E1Dcf9\",\n USDC: \"0x41E94Eb019C0762f9Bfcf9Fb1E58725BfB0e7582\",\n },\n // CUSTOM CHAINS\n [unichain.id]: {\n ETH: DEFAULT_ADDRESS,\n WETH: \"0x4200000000000000000000000000000000000006\",\n USDC: \"0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA\",\n },\n [pecorinoSignet.id]: {\n USD: DEFAULT_ADDRESS,\n },\n [pecorinoHost.id]: {\n ETH: DEFAULT_ADDRESS,\n },\n};\n\nexport function getTestnetTokenAddresses(chainId: number): ChainTokenAddresses {\n return testnetTokenAddresses[chainId] || {};\n}\n\nexport function getTestnetTokenAddress(\n chainId: number,\n symbol: string,\n): Optional<Address> {\n const addresses = getTestnetTokenAddresses(chainId);\n return addresses[symbol.toUpperCase()];\n}\n\nexport function isTestnetTokenSupported(\n chainId: number,\n symbol: string,\n): boolean {\n return getTestnetTokenAddress(chainId, symbol) !== undefined;\n}\n\n\n","import type { TokenMetadata } from \"../types\";\nimport type { Optional } from \"@otim/utils/helpers\";\n\n/**\n * Token metadata for testnets and custom chains.\n * Mainnets use JSON token lists (see token-lists.ts).\n */\nexport const testnetTokenMetadata: Record<string, TokenMetadata> = {\n USD: {\n name: \"US Dollar\",\n symbol: \"USD\",\n decimals: 18,\n logoURI: \"/tokens/usd.svg\",\n },\n ETH: {\n name: \"Ethereum\",\n symbol: \"ETH\",\n decimals: 18,\n logoURI: \"/tokens/eth.svg\",\n },\n WETH: {\n name: \"Wrapped Ether\",\n symbol: \"WETH\",\n decimals: 18,\n logoURI: \"/tokens/eth.svg\",\n type: \"ERC20\",\n },\n USDC: {\n name: \"USDC\",\n symbol: \"USDC\",\n decimals: 6,\n logoURI:\n \"https://assets-cdn.trustwallet.com/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png\",\n type: \"ERC20\",\n },\n USDT: {\n name: \"Tether USD\",\n symbol: \"USDT\",\n decimals: 6,\n logoURI:\n \"https://assets-cdn.trustwallet.com/blockchains/ethereum/assets/0xdAC17F958D2ee523a2206206994597C13D831ec7/logo.png\",\n type: \"ERC20\",\n },\n BNB: {\n name: \"BNB\",\n symbol: \"BNB\",\n decimals: 18,\n logoURI: \"/tokens/eth.svg\", // TODO: Add BNB logo\n type: \"ERC20\",\n },\n WBNB: {\n name: \"Wrapped BNB\",\n symbol: \"WBNB\",\n decimals: 18,\n logoURI: \"/tokens/eth.svg\", // TODO: Add BNB logo\n type: \"ERC20\",\n },\n POL: {\n name: \"Polygon\",\n symbol: \"POL\",\n decimals: 18,\n logoURI: \"/tokens/eth.svg\", // TODO: Add POL logo\n type: \"ERC20\",\n },\n WPOL: {\n name: \"Wrapped Polygon\",\n symbol: \"WPOL\",\n decimals: 18,\n logoURI: \"/tokens/eth.svg\", // TODO: Add POL logo\n type: \"ERC20\",\n },\n WMATIC: {\n name: \"Wrapped MATIC\",\n symbol: \"WMATIC\",\n decimals: 18,\n logoURI: \"/tokens/eth.svg\", // TODO: Add MATIC logo\n type: \"ERC20\",\n },\n};\n\nexport function getTestnetTokenMetadata(symbol: string): Optional<TokenMetadata> {\n return testnetTokenMetadata[symbol.toUpperCase()];\n}\n\n\n","","","","","","","import type { ChainToken } from \"../types\";\nimport type { Optional } from \"@otim/utils/helpers\";\nimport type { Address } from \"@otim/utils/schemas\";\n\nimport {\n arbitrum,\n base,\n bsc,\n mainnet,\n optimism,\n polygon,\n} from \"viem/chains\";\n\n// Static imports - these will be inlined at build time by the bundler\nimport arbitrumTokens from \"./arbitrum-token-list.json\";\nimport baseTokens from \"./base-token-list.json\";\nimport bscTokens from \"./bsc-token-list.json\";\nimport ethereumTokens from \"./ethereum-token-list.json\";\nimport optimismTokens from \"./optimism-token-list.json\";\nimport polygonTokens from \"./polygon-token-list.json\";\n\n/**\n * Token data from CoinGecko-generated JSON files\n */\nexport interface TokenListEntry {\n chainId: number;\n address: string;\n symbol: string;\n name: string;\n coingeckoId: string;\n marketCapRank: number;\n logoUrl: string;\n decimals: number;\n}\n\n/**\n * Chain ID to token list mapping\n */\nconst CHAIN_TOKEN_LISTS: Record<number, TokenListEntry[]> = {\n [mainnet.id]: ethereumTokens as TokenListEntry[],\n [base.id]: baseTokens as TokenListEntry[],\n [arbitrum.id]: arbitrumTokens as TokenListEntry[],\n [optimism.id]: optimismTokens as TokenListEntry[],\n [bsc.id]: bscTokens as TokenListEntry[],\n [polygon.id]: polygonTokens as TokenListEntry[],\n};\n\n/**\n * Convert TokenListEntry to ChainToken format\n */\nfunction toChainToken(entry: TokenListEntry): ChainToken {\n // Decimals are always present in the JSON token lists\n const decimals = entry.decimals;\n \n return {\n chainId: entry.chainId,\n address: entry.address as Address,\n symbol: entry.symbol,\n name: entry.name,\n decimals,\n logoURI: entry.logoUrl,\n type: \"ERC20\",\n };\n}\n\n/**\n * Load token list for a specific chain\n */\nexport function loadTokenList(chainId: number): TokenListEntry[] {\n return CHAIN_TOKEN_LISTS[chainId] || [];\n}\n\n/**\n * Get token list as ChainToken[] for a specific chain\n */\nexport function getTokenListTokens(chainId: number): ChainToken[] {\n const entries = loadTokenList(chainId);\n return entries.map(toChainToken);\n}\n\n/**\n * Get a token from the token list by address\n */\nexport function getTokenListTokenByAddress(\n chainId: number,\n address: string,\n): Optional<ChainToken> {\n const entries = loadTokenList(chainId);\n const entry = entries.find(\n (t) => t.address.toLowerCase() === address.toLowerCase(),\n );\n return entry ? toChainToken(entry) : undefined;\n}\n\n/**\n * Get a token from the token list by symbol\n */\nexport function getTokenListTokenBySymbol(\n chainId: number,\n symbol: string,\n): Optional<ChainToken> {\n const entries = loadTokenList(chainId);\n const entry = entries.find(\n (t) => t.symbol.toUpperCase() === symbol.toUpperCase(),\n );\n return entry ? toChainToken(entry) : undefined;\n}\n\n/**\n * Get raw token list entries (with CoinGecko metadata)\n */\nexport function getTokenListEntries(chainId: number): TokenListEntry[] {\n return loadTokenList(chainId);\n}\n\n/**\n * Check if a chain has a token list available\n */\nexport function hasTokenList(chainId: number): boolean {\n return chainId in CHAIN_TOKEN_LISTS;\n}\n","import type { ChainToken } from \"../types\";\nimport type { Optional } from \"@otim/utils/helpers\";\n\nimport {\n getTestnetTokenAddress,\n getTestnetTokenAddresses,\n} from \"./testnet-token-addresses\";\nimport { getTestnetTokenMetadata } from \"./testnet-token-metadata\";\nimport {\n getTokenListTokenBySymbol,\n getTokenListTokens,\n hasTokenList,\n} from \"./token-lists\";\n\n/**\n * Get all tokens for a chain.\n * \n * Mainnets (Ethereum, Base, Arbitrum, Optimism, BSC, Polygon):\n * - Uses comprehensive JSON token lists (top 50 by market cap)\n * \n * Testnets and custom chains:\n * - Uses hardcoded token addresses and metadata\n */\nexport function getChainTokens(chainId: number): ChainToken[] {\n // Use JSON token lists for supported mainnets\n if (hasTokenList(chainId)) {\n return getTokenListTokens(chainId);\n }\n\n // Use testnet/custom chain system\n const addresses = getTestnetTokenAddresses(chainId);\n const tokens: ChainToken[] = [];\n\n for (const [symbol, address] of Object.entries(addresses)) {\n const metadata = getTestnetTokenMetadata(symbol);\n\n if (metadata && address) {\n tokens.push({ ...metadata, address, chainId });\n }\n }\n\n return tokens;\n}\n\nexport function getChainToken(\n chainId: number,\n symbol: string,\n): Optional<ChainToken> {\n const tokens = getChainTokens(chainId);\n return tokens.find(\n (token) => token.symbol.toUpperCase() === symbol.toUpperCase(),\n );\n}\n\nexport function getChainTokenByAddress(\n chainId: number,\n address: string,\n): Optional<ChainToken> {\n const tokens = getChainTokens(chainId);\n return tokens.find(\n (token) => token.address.toLowerCase() === address.toLowerCase(),\n );\n}\n\n/**\n * Get token address by symbol for a chain.\n * Works for both mainnets (from JSON lists) and testnets (from hardcoded addresses).\n */\nexport function getTokenAddress(\n chainId: number,\n symbol: string,\n): Optional<string> {\n // Try JSON lists first (mainnets)\n if (hasTokenList(chainId)) {\n const token = getTokenListTokenBySymbol(chainId, symbol);\n return token?.address;\n }\n\n // Fallback to testnet addresses\n return getTestnetTokenAddress(chainId, symbol);\n}\n\n/**\n * Get all token addresses for a chain as a symbol -> address mapping.\n * Compatible with the old tokenAddresses structure for backward compatibility.\n */\nexport function getTokenAddresses(\n chainId: number,\n): Record<string, string> {\n const tokens = getChainTokens(chainId);\n const addresses: Record<string, string> = {};\n\n for (const token of tokens) {\n addresses[token.symbol.toUpperCase()] = token.address;\n }\n\n return addresses;\n}\n","import type { ChainConfig } from \"../types\";\nimport type { Optional } from \"@otim/utils/helpers\";\nimport type { Chain } from \"viem/chains\";\n\nimport { mainnetChains } from \"./mainnet-chains\";\nimport { testnetChains } from \"./testnet-chains\";\nimport { getChainTokens } from \"../tokens/chain-tokens\";\n\nexport const allChains = [...mainnetChains, ...testnetChains] as const;\n\nexport type SupportedChainId = (typeof allChains)[number][\"id\"];\n\nexport const chainById = new Map<number, Chain>(\n allChains.map((chain) => [chain.id, chain]),\n);\n\nexport function getChainById(chainId: number): Optional<Chain> {\n return chainById.get(chainId);\n}\n\nexport function getChainConfig(chainId: number): Optional<ChainConfig> {\n const chain = getChainById(chainId);\n if (!chain) return undefined;\n\n return {\n chain,\n isTestnet: chain.testnet ?? false,\n tokens: getChainTokens(chain.id),\n };\n}\n\nexport function getMainnetChains(): ChainConfig[] {\n return mainnetChains.map((chain) => ({\n chain,\n isTestnet: false,\n tokens: getChainTokens(chain.id),\n }));\n}\n\nexport function getTestnetChains(): ChainConfig[] {\n return testnetChains.map((chain) => ({\n chain,\n isTestnet: true,\n tokens: getChainTokens(chain.id),\n }));\n}\n\nexport function getAllChains(): ChainConfig[] {\n return [...getMainnetChains(), ...getTestnetChains()];\n}\n\nexport function isSupportedChain(chainId: number): boolean {\n return chainById.has(chainId);\n}\n","import type { ChainToken } from \"../types\";\n\nexport function filterTokens(\n tokens: ChainToken[],\n allowedSymbols: string[],\n disabledSymbols: string[],\n): ChainToken[] {\n let result = tokens;\n\n if (disabledSymbols.length > 0) {\n result = result.filter(\n (token) => !disabledSymbols.includes(token.symbol.toUpperCase()),\n );\n }\n\n if (allowedSymbols && allowedSymbols.length > 0) {\n result = result.filter((token) =>\n allowedSymbols.includes(token.symbol.toUpperCase()),\n );\n }\n\n return result;\n}\n","import type { ChainToken } from \"../types\";\nimport type { Optional } from \"@otim/utils/helpers\";\n\nexport interface TokenMaps {\n byAddress: Map<string, ChainToken>;\n bySymbol: Map<string, ChainToken>;\n}\n\nexport function createTokenMaps(tokens: ChainToken[]): TokenMaps {\n const byAddress = new Map<string, ChainToken>();\n const bySymbol = new Map<string, ChainToken>();\n\n tokens.forEach((token) => {\n byAddress.set(token.address.toLowerCase(), token);\n bySymbol.set(token.symbol.toLowerCase(), token);\n });\n\n return { byAddress, bySymbol };\n}\n\nexport function getTokenByAddress(\n maps: TokenMaps,\n address: string,\n): Optional<ChainToken> {\n if (!address) return undefined;\n return maps.byAddress.get(address.toLowerCase());\n}\n\nexport function getTokenBySymbol(\n maps: TokenMaps,\n symbol: string,\n): Optional<ChainToken> {\n if (!symbol) return undefined;\n return maps.bySymbol.get(symbol.toLowerCase());\n}\n","/**\n * List of supported stablecoin symbols\n */\nconst stablecoinSymbols = [\"USDC\", \"USDT\"] as const;\n\n/**\n * Checks if a token symbol is a stablecoin\n * @param symbol - Token symbol to check (e.g., \"USDC\", \"ETH\")\n * @returns true if the symbol is a recognized stablecoin\n */\nexport function isStablecoin(symbol: string | string[]): boolean {\n if (typeof symbol === \"string\") {\n return stablecoinSymbols.includes(\n symbol as (typeof stablecoinSymbols)[number],\n );\n }\n\n return symbol.every((s) =>\n stablecoinSymbols.includes(s as (typeof stablecoinSymbols)[number]),\n );\n}\n","import type { Optional } from \"@otim/utils/helpers\";\n\n/**\n * Mapping between chain ID numbers (used internally by otim) and\n * Lambda API chain ID strings (used by Lambda's API endpoints).\n *\n * Lambda uses string identifiers for chains while we use numeric chain IDs\n * from viem/wagmi. This map provides bidirectional conversion.\n */\n\n/**\n * Map from numeric chain ID to Lambda chain ID string\n */\nexport const CHAIN_ID_TO_LAMBDA_ID: Record<number, string> = {\n /* Mainnet chains */\n 1: \"ethereum\",\n 8453: \"base\",\n 42161: \"arbitrum\",\n 10: \"optimism\",\n 56: \"binance-smart-chain\",\n 130: \"unichain\",\n 137: \"polygon\",\n} as const;\n\n/**\n * Map from Lambda chain ID string to numeric chain ID\n */\nexport const LAMBDA_ID_TO_CHAIN_ID: Record<string, number> = {\n ethereum: 1,\n base: 8453,\n arbitrum: 42161,\n optimism: 10,\n \"binance-smart-chain\": 56,\n unichain: 130,\n polygon: 137,\n} as const;\n\n/**\n * Convert a numeric chain ID to Lambda's chain ID string\n * @param chainId - The numeric chain ID\n * @returns The Lambda chain ID string, or undefined if not supported by Lambda\n */\n\nexport function chainIdToLambdaId(chainId: number): Optional<string> {\n return CHAIN_ID_TO_LAMBDA_ID[chainId];\n}\n\n/**\n * Convert a Lambda chain ID string to numeric chain ID\n * @param lambdaId - The Lambda chain ID string\n * @returns The numeric chain ID, or undefined if not recognized\n */\nexport function lambdaIdToChainId(lambdaId: string): Optional<number> {\n return LAMBDA_ID_TO_CHAIN_ID[lambdaId];\n}\n\n/**\n * Check if a chain ID is supported by Lambda\n * @param chainId - The numeric chain ID to check\n * @returns true if the chain is supported by Lambda\n */\nexport function isLambdaSupportedChain(chainId: number): boolean {\n return chainId in CHAIN_ID_TO_LAMBDA_ID;\n}\n\n/**\n * Get all chain IDs supported by Lambda\n * @returns Array of numeric chain IDs that are supported by Lambda\n */\nexport function getLambdaSupportedChainIds(): number[] {\n return Object.keys(CHAIN_ID_TO_LAMBDA_ID).map(Number);\n}\n\n/**\n * Get all Lambda chain ID strings\n * @returns Array of Lambda chain ID strings\n */\nexport function getLambdaChainIds(): string[] {\n return Object.values(CHAIN_ID_TO_LAMBDA_ID);\n}\n","import type { Optional } from \"@otim/utils/helpers\";\n\nimport {\n arbitrum,\n avalanche,\n base,\n baseSepolia,\n bsc,\n mainnet,\n optimism,\n polygon,\n polygonAmoy,\n sepolia,\n unichain,\n} from \"viem/chains\";\n\nimport { pecorinoHost, pecorinoSignet } from \"./custom-chains\";\n\nexport interface ChainMetadata {\n name: string;\n iconUrl?: string;\n // Add other chain metadata fields as needed\n}\n\n/**\n * Chain metadata including icon URLs and display names.\n * Icon URLs can be IPFS hashes or HTTP URLs.\n * \n * To get chain icon URLs, you can:\n * 1. Extract from Lambda portfolio API (chain_icon_url field)\n * 2. Use chain explorer APIs\n * 3. Use trusted sources like ChainList\n */\nexport const chainMetadata: Record<number, ChainMetadata> = {\n [mainnet.id]: {\n name: \"Ethereum\",\n iconUrl: \"https://static.lambda.p2p.org/chains/ethereum.png\",\n },\n [base.id]: {\n name: \"Base\",\n iconUrl: \"https://static.lambda.p2p.org/chains/base.png\",\n },\n [arbitrum.id]: {\n name: \"Arbitrum One\",\n iconUrl: \"https://static.lambda.p2p.org/chains/arbitrum.png\",\n },\n [optimism.id]: {\n name: \"OP Mainnet\",\n iconUrl: \"https://static.lambda.p2p.org/chains/optimism.png\",\n },\n [bsc.id]: {\n name: \"Binance Smart Chain\",\n iconUrl: \"https://static.lambda.p2p.org/chains/binance-smart-chain.png\",\n },\n [polygon.id]: {\n name: \"Polygon\",\n iconUrl: \"https://static.lambda.p2p.org/chains/polygon.png\",\n },\n [avalanche.id]: {\n name: \"Avalanche\",\n iconUrl: \"https://static.lambda.p2p.org/chains/avalanche.png\",\n },\n [unichain.id]: {\n name: \"Unichain\",\n iconUrl: \"https://static.lambda.p2p.org/chains/unichain.png\",\n },\n [sepolia.id]: {\n name: \"Sepolia\",\n },\n [baseSepolia.id]: {\n name: \"Base Sepolia\",\n },\n [polygonAmoy.id]: {\n name: \"Polygon Amoy\",\n },\n [pecorinoSignet.id]: {\n name: \"Pecorino Signet\",\n },\n [pecorinoHost.id]: {\n name: \"Pecorino Host\",\n },\n};\n\n/**\n * Get chain metadata by chain ID\n * @param chainId - The numeric chain ID\n * @returns Chain metadata or undefined if not found\n */\nexport function getChainMetadata(chainId: number): Optional<ChainMetadata> {\n return chainMetadata[chainId];\n}\n\n/**\n * Get chain icon URL by chain ID\n * @param chainId - The numeric chain ID\n * @returns Chain icon URL or undefined if not found\n */\nexport function getChainIconUrl(chainId: number): Optional<string> {\n return chainMetadata[chainId]?.iconUrl;\n}\n\n/**\n * Get chain display name by chain ID\n * @param chainId - The numeric chain ID\n * @returns Chain name or undefined if not found\n */\nexport function getChainDisplayName(chainId: number): Optional<string> {\n return chainMetadata[chainId]?.name;\n}\n\n"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
1
+ {"version":3,"file":"index.js","names":["OtimEnvironment","base","baseSepolia","mainnet","base","arbitrum","optimism","bsc","unichain","polygon","sepolia","baseSepolia","sepolia","DEFAULT_ADDRESS","baseSepolia","bscTestnet","polygonAmoy","unichain","mainnet","ethereumTokens","base","baseTokens","arbitrum","arbitrumTokens","optimism","optimismTokens","bsc","bscTokens","polygon","polygonTokens","polygon","mainnet","base","arbitrum","optimism","bsc","polygon","avalanche","unichain","sepolia","baseSepolia","polygonAmoy"],"sources":["../../src/chains/config/custom-chains.ts","../../src/chains/config/all-chains.ts","../../src/chains/config/mainnet-chains.ts","../../src/chains/config/testnet-chains.ts","../../src/chains/tokens/testnet-token-addresses.ts","../../src/chains/tokens/testnet-token-metadata.ts","../../src/chains/tokens/arbitrum-token-list.json","../../src/chains/tokens/base-token-list.json","../../src/chains/tokens/bsc-token-list.json","../../src/chains/tokens/ethereum-token-list.json","../../src/chains/tokens/optimism-token-list.json","../../src/chains/tokens/polygon-token-list.json","../../src/chains/tokens/token-lists.ts","../../src/chains/tokens/chain-tokens.ts","../../src/chains/config/supported-chains.ts","../../src/chains/utils/filter-tokens.ts","../../src/chains/utils/token-maps.ts","../../src/chains/utils/stablecoin.ts","../../src/chains/transport.ts","../../src/chains/lambda/chain-mapping.ts","../../src/chains/config/chain-metadata.ts"],"sourcesContent":["import type { Chain } from \"viem/chains\";\n\nexport const pecorinoSignet = {\n id: 14174,\n name: \"Pecorino Signet\",\n nativeCurrency: {\n decimals: 18,\n name: \"USD\",\n symbol: \"USD\",\n },\n rpcUrls: {\n default: { http: [\"https://rpc.pecorino.signet.sh/\"] },\n public: { http: [\"https://rpc.pecorino.signet.sh/\"] },\n },\n blockExplorers: {\n default: {\n name: \"Pecorino Signet Explorer\",\n url: \"https://explorer.pecorino.signet.sh/\",\n },\n },\n testnet: true,\n} as const satisfies Chain;\n\nexport const pecorinoHost = {\n id: 3151908,\n name: \"Pecorino Host\",\n nativeCurrency: {\n decimals: 18,\n name: \"ETH\",\n symbol: \"ETH\",\n },\n rpcUrls: {\n default: { http: [\"https://host-rpc.pecorino.signet.sh/\"] },\n public: { http: [\"https://host-rpc.pecorino.signet.sh/\"] },\n },\n blockExplorers: {\n default: {\n name: \"Pecorino Host Explorer\",\n url: \"https://explorer-host.pecorino.signet.sh/\",\n },\n },\n testnet: true,\n} as const satisfies Chain;\n","import {\n arbitrum,\n base,\n baseSepolia,\n bsc,\n mainnet,\n optimism,\n polygon,\n polygonAmoy,\n sepolia,\n unichain,\n} from \"viem/chains\";\n\nimport { pecorinoHost, pecorinoSignet } from \"./custom-chains\";\nimport { OtimEnvironment } from \"../../config/api-urls\";\n\nexport const supportedChains = {\n mainnet: {\n mainnet,\n base,\n arbitrum,\n polygon,\n },\n testnet: {\n sepolia,\n baseSepolia,\n },\n} as const;\n\nexport const allSupportedChains = {\n mainnet,\n base,\n arbitrum,\n optimism,\n bsc,\n unichain,\n polygon,\n sepolia,\n baseSepolia,\n polygonAmoy,\n pecorinoHost,\n pecorinoSignet,\n} as const;\n\n/**\n * Get the default chain ID based on the provided environment.\n * Production: Base mainnet (8453)\n * Local/Sandbox: Base Sepolia (84532)\n *\n * @param environment - The Otim environment (local | sandbox | production)\n * @returns The default chain ID for the environment\n */\nexport const getDefaultChainId = (environment: OtimEnvironment): number => {\n return environment === OtimEnvironment.Production ? base.id : baseSepolia.id;\n};\n\n/**\n * Get the default chain based on the provided environment.\n * Production: Base mainnet\n * Local/Sandbox: Base Sepolia\n *\n * @param environment - The Otim environment (local | sandbox | production)\n * @returns The default chain for the environment\n */\nexport const getDefaultChain = (environment: OtimEnvironment) => {\n return environment === OtimEnvironment.Production ? base : baseSepolia;\n};\n\nexport type SupportedChainName = keyof typeof allSupportedChains;\nexport type MainnetChainName = keyof typeof supportedChains.mainnet;\nexport type TestnetChainName = keyof typeof supportedChains.testnet;\n","import type { Optional } from \"@otim/utils/helpers\";\nimport type { Chain } from \"viem/chains\";\n\nimport {\n arbitrum,\n base,\n bsc,\n mainnet,\n optimism,\n polygon,\n unichain,\n} from \"viem/chains\";\n\nexport const mainnetChains = [\n mainnet,\n base,\n arbitrum,\n optimism,\n bsc,\n unichain,\n polygon,\n] as const;\n\nexport const mainnetChainsById = new Map<number, Chain>(\n mainnetChains.map((chain) => [chain.id, chain]),\n);\n\nexport function getMainnetChain(chainId: number): Optional<Chain> {\n return mainnetChainsById.get(chainId);\n}\n\nexport function isMainnetChain(chainId: number): boolean {\n return mainnetChainsById.has(chainId);\n}\n","import type { Optional } from \"@otim/utils/helpers\";\nimport type { Chain } from \"viem/chains\";\n\nimport {\n baseSepolia,\n sepolia,\n} from \"viem/chains\";\n\nexport const testnetChains = [\n sepolia,\n baseSepolia,\n] as const;\n\nexport const testnetChainsById = new Map<number, Chain>(\n testnetChains.map((chain) => [chain.id, chain]),\n);\n\nexport function getTestnetChain(chainId: number): Optional<Chain> {\n return testnetChainsById.get(chainId);\n}\n\nexport function isTestnetChain(chainId: number): boolean {\n return testnetChainsById.has(chainId);\n}\n","import type { ChainTokenAddresses } from \"../types\";\nimport type { Optional } from \"@otim/utils/helpers\";\nimport type { Address } from \"@otim/utils/schemas\";\n\nimport {\n baseSepolia,\n bscTestnet,\n polygonAmoy,\n sepolia,\n unichain,\n} from \"viem/chains\";\n\nimport { DEFAULT_ADDRESS } from \"../../helpers\";\nimport { pecorinoHost, pecorinoSignet } from \"../config/custom-chains\";\n\n/**\n * Token addresses for testnets and custom chains.\n * Mainnets use JSON token lists (see token-lists.ts).\n */\nexport const testnetTokenAddresses: Record<number, ChainTokenAddresses> = {\n // TESTNETS\n [sepolia.id]: {\n ETH: DEFAULT_ADDRESS,\n WETH: \"0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14\",\n USDC: \"0x1c7d4b196cb0c7b01d743fbc6116a902379c7238\",\n USDT: \"0xaa8e23fb1079ea71e0a56f48a2aa51851d8433d0\",\n },\n [baseSepolia.id]: {\n ETH: DEFAULT_ADDRESS,\n WETH: \"0x4200000000000000000000000000000000000006\",\n USDC: \"0x036CbD53842c5426634e7929541eC2318f3dCF7e\",\n USDT: \"0x323e78f944A9a1FcF3a10efcC5319DBb0bB6e673\",\n },\n [bscTestnet.id]: {\n BNB: DEFAULT_ADDRESS,\n WBNB: \"0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd\",\n USDC: \"0x64544969ed7EBf5f083679233325356EbE738930\",\n },\n [polygonAmoy.id]: {\n POL: DEFAULT_ADDRESS,\n WMATIC: \"0x360ad4f9a9A8EFe9A8DCB5f461c4Cc1047E1Dcf9\",\n USDC: \"0x41E94Eb019C0762f9Bfcf9Fb1E58725BfB0e7582\",\n },\n // CUSTOM CHAINS\n [unichain.id]: {\n ETH: DEFAULT_ADDRESS,\n WETH: \"0x4200000000000000000000000000000000000006\",\n USDC: \"0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA\",\n },\n [pecorinoSignet.id]: {\n USD: DEFAULT_ADDRESS,\n },\n [pecorinoHost.id]: {\n ETH: DEFAULT_ADDRESS,\n },\n};\n\nexport function getTestnetTokenAddresses(chainId: number): ChainTokenAddresses {\n return testnetTokenAddresses[chainId] || {};\n}\n\nexport function getTestnetTokenAddress(\n chainId: number,\n symbol: string,\n): Optional<Address> {\n const addresses = getTestnetTokenAddresses(chainId);\n return addresses[symbol.toUpperCase()];\n}\n\nexport function isTestnetTokenSupported(\n chainId: number,\n symbol: string,\n): boolean {\n return getTestnetTokenAddress(chainId, symbol) !== undefined;\n}\n\n\n","import type { TokenMetadata } from \"../types\";\nimport type { Optional } from \"@otim/utils/helpers\";\n\n/**\n * Token metadata for testnets and custom chains.\n * Mainnets use JSON token lists (see token-lists.ts).\n */\nexport const testnetTokenMetadata: Record<string, TokenMetadata> = {\n USD: {\n name: \"US Dollar\",\n symbol: \"USD\",\n decimals: 18,\n logoURI: \"/tokens/usd.svg\",\n },\n ETH: {\n name: \"Ethereum\",\n symbol: \"ETH\",\n decimals: 18,\n logoURI: \"/tokens/eth.svg\",\n },\n WETH: {\n name: \"Wrapped Ether\",\n symbol: \"WETH\",\n decimals: 18,\n logoURI: \"/tokens/eth.svg\",\n type: \"ERC20\",\n },\n USDC: {\n name: \"USDC\",\n symbol: \"USDC\",\n decimals: 6,\n logoURI:\n \"https://assets-cdn.trustwallet.com/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png\",\n type: \"ERC20\",\n },\n USDT: {\n name: \"Tether USD\",\n symbol: \"USDT\",\n decimals: 6,\n logoURI:\n \"https://assets-cdn.trustwallet.com/blockchains/ethereum/assets/0xdAC17F958D2ee523a2206206994597C13D831ec7/logo.png\",\n type: \"ERC20\",\n },\n BNB: {\n name: \"BNB\",\n symbol: \"BNB\",\n decimals: 18,\n logoURI: \"/tokens/eth.svg\", // TODO: Add BNB logo\n type: \"ERC20\",\n },\n WBNB: {\n name: \"Wrapped BNB\",\n symbol: \"WBNB\",\n decimals: 18,\n logoURI: \"/tokens/eth.svg\", // TODO: Add BNB logo\n type: \"ERC20\",\n },\n POL: {\n name: \"Polygon\",\n symbol: \"POL\",\n decimals: 18,\n logoURI: \"/tokens/eth.svg\", // TODO: Add POL logo\n type: \"ERC20\",\n },\n WPOL: {\n name: \"Wrapped Polygon\",\n symbol: \"WPOL\",\n decimals: 18,\n logoURI: \"/tokens/eth.svg\", // TODO: Add POL logo\n type: \"ERC20\",\n },\n WMATIC: {\n name: \"Wrapped MATIC\",\n symbol: \"WMATIC\",\n decimals: 18,\n logoURI: \"/tokens/eth.svg\", // TODO: Add MATIC logo\n type: \"ERC20\",\n },\n};\n\nexport function getTestnetTokenMetadata(symbol: string): Optional<TokenMetadata> {\n return testnetTokenMetadata[symbol.toUpperCase()];\n}\n\n\n","","","","","","","import type { ChainToken } from \"../types\";\nimport type { Optional } from \"@otim/utils/helpers\";\nimport type { Address } from \"@otim/utils/schemas\";\n\nimport {\n arbitrum,\n base,\n bsc,\n mainnet,\n optimism,\n polygon,\n} from \"viem/chains\";\n\n// Static imports - these will be inlined at build time by the bundler\nimport arbitrumTokens from \"./arbitrum-token-list.json\";\nimport baseTokens from \"./base-token-list.json\";\nimport bscTokens from \"./bsc-token-list.json\";\nimport ethereumTokens from \"./ethereum-token-list.json\";\nimport optimismTokens from \"./optimism-token-list.json\";\nimport polygonTokens from \"./polygon-token-list.json\";\n\n/**\n * Token data from CoinGecko-generated JSON files\n */\nexport interface TokenListEntry {\n chainId: number;\n address: string;\n symbol: string;\n name: string;\n coingeckoId: string;\n marketCapRank: number;\n logoUrl: string;\n decimals: number;\n}\n\n/**\n * Chain ID to token list mapping\n */\nconst CHAIN_TOKEN_LISTS: Record<number, TokenListEntry[]> = {\n [mainnet.id]: ethereumTokens as TokenListEntry[],\n [base.id]: baseTokens as TokenListEntry[],\n [arbitrum.id]: arbitrumTokens as TokenListEntry[],\n [optimism.id]: optimismTokens as TokenListEntry[],\n [bsc.id]: bscTokens as TokenListEntry[],\n [polygon.id]: polygonTokens as TokenListEntry[],\n};\n\n/**\n * Convert TokenListEntry to ChainToken format\n */\nfunction toChainToken(entry: TokenListEntry): ChainToken {\n // Decimals are always present in the JSON token lists\n const decimals = entry.decimals;\n \n return {\n chainId: entry.chainId,\n address: entry.address as Address,\n symbol: entry.symbol,\n name: entry.name,\n decimals,\n logoURI: entry.logoUrl,\n type: \"ERC20\",\n };\n}\n\n/**\n * Load token list for a specific chain\n */\nexport function loadTokenList(chainId: number): TokenListEntry[] {\n return CHAIN_TOKEN_LISTS[chainId] || [];\n}\n\n/**\n * Get token list as ChainToken[] for a specific chain\n */\nexport function getTokenListTokens(chainId: number): ChainToken[] {\n const entries = loadTokenList(chainId);\n return entries.map(toChainToken);\n}\n\n/**\n * Get a token from the token list by address\n */\nexport function getTokenListTokenByAddress(\n chainId: number,\n address: string,\n): Optional<ChainToken> {\n const entries = loadTokenList(chainId);\n const entry = entries.find(\n (t) => t.address.toLowerCase() === address.toLowerCase(),\n );\n return entry ? toChainToken(entry) : undefined;\n}\n\n/**\n * Get a token from the token list by symbol\n */\nexport function getTokenListTokenBySymbol(\n chainId: number,\n symbol: string,\n): Optional<ChainToken> {\n const entries = loadTokenList(chainId);\n const entry = entries.find(\n (t) => t.symbol.toUpperCase() === symbol.toUpperCase(),\n );\n return entry ? toChainToken(entry) : undefined;\n}\n\n/**\n * Get raw token list entries (with CoinGecko metadata)\n */\nexport function getTokenListEntries(chainId: number): TokenListEntry[] {\n return loadTokenList(chainId);\n}\n\n/**\n * Check if a chain has a token list available\n */\nexport function hasTokenList(chainId: number): boolean {\n return chainId in CHAIN_TOKEN_LISTS;\n}\n","import type { ChainToken } from \"../types\";\nimport type { Optional } from \"@otim/utils/helpers\";\n\nimport {\n getTestnetTokenAddress,\n getTestnetTokenAddresses,\n} from \"./testnet-token-addresses\";\nimport { getTestnetTokenMetadata } from \"./testnet-token-metadata\";\nimport {\n getTokenListTokenBySymbol,\n getTokenListTokens,\n hasTokenList,\n} from \"./token-lists\";\n\n/**\n * Get all tokens for a chain.\n * \n * Mainnets (Ethereum, Base, Arbitrum, Optimism, BSC, Polygon):\n * - Uses comprehensive JSON token lists (top 50 by market cap)\n * \n * Testnets and custom chains:\n * - Uses hardcoded token addresses and metadata\n */\nexport function getChainTokens(chainId: number): ChainToken[] {\n // Use JSON token lists for supported mainnets\n if (hasTokenList(chainId)) {\n return getTokenListTokens(chainId);\n }\n\n // Use testnet/custom chain system\n const addresses = getTestnetTokenAddresses(chainId);\n const tokens: ChainToken[] = [];\n\n for (const [symbol, address] of Object.entries(addresses)) {\n const metadata = getTestnetTokenMetadata(symbol);\n\n if (metadata && address) {\n tokens.push({ ...metadata, address, chainId });\n }\n }\n\n return tokens;\n}\n\nexport function getChainToken(\n chainId: number,\n symbol: string,\n): Optional<ChainToken> {\n const tokens = getChainTokens(chainId);\n return tokens.find(\n (token) => token.symbol.toUpperCase() === symbol.toUpperCase(),\n );\n}\n\nexport function getChainTokenByAddress(\n chainId: number,\n address: string,\n): Optional<ChainToken> {\n const tokens = getChainTokens(chainId);\n return tokens.find(\n (token) => token.address.toLowerCase() === address.toLowerCase(),\n );\n}\n\n/**\n * Get token address by symbol for a chain.\n * Works for both mainnets (from JSON lists) and testnets (from hardcoded addresses).\n */\nexport function getTokenAddress(\n chainId: number,\n symbol: string,\n): Optional<string> {\n // Try JSON lists first (mainnets)\n if (hasTokenList(chainId)) {\n const token = getTokenListTokenBySymbol(chainId, symbol);\n return token?.address;\n }\n\n // Fallback to testnet addresses\n return getTestnetTokenAddress(chainId, symbol);\n}\n\n/**\n * Get all token addresses for a chain as a symbol -> address mapping.\n * Compatible with the old tokenAddresses structure for backward compatibility.\n */\nexport function getTokenAddresses(\n chainId: number,\n): Record<string, string> {\n const tokens = getChainTokens(chainId);\n const addresses: Record<string, string> = {};\n\n for (const token of tokens) {\n addresses[token.symbol.toUpperCase()] = token.address;\n }\n\n return addresses;\n}\n","import type { ChainConfig } from \"../types\";\nimport type { Optional } from \"@otim/utils/helpers\";\nimport type { Chain } from \"viem/chains\";\n\nimport { mainnetChains } from \"./mainnet-chains\";\nimport { testnetChains } from \"./testnet-chains\";\nimport { getChainTokens } from \"../tokens/chain-tokens\";\n\nexport const allChains = [...mainnetChains, ...testnetChains] as const;\n\nexport type SupportedChainId = (typeof allChains)[number][\"id\"];\n\nexport const chainById = new Map<number, Chain>(\n allChains.map((chain) => [chain.id, chain]),\n);\n\nexport function getChainById(chainId: number): Optional<Chain> {\n return chainById.get(chainId);\n}\n\nexport function getChainConfig(chainId: number): Optional<ChainConfig> {\n const chain = getChainById(chainId);\n if (!chain) return undefined;\n\n return {\n chain,\n isTestnet: chain.testnet ?? false,\n tokens: getChainTokens(chain.id),\n };\n}\n\nexport function getMainnetChains(): ChainConfig[] {\n return mainnetChains.map((chain) => ({\n chain,\n isTestnet: false,\n tokens: getChainTokens(chain.id),\n }));\n}\n\nexport function getTestnetChains(): ChainConfig[] {\n return testnetChains.map((chain) => ({\n chain,\n isTestnet: true,\n tokens: getChainTokens(chain.id),\n }));\n}\n\nexport function getAllChains(): ChainConfig[] {\n return [...getMainnetChains(), ...getTestnetChains()];\n}\n\nexport function isSupportedChain(chainId: number): boolean {\n return chainById.has(chainId);\n}\n","import type { ChainToken } from \"../types\";\n\nexport function filterTokens(\n tokens: ChainToken[],\n allowedSymbols: string[],\n disabledSymbols: string[],\n): ChainToken[] {\n let result = tokens;\n\n if (disabledSymbols.length > 0) {\n result = result.filter(\n (token) => !disabledSymbols.includes(token.symbol.toUpperCase()),\n );\n }\n\n if (allowedSymbols && allowedSymbols.length > 0) {\n result = result.filter((token) =>\n allowedSymbols.includes(token.symbol.toUpperCase()),\n );\n }\n\n return result;\n}\n","import type { ChainToken } from \"../types\";\nimport type { Optional } from \"@otim/utils/helpers\";\n\nexport interface TokenMaps {\n byAddress: Map<string, ChainToken>;\n bySymbol: Map<string, ChainToken>;\n}\n\nexport function createTokenMaps(tokens: ChainToken[]): TokenMaps {\n const byAddress = new Map<string, ChainToken>();\n const bySymbol = new Map<string, ChainToken>();\n\n tokens.forEach((token) => {\n byAddress.set(token.address.toLowerCase(), token);\n bySymbol.set(token.symbol.toLowerCase(), token);\n });\n\n return { byAddress, bySymbol };\n}\n\nexport function getTokenByAddress(\n maps: TokenMaps,\n address: string,\n): Optional<ChainToken> {\n if (!address) return undefined;\n return maps.byAddress.get(address.toLowerCase());\n}\n\nexport function getTokenBySymbol(\n maps: TokenMaps,\n symbol: string,\n): Optional<ChainToken> {\n if (!symbol) return undefined;\n return maps.bySymbol.get(symbol.toLowerCase());\n}\n","/**\n * List of supported stablecoin symbols\n */\nconst stablecoinSymbols = [\"USDC\", \"USDT\"] as const;\n\n/**\n * Checks if a token symbol is a stablecoin\n * @param symbol - Token symbol to check (e.g., \"USDC\", \"ETH\")\n * @returns true if the symbol is a recognized stablecoin\n */\nexport function isStablecoin(symbol: string | string[]): boolean {\n if (typeof symbol === \"string\") {\n return stablecoinSymbols.includes(\n symbol as (typeof stablecoinSymbols)[number],\n );\n }\n\n return symbol.every((s) =>\n stablecoinSymbols.includes(s as (typeof stablecoinSymbols)[number]),\n );\n}\n","import { http } from \"viem\";\nimport { polygon } from \"viem/chains\";\n\nexport type ChainRpcOverrides = Readonly<Record<number, string>>;\n\n/**\n * Default custom RPC URL overrides per chain ID.\n * Used by {@link getChainTransport} when no caller-provided override exists.\n */\nexport const customRpcUrls: ChainRpcOverrides = {\n [polygon.id]: \"https://polygon.drpc.org\",\n} as const;\n\n/**\n * Returns an HTTP transport for the given chain.\n * Resolves the RPC URL in priority order:\n * 1. Caller-provided `overrides`\n * 2. {@link customRpcUrls} defaults\n * 3. viem's built-in public RPC (bare `http()`)\n */\nexport function getChainTransport(\n chainId: number,\n overrides?: ChainRpcOverrides,\n) {\n const rpcUrl = overrides?.[chainId] ?? customRpcUrls[chainId];\n return rpcUrl ? http(rpcUrl) : http();\n}\n","import type { Optional } from \"@otim/utils/helpers\";\n\n/**\n * Mapping between chain ID numbers (used internally by otim) and\n * Lambda API chain ID strings (used by Lambda's API endpoints).\n *\n * Lambda uses string identifiers for chains while we use numeric chain IDs\n * from viem/wagmi. This map provides bidirectional conversion.\n */\n\n/**\n * Map from numeric chain ID to Lambda chain ID string\n */\nexport const CHAIN_ID_TO_LAMBDA_ID: Record<number, string> = {\n /* Mainnet chains */\n 1: \"ethereum\",\n 8453: \"base\",\n 42161: \"arbitrum\",\n 10: \"optimism\",\n 56: \"binance-smart-chain\",\n 130: \"unichain\",\n 137: \"polygon\",\n} as const;\n\n/**\n * Map from Lambda chain ID string to numeric chain ID\n */\nexport const LAMBDA_ID_TO_CHAIN_ID: Record<string, number> = {\n ethereum: 1,\n base: 8453,\n arbitrum: 42161,\n optimism: 10,\n \"binance-smart-chain\": 56,\n unichain: 130,\n polygon: 137,\n} as const;\n\n/**\n * Convert a numeric chain ID to Lambda's chain ID string\n * @param chainId - The numeric chain ID\n * @returns The Lambda chain ID string, or undefined if not supported by Lambda\n */\n\nexport function chainIdToLambdaId(chainId: number): Optional<string> {\n return CHAIN_ID_TO_LAMBDA_ID[chainId];\n}\n\n/**\n * Convert a Lambda chain ID string to numeric chain ID\n * @param lambdaId - The Lambda chain ID string\n * @returns The numeric chain ID, or undefined if not recognized\n */\nexport function lambdaIdToChainId(lambdaId: string): Optional<number> {\n return LAMBDA_ID_TO_CHAIN_ID[lambdaId];\n}\n\n/**\n * Check if a chain ID is supported by Lambda\n * @param chainId - The numeric chain ID to check\n * @returns true if the chain is supported by Lambda\n */\nexport function isLambdaSupportedChain(chainId: number): boolean {\n return chainId in CHAIN_ID_TO_LAMBDA_ID;\n}\n\n/**\n * Get all chain IDs supported by Lambda\n * @returns Array of numeric chain IDs that are supported by Lambda\n */\nexport function getLambdaSupportedChainIds(): number[] {\n return Object.keys(CHAIN_ID_TO_LAMBDA_ID).map(Number);\n}\n\n/**\n * Get all Lambda chain ID strings\n * @returns Array of Lambda chain ID strings\n */\nexport function getLambdaChainIds(): string[] {\n return Object.values(CHAIN_ID_TO_LAMBDA_ID);\n}\n","import type { Optional } from \"@otim/utils/helpers\";\n\nimport {\n arbitrum,\n avalanche,\n base,\n baseSepolia,\n bsc,\n mainnet,\n optimism,\n polygon,\n polygonAmoy,\n sepolia,\n unichain,\n} from \"viem/chains\";\n\nimport { pecorinoHost, pecorinoSignet } from \"./custom-chains\";\n\nexport interface ChainMetadata {\n name: string;\n iconUrl?: string;\n // Add other chain metadata fields as needed\n}\n\n/**\n * Chain metadata including icon URLs and display names.\n * Icon URLs can be IPFS hashes or HTTP URLs.\n * \n * To get chain icon URLs, you can:\n * 1. Extract from Lambda portfolio API (chain_icon_url field)\n * 2. Use chain explorer APIs\n * 3. Use trusted sources like ChainList\n */\nexport const chainMetadata: Record<number, ChainMetadata> = {\n [mainnet.id]: {\n name: \"Ethereum\",\n iconUrl: \"https://static.lambda.p2p.org/chains/ethereum.png\",\n },\n [base.id]: {\n name: \"Base\",\n iconUrl: \"https://static.lambda.p2p.org/chains/base.png\",\n },\n [arbitrum.id]: {\n name: \"Arbitrum One\",\n iconUrl: \"https://static.lambda.p2p.org/chains/arbitrum.png\",\n },\n [optimism.id]: {\n name: \"OP Mainnet\",\n iconUrl: \"https://static.lambda.p2p.org/chains/optimism.png\",\n },\n [bsc.id]: {\n name: \"Binance Smart Chain\",\n iconUrl: \"https://static.lambda.p2p.org/chains/binance-smart-chain.png\",\n },\n [polygon.id]: {\n name: \"Polygon\",\n iconUrl: \"https://static.lambda.p2p.org/chains/polygon.png\",\n },\n [avalanche.id]: {\n name: \"Avalanche\",\n iconUrl: \"https://static.lambda.p2p.org/chains/avalanche.png\",\n },\n [unichain.id]: {\n name: \"Unichain\",\n iconUrl: \"https://static.lambda.p2p.org/chains/unichain.png\",\n },\n [sepolia.id]: {\n name: \"Sepolia\",\n },\n [baseSepolia.id]: {\n name: \"Base Sepolia\",\n },\n [polygonAmoy.id]: {\n name: \"Polygon Amoy\",\n },\n [pecorinoSignet.id]: {\n name: \"Pecorino Signet\",\n },\n [pecorinoHost.id]: {\n name: \"Pecorino Host\",\n },\n};\n\n/**\n * Get chain metadata by chain ID\n * @param chainId - The numeric chain ID\n * @returns Chain metadata or undefined if not found\n */\nexport function getChainMetadata(chainId: number): Optional<ChainMetadata> {\n return chainMetadata[chainId];\n}\n\n/**\n * Get chain icon URL by chain ID\n * @param chainId - The numeric chain ID\n * @returns Chain icon URL or undefined if not found\n */\nexport function getChainIconUrl(chainId: number): Optional<string> {\n return chainMetadata[chainId]?.iconUrl;\n}\n\n/**\n * Get chain display name by chain ID\n * @param chainId - The numeric chain ID\n * @returns Chain name or undefined if not found\n */\nexport function getChainDisplayName(chainId: number): Optional<string> {\n return chainMetadata[chainId]?.name;\n}\n\n"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
@@ -1,6 +1,7 @@
1
- import { t as OtimEnvironment } from "../api-urls-DJcIKBCy.mjs";
2
- import { J as DEFAULT_ADDRESS } from "../helpers-BNiSxjGq.mjs";
1
+ import { t as OtimEnvironment } from "../api-urls-B6RnXSRD.mjs";
2
+ import { J as DEFAULT_ADDRESS } from "../zod-CFr-iyX9.mjs";
3
3
  import { arbitrum, avalanche, base, baseSepolia, bsc, bscTestnet, mainnet, optimism, polygon, polygonAmoy, sepolia, unichain } from "viem/chains";
4
+ import { http } from "viem";
4
5
 
5
6
  //#region src/chains/config/custom-chains.ts
6
7
  const pecorinoSignet = {
@@ -47,8 +48,6 @@ const supportedChains = {
47
48
  mainnet,
48
49
  base,
49
50
  arbitrum,
50
- optimism,
51
- bsc,
52
51
  polygon
53
52
  },
54
53
  testnet: {
@@ -3482,6 +3481,25 @@ function isStablecoin(symbol) {
3482
3481
  return symbol.every((s) => stablecoinSymbols.includes(s));
3483
3482
  }
3484
3483
 
3484
+ //#endregion
3485
+ //#region src/chains/transport.ts
3486
+ /**
3487
+ * Default custom RPC URL overrides per chain ID.
3488
+ * Used by {@link getChainTransport} when no caller-provided override exists.
3489
+ */
3490
+ const customRpcUrls = { [polygon.id]: "https://polygon.drpc.org" };
3491
+ /**
3492
+ * Returns an HTTP transport for the given chain.
3493
+ * Resolves the RPC URL in priority order:
3494
+ * 1. Caller-provided `overrides`
3495
+ * 2. {@link customRpcUrls} defaults
3496
+ * 3. viem's built-in public RPC (bare `http()`)
3497
+ */
3498
+ function getChainTransport(chainId, overrides) {
3499
+ const rpcUrl = overrides?.[chainId] ?? customRpcUrls[chainId];
3500
+ return rpcUrl ? http(rpcUrl) : http();
3501
+ }
3502
+
3485
3503
  //#endregion
3486
3504
  //#region src/chains/lambda/chain-mapping.ts
3487
3505
  /**
@@ -3630,5 +3648,5 @@ function getChainDisplayName(chainId) {
3630
3648
  }
3631
3649
 
3632
3650
  //#endregion
3633
- export { CHAIN_ID_TO_LAMBDA_ID, LAMBDA_ID_TO_CHAIN_ID, allChains, allSupportedChains, chainById, chainIdToLambdaId, chainMetadata, createTokenMaps, filterTokens, getAllChains, getChainById, getChainConfig, getChainDisplayName, getChainIconUrl, getChainMetadata, getChainToken, getChainTokenByAddress, getChainTokens, getDefaultChain, getDefaultChainId, getLambdaChainIds, getLambdaSupportedChainIds, getMainnetChain, getMainnetChains, getTestnetChain, getTestnetChains, getTestnetTokenAddress, getTestnetTokenAddresses, getTestnetTokenMetadata, getTokenAddress, getTokenAddresses, getTokenByAddress, getTokenBySymbol, getTokenListEntries, getTokenListTokenByAddress, getTokenListTokenBySymbol, getTokenListTokens, hasTokenList, isLambdaSupportedChain, isMainnetChain, isStablecoin, isSupportedChain, isTestnetChain, isTestnetTokenSupported, lambdaIdToChainId, loadTokenList, mainnetChains, mainnetChainsById, pecorinoHost, pecorinoSignet, supportedChains, testnetChains, testnetChainsById, testnetTokenAddresses, testnetTokenMetadata };
3651
+ export { CHAIN_ID_TO_LAMBDA_ID, LAMBDA_ID_TO_CHAIN_ID, allChains, allSupportedChains, chainById, chainIdToLambdaId, chainMetadata, createTokenMaps, customRpcUrls, filterTokens, getAllChains, getChainById, getChainConfig, getChainDisplayName, getChainIconUrl, getChainMetadata, getChainToken, getChainTokenByAddress, getChainTokens, getChainTransport, getDefaultChain, getDefaultChainId, getLambdaChainIds, getLambdaSupportedChainIds, getMainnetChain, getMainnetChains, getTestnetChain, getTestnetChains, getTestnetTokenAddress, getTestnetTokenAddresses, getTestnetTokenMetadata, getTokenAddress, getTokenAddresses, getTokenByAddress, getTokenBySymbol, getTokenListEntries, getTokenListTokenByAddress, getTokenListTokenBySymbol, getTokenListTokens, hasTokenList, isLambdaSupportedChain, isMainnetChain, isStablecoin, isSupportedChain, isTestnetChain, isTestnetTokenSupported, lambdaIdToChainId, loadTokenList, mainnetChains, mainnetChainsById, pecorinoHost, pecorinoSignet, supportedChains, testnetChains, testnetChainsById, testnetTokenAddresses, testnetTokenMetadata };
3634
3652
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["ethereumTokens","baseTokens","arbitrumTokens","optimismTokens","bscTokens","polygonTokens"],"sources":["../../src/chains/config/custom-chains.ts","../../src/chains/config/all-chains.ts","../../src/chains/config/mainnet-chains.ts","../../src/chains/config/testnet-chains.ts","../../src/chains/tokens/testnet-token-addresses.ts","../../src/chains/tokens/testnet-token-metadata.ts","../../src/chains/tokens/arbitrum-token-list.json","../../src/chains/tokens/base-token-list.json","../../src/chains/tokens/bsc-token-list.json","../../src/chains/tokens/ethereum-token-list.json","../../src/chains/tokens/optimism-token-list.json","../../src/chains/tokens/polygon-token-list.json","../../src/chains/tokens/token-lists.ts","../../src/chains/tokens/chain-tokens.ts","../../src/chains/config/supported-chains.ts","../../src/chains/utils/filter-tokens.ts","../../src/chains/utils/token-maps.ts","../../src/chains/utils/stablecoin.ts","../../src/chains/lambda/chain-mapping.ts","../../src/chains/config/chain-metadata.ts"],"sourcesContent":["import type { Chain } from \"viem/chains\";\n\nexport const pecorinoSignet = {\n id: 14174,\n name: \"Pecorino Signet\",\n nativeCurrency: {\n decimals: 18,\n name: \"USD\",\n symbol: \"USD\",\n },\n rpcUrls: {\n default: { http: [\"https://rpc.pecorino.signet.sh/\"] },\n public: { http: [\"https://rpc.pecorino.signet.sh/\"] },\n },\n blockExplorers: {\n default: {\n name: \"Pecorino Signet Explorer\",\n url: \"https://explorer.pecorino.signet.sh/\",\n },\n },\n testnet: true,\n} as const satisfies Chain;\n\nexport const pecorinoHost = {\n id: 3151908,\n name: \"Pecorino Host\",\n nativeCurrency: {\n decimals: 18,\n name: \"ETH\",\n symbol: \"ETH\",\n },\n rpcUrls: {\n default: { http: [\"https://host-rpc.pecorino.signet.sh/\"] },\n public: { http: [\"https://host-rpc.pecorino.signet.sh/\"] },\n },\n blockExplorers: {\n default: {\n name: \"Pecorino Host Explorer\",\n url: \"https://explorer-host.pecorino.signet.sh/\",\n },\n },\n testnet: true,\n} as const satisfies Chain;\n","import {\n arbitrum,\n base,\n baseSepolia,\n bsc,\n mainnet,\n optimism,\n polygon,\n polygonAmoy,\n sepolia,\n unichain,\n} from \"viem/chains\";\n\nimport { pecorinoHost, pecorinoSignet } from \"./custom-chains\";\nimport { OtimEnvironment } from \"../../config/api-urls\";\n\nexport const supportedChains = {\n mainnet: {\n mainnet,\n base,\n arbitrum,\n optimism,\n bsc,\n polygon,\n },\n testnet: {\n sepolia,\n baseSepolia,\n },\n} as const;\n\nexport const allSupportedChains = {\n mainnet,\n base,\n arbitrum,\n optimism,\n bsc,\n unichain,\n polygon,\n sepolia,\n baseSepolia,\n polygonAmoy,\n pecorinoHost,\n pecorinoSignet,\n} as const;\n\n/**\n * Get the default chain ID based on the provided environment.\n * Production: Base mainnet (8453)\n * Local/Sandbox: Base Sepolia (84532)\n *\n * @param environment - The Otim environment (local | sandbox | production)\n * @returns The default chain ID for the environment\n */\nexport const getDefaultChainId = (environment: OtimEnvironment): number => {\n return environment === OtimEnvironment.Production ? base.id : baseSepolia.id;\n};\n\n/**\n * Get the default chain based on the provided environment.\n * Production: Base mainnet\n * Local/Sandbox: Base Sepolia\n *\n * @param environment - The Otim environment (local | sandbox | production)\n * @returns The default chain for the environment\n */\nexport const getDefaultChain = (environment: OtimEnvironment) => {\n return environment === OtimEnvironment.Production ? base : baseSepolia;\n};\n\nexport type SupportedChainName = keyof typeof allSupportedChains;\nexport type MainnetChainName = keyof typeof supportedChains.mainnet;\nexport type TestnetChainName = keyof typeof supportedChains.testnet;\n","import type { Optional } from \"@otim/utils/helpers\";\nimport type { Chain } from \"viem/chains\";\n\nimport {\n arbitrum,\n base,\n bsc,\n mainnet,\n optimism,\n polygon,\n unichain,\n} from \"viem/chains\";\n\nexport const mainnetChains = [\n mainnet,\n base,\n arbitrum,\n optimism,\n bsc,\n unichain,\n polygon,\n] as const;\n\nexport const mainnetChainsById = new Map<number, Chain>(\n mainnetChains.map((chain) => [chain.id, chain]),\n);\n\nexport function getMainnetChain(chainId: number): Optional<Chain> {\n return mainnetChainsById.get(chainId);\n}\n\nexport function isMainnetChain(chainId: number): boolean {\n return mainnetChainsById.has(chainId);\n}\n","import type { Optional } from \"@otim/utils/helpers\";\nimport type { Chain } from \"viem/chains\";\n\nimport {\n baseSepolia,\n sepolia,\n} from \"viem/chains\";\n\nexport const testnetChains = [\n sepolia,\n baseSepolia,\n] as const;\n\nexport const testnetChainsById = new Map<number, Chain>(\n testnetChains.map((chain) => [chain.id, chain]),\n);\n\nexport function getTestnetChain(chainId: number): Optional<Chain> {\n return testnetChainsById.get(chainId);\n}\n\nexport function isTestnetChain(chainId: number): boolean {\n return testnetChainsById.has(chainId);\n}\n","import type { ChainTokenAddresses } from \"../types\";\nimport type { Optional } from \"@otim/utils/helpers\";\nimport type { Address } from \"@otim/utils/schemas\";\n\nimport {\n baseSepolia,\n bscTestnet,\n polygonAmoy,\n sepolia,\n unichain,\n} from \"viem/chains\";\n\nimport { DEFAULT_ADDRESS } from \"../../helpers\";\nimport { pecorinoHost, pecorinoSignet } from \"../config/custom-chains\";\n\n/**\n * Token addresses for testnets and custom chains.\n * Mainnets use JSON token lists (see token-lists.ts).\n */\nexport const testnetTokenAddresses: Record<number, ChainTokenAddresses> = {\n // TESTNETS\n [sepolia.id]: {\n ETH: DEFAULT_ADDRESS,\n WETH: \"0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14\",\n USDC: \"0x1c7d4b196cb0c7b01d743fbc6116a902379c7238\",\n USDT: \"0xaa8e23fb1079ea71e0a56f48a2aa51851d8433d0\",\n },\n [baseSepolia.id]: {\n ETH: DEFAULT_ADDRESS,\n WETH: \"0x4200000000000000000000000000000000000006\",\n USDC: \"0x036CbD53842c5426634e7929541eC2318f3dCF7e\",\n USDT: \"0x323e78f944A9a1FcF3a10efcC5319DBb0bB6e673\",\n },\n [bscTestnet.id]: {\n BNB: DEFAULT_ADDRESS,\n WBNB: \"0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd\",\n USDC: \"0x64544969ed7EBf5f083679233325356EbE738930\",\n },\n [polygonAmoy.id]: {\n POL: DEFAULT_ADDRESS,\n WMATIC: \"0x360ad4f9a9A8EFe9A8DCB5f461c4Cc1047E1Dcf9\",\n USDC: \"0x41E94Eb019C0762f9Bfcf9Fb1E58725BfB0e7582\",\n },\n // CUSTOM CHAINS\n [unichain.id]: {\n ETH: DEFAULT_ADDRESS,\n WETH: \"0x4200000000000000000000000000000000000006\",\n USDC: \"0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA\",\n },\n [pecorinoSignet.id]: {\n USD: DEFAULT_ADDRESS,\n },\n [pecorinoHost.id]: {\n ETH: DEFAULT_ADDRESS,\n },\n};\n\nexport function getTestnetTokenAddresses(chainId: number): ChainTokenAddresses {\n return testnetTokenAddresses[chainId] || {};\n}\n\nexport function getTestnetTokenAddress(\n chainId: number,\n symbol: string,\n): Optional<Address> {\n const addresses = getTestnetTokenAddresses(chainId);\n return addresses[symbol.toUpperCase()];\n}\n\nexport function isTestnetTokenSupported(\n chainId: number,\n symbol: string,\n): boolean {\n return getTestnetTokenAddress(chainId, symbol) !== undefined;\n}\n\n\n","import type { TokenMetadata } from \"../types\";\nimport type { Optional } from \"@otim/utils/helpers\";\n\n/**\n * Token metadata for testnets and custom chains.\n * Mainnets use JSON token lists (see token-lists.ts).\n */\nexport const testnetTokenMetadata: Record<string, TokenMetadata> = {\n USD: {\n name: \"US Dollar\",\n symbol: \"USD\",\n decimals: 18,\n logoURI: \"/tokens/usd.svg\",\n },\n ETH: {\n name: \"Ethereum\",\n symbol: \"ETH\",\n decimals: 18,\n logoURI: \"/tokens/eth.svg\",\n },\n WETH: {\n name: \"Wrapped Ether\",\n symbol: \"WETH\",\n decimals: 18,\n logoURI: \"/tokens/eth.svg\",\n type: \"ERC20\",\n },\n USDC: {\n name: \"USDC\",\n symbol: \"USDC\",\n decimals: 6,\n logoURI:\n \"https://assets-cdn.trustwallet.com/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png\",\n type: \"ERC20\",\n },\n USDT: {\n name: \"Tether USD\",\n symbol: \"USDT\",\n decimals: 6,\n logoURI:\n \"https://assets-cdn.trustwallet.com/blockchains/ethereum/assets/0xdAC17F958D2ee523a2206206994597C13D831ec7/logo.png\",\n type: \"ERC20\",\n },\n BNB: {\n name: \"BNB\",\n symbol: \"BNB\",\n decimals: 18,\n logoURI: \"/tokens/eth.svg\", // TODO: Add BNB logo\n type: \"ERC20\",\n },\n WBNB: {\n name: \"Wrapped BNB\",\n symbol: \"WBNB\",\n decimals: 18,\n logoURI: \"/tokens/eth.svg\", // TODO: Add BNB logo\n type: \"ERC20\",\n },\n POL: {\n name: \"Polygon\",\n symbol: \"POL\",\n decimals: 18,\n logoURI: \"/tokens/eth.svg\", // TODO: Add POL logo\n type: \"ERC20\",\n },\n WPOL: {\n name: \"Wrapped Polygon\",\n symbol: \"WPOL\",\n decimals: 18,\n logoURI: \"/tokens/eth.svg\", // TODO: Add POL logo\n type: \"ERC20\",\n },\n WMATIC: {\n name: \"Wrapped MATIC\",\n symbol: \"WMATIC\",\n decimals: 18,\n logoURI: \"/tokens/eth.svg\", // TODO: Add MATIC logo\n type: \"ERC20\",\n },\n};\n\nexport function getTestnetTokenMetadata(symbol: string): Optional<TokenMetadata> {\n return testnetTokenMetadata[symbol.toUpperCase()];\n}\n\n\n","","","","","","","import type { ChainToken } from \"../types\";\nimport type { Optional } from \"@otim/utils/helpers\";\nimport type { Address } from \"@otim/utils/schemas\";\n\nimport {\n arbitrum,\n base,\n bsc,\n mainnet,\n optimism,\n polygon,\n} from \"viem/chains\";\n\n// Static imports - these will be inlined at build time by the bundler\nimport arbitrumTokens from \"./arbitrum-token-list.json\";\nimport baseTokens from \"./base-token-list.json\";\nimport bscTokens from \"./bsc-token-list.json\";\nimport ethereumTokens from \"./ethereum-token-list.json\";\nimport optimismTokens from \"./optimism-token-list.json\";\nimport polygonTokens from \"./polygon-token-list.json\";\n\n/**\n * Token data from CoinGecko-generated JSON files\n */\nexport interface TokenListEntry {\n chainId: number;\n address: string;\n symbol: string;\n name: string;\n coingeckoId: string;\n marketCapRank: number;\n logoUrl: string;\n decimals: number;\n}\n\n/**\n * Chain ID to token list mapping\n */\nconst CHAIN_TOKEN_LISTS: Record<number, TokenListEntry[]> = {\n [mainnet.id]: ethereumTokens as TokenListEntry[],\n [base.id]: baseTokens as TokenListEntry[],\n [arbitrum.id]: arbitrumTokens as TokenListEntry[],\n [optimism.id]: optimismTokens as TokenListEntry[],\n [bsc.id]: bscTokens as TokenListEntry[],\n [polygon.id]: polygonTokens as TokenListEntry[],\n};\n\n/**\n * Convert TokenListEntry to ChainToken format\n */\nfunction toChainToken(entry: TokenListEntry): ChainToken {\n // Decimals are always present in the JSON token lists\n const decimals = entry.decimals;\n \n return {\n chainId: entry.chainId,\n address: entry.address as Address,\n symbol: entry.symbol,\n name: entry.name,\n decimals,\n logoURI: entry.logoUrl,\n type: \"ERC20\",\n };\n}\n\n/**\n * Load token list for a specific chain\n */\nexport function loadTokenList(chainId: number): TokenListEntry[] {\n return CHAIN_TOKEN_LISTS[chainId] || [];\n}\n\n/**\n * Get token list as ChainToken[] for a specific chain\n */\nexport function getTokenListTokens(chainId: number): ChainToken[] {\n const entries = loadTokenList(chainId);\n return entries.map(toChainToken);\n}\n\n/**\n * Get a token from the token list by address\n */\nexport function getTokenListTokenByAddress(\n chainId: number,\n address: string,\n): Optional<ChainToken> {\n const entries = loadTokenList(chainId);\n const entry = entries.find(\n (t) => t.address.toLowerCase() === address.toLowerCase(),\n );\n return entry ? toChainToken(entry) : undefined;\n}\n\n/**\n * Get a token from the token list by symbol\n */\nexport function getTokenListTokenBySymbol(\n chainId: number,\n symbol: string,\n): Optional<ChainToken> {\n const entries = loadTokenList(chainId);\n const entry = entries.find(\n (t) => t.symbol.toUpperCase() === symbol.toUpperCase(),\n );\n return entry ? toChainToken(entry) : undefined;\n}\n\n/**\n * Get raw token list entries (with CoinGecko metadata)\n */\nexport function getTokenListEntries(chainId: number): TokenListEntry[] {\n return loadTokenList(chainId);\n}\n\n/**\n * Check if a chain has a token list available\n */\nexport function hasTokenList(chainId: number): boolean {\n return chainId in CHAIN_TOKEN_LISTS;\n}\n","import type { ChainToken } from \"../types\";\nimport type { Optional } from \"@otim/utils/helpers\";\n\nimport {\n getTestnetTokenAddress,\n getTestnetTokenAddresses,\n} from \"./testnet-token-addresses\";\nimport { getTestnetTokenMetadata } from \"./testnet-token-metadata\";\nimport {\n getTokenListTokenBySymbol,\n getTokenListTokens,\n hasTokenList,\n} from \"./token-lists\";\n\n/**\n * Get all tokens for a chain.\n * \n * Mainnets (Ethereum, Base, Arbitrum, Optimism, BSC, Polygon):\n * - Uses comprehensive JSON token lists (top 50 by market cap)\n * \n * Testnets and custom chains:\n * - Uses hardcoded token addresses and metadata\n */\nexport function getChainTokens(chainId: number): ChainToken[] {\n // Use JSON token lists for supported mainnets\n if (hasTokenList(chainId)) {\n return getTokenListTokens(chainId);\n }\n\n // Use testnet/custom chain system\n const addresses = getTestnetTokenAddresses(chainId);\n const tokens: ChainToken[] = [];\n\n for (const [symbol, address] of Object.entries(addresses)) {\n const metadata = getTestnetTokenMetadata(symbol);\n\n if (metadata && address) {\n tokens.push({ ...metadata, address, chainId });\n }\n }\n\n return tokens;\n}\n\nexport function getChainToken(\n chainId: number,\n symbol: string,\n): Optional<ChainToken> {\n const tokens = getChainTokens(chainId);\n return tokens.find(\n (token) => token.symbol.toUpperCase() === symbol.toUpperCase(),\n );\n}\n\nexport function getChainTokenByAddress(\n chainId: number,\n address: string,\n): Optional<ChainToken> {\n const tokens = getChainTokens(chainId);\n return tokens.find(\n (token) => token.address.toLowerCase() === address.toLowerCase(),\n );\n}\n\n/**\n * Get token address by symbol for a chain.\n * Works for both mainnets (from JSON lists) and testnets (from hardcoded addresses).\n */\nexport function getTokenAddress(\n chainId: number,\n symbol: string,\n): Optional<string> {\n // Try JSON lists first (mainnets)\n if (hasTokenList(chainId)) {\n const token = getTokenListTokenBySymbol(chainId, symbol);\n return token?.address;\n }\n\n // Fallback to testnet addresses\n return getTestnetTokenAddress(chainId, symbol);\n}\n\n/**\n * Get all token addresses for a chain as a symbol -> address mapping.\n * Compatible with the old tokenAddresses structure for backward compatibility.\n */\nexport function getTokenAddresses(\n chainId: number,\n): Record<string, string> {\n const tokens = getChainTokens(chainId);\n const addresses: Record<string, string> = {};\n\n for (const token of tokens) {\n addresses[token.symbol.toUpperCase()] = token.address;\n }\n\n return addresses;\n}\n","import type { ChainConfig } from \"../types\";\nimport type { Optional } from \"@otim/utils/helpers\";\nimport type { Chain } from \"viem/chains\";\n\nimport { mainnetChains } from \"./mainnet-chains\";\nimport { testnetChains } from \"./testnet-chains\";\nimport { getChainTokens } from \"../tokens/chain-tokens\";\n\nexport const allChains = [...mainnetChains, ...testnetChains] as const;\n\nexport type SupportedChainId = (typeof allChains)[number][\"id\"];\n\nexport const chainById = new Map<number, Chain>(\n allChains.map((chain) => [chain.id, chain]),\n);\n\nexport function getChainById(chainId: number): Optional<Chain> {\n return chainById.get(chainId);\n}\n\nexport function getChainConfig(chainId: number): Optional<ChainConfig> {\n const chain = getChainById(chainId);\n if (!chain) return undefined;\n\n return {\n chain,\n isTestnet: chain.testnet ?? false,\n tokens: getChainTokens(chain.id),\n };\n}\n\nexport function getMainnetChains(): ChainConfig[] {\n return mainnetChains.map((chain) => ({\n chain,\n isTestnet: false,\n tokens: getChainTokens(chain.id),\n }));\n}\n\nexport function getTestnetChains(): ChainConfig[] {\n return testnetChains.map((chain) => ({\n chain,\n isTestnet: true,\n tokens: getChainTokens(chain.id),\n }));\n}\n\nexport function getAllChains(): ChainConfig[] {\n return [...getMainnetChains(), ...getTestnetChains()];\n}\n\nexport function isSupportedChain(chainId: number): boolean {\n return chainById.has(chainId);\n}\n","import type { ChainToken } from \"../types\";\n\nexport function filterTokens(\n tokens: ChainToken[],\n allowedSymbols: string[],\n disabledSymbols: string[],\n): ChainToken[] {\n let result = tokens;\n\n if (disabledSymbols.length > 0) {\n result = result.filter(\n (token) => !disabledSymbols.includes(token.symbol.toUpperCase()),\n );\n }\n\n if (allowedSymbols && allowedSymbols.length > 0) {\n result = result.filter((token) =>\n allowedSymbols.includes(token.symbol.toUpperCase()),\n );\n }\n\n return result;\n}\n","import type { ChainToken } from \"../types\";\nimport type { Optional } from \"@otim/utils/helpers\";\n\nexport interface TokenMaps {\n byAddress: Map<string, ChainToken>;\n bySymbol: Map<string, ChainToken>;\n}\n\nexport function createTokenMaps(tokens: ChainToken[]): TokenMaps {\n const byAddress = new Map<string, ChainToken>();\n const bySymbol = new Map<string, ChainToken>();\n\n tokens.forEach((token) => {\n byAddress.set(token.address.toLowerCase(), token);\n bySymbol.set(token.symbol.toLowerCase(), token);\n });\n\n return { byAddress, bySymbol };\n}\n\nexport function getTokenByAddress(\n maps: TokenMaps,\n address: string,\n): Optional<ChainToken> {\n if (!address) return undefined;\n return maps.byAddress.get(address.toLowerCase());\n}\n\nexport function getTokenBySymbol(\n maps: TokenMaps,\n symbol: string,\n): Optional<ChainToken> {\n if (!symbol) return undefined;\n return maps.bySymbol.get(symbol.toLowerCase());\n}\n","/**\n * List of supported stablecoin symbols\n */\nconst stablecoinSymbols = [\"USDC\", \"USDT\"] as const;\n\n/**\n * Checks if a token symbol is a stablecoin\n * @param symbol - Token symbol to check (e.g., \"USDC\", \"ETH\")\n * @returns true if the symbol is a recognized stablecoin\n */\nexport function isStablecoin(symbol: string | string[]): boolean {\n if (typeof symbol === \"string\") {\n return stablecoinSymbols.includes(\n symbol as (typeof stablecoinSymbols)[number],\n );\n }\n\n return symbol.every((s) =>\n stablecoinSymbols.includes(s as (typeof stablecoinSymbols)[number]),\n );\n}\n","import type { Optional } from \"@otim/utils/helpers\";\n\n/**\n * Mapping between chain ID numbers (used internally by otim) and\n * Lambda API chain ID strings (used by Lambda's API endpoints).\n *\n * Lambda uses string identifiers for chains while we use numeric chain IDs\n * from viem/wagmi. This map provides bidirectional conversion.\n */\n\n/**\n * Map from numeric chain ID to Lambda chain ID string\n */\nexport const CHAIN_ID_TO_LAMBDA_ID: Record<number, string> = {\n /* Mainnet chains */\n 1: \"ethereum\",\n 8453: \"base\",\n 42161: \"arbitrum\",\n 10: \"optimism\",\n 56: \"binance-smart-chain\",\n 130: \"unichain\",\n 137: \"polygon\",\n} as const;\n\n/**\n * Map from Lambda chain ID string to numeric chain ID\n */\nexport const LAMBDA_ID_TO_CHAIN_ID: Record<string, number> = {\n ethereum: 1,\n base: 8453,\n arbitrum: 42161,\n optimism: 10,\n \"binance-smart-chain\": 56,\n unichain: 130,\n polygon: 137,\n} as const;\n\n/**\n * Convert a numeric chain ID to Lambda's chain ID string\n * @param chainId - The numeric chain ID\n * @returns The Lambda chain ID string, or undefined if not supported by Lambda\n */\n\nexport function chainIdToLambdaId(chainId: number): Optional<string> {\n return CHAIN_ID_TO_LAMBDA_ID[chainId];\n}\n\n/**\n * Convert a Lambda chain ID string to numeric chain ID\n * @param lambdaId - The Lambda chain ID string\n * @returns The numeric chain ID, or undefined if not recognized\n */\nexport function lambdaIdToChainId(lambdaId: string): Optional<number> {\n return LAMBDA_ID_TO_CHAIN_ID[lambdaId];\n}\n\n/**\n * Check if a chain ID is supported by Lambda\n * @param chainId - The numeric chain ID to check\n * @returns true if the chain is supported by Lambda\n */\nexport function isLambdaSupportedChain(chainId: number): boolean {\n return chainId in CHAIN_ID_TO_LAMBDA_ID;\n}\n\n/**\n * Get all chain IDs supported by Lambda\n * @returns Array of numeric chain IDs that are supported by Lambda\n */\nexport function getLambdaSupportedChainIds(): number[] {\n return Object.keys(CHAIN_ID_TO_LAMBDA_ID).map(Number);\n}\n\n/**\n * Get all Lambda chain ID strings\n * @returns Array of Lambda chain ID strings\n */\nexport function getLambdaChainIds(): string[] {\n return Object.values(CHAIN_ID_TO_LAMBDA_ID);\n}\n","import type { Optional } from \"@otim/utils/helpers\";\n\nimport {\n arbitrum,\n avalanche,\n base,\n baseSepolia,\n bsc,\n mainnet,\n optimism,\n polygon,\n polygonAmoy,\n sepolia,\n unichain,\n} from \"viem/chains\";\n\nimport { pecorinoHost, pecorinoSignet } from \"./custom-chains\";\n\nexport interface ChainMetadata {\n name: string;\n iconUrl?: string;\n // Add other chain metadata fields as needed\n}\n\n/**\n * Chain metadata including icon URLs and display names.\n * Icon URLs can be IPFS hashes or HTTP URLs.\n * \n * To get chain icon URLs, you can:\n * 1. Extract from Lambda portfolio API (chain_icon_url field)\n * 2. Use chain explorer APIs\n * 3. Use trusted sources like ChainList\n */\nexport const chainMetadata: Record<number, ChainMetadata> = {\n [mainnet.id]: {\n name: \"Ethereum\",\n iconUrl: \"https://static.lambda.p2p.org/chains/ethereum.png\",\n },\n [base.id]: {\n name: \"Base\",\n iconUrl: \"https://static.lambda.p2p.org/chains/base.png\",\n },\n [arbitrum.id]: {\n name: \"Arbitrum One\",\n iconUrl: \"https://static.lambda.p2p.org/chains/arbitrum.png\",\n },\n [optimism.id]: {\n name: \"OP Mainnet\",\n iconUrl: \"https://static.lambda.p2p.org/chains/optimism.png\",\n },\n [bsc.id]: {\n name: \"Binance Smart Chain\",\n iconUrl: \"https://static.lambda.p2p.org/chains/binance-smart-chain.png\",\n },\n [polygon.id]: {\n name: \"Polygon\",\n iconUrl: \"https://static.lambda.p2p.org/chains/polygon.png\",\n },\n [avalanche.id]: {\n name: \"Avalanche\",\n iconUrl: \"https://static.lambda.p2p.org/chains/avalanche.png\",\n },\n [unichain.id]: {\n name: \"Unichain\",\n iconUrl: \"https://static.lambda.p2p.org/chains/unichain.png\",\n },\n [sepolia.id]: {\n name: \"Sepolia\",\n },\n [baseSepolia.id]: {\n name: \"Base Sepolia\",\n },\n [polygonAmoy.id]: {\n name: \"Polygon Amoy\",\n },\n [pecorinoSignet.id]: {\n name: \"Pecorino Signet\",\n },\n [pecorinoHost.id]: {\n name: \"Pecorino Host\",\n },\n};\n\n/**\n * Get chain metadata by chain ID\n * @param chainId - The numeric chain ID\n * @returns Chain metadata or undefined if not found\n */\nexport function getChainMetadata(chainId: number): Optional<ChainMetadata> {\n return chainMetadata[chainId];\n}\n\n/**\n * Get chain icon URL by chain ID\n * @param chainId - The numeric chain ID\n * @returns Chain icon URL or undefined if not found\n */\nexport function getChainIconUrl(chainId: number): Optional<string> {\n return chainMetadata[chainId]?.iconUrl;\n}\n\n/**\n * Get chain display name by chain ID\n * @param chainId - The numeric chain ID\n * @returns Chain name or undefined if not found\n */\nexport function getChainDisplayName(chainId: number): Optional<string> {\n return chainMetadata[chainId]?.name;\n}\n\n"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
1
+ {"version":3,"file":"index.mjs","names":["ethereumTokens","baseTokens","arbitrumTokens","optimismTokens","bscTokens","polygonTokens"],"sources":["../../src/chains/config/custom-chains.ts","../../src/chains/config/all-chains.ts","../../src/chains/config/mainnet-chains.ts","../../src/chains/config/testnet-chains.ts","../../src/chains/tokens/testnet-token-addresses.ts","../../src/chains/tokens/testnet-token-metadata.ts","../../src/chains/tokens/arbitrum-token-list.json","../../src/chains/tokens/base-token-list.json","../../src/chains/tokens/bsc-token-list.json","../../src/chains/tokens/ethereum-token-list.json","../../src/chains/tokens/optimism-token-list.json","../../src/chains/tokens/polygon-token-list.json","../../src/chains/tokens/token-lists.ts","../../src/chains/tokens/chain-tokens.ts","../../src/chains/config/supported-chains.ts","../../src/chains/utils/filter-tokens.ts","../../src/chains/utils/token-maps.ts","../../src/chains/utils/stablecoin.ts","../../src/chains/transport.ts","../../src/chains/lambda/chain-mapping.ts","../../src/chains/config/chain-metadata.ts"],"sourcesContent":["import type { Chain } from \"viem/chains\";\n\nexport const pecorinoSignet = {\n id: 14174,\n name: \"Pecorino Signet\",\n nativeCurrency: {\n decimals: 18,\n name: \"USD\",\n symbol: \"USD\",\n },\n rpcUrls: {\n default: { http: [\"https://rpc.pecorino.signet.sh/\"] },\n public: { http: [\"https://rpc.pecorino.signet.sh/\"] },\n },\n blockExplorers: {\n default: {\n name: \"Pecorino Signet Explorer\",\n url: \"https://explorer.pecorino.signet.sh/\",\n },\n },\n testnet: true,\n} as const satisfies Chain;\n\nexport const pecorinoHost = {\n id: 3151908,\n name: \"Pecorino Host\",\n nativeCurrency: {\n decimals: 18,\n name: \"ETH\",\n symbol: \"ETH\",\n },\n rpcUrls: {\n default: { http: [\"https://host-rpc.pecorino.signet.sh/\"] },\n public: { http: [\"https://host-rpc.pecorino.signet.sh/\"] },\n },\n blockExplorers: {\n default: {\n name: \"Pecorino Host Explorer\",\n url: \"https://explorer-host.pecorino.signet.sh/\",\n },\n },\n testnet: true,\n} as const satisfies Chain;\n","import {\n arbitrum,\n base,\n baseSepolia,\n bsc,\n mainnet,\n optimism,\n polygon,\n polygonAmoy,\n sepolia,\n unichain,\n} from \"viem/chains\";\n\nimport { pecorinoHost, pecorinoSignet } from \"./custom-chains\";\nimport { OtimEnvironment } from \"../../config/api-urls\";\n\nexport const supportedChains = {\n mainnet: {\n mainnet,\n base,\n arbitrum,\n polygon,\n },\n testnet: {\n sepolia,\n baseSepolia,\n },\n} as const;\n\nexport const allSupportedChains = {\n mainnet,\n base,\n arbitrum,\n optimism,\n bsc,\n unichain,\n polygon,\n sepolia,\n baseSepolia,\n polygonAmoy,\n pecorinoHost,\n pecorinoSignet,\n} as const;\n\n/**\n * Get the default chain ID based on the provided environment.\n * Production: Base mainnet (8453)\n * Local/Sandbox: Base Sepolia (84532)\n *\n * @param environment - The Otim environment (local | sandbox | production)\n * @returns The default chain ID for the environment\n */\nexport const getDefaultChainId = (environment: OtimEnvironment): number => {\n return environment === OtimEnvironment.Production ? base.id : baseSepolia.id;\n};\n\n/**\n * Get the default chain based on the provided environment.\n * Production: Base mainnet\n * Local/Sandbox: Base Sepolia\n *\n * @param environment - The Otim environment (local | sandbox | production)\n * @returns The default chain for the environment\n */\nexport const getDefaultChain = (environment: OtimEnvironment) => {\n return environment === OtimEnvironment.Production ? base : baseSepolia;\n};\n\nexport type SupportedChainName = keyof typeof allSupportedChains;\nexport type MainnetChainName = keyof typeof supportedChains.mainnet;\nexport type TestnetChainName = keyof typeof supportedChains.testnet;\n","import type { Optional } from \"@otim/utils/helpers\";\nimport type { Chain } from \"viem/chains\";\n\nimport {\n arbitrum,\n base,\n bsc,\n mainnet,\n optimism,\n polygon,\n unichain,\n} from \"viem/chains\";\n\nexport const mainnetChains = [\n mainnet,\n base,\n arbitrum,\n optimism,\n bsc,\n unichain,\n polygon,\n] as const;\n\nexport const mainnetChainsById = new Map<number, Chain>(\n mainnetChains.map((chain) => [chain.id, chain]),\n);\n\nexport function getMainnetChain(chainId: number): Optional<Chain> {\n return mainnetChainsById.get(chainId);\n}\n\nexport function isMainnetChain(chainId: number): boolean {\n return mainnetChainsById.has(chainId);\n}\n","import type { Optional } from \"@otim/utils/helpers\";\nimport type { Chain } from \"viem/chains\";\n\nimport {\n baseSepolia,\n sepolia,\n} from \"viem/chains\";\n\nexport const testnetChains = [\n sepolia,\n baseSepolia,\n] as const;\n\nexport const testnetChainsById = new Map<number, Chain>(\n testnetChains.map((chain) => [chain.id, chain]),\n);\n\nexport function getTestnetChain(chainId: number): Optional<Chain> {\n return testnetChainsById.get(chainId);\n}\n\nexport function isTestnetChain(chainId: number): boolean {\n return testnetChainsById.has(chainId);\n}\n","import type { ChainTokenAddresses } from \"../types\";\nimport type { Optional } from \"@otim/utils/helpers\";\nimport type { Address } from \"@otim/utils/schemas\";\n\nimport {\n baseSepolia,\n bscTestnet,\n polygonAmoy,\n sepolia,\n unichain,\n} from \"viem/chains\";\n\nimport { DEFAULT_ADDRESS } from \"../../helpers\";\nimport { pecorinoHost, pecorinoSignet } from \"../config/custom-chains\";\n\n/**\n * Token addresses for testnets and custom chains.\n * Mainnets use JSON token lists (see token-lists.ts).\n */\nexport const testnetTokenAddresses: Record<number, ChainTokenAddresses> = {\n // TESTNETS\n [sepolia.id]: {\n ETH: DEFAULT_ADDRESS,\n WETH: \"0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14\",\n USDC: \"0x1c7d4b196cb0c7b01d743fbc6116a902379c7238\",\n USDT: \"0xaa8e23fb1079ea71e0a56f48a2aa51851d8433d0\",\n },\n [baseSepolia.id]: {\n ETH: DEFAULT_ADDRESS,\n WETH: \"0x4200000000000000000000000000000000000006\",\n USDC: \"0x036CbD53842c5426634e7929541eC2318f3dCF7e\",\n USDT: \"0x323e78f944A9a1FcF3a10efcC5319DBb0bB6e673\",\n },\n [bscTestnet.id]: {\n BNB: DEFAULT_ADDRESS,\n WBNB: \"0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd\",\n USDC: \"0x64544969ed7EBf5f083679233325356EbE738930\",\n },\n [polygonAmoy.id]: {\n POL: DEFAULT_ADDRESS,\n WMATIC: \"0x360ad4f9a9A8EFe9A8DCB5f461c4Cc1047E1Dcf9\",\n USDC: \"0x41E94Eb019C0762f9Bfcf9Fb1E58725BfB0e7582\",\n },\n // CUSTOM CHAINS\n [unichain.id]: {\n ETH: DEFAULT_ADDRESS,\n WETH: \"0x4200000000000000000000000000000000000006\",\n USDC: \"0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA\",\n },\n [pecorinoSignet.id]: {\n USD: DEFAULT_ADDRESS,\n },\n [pecorinoHost.id]: {\n ETH: DEFAULT_ADDRESS,\n },\n};\n\nexport function getTestnetTokenAddresses(chainId: number): ChainTokenAddresses {\n return testnetTokenAddresses[chainId] || {};\n}\n\nexport function getTestnetTokenAddress(\n chainId: number,\n symbol: string,\n): Optional<Address> {\n const addresses = getTestnetTokenAddresses(chainId);\n return addresses[symbol.toUpperCase()];\n}\n\nexport function isTestnetTokenSupported(\n chainId: number,\n symbol: string,\n): boolean {\n return getTestnetTokenAddress(chainId, symbol) !== undefined;\n}\n\n\n","import type { TokenMetadata } from \"../types\";\nimport type { Optional } from \"@otim/utils/helpers\";\n\n/**\n * Token metadata for testnets and custom chains.\n * Mainnets use JSON token lists (see token-lists.ts).\n */\nexport const testnetTokenMetadata: Record<string, TokenMetadata> = {\n USD: {\n name: \"US Dollar\",\n symbol: \"USD\",\n decimals: 18,\n logoURI: \"/tokens/usd.svg\",\n },\n ETH: {\n name: \"Ethereum\",\n symbol: \"ETH\",\n decimals: 18,\n logoURI: \"/tokens/eth.svg\",\n },\n WETH: {\n name: \"Wrapped Ether\",\n symbol: \"WETH\",\n decimals: 18,\n logoURI: \"/tokens/eth.svg\",\n type: \"ERC20\",\n },\n USDC: {\n name: \"USDC\",\n symbol: \"USDC\",\n decimals: 6,\n logoURI:\n \"https://assets-cdn.trustwallet.com/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png\",\n type: \"ERC20\",\n },\n USDT: {\n name: \"Tether USD\",\n symbol: \"USDT\",\n decimals: 6,\n logoURI:\n \"https://assets-cdn.trustwallet.com/blockchains/ethereum/assets/0xdAC17F958D2ee523a2206206994597C13D831ec7/logo.png\",\n type: \"ERC20\",\n },\n BNB: {\n name: \"BNB\",\n symbol: \"BNB\",\n decimals: 18,\n logoURI: \"/tokens/eth.svg\", // TODO: Add BNB logo\n type: \"ERC20\",\n },\n WBNB: {\n name: \"Wrapped BNB\",\n symbol: \"WBNB\",\n decimals: 18,\n logoURI: \"/tokens/eth.svg\", // TODO: Add BNB logo\n type: \"ERC20\",\n },\n POL: {\n name: \"Polygon\",\n symbol: \"POL\",\n decimals: 18,\n logoURI: \"/tokens/eth.svg\", // TODO: Add POL logo\n type: \"ERC20\",\n },\n WPOL: {\n name: \"Wrapped Polygon\",\n symbol: \"WPOL\",\n decimals: 18,\n logoURI: \"/tokens/eth.svg\", // TODO: Add POL logo\n type: \"ERC20\",\n },\n WMATIC: {\n name: \"Wrapped MATIC\",\n symbol: \"WMATIC\",\n decimals: 18,\n logoURI: \"/tokens/eth.svg\", // TODO: Add MATIC logo\n type: \"ERC20\",\n },\n};\n\nexport function getTestnetTokenMetadata(symbol: string): Optional<TokenMetadata> {\n return testnetTokenMetadata[symbol.toUpperCase()];\n}\n\n\n","","","","","","","import type { ChainToken } from \"../types\";\nimport type { Optional } from \"@otim/utils/helpers\";\nimport type { Address } from \"@otim/utils/schemas\";\n\nimport {\n arbitrum,\n base,\n bsc,\n mainnet,\n optimism,\n polygon,\n} from \"viem/chains\";\n\n// Static imports - these will be inlined at build time by the bundler\nimport arbitrumTokens from \"./arbitrum-token-list.json\";\nimport baseTokens from \"./base-token-list.json\";\nimport bscTokens from \"./bsc-token-list.json\";\nimport ethereumTokens from \"./ethereum-token-list.json\";\nimport optimismTokens from \"./optimism-token-list.json\";\nimport polygonTokens from \"./polygon-token-list.json\";\n\n/**\n * Token data from CoinGecko-generated JSON files\n */\nexport interface TokenListEntry {\n chainId: number;\n address: string;\n symbol: string;\n name: string;\n coingeckoId: string;\n marketCapRank: number;\n logoUrl: string;\n decimals: number;\n}\n\n/**\n * Chain ID to token list mapping\n */\nconst CHAIN_TOKEN_LISTS: Record<number, TokenListEntry[]> = {\n [mainnet.id]: ethereumTokens as TokenListEntry[],\n [base.id]: baseTokens as TokenListEntry[],\n [arbitrum.id]: arbitrumTokens as TokenListEntry[],\n [optimism.id]: optimismTokens as TokenListEntry[],\n [bsc.id]: bscTokens as TokenListEntry[],\n [polygon.id]: polygonTokens as TokenListEntry[],\n};\n\n/**\n * Convert TokenListEntry to ChainToken format\n */\nfunction toChainToken(entry: TokenListEntry): ChainToken {\n // Decimals are always present in the JSON token lists\n const decimals = entry.decimals;\n \n return {\n chainId: entry.chainId,\n address: entry.address as Address,\n symbol: entry.symbol,\n name: entry.name,\n decimals,\n logoURI: entry.logoUrl,\n type: \"ERC20\",\n };\n}\n\n/**\n * Load token list for a specific chain\n */\nexport function loadTokenList(chainId: number): TokenListEntry[] {\n return CHAIN_TOKEN_LISTS[chainId] || [];\n}\n\n/**\n * Get token list as ChainToken[] for a specific chain\n */\nexport function getTokenListTokens(chainId: number): ChainToken[] {\n const entries = loadTokenList(chainId);\n return entries.map(toChainToken);\n}\n\n/**\n * Get a token from the token list by address\n */\nexport function getTokenListTokenByAddress(\n chainId: number,\n address: string,\n): Optional<ChainToken> {\n const entries = loadTokenList(chainId);\n const entry = entries.find(\n (t) => t.address.toLowerCase() === address.toLowerCase(),\n );\n return entry ? toChainToken(entry) : undefined;\n}\n\n/**\n * Get a token from the token list by symbol\n */\nexport function getTokenListTokenBySymbol(\n chainId: number,\n symbol: string,\n): Optional<ChainToken> {\n const entries = loadTokenList(chainId);\n const entry = entries.find(\n (t) => t.symbol.toUpperCase() === symbol.toUpperCase(),\n );\n return entry ? toChainToken(entry) : undefined;\n}\n\n/**\n * Get raw token list entries (with CoinGecko metadata)\n */\nexport function getTokenListEntries(chainId: number): TokenListEntry[] {\n return loadTokenList(chainId);\n}\n\n/**\n * Check if a chain has a token list available\n */\nexport function hasTokenList(chainId: number): boolean {\n return chainId in CHAIN_TOKEN_LISTS;\n}\n","import type { ChainToken } from \"../types\";\nimport type { Optional } from \"@otim/utils/helpers\";\n\nimport {\n getTestnetTokenAddress,\n getTestnetTokenAddresses,\n} from \"./testnet-token-addresses\";\nimport { getTestnetTokenMetadata } from \"./testnet-token-metadata\";\nimport {\n getTokenListTokenBySymbol,\n getTokenListTokens,\n hasTokenList,\n} from \"./token-lists\";\n\n/**\n * Get all tokens for a chain.\n * \n * Mainnets (Ethereum, Base, Arbitrum, Optimism, BSC, Polygon):\n * - Uses comprehensive JSON token lists (top 50 by market cap)\n * \n * Testnets and custom chains:\n * - Uses hardcoded token addresses and metadata\n */\nexport function getChainTokens(chainId: number): ChainToken[] {\n // Use JSON token lists for supported mainnets\n if (hasTokenList(chainId)) {\n return getTokenListTokens(chainId);\n }\n\n // Use testnet/custom chain system\n const addresses = getTestnetTokenAddresses(chainId);\n const tokens: ChainToken[] = [];\n\n for (const [symbol, address] of Object.entries(addresses)) {\n const metadata = getTestnetTokenMetadata(symbol);\n\n if (metadata && address) {\n tokens.push({ ...metadata, address, chainId });\n }\n }\n\n return tokens;\n}\n\nexport function getChainToken(\n chainId: number,\n symbol: string,\n): Optional<ChainToken> {\n const tokens = getChainTokens(chainId);\n return tokens.find(\n (token) => token.symbol.toUpperCase() === symbol.toUpperCase(),\n );\n}\n\nexport function getChainTokenByAddress(\n chainId: number,\n address: string,\n): Optional<ChainToken> {\n const tokens = getChainTokens(chainId);\n return tokens.find(\n (token) => token.address.toLowerCase() === address.toLowerCase(),\n );\n}\n\n/**\n * Get token address by symbol for a chain.\n * Works for both mainnets (from JSON lists) and testnets (from hardcoded addresses).\n */\nexport function getTokenAddress(\n chainId: number,\n symbol: string,\n): Optional<string> {\n // Try JSON lists first (mainnets)\n if (hasTokenList(chainId)) {\n const token = getTokenListTokenBySymbol(chainId, symbol);\n return token?.address;\n }\n\n // Fallback to testnet addresses\n return getTestnetTokenAddress(chainId, symbol);\n}\n\n/**\n * Get all token addresses for a chain as a symbol -> address mapping.\n * Compatible with the old tokenAddresses structure for backward compatibility.\n */\nexport function getTokenAddresses(\n chainId: number,\n): Record<string, string> {\n const tokens = getChainTokens(chainId);\n const addresses: Record<string, string> = {};\n\n for (const token of tokens) {\n addresses[token.symbol.toUpperCase()] = token.address;\n }\n\n return addresses;\n}\n","import type { ChainConfig } from \"../types\";\nimport type { Optional } from \"@otim/utils/helpers\";\nimport type { Chain } from \"viem/chains\";\n\nimport { mainnetChains } from \"./mainnet-chains\";\nimport { testnetChains } from \"./testnet-chains\";\nimport { getChainTokens } from \"../tokens/chain-tokens\";\n\nexport const allChains = [...mainnetChains, ...testnetChains] as const;\n\nexport type SupportedChainId = (typeof allChains)[number][\"id\"];\n\nexport const chainById = new Map<number, Chain>(\n allChains.map((chain) => [chain.id, chain]),\n);\n\nexport function getChainById(chainId: number): Optional<Chain> {\n return chainById.get(chainId);\n}\n\nexport function getChainConfig(chainId: number): Optional<ChainConfig> {\n const chain = getChainById(chainId);\n if (!chain) return undefined;\n\n return {\n chain,\n isTestnet: chain.testnet ?? false,\n tokens: getChainTokens(chain.id),\n };\n}\n\nexport function getMainnetChains(): ChainConfig[] {\n return mainnetChains.map((chain) => ({\n chain,\n isTestnet: false,\n tokens: getChainTokens(chain.id),\n }));\n}\n\nexport function getTestnetChains(): ChainConfig[] {\n return testnetChains.map((chain) => ({\n chain,\n isTestnet: true,\n tokens: getChainTokens(chain.id),\n }));\n}\n\nexport function getAllChains(): ChainConfig[] {\n return [...getMainnetChains(), ...getTestnetChains()];\n}\n\nexport function isSupportedChain(chainId: number): boolean {\n return chainById.has(chainId);\n}\n","import type { ChainToken } from \"../types\";\n\nexport function filterTokens(\n tokens: ChainToken[],\n allowedSymbols: string[],\n disabledSymbols: string[],\n): ChainToken[] {\n let result = tokens;\n\n if (disabledSymbols.length > 0) {\n result = result.filter(\n (token) => !disabledSymbols.includes(token.symbol.toUpperCase()),\n );\n }\n\n if (allowedSymbols && allowedSymbols.length > 0) {\n result = result.filter((token) =>\n allowedSymbols.includes(token.symbol.toUpperCase()),\n );\n }\n\n return result;\n}\n","import type { ChainToken } from \"../types\";\nimport type { Optional } from \"@otim/utils/helpers\";\n\nexport interface TokenMaps {\n byAddress: Map<string, ChainToken>;\n bySymbol: Map<string, ChainToken>;\n}\n\nexport function createTokenMaps(tokens: ChainToken[]): TokenMaps {\n const byAddress = new Map<string, ChainToken>();\n const bySymbol = new Map<string, ChainToken>();\n\n tokens.forEach((token) => {\n byAddress.set(token.address.toLowerCase(), token);\n bySymbol.set(token.symbol.toLowerCase(), token);\n });\n\n return { byAddress, bySymbol };\n}\n\nexport function getTokenByAddress(\n maps: TokenMaps,\n address: string,\n): Optional<ChainToken> {\n if (!address) return undefined;\n return maps.byAddress.get(address.toLowerCase());\n}\n\nexport function getTokenBySymbol(\n maps: TokenMaps,\n symbol: string,\n): Optional<ChainToken> {\n if (!symbol) return undefined;\n return maps.bySymbol.get(symbol.toLowerCase());\n}\n","/**\n * List of supported stablecoin symbols\n */\nconst stablecoinSymbols = [\"USDC\", \"USDT\"] as const;\n\n/**\n * Checks if a token symbol is a stablecoin\n * @param symbol - Token symbol to check (e.g., \"USDC\", \"ETH\")\n * @returns true if the symbol is a recognized stablecoin\n */\nexport function isStablecoin(symbol: string | string[]): boolean {\n if (typeof symbol === \"string\") {\n return stablecoinSymbols.includes(\n symbol as (typeof stablecoinSymbols)[number],\n );\n }\n\n return symbol.every((s) =>\n stablecoinSymbols.includes(s as (typeof stablecoinSymbols)[number]),\n );\n}\n","import { http } from \"viem\";\nimport { polygon } from \"viem/chains\";\n\nexport type ChainRpcOverrides = Readonly<Record<number, string>>;\n\n/**\n * Default custom RPC URL overrides per chain ID.\n * Used by {@link getChainTransport} when no caller-provided override exists.\n */\nexport const customRpcUrls: ChainRpcOverrides = {\n [polygon.id]: \"https://polygon.drpc.org\",\n} as const;\n\n/**\n * Returns an HTTP transport for the given chain.\n * Resolves the RPC URL in priority order:\n * 1. Caller-provided `overrides`\n * 2. {@link customRpcUrls} defaults\n * 3. viem's built-in public RPC (bare `http()`)\n */\nexport function getChainTransport(\n chainId: number,\n overrides?: ChainRpcOverrides,\n) {\n const rpcUrl = overrides?.[chainId] ?? customRpcUrls[chainId];\n return rpcUrl ? http(rpcUrl) : http();\n}\n","import type { Optional } from \"@otim/utils/helpers\";\n\n/**\n * Mapping between chain ID numbers (used internally by otim) and\n * Lambda API chain ID strings (used by Lambda's API endpoints).\n *\n * Lambda uses string identifiers for chains while we use numeric chain IDs\n * from viem/wagmi. This map provides bidirectional conversion.\n */\n\n/**\n * Map from numeric chain ID to Lambda chain ID string\n */\nexport const CHAIN_ID_TO_LAMBDA_ID: Record<number, string> = {\n /* Mainnet chains */\n 1: \"ethereum\",\n 8453: \"base\",\n 42161: \"arbitrum\",\n 10: \"optimism\",\n 56: \"binance-smart-chain\",\n 130: \"unichain\",\n 137: \"polygon\",\n} as const;\n\n/**\n * Map from Lambda chain ID string to numeric chain ID\n */\nexport const LAMBDA_ID_TO_CHAIN_ID: Record<string, number> = {\n ethereum: 1,\n base: 8453,\n arbitrum: 42161,\n optimism: 10,\n \"binance-smart-chain\": 56,\n unichain: 130,\n polygon: 137,\n} as const;\n\n/**\n * Convert a numeric chain ID to Lambda's chain ID string\n * @param chainId - The numeric chain ID\n * @returns The Lambda chain ID string, or undefined if not supported by Lambda\n */\n\nexport function chainIdToLambdaId(chainId: number): Optional<string> {\n return CHAIN_ID_TO_LAMBDA_ID[chainId];\n}\n\n/**\n * Convert a Lambda chain ID string to numeric chain ID\n * @param lambdaId - The Lambda chain ID string\n * @returns The numeric chain ID, or undefined if not recognized\n */\nexport function lambdaIdToChainId(lambdaId: string): Optional<number> {\n return LAMBDA_ID_TO_CHAIN_ID[lambdaId];\n}\n\n/**\n * Check if a chain ID is supported by Lambda\n * @param chainId - The numeric chain ID to check\n * @returns true if the chain is supported by Lambda\n */\nexport function isLambdaSupportedChain(chainId: number): boolean {\n return chainId in CHAIN_ID_TO_LAMBDA_ID;\n}\n\n/**\n * Get all chain IDs supported by Lambda\n * @returns Array of numeric chain IDs that are supported by Lambda\n */\nexport function getLambdaSupportedChainIds(): number[] {\n return Object.keys(CHAIN_ID_TO_LAMBDA_ID).map(Number);\n}\n\n/**\n * Get all Lambda chain ID strings\n * @returns Array of Lambda chain ID strings\n */\nexport function getLambdaChainIds(): string[] {\n return Object.values(CHAIN_ID_TO_LAMBDA_ID);\n}\n","import type { Optional } from \"@otim/utils/helpers\";\n\nimport {\n arbitrum,\n avalanche,\n base,\n baseSepolia,\n bsc,\n mainnet,\n optimism,\n polygon,\n polygonAmoy,\n sepolia,\n unichain,\n} from \"viem/chains\";\n\nimport { pecorinoHost, pecorinoSignet } from \"./custom-chains\";\n\nexport interface ChainMetadata {\n name: string;\n iconUrl?: string;\n // Add other chain metadata fields as needed\n}\n\n/**\n * Chain metadata including icon URLs and display names.\n * Icon URLs can be IPFS hashes or HTTP URLs.\n * \n * To get chain icon URLs, you can:\n * 1. Extract from Lambda portfolio API (chain_icon_url field)\n * 2. Use chain explorer APIs\n * 3. Use trusted sources like ChainList\n */\nexport const chainMetadata: Record<number, ChainMetadata> = {\n [mainnet.id]: {\n name: \"Ethereum\",\n iconUrl: \"https://static.lambda.p2p.org/chains/ethereum.png\",\n },\n [base.id]: {\n name: \"Base\",\n iconUrl: \"https://static.lambda.p2p.org/chains/base.png\",\n },\n [arbitrum.id]: {\n name: \"Arbitrum One\",\n iconUrl: \"https://static.lambda.p2p.org/chains/arbitrum.png\",\n },\n [optimism.id]: {\n name: \"OP Mainnet\",\n iconUrl: \"https://static.lambda.p2p.org/chains/optimism.png\",\n },\n [bsc.id]: {\n name: \"Binance Smart Chain\",\n iconUrl: \"https://static.lambda.p2p.org/chains/binance-smart-chain.png\",\n },\n [polygon.id]: {\n name: \"Polygon\",\n iconUrl: \"https://static.lambda.p2p.org/chains/polygon.png\",\n },\n [avalanche.id]: {\n name: \"Avalanche\",\n iconUrl: \"https://static.lambda.p2p.org/chains/avalanche.png\",\n },\n [unichain.id]: {\n name: \"Unichain\",\n iconUrl: \"https://static.lambda.p2p.org/chains/unichain.png\",\n },\n [sepolia.id]: {\n name: \"Sepolia\",\n },\n [baseSepolia.id]: {\n name: \"Base Sepolia\",\n },\n [polygonAmoy.id]: {\n name: \"Polygon Amoy\",\n },\n [pecorinoSignet.id]: {\n name: \"Pecorino Signet\",\n },\n [pecorinoHost.id]: {\n name: \"Pecorino Host\",\n },\n};\n\n/**\n * Get chain metadata by chain ID\n * @param chainId - The numeric chain ID\n * @returns Chain metadata or undefined if not found\n */\nexport function getChainMetadata(chainId: number): Optional<ChainMetadata> {\n return chainMetadata[chainId];\n}\n\n/**\n * Get chain icon URL by chain ID\n * @param chainId - The numeric chain ID\n * @returns Chain icon URL or undefined if not found\n */\nexport function getChainIconUrl(chainId: number): Optional<string> {\n return chainMetadata[chainId]?.iconUrl;\n}\n\n/**\n * Get chain display name by chain ID\n * @param chainId - The numeric chain ID\n * @returns Chain name or undefined if not found\n */\nexport function getChainDisplayName(chainId: number): Optional<string> {\n return chainMetadata[chainId]?.name;\n}\n\n"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
@@ -1,4 +1,4 @@
1
- //#region rolldown:runtime
1
+ //#region \0rolldown/runtime.js
2
2
  var __create = Object.create;
3
3
  var __defProp = Object.defineProperty;
4
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -1,4 +1,4 @@
1
- import { t as OtimEnvironment } from "./api-urls-SKeIQMoZ.js";
1
+ import { t as OtimEnvironment } from "./api-urls-Dgxfefmy.js";
2
2
  import { AxiosInstance } from "axios";
3
3
 
4
4
  //#region src/server/client-factory.d.ts
@@ -19,4 +19,4 @@ type ApiClient = AxiosInstance;
19
19
  declare function createApiClient(config: ApiClientConfig): ApiClient;
20
20
  //#endregion
21
21
  export { ApiClientConfig as n, createApiClient as r, ApiClient as t };
22
- //# sourceMappingURL=client-factory-C3A4RPdj.d.ts.map
22
+ //# sourceMappingURL=client-factory-B12uLPUI.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-factory-B12uLPUI.d.ts","names":[],"sources":["../src/server/client-factory.ts"],"mappings":";;;;UAUiB,eAAA;EAEf,WAAA,EAAa,eAAA;EAEb,eAAA,SAAwB,OAAA;EAExB,OAAA;EAEA,OAAA;AAAA;AAAA,KAIU,SAAA,GAAY,aAAA;;;;;;;;iBAsBR,eAAA,CAAgB,MAAA,EAAQ,eAAA,GAAkB,SAAA"}
@@ -1,4 +1,4 @@
1
- import { a as getPlatformApiUrl } from "./api-urls-DJcIKBCy.mjs";
1
+ import { a as getPlatformApiUrl } from "./api-urls-B6RnXSRD.mjs";
2
2
  import axios from "axios";
3
3
  import { isString, logger } from "@otim/utils/helpers";
4
4
 
@@ -39,4 +39,4 @@ function createApiClient(config) {
39
39
 
40
40
  //#endregion
41
41
  export { createApiClient as t };
42
- //# sourceMappingURL=client-factory-7xUSPC9I.mjs.map
42
+ //# sourceMappingURL=client-factory-DY6UNuuV.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"client-factory-7xUSPC9I.mjs","names":[],"sources":["../src/server/client-factory.ts"],"sourcesContent":["import type { OtimEnvironment } from \"../config/api-urls\";\nimport type { AxiosInstance } from \"axios\";\n\nimport axios from \"axios\";\n\nimport { isString, logger } from \"@otim/utils/helpers\";\n\nimport { getPlatformApiUrl } from \"../config/api-urls\";\n\n/* Configuration for creating an API client instance */\nexport interface ApiClientConfig {\n /* Required: The environment to use (sandbox or production) */\n environment: OtimEnvironment;\n /* Optional: Custom auth token getter for this client instance */\n authTokenGetter?: () => Promise<string | undefined>;\n /* Optional: Override the base URL (defaults to environment URL) */\n baseURL?: string;\n /* Optional: Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n}\n\n/* Type alias for the API client instance */\nexport type ApiClient = AxiosInstance;\n\n/* Gets the Platform API URL for the specified environment */\nfunction getApiUrlForEnvironment(environment: OtimEnvironment): string {\n const url = getPlatformApiUrl(environment);\n\n if (!isString(url) || url.trim() === \"\") {\n const errorMessage = `Invalid API URL for environment: ${environment}`;\n logger.error(errorMessage, { context: \"API Client Factory\" });\n throw new Error(errorMessage);\n }\n\n return url;\n}\n\n/**\n * Creates a new API client instance with the specified configuration.\n * Each client is independent and can have its own auth token getter.\n *\n * @param config - The configuration for the API client\n * @returns An axios instance configured for the specified environment\n */\nexport function createApiClient(config: ApiClientConfig): ApiClient {\n const { environment, authTokenGetter, timeout = 30000 } = config;\n\n const baseURL = config.baseURL ?? getApiUrlForEnvironment(environment);\n\n const client = axios.create({\n baseURL,\n timeout,\n });\n\n // Setup auth token interceptor if provided\n if (authTokenGetter) {\n client.interceptors.request.use(async (requestConfig) => {\n const token = await authTokenGetter();\n if (token) {\n requestConfig.headers = requestConfig.headers ?? {};\n requestConfig.headers.Authorization = `Bearer ${token}`;\n }\n return requestConfig;\n });\n }\n\n return client;\n}\n"],"mappings":";;;;;AAyBA,SAAS,wBAAwB,aAAsC;CACrE,MAAM,MAAM,kBAAkB,YAAY;AAE1C,KAAI,CAAC,SAAS,IAAI,IAAI,IAAI,MAAM,KAAK,IAAI;EACvC,MAAM,eAAe,oCAAoC;AACzD,SAAO,MAAM,cAAc,EAAE,SAAS,sBAAsB,CAAC;AAC7D,QAAM,IAAI,MAAM,aAAa;;AAG/B,QAAO;;;;;;;;;AAUT,SAAgB,gBAAgB,QAAoC;CAClE,MAAM,EAAE,aAAa,iBAAiB,UAAU,QAAU;CAE1D,MAAM,UAAU,OAAO,WAAW,wBAAwB,YAAY;CAEtE,MAAM,SAAS,MAAM,OAAO;EAC1B;EACA;EACD,CAAC;AAGF,KAAI,gBACF,QAAO,aAAa,QAAQ,IAAI,OAAO,kBAAkB;EACvD,MAAM,QAAQ,MAAM,iBAAiB;AACrC,MAAI,OAAO;AACT,iBAAc,UAAU,cAAc,WAAW,EAAE;AACnD,iBAAc,QAAQ,gBAAgB,UAAU;;AAElD,SAAO;GACP;AAGJ,QAAO"}
1
+ {"version":3,"file":"client-factory-DY6UNuuV.mjs","names":[],"sources":["../src/server/client-factory.ts"],"sourcesContent":["import type { OtimEnvironment } from \"../config/api-urls\";\nimport type { AxiosInstance } from \"axios\";\n\nimport axios from \"axios\";\n\nimport { isString, logger } from \"@otim/utils/helpers\";\n\nimport { getPlatformApiUrl } from \"../config/api-urls\";\n\n/* Configuration for creating an API client instance */\nexport interface ApiClientConfig {\n /* Required: The environment to use (sandbox or production) */\n environment: OtimEnvironment;\n /* Optional: Custom auth token getter for this client instance */\n authTokenGetter?: () => Promise<string | undefined>;\n /* Optional: Override the base URL (defaults to environment URL) */\n baseURL?: string;\n /* Optional: Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n}\n\n/* Type alias for the API client instance */\nexport type ApiClient = AxiosInstance;\n\n/* Gets the Platform API URL for the specified environment */\nfunction getApiUrlForEnvironment(environment: OtimEnvironment): string {\n const url = getPlatformApiUrl(environment);\n\n if (!isString(url) || url.trim() === \"\") {\n const errorMessage = `Invalid API URL for environment: ${environment}`;\n logger.error(errorMessage, { context: \"API Client Factory\" });\n throw new Error(errorMessage);\n }\n\n return url;\n}\n\n/**\n * Creates a new API client instance with the specified configuration.\n * Each client is independent and can have its own auth token getter.\n *\n * @param config - The configuration for the API client\n * @returns An axios instance configured for the specified environment\n */\nexport function createApiClient(config: ApiClientConfig): ApiClient {\n const { environment, authTokenGetter, timeout = 30000 } = config;\n\n const baseURL = config.baseURL ?? getApiUrlForEnvironment(environment);\n\n const client = axios.create({\n baseURL,\n timeout,\n });\n\n // Setup auth token interceptor if provided\n if (authTokenGetter) {\n client.interceptors.request.use(async (requestConfig) => {\n const token = await authTokenGetter();\n if (token) {\n requestConfig.headers = requestConfig.headers ?? {};\n requestConfig.headers.Authorization = `Bearer ${token}`;\n }\n return requestConfig;\n });\n }\n\n return client;\n}\n"],"mappings":";;;;;AAyBA,SAAS,wBAAwB,aAAsC;CACrE,MAAM,MAAM,kBAAkB,YAAY;AAE1C,KAAI,CAAC,SAAS,IAAI,IAAI,IAAI,MAAM,KAAK,IAAI;EACvC,MAAM,eAAe,oCAAoC;AACzD,SAAO,MAAM,cAAc,EAAE,SAAS,sBAAsB,CAAC;AAC7D,QAAM,IAAI,MAAM,aAAa;;AAG/B,QAAO;;;;;;;;;AAUT,SAAgB,gBAAgB,QAAoC;CAClE,MAAM,EAAE,aAAa,iBAAiB,UAAU,QAAU;CAE1D,MAAM,UAAU,OAAO,WAAW,wBAAwB,YAAY;CAEtE,MAAM,SAAS,MAAM,OAAO;EAC1B;EACA;EACD,CAAC;AAGF,KAAI,gBACF,QAAO,aAAa,QAAQ,IAAI,OAAO,kBAAkB;EACvD,MAAM,QAAQ,MAAM,iBAAiB;AACrC,MAAI,OAAO;AACT,iBAAc,UAAU,cAAc,WAAW,EAAE;AACnD,iBAAc,QAAQ,gBAAgB,UAAU;;AAElD,SAAO;GACP;AAGJ,QAAO"}
@@ -1,4 +1,4 @@
1
- const require_chunk = require('./chunk-kSYXY2_d.js');
1
+ const require_chunk = require('./chunk-BE-pF4vm.js');
2
2
  const require_api_urls = require('./api-urls-Cd20DG4i.js');
3
3
  let axios = require("axios");
4
4
  axios = require_chunk.__toESM(axios);
@@ -46,4 +46,4 @@ Object.defineProperty(exports, 'createApiClient', {
46
46
  return createApiClient;
47
47
  }
48
48
  });
49
- //# sourceMappingURL=client-factory-CTI_Nt35.js.map
49
+ //# sourceMappingURL=client-factory-Drsy2vfF.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client-factory-CTI_Nt35.js","names":["getPlatformApiUrl"],"sources":["../src/server/client-factory.ts"],"sourcesContent":["import type { OtimEnvironment } from \"../config/api-urls\";\nimport type { AxiosInstance } from \"axios\";\n\nimport axios from \"axios\";\n\nimport { isString, logger } from \"@otim/utils/helpers\";\n\nimport { getPlatformApiUrl } from \"../config/api-urls\";\n\n/* Configuration for creating an API client instance */\nexport interface ApiClientConfig {\n /* Required: The environment to use (sandbox or production) */\n environment: OtimEnvironment;\n /* Optional: Custom auth token getter for this client instance */\n authTokenGetter?: () => Promise<string | undefined>;\n /* Optional: Override the base URL (defaults to environment URL) */\n baseURL?: string;\n /* Optional: Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n}\n\n/* Type alias for the API client instance */\nexport type ApiClient = AxiosInstance;\n\n/* Gets the Platform API URL for the specified environment */\nfunction getApiUrlForEnvironment(environment: OtimEnvironment): string {\n const url = getPlatformApiUrl(environment);\n\n if (!isString(url) || url.trim() === \"\") {\n const errorMessage = `Invalid API URL for environment: ${environment}`;\n logger.error(errorMessage, { context: \"API Client Factory\" });\n throw new Error(errorMessage);\n }\n\n return url;\n}\n\n/**\n * Creates a new API client instance with the specified configuration.\n * Each client is independent and can have its own auth token getter.\n *\n * @param config - The configuration for the API client\n * @returns An axios instance configured for the specified environment\n */\nexport function createApiClient(config: ApiClientConfig): ApiClient {\n const { environment, authTokenGetter, timeout = 30000 } = config;\n\n const baseURL = config.baseURL ?? getApiUrlForEnvironment(environment);\n\n const client = axios.create({\n baseURL,\n timeout,\n });\n\n // Setup auth token interceptor if provided\n if (authTokenGetter) {\n client.interceptors.request.use(async (requestConfig) => {\n const token = await authTokenGetter();\n if (token) {\n requestConfig.headers = requestConfig.headers ?? {};\n requestConfig.headers.Authorization = `Bearer ${token}`;\n }\n return requestConfig;\n });\n }\n\n return client;\n}\n"],"mappings":";;;;;;;AAyBA,SAAS,wBAAwB,aAAsC;CACrE,MAAM,MAAMA,mCAAkB,YAAY;AAE1C,KAAI,mCAAU,IAAI,IAAI,IAAI,MAAM,KAAK,IAAI;EACvC,MAAM,eAAe,oCAAoC;AACzD,6BAAO,MAAM,cAAc,EAAE,SAAS,sBAAsB,CAAC;AAC7D,QAAM,IAAI,MAAM,aAAa;;AAG/B,QAAO;;;;;;;;;AAUT,SAAgB,gBAAgB,QAAoC;CAClE,MAAM,EAAE,aAAa,iBAAiB,UAAU,QAAU;CAE1D,MAAM,UAAU,OAAO,WAAW,wBAAwB,YAAY;CAEtE,MAAM,SAAS,cAAM,OAAO;EAC1B;EACA;EACD,CAAC;AAGF,KAAI,gBACF,QAAO,aAAa,QAAQ,IAAI,OAAO,kBAAkB;EACvD,MAAM,QAAQ,MAAM,iBAAiB;AACrC,MAAI,OAAO;AACT,iBAAc,UAAU,cAAc,WAAW,EAAE;AACnD,iBAAc,QAAQ,gBAAgB,UAAU;;AAElD,SAAO;GACP;AAGJ,QAAO"}
1
+ {"version":3,"file":"client-factory-Drsy2vfF.js","names":["getPlatformApiUrl"],"sources":["../src/server/client-factory.ts"],"sourcesContent":["import type { OtimEnvironment } from \"../config/api-urls\";\nimport type { AxiosInstance } from \"axios\";\n\nimport axios from \"axios\";\n\nimport { isString, logger } from \"@otim/utils/helpers\";\n\nimport { getPlatformApiUrl } from \"../config/api-urls\";\n\n/* Configuration for creating an API client instance */\nexport interface ApiClientConfig {\n /* Required: The environment to use (sandbox or production) */\n environment: OtimEnvironment;\n /* Optional: Custom auth token getter for this client instance */\n authTokenGetter?: () => Promise<string | undefined>;\n /* Optional: Override the base URL (defaults to environment URL) */\n baseURL?: string;\n /* Optional: Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n}\n\n/* Type alias for the API client instance */\nexport type ApiClient = AxiosInstance;\n\n/* Gets the Platform API URL for the specified environment */\nfunction getApiUrlForEnvironment(environment: OtimEnvironment): string {\n const url = getPlatformApiUrl(environment);\n\n if (!isString(url) || url.trim() === \"\") {\n const errorMessage = `Invalid API URL for environment: ${environment}`;\n logger.error(errorMessage, { context: \"API Client Factory\" });\n throw new Error(errorMessage);\n }\n\n return url;\n}\n\n/**\n * Creates a new API client instance with the specified configuration.\n * Each client is independent and can have its own auth token getter.\n *\n * @param config - The configuration for the API client\n * @returns An axios instance configured for the specified environment\n */\nexport function createApiClient(config: ApiClientConfig): ApiClient {\n const { environment, authTokenGetter, timeout = 30000 } = config;\n\n const baseURL = config.baseURL ?? getApiUrlForEnvironment(environment);\n\n const client = axios.create({\n baseURL,\n timeout,\n });\n\n // Setup auth token interceptor if provided\n if (authTokenGetter) {\n client.interceptors.request.use(async (requestConfig) => {\n const token = await authTokenGetter();\n if (token) {\n requestConfig.headers = requestConfig.headers ?? {};\n requestConfig.headers.Authorization = `Bearer ${token}`;\n }\n return requestConfig;\n });\n }\n\n return client;\n}\n"],"mappings":";;;;;;;AAyBA,SAAS,wBAAwB,aAAsC;CACrE,MAAM,MAAMA,mCAAkB,YAAY;AAE1C,KAAI,mCAAU,IAAI,IAAI,IAAI,MAAM,KAAK,IAAI;EACvC,MAAM,eAAe,oCAAoC;AACzD,6BAAO,MAAM,cAAc,EAAE,SAAS,sBAAsB,CAAC;AAC7D,QAAM,IAAI,MAAM,aAAa;;AAG/B,QAAO;;;;;;;;;AAUT,SAAgB,gBAAgB,QAAoC;CAClE,MAAM,EAAE,aAAa,iBAAiB,UAAU,QAAU;CAE1D,MAAM,UAAU,OAAO,WAAW,wBAAwB,YAAY;CAEtE,MAAM,SAAS,cAAM,OAAO;EAC1B;EACA;EACD,CAAC;AAGF,KAAI,gBACF,QAAO,aAAa,QAAQ,IAAI,OAAO,kBAAkB;EACvD,MAAM,QAAQ,MAAM,iBAAiB;AACrC,MAAI,OAAO;AACT,iBAAc,UAAU,cAAc,WAAW,EAAE;AACnD,iBAAc,QAAQ,gBAAgB,UAAU;;AAElD,SAAO;GACP;AAGJ,QAAO"}