@manifest-network/manifest-mcp-core 0.4.5 → 0.4.6

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.
package/dist/client.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { ManifestMCPError, ManifestMCPErrorCode } from "./types.js";
2
2
  import { withRetry } from "./retry.js";
3
3
  import "./config.js";
4
- import { createLCDQueryClient } from "./lcd-adapter.js";
5
4
  import { logger } from "./logger.js";
5
+ import { createLCDQueryClient } from "./lcd-adapter.js";
6
6
  import { Registry } from "@cosmjs/proto-signing";
7
7
  import { AminoTypes, GasPrice, SigningStargateClient } from "@cosmjs/stargate";
8
8
  import { cosmosAminoConverters, cosmosProtoRegistry, cosmwasm, cosmwasmAminoConverters, cosmwasmProtoRegistry, liftedinit, liftedinitAminoConverters, liftedinitProtoRegistry, osmosisAminoConverters, osmosisProtoRegistry, strangeloveVenturesAminoConverters, strangeloveVenturesProtoRegistry } from "@manifest-network/manifestjs";
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { ManifestMCPError, ManifestMCPErrorCode } from "./types.js";
2
2
  import { DEFAULT_RETRY_CONFIG, calculateBackoff, isRetryableError, withRetry } from "./retry.js";
3
3
  import { createConfig, createValidatedConfig, validateConfig } from "./config.js";
4
- import { createLCDQueryClient } from "./lcd-adapter.js";
5
4
  import { logger } from "./logger.js";
5
+ import { createLCDQueryClient } from "./lcd-adapter.js";
6
6
  import { CosmosClientManager } from "./client.js";
7
7
  import { DNS_LABEL_RE, optionalBoolean, parseArgs, requireString, requireStringEnum, requireUuid } from "./validation.js";
8
8
  import { MAX_PAGE_LIMIT, createPagination } from "./queries/utils.js";
@@ -9,7 +9,14 @@ declare function findConverter(namespace: Record<string, unknown>, methodName: s
9
9
  type AsyncFn = (...args: unknown[]) => Promise<unknown>;
10
10
  declare function adaptModule(lcdMod: unknown, converterNs: unknown): Record<string, AsyncFn>;
11
11
  declare function unsupportedModule(modulePath: string): unknown;
12
+ /**
13
+ * The generated LCD client interpolates `queryData` (Uint8Array) directly into
14
+ * the URL path via template literal, producing comma-separated byte values
15
+ * (e.g. `smart/123,34,99,...`) instead of base64. The REST API expects base64.
16
+ * Patch the methods to convert queryData before the URL is constructed.
17
+ */
18
+ declare function patchWasmQueryData(wasmLcd: unknown): Record<string, unknown>;
12
19
  declare function createLCDQueryClient(restEndpoint: string): Promise<ManifestQueryClient>;
13
20
  //#endregion
14
- export { adaptModule as _adaptModule, findConverter as _findConverter, snakeToCamelDeep as _snakeToCamelDeep, unsupportedModule as _unsupportedModule, createLCDQueryClient };
21
+ export { adaptModule as _adaptModule, findConverter as _findConverter, patchWasmQueryData as _patchWasmQueryData, snakeToCamelDeep as _snakeToCamelDeep, unsupportedModule as _unsupportedModule, createLCDQueryClient };
15
22
  //# sourceMappingURL=lcd-adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"lcd-adapter.d.ts","names":[],"sources":["../src/lcd-adapter.ts"],"mappings":";;;iBAYS,gBAAA,CAAiB,GAAA;AAAA,UAwBhB,SAAA;EACR,QAAA,CAAS,MAAA;AAAA;AAAA,iBAGF,aAAA,CACP,SAAA,EAAW,MAAA,mBACX,UAAA,WACC,SAAA;AAAA,KAiBE,OAAA,OAAc,IAAA,gBAAoB,OAAA;AAAA,iBAE9B,WAAA,CACP,MAAA,WACA,WAAA,YACC,MAAA,SAAe,OAAA;AAAA,iBAqCT,iBAAA,CAAkB,UAAA;AAAA,iBAiBL,oBAAA,CACpB,YAAA,WACC,OAAA,CAAQ,mBAAA"}
1
+ {"version":3,"file":"lcd-adapter.d.ts","names":[],"sources":["../src/lcd-adapter.ts"],"mappings":";;;iBAcS,gBAAA,CAAiB,GAAA;AAAA,UAwBhB,SAAA;EACR,QAAA,CAAS,MAAA;AAAA;AAAA,iBAGF,aAAA,CACP,SAAA,EAAW,MAAA,mBACX,UAAA,WACC,SAAA;AAAA,KAiBE,OAAA,OAAc,IAAA,gBAAoB,OAAA;AAAA,iBAE9B,WAAA,CACP,MAAA,WACA,WAAA,YACC,MAAA,SAAe,OAAA;AAAA,iBAqCT,iBAAA,CAAkB,UAAA;;;;;AAjED;;iBAwFjB,kBAAA,CAAmB,OAAA,YAAmB,MAAA;AAAA,iBAyBzB,oBAAA,CACpB,YAAA,WACC,OAAA,CAAQ,mBAAA"}
@@ -1,5 +1,7 @@
1
1
  import { ManifestMCPError, ManifestMCPErrorCode } from "./types.js";
2
+ import { logger } from "./logger.js";
2
3
  import { cosmos, cosmwasm, liftedinit } from "@manifest-network/manifestjs";
4
+ import { toBase64 } from "@cosmjs/encoding";
3
5
  //#region src/lcd-adapter.ts
4
6
  function snakeToCamel(s) {
5
7
  return s.replace(/_(.)/g, (_, c) => c.toUpperCase());
@@ -51,6 +53,31 @@ function unsupportedModule(modulePath) {
51
53
  if (typeof prop === "string") throw new ManifestMCPError(ManifestMCPErrorCode.UNSUPPORTED_QUERY, `Module "${modulePath}" is not available via LCD/REST. Use an RPC endpoint instead.`);
52
54
  } });
53
55
  }
56
+ /**
57
+ * The generated LCD client interpolates `queryData` (Uint8Array) directly into
58
+ * the URL path via template literal, producing comma-separated byte values
59
+ * (e.g. `smart/123,34,99,...`) instead of base64. The REST API expects base64.
60
+ * Patch the methods to convert queryData before the URL is constructed.
61
+ */
62
+ function patchWasmQueryData(wasmLcd) {
63
+ const mod = wasmLcd;
64
+ const patched = { ...mod };
65
+ for (const method of ["smartContractState", "rawContractState"]) {
66
+ const original = mod[method];
67
+ if (typeof original !== "function") {
68
+ logger.warn(`patchWasmQueryData: expected method "${method}" not found on wasm LCD module. Wasm queries may fail with malformed URLs.`);
69
+ continue;
70
+ }
71
+ patched[method] = (params) => {
72
+ const queryData = params.queryData;
73
+ return original.call(mod, {
74
+ ...params,
75
+ queryData: queryData instanceof Uint8Array ? toBase64(queryData) : queryData
76
+ });
77
+ };
78
+ }
79
+ return patched;
80
+ }
54
81
  async function createLCDQueryClient(restEndpoint) {
55
82
  let lcd;
56
83
  let cosmwasmLcd;
@@ -87,7 +114,7 @@ async function createLCDQueryClient(restEndpoint) {
87
114
  manifest: { v1: unsupportedModule("liftedinit.manifest.v1") },
88
115
  sku: { v1: adaptModule(lcd.liftedinit.sku.v1, liftedinit.sku.v1) }
89
116
  },
90
- cosmwasm: { wasm: { v1: adaptModule(cosmwasmLcd.cosmwasm.wasm.v1, cosmwasm.wasm.v1) } }
117
+ cosmwasm: { wasm: { v1: adaptModule(patchWasmQueryData(cosmwasmLcd.cosmwasm.wasm.v1), cosmwasm.wasm.v1) } }
91
118
  };
92
119
  } catch (error) {
93
120
  if (error instanceof ManifestMCPError) throw error;
@@ -95,6 +122,6 @@ async function createLCDQueryClient(restEndpoint) {
95
122
  }
96
123
  }
97
124
  //#endregion
98
- export { adaptModule as _adaptModule, findConverter as _findConverter, snakeToCamelDeep as _snakeToCamelDeep, unsupportedModule as _unsupportedModule, createLCDQueryClient };
125
+ export { adaptModule as _adaptModule, findConverter as _findConverter, patchWasmQueryData as _patchWasmQueryData, snakeToCamelDeep as _snakeToCamelDeep, unsupportedModule as _unsupportedModule, createLCDQueryClient };
99
126
 
100
127
  //# sourceMappingURL=lcd-adapter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lcd-adapter.js","names":["cosmwasmNs"],"sources":["../src/lcd-adapter.ts"],"sourcesContent":["import {\n cosmos,\n cosmwasm as cosmwasmNs,\n liftedinit,\n} from '@manifest-network/manifestjs';\nimport type { ManifestQueryClient } from './client.js';\nimport { ManifestMCPError, ManifestMCPErrorCode } from './types.js';\n\nfunction snakeToCamel(s: string): string {\n return s.replace(/_(.)/g, (_, c: string) => c.toUpperCase());\n}\n\nfunction snakeToCamelDeep(obj: unknown): unknown {\n if (Array.isArray(obj)) {\n return obj.map(snakeToCamelDeep);\n }\n if (\n obj !== null &&\n typeof obj === 'object' &&\n !(obj instanceof Date) &&\n !(obj instanceof Uint8Array)\n ) {\n return Object.fromEntries(\n Object.entries(obj as Record<string, unknown>).map(([k, v]) => [\n snakeToCamel(k),\n snakeToCamelDeep(v),\n ]),\n );\n }\n return obj;\n}\n\nfunction ucFirst(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\ninterface Converter {\n fromJSON(object: unknown): unknown;\n}\n\nfunction findConverter(\n namespace: Record<string, unknown>,\n methodName: string,\n): Converter {\n const uc = ucFirst(methodName);\n const queryName = `Query${uc}Response`;\n const plainName = `${uc}Response`;\n\n const converter = (namespace[queryName] ?? namespace[plainName]) as\n | Converter\n | undefined;\n if (!converter?.fromJSON) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.QUERY_FAILED,\n `No response converter found for method \"${methodName}\" (tried \"${queryName}\" and \"${plainName}\")`,\n );\n }\n return converter;\n}\n\ntype AsyncFn = (...args: unknown[]) => Promise<unknown>;\n\nfunction adaptModule(\n lcdMod: unknown,\n converterNs: unknown,\n): Record<string, AsyncFn> {\n const lcdModule = lcdMod as Record<string, unknown>;\n const converterNamespace = converterNs as Record<string, unknown>;\n const adapted: Record<string, AsyncFn> = {};\n\n for (const key of Object.keys(lcdModule)) {\n if (key === 'req' || typeof lcdModule[key] !== 'function') continue;\n\n const originalFn = lcdModule[key] as AsyncFn;\n const converter = findConverter(converterNamespace, key);\n\n adapted[key] = async (...args: unknown[]) => {\n let sdkResult: unknown;\n try {\n sdkResult = await originalFn.call(lcdModule, ...args);\n } catch (error) {\n if (error instanceof ManifestMCPError) throw error;\n throw new ManifestMCPError(\n ManifestMCPErrorCode.QUERY_FAILED,\n `LCD query \"${key}\" failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n const camelCased = snakeToCamelDeep(sdkResult);\n try {\n return converter.fromJSON(camelCased);\n } catch (error) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.QUERY_FAILED,\n `Failed to convert LCD response for \"${key}\": ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n };\n }\n\n return adapted;\n}\n\nfunction unsupportedModule(modulePath: string): unknown {\n return new Proxy(\n {},\n {\n get(_target, prop) {\n if (typeof prop === 'string') {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.UNSUPPORTED_QUERY,\n `Module \"${modulePath}\" is not available via LCD/REST. Use an RPC endpoint instead.`,\n );\n }\n return undefined;\n },\n },\n );\n}\n\nexport async function createLCDQueryClient(\n restEndpoint: string,\n): Promise<ManifestQueryClient> {\n let lcd: Awaited<ReturnType<typeof liftedinit.ClientFactory.createLCDClient>>;\n let cosmwasmLcd: Awaited<\n ReturnType<typeof cosmwasmNs.ClientFactory.createLCDClient>\n >;\n try {\n [lcd, cosmwasmLcd] = await Promise.all([\n liftedinit.ClientFactory.createLCDClient({ restEndpoint }),\n cosmwasmNs.ClientFactory.createLCDClient({ restEndpoint }),\n ]);\n } catch (error) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.RPC_CONNECTION_FAILED,\n `Failed to create LCD client for ${restEndpoint}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n try {\n return {\n cosmos: {\n auth: {\n v1beta1: adaptModule(lcd.cosmos.auth.v1beta1, cosmos.auth.v1beta1),\n },\n authz: {\n v1beta1: adaptModule(lcd.cosmos.authz.v1beta1, cosmos.authz.v1beta1),\n },\n bank: {\n v1beta1: adaptModule(lcd.cosmos.bank.v1beta1, cosmos.bank.v1beta1),\n },\n base: {\n node: {\n v1beta1: adaptModule(\n lcd.cosmos.base.node.v1beta1,\n cosmos.base.node.v1beta1,\n ),\n },\n },\n circuit: { v1: adaptModule(lcd.cosmos.circuit.v1, cosmos.circuit.v1) },\n consensus: {\n v1: adaptModule(lcd.cosmos.consensus.v1, cosmos.consensus.v1),\n },\n distribution: {\n v1beta1: adaptModule(\n lcd.cosmos.distribution.v1beta1,\n cosmos.distribution.v1beta1,\n ),\n },\n feegrant: {\n v1beta1: adaptModule(\n lcd.cosmos.feegrant.v1beta1,\n cosmos.feegrant.v1beta1,\n ),\n },\n gov: {\n v1: adaptModule(lcd.cosmos.gov.v1, cosmos.gov.v1),\n v1beta1: adaptModule(lcd.cosmos.gov.v1beta1, cosmos.gov.v1beta1),\n },\n group: { v1: adaptModule(lcd.cosmos.group.v1, cosmos.group.v1) },\n mint: {\n v1beta1: adaptModule(lcd.cosmos.mint.v1beta1, cosmos.mint.v1beta1),\n },\n orm: {\n query: { v1alpha1: unsupportedModule('cosmos.orm.query.v1alpha1') },\n },\n params: {\n v1beta1: adaptModule(\n lcd.cosmos.params.v1beta1,\n cosmos.params.v1beta1,\n ),\n },\n staking: {\n v1beta1: adaptModule(\n lcd.cosmos.staking.v1beta1,\n cosmos.staking.v1beta1,\n ),\n },\n tx: { v1beta1: adaptModule(lcd.cosmos.tx.v1beta1, cosmos.tx.v1beta1) },\n upgrade: {\n v1beta1: adaptModule(\n lcd.cosmos.upgrade.v1beta1,\n cosmos.upgrade.v1beta1,\n ),\n },\n },\n liftedinit: {\n billing: {\n v1: adaptModule(lcd.liftedinit.billing.v1, liftedinit.billing.v1),\n },\n manifest: { v1: unsupportedModule('liftedinit.manifest.v1') },\n sku: { v1: adaptModule(lcd.liftedinit.sku.v1, liftedinit.sku.v1) },\n },\n cosmwasm: {\n wasm: {\n v1: adaptModule(cosmwasmLcd.cosmwasm.wasm.v1, cosmwasmNs.wasm.v1),\n },\n },\n } as ManifestQueryClient;\n } catch (error) {\n if (error instanceof ManifestMCPError) throw error;\n throw new ManifestMCPError(\n ManifestMCPErrorCode.RPC_CONNECTION_FAILED,\n `Failed to adapt LCD modules: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\n// Re-export for testing\nexport {\n adaptModule as _adaptModule,\n findConverter as _findConverter,\n snakeToCamelDeep as _snakeToCamelDeep,\n unsupportedModule as _unsupportedModule,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"lcd-adapter.js","names":["cosmwasmNs"],"sources":["../src/lcd-adapter.ts"],"sourcesContent":["import { toBase64 } from '@cosmjs/encoding';\nimport {\n cosmos,\n cosmwasm as cosmwasmNs,\n liftedinit,\n} from '@manifest-network/manifestjs';\nimport type { ManifestQueryClient } from './client.js';\nimport { logger } from './logger.js';\nimport { ManifestMCPError, ManifestMCPErrorCode } from './types.js';\n\nfunction snakeToCamel(s: string): string {\n return s.replace(/_(.)/g, (_, c: string) => c.toUpperCase());\n}\n\nfunction snakeToCamelDeep(obj: unknown): unknown {\n if (Array.isArray(obj)) {\n return obj.map(snakeToCamelDeep);\n }\n if (\n obj !== null &&\n typeof obj === 'object' &&\n !(obj instanceof Date) &&\n !(obj instanceof Uint8Array)\n ) {\n return Object.fromEntries(\n Object.entries(obj as Record<string, unknown>).map(([k, v]) => [\n snakeToCamel(k),\n snakeToCamelDeep(v),\n ]),\n );\n }\n return obj;\n}\n\nfunction ucFirst(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\ninterface Converter {\n fromJSON(object: unknown): unknown;\n}\n\nfunction findConverter(\n namespace: Record<string, unknown>,\n methodName: string,\n): Converter {\n const uc = ucFirst(methodName);\n const queryName = `Query${uc}Response`;\n const plainName = `${uc}Response`;\n\n const converter = (namespace[queryName] ?? namespace[plainName]) as\n | Converter\n | undefined;\n if (!converter?.fromJSON) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.QUERY_FAILED,\n `No response converter found for method \"${methodName}\" (tried \"${queryName}\" and \"${plainName}\")`,\n );\n }\n return converter;\n}\n\ntype AsyncFn = (...args: unknown[]) => Promise<unknown>;\n\nfunction adaptModule(\n lcdMod: unknown,\n converterNs: unknown,\n): Record<string, AsyncFn> {\n const lcdModule = lcdMod as Record<string, unknown>;\n const converterNamespace = converterNs as Record<string, unknown>;\n const adapted: Record<string, AsyncFn> = {};\n\n for (const key of Object.keys(lcdModule)) {\n if (key === 'req' || typeof lcdModule[key] !== 'function') continue;\n\n const originalFn = lcdModule[key] as AsyncFn;\n const converter = findConverter(converterNamespace, key);\n\n adapted[key] = async (...args: unknown[]) => {\n let sdkResult: unknown;\n try {\n sdkResult = await originalFn.call(lcdModule, ...args);\n } catch (error) {\n if (error instanceof ManifestMCPError) throw error;\n throw new ManifestMCPError(\n ManifestMCPErrorCode.QUERY_FAILED,\n `LCD query \"${key}\" failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n const camelCased = snakeToCamelDeep(sdkResult);\n try {\n return converter.fromJSON(camelCased);\n } catch (error) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.QUERY_FAILED,\n `Failed to convert LCD response for \"${key}\": ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n };\n }\n\n return adapted;\n}\n\nfunction unsupportedModule(modulePath: string): unknown {\n return new Proxy(\n {},\n {\n get(_target, prop) {\n if (typeof prop === 'string') {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.UNSUPPORTED_QUERY,\n `Module \"${modulePath}\" is not available via LCD/REST. Use an RPC endpoint instead.`,\n );\n }\n return undefined;\n },\n },\n );\n}\n\n/**\n * The generated LCD client interpolates `queryData` (Uint8Array) directly into\n * the URL path via template literal, producing comma-separated byte values\n * (e.g. `smart/123,34,99,...`) instead of base64. The REST API expects base64.\n * Patch the methods to convert queryData before the URL is constructed.\n */\nfunction patchWasmQueryData(wasmLcd: unknown): Record<string, unknown> {\n const mod = wasmLcd as Record<string, unknown>;\n const patched: Record<string, unknown> = { ...mod };\n for (const method of ['smartContractState', 'rawContractState']) {\n const original = mod[method] as (\n params: Record<string, unknown>,\n ) => Promise<unknown>;\n if (typeof original !== 'function') {\n logger.warn(\n `patchWasmQueryData: expected method \"${method}\" not found on wasm LCD module. Wasm queries may fail with malformed URLs.`,\n );\n continue;\n }\n patched[method] = (params: Record<string, unknown>) => {\n const queryData = params.queryData;\n return original.call(mod, {\n ...params,\n queryData:\n queryData instanceof Uint8Array ? toBase64(queryData) : queryData,\n });\n };\n }\n return patched;\n}\n\nexport async function createLCDQueryClient(\n restEndpoint: string,\n): Promise<ManifestQueryClient> {\n let lcd: Awaited<ReturnType<typeof liftedinit.ClientFactory.createLCDClient>>;\n let cosmwasmLcd: Awaited<\n ReturnType<typeof cosmwasmNs.ClientFactory.createLCDClient>\n >;\n try {\n [lcd, cosmwasmLcd] = await Promise.all([\n liftedinit.ClientFactory.createLCDClient({ restEndpoint }),\n cosmwasmNs.ClientFactory.createLCDClient({ restEndpoint }),\n ]);\n } catch (error) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.RPC_CONNECTION_FAILED,\n `Failed to create LCD client for ${restEndpoint}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n try {\n return {\n cosmos: {\n auth: {\n v1beta1: adaptModule(lcd.cosmos.auth.v1beta1, cosmos.auth.v1beta1),\n },\n authz: {\n v1beta1: adaptModule(lcd.cosmos.authz.v1beta1, cosmos.authz.v1beta1),\n },\n bank: {\n v1beta1: adaptModule(lcd.cosmos.bank.v1beta1, cosmos.bank.v1beta1),\n },\n base: {\n node: {\n v1beta1: adaptModule(\n lcd.cosmos.base.node.v1beta1,\n cosmos.base.node.v1beta1,\n ),\n },\n },\n circuit: { v1: adaptModule(lcd.cosmos.circuit.v1, cosmos.circuit.v1) },\n consensus: {\n v1: adaptModule(lcd.cosmos.consensus.v1, cosmos.consensus.v1),\n },\n distribution: {\n v1beta1: adaptModule(\n lcd.cosmos.distribution.v1beta1,\n cosmos.distribution.v1beta1,\n ),\n },\n feegrant: {\n v1beta1: adaptModule(\n lcd.cosmos.feegrant.v1beta1,\n cosmos.feegrant.v1beta1,\n ),\n },\n gov: {\n v1: adaptModule(lcd.cosmos.gov.v1, cosmos.gov.v1),\n v1beta1: adaptModule(lcd.cosmos.gov.v1beta1, cosmos.gov.v1beta1),\n },\n group: { v1: adaptModule(lcd.cosmos.group.v1, cosmos.group.v1) },\n mint: {\n v1beta1: adaptModule(lcd.cosmos.mint.v1beta1, cosmos.mint.v1beta1),\n },\n orm: {\n query: { v1alpha1: unsupportedModule('cosmos.orm.query.v1alpha1') },\n },\n params: {\n v1beta1: adaptModule(\n lcd.cosmos.params.v1beta1,\n cosmos.params.v1beta1,\n ),\n },\n staking: {\n v1beta1: adaptModule(\n lcd.cosmos.staking.v1beta1,\n cosmos.staking.v1beta1,\n ),\n },\n tx: { v1beta1: adaptModule(lcd.cosmos.tx.v1beta1, cosmos.tx.v1beta1) },\n upgrade: {\n v1beta1: adaptModule(\n lcd.cosmos.upgrade.v1beta1,\n cosmos.upgrade.v1beta1,\n ),\n },\n },\n liftedinit: {\n billing: {\n v1: adaptModule(lcd.liftedinit.billing.v1, liftedinit.billing.v1),\n },\n manifest: { v1: unsupportedModule('liftedinit.manifest.v1') },\n sku: { v1: adaptModule(lcd.liftedinit.sku.v1, liftedinit.sku.v1) },\n },\n cosmwasm: {\n wasm: {\n v1: adaptModule(\n patchWasmQueryData(cosmwasmLcd.cosmwasm.wasm.v1),\n cosmwasmNs.wasm.v1,\n ),\n },\n },\n } as ManifestQueryClient;\n } catch (error) {\n if (error instanceof ManifestMCPError) throw error;\n throw new ManifestMCPError(\n ManifestMCPErrorCode.RPC_CONNECTION_FAILED,\n `Failed to adapt LCD modules: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\n// Re-export for testing\nexport {\n adaptModule as _adaptModule,\n findConverter as _findConverter,\n patchWasmQueryData as _patchWasmQueryData,\n snakeToCamelDeep as _snakeToCamelDeep,\n unsupportedModule as _unsupportedModule,\n};\n"],"mappings":";;;;;AAUA,SAAS,aAAa,GAAmB;AACvC,QAAO,EAAE,QAAQ,UAAU,GAAG,MAAc,EAAE,aAAa,CAAC;;AAG9D,SAAS,iBAAiB,KAAuB;AAC/C,KAAI,MAAM,QAAQ,IAAI,CACpB,QAAO,IAAI,IAAI,iBAAiB;AAElC,KACE,QAAQ,QACR,OAAO,QAAQ,YACf,EAAE,eAAe,SACjB,EAAE,eAAe,YAEjB,QAAO,OAAO,YACZ,OAAO,QAAQ,IAA+B,CAAC,KAAK,CAAC,GAAG,OAAO,CAC7D,aAAa,EAAE,EACf,iBAAiB,EAAE,CACpB,CAAC,CACH;AAEH,QAAO;;AAGT,SAAS,QAAQ,GAAmB;AAClC,QAAO,EAAE,OAAO,EAAE,CAAC,aAAa,GAAG,EAAE,MAAM,EAAE;;AAO/C,SAAS,cACP,WACA,YACW;CACX,MAAM,KAAK,QAAQ,WAAW;CAC9B,MAAM,YAAY,QAAQ,GAAG;CAC7B,MAAM,YAAY,GAAG,GAAG;CAExB,MAAM,YAAa,UAAU,cAAc,UAAU;AAGrD,KAAI,CAAC,WAAW,SACd,OAAM,IAAI,iBACR,qBAAqB,cACrB,2CAA2C,WAAW,YAAY,UAAU,SAAS,UAAU,IAChG;AAEH,QAAO;;AAKT,SAAS,YACP,QACA,aACyB;CACzB,MAAM,YAAY;CAClB,MAAM,qBAAqB;CAC3B,MAAM,UAAmC,EAAE;AAE3C,MAAK,MAAM,OAAO,OAAO,KAAK,UAAU,EAAE;AACxC,MAAI,QAAQ,SAAS,OAAO,UAAU,SAAS,WAAY;EAE3D,MAAM,aAAa,UAAU;EAC7B,MAAM,YAAY,cAAc,oBAAoB,IAAI;AAExD,UAAQ,OAAO,OAAO,GAAG,SAAoB;GAC3C,IAAI;AACJ,OAAI;AACF,gBAAY,MAAM,WAAW,KAAK,WAAW,GAAG,KAAK;YAC9C,OAAO;AACd,QAAI,iBAAiB,iBAAkB,OAAM;AAC7C,UAAM,IAAI,iBACR,qBAAqB,cACrB,cAAc,IAAI,YAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GACrF;;GAEH,MAAM,aAAa,iBAAiB,UAAU;AAC9C,OAAI;AACF,WAAO,UAAU,SAAS,WAAW;YAC9B,OAAO;AACd,UAAM,IAAI,iBACR,qBAAqB,cACrB,uCAAuC,IAAI,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GACvG;;;;AAKP,QAAO;;AAGT,SAAS,kBAAkB,YAA6B;AACtD,QAAO,IAAI,MACT,EAAE,EACF,EACE,IAAI,SAAS,MAAM;AACjB,MAAI,OAAO,SAAS,SAClB,OAAM,IAAI,iBACR,qBAAqB,mBACrB,WAAW,WAAW,+DACvB;IAIN,CACF;;;;;;;;AASH,SAAS,mBAAmB,SAA2C;CACrE,MAAM,MAAM;CACZ,MAAM,UAAmC,EAAE,GAAG,KAAK;AACnD,MAAK,MAAM,UAAU,CAAC,sBAAsB,mBAAmB,EAAE;EAC/D,MAAM,WAAW,IAAI;AAGrB,MAAI,OAAO,aAAa,YAAY;AAClC,UAAO,KACL,wCAAwC,OAAO,4EAChD;AACD;;AAEF,UAAQ,WAAW,WAAoC;GACrD,MAAM,YAAY,OAAO;AACzB,UAAO,SAAS,KAAK,KAAK;IACxB,GAAG;IACH,WACE,qBAAqB,aAAa,SAAS,UAAU,GAAG;IAC3D,CAAC;;;AAGN,QAAO;;AAGT,eAAsB,qBACpB,cAC8B;CAC9B,IAAI;CACJ,IAAI;AAGJ,KAAI;AACF,GAAC,KAAK,eAAe,MAAM,QAAQ,IAAI,CACrC,WAAW,cAAc,gBAAgB,EAAE,cAAc,CAAC,EAC1DA,SAAW,cAAc,gBAAgB,EAAE,cAAc,CAAC,CAC3D,CAAC;UACK,OAAO;AACd,QAAM,IAAI,iBACR,qBAAqB,uBACrB,mCAAmC,aAAa,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GAC3G;;AAGH,KAAI;AACF,SAAO;GACL,QAAQ;IACN,MAAM,EACJ,SAAS,YAAY,IAAI,OAAO,KAAK,SAAS,OAAO,KAAK,QAAQ,EACnE;IACD,OAAO,EACL,SAAS,YAAY,IAAI,OAAO,MAAM,SAAS,OAAO,MAAM,QAAQ,EACrE;IACD,MAAM,EACJ,SAAS,YAAY,IAAI,OAAO,KAAK,SAAS,OAAO,KAAK,QAAQ,EACnE;IACD,MAAM,EACJ,MAAM,EACJ,SAAS,YACP,IAAI,OAAO,KAAK,KAAK,SACrB,OAAO,KAAK,KAAK,QAClB,EACF,EACF;IACD,SAAS,EAAE,IAAI,YAAY,IAAI,OAAO,QAAQ,IAAI,OAAO,QAAQ,GAAG,EAAE;IACtE,WAAW,EACT,IAAI,YAAY,IAAI,OAAO,UAAU,IAAI,OAAO,UAAU,GAAG,EAC9D;IACD,cAAc,EACZ,SAAS,YACP,IAAI,OAAO,aAAa,SACxB,OAAO,aAAa,QACrB,EACF;IACD,UAAU,EACR,SAAS,YACP,IAAI,OAAO,SAAS,SACpB,OAAO,SAAS,QACjB,EACF;IACD,KAAK;KACH,IAAI,YAAY,IAAI,OAAO,IAAI,IAAI,OAAO,IAAI,GAAG;KACjD,SAAS,YAAY,IAAI,OAAO,IAAI,SAAS,OAAO,IAAI,QAAQ;KACjE;IACD,OAAO,EAAE,IAAI,YAAY,IAAI,OAAO,MAAM,IAAI,OAAO,MAAM,GAAG,EAAE;IAChE,MAAM,EACJ,SAAS,YAAY,IAAI,OAAO,KAAK,SAAS,OAAO,KAAK,QAAQ,EACnE;IACD,KAAK,EACH,OAAO,EAAE,UAAU,kBAAkB,4BAA4B,EAAE,EACpE;IACD,QAAQ,EACN,SAAS,YACP,IAAI,OAAO,OAAO,SAClB,OAAO,OAAO,QACf,EACF;IACD,SAAS,EACP,SAAS,YACP,IAAI,OAAO,QAAQ,SACnB,OAAO,QAAQ,QAChB,EACF;IACD,IAAI,EAAE,SAAS,YAAY,IAAI,OAAO,GAAG,SAAS,OAAO,GAAG,QAAQ,EAAE;IACtE,SAAS,EACP,SAAS,YACP,IAAI,OAAO,QAAQ,SACnB,OAAO,QAAQ,QAChB,EACF;IACF;GACD,YAAY;IACV,SAAS,EACP,IAAI,YAAY,IAAI,WAAW,QAAQ,IAAI,WAAW,QAAQ,GAAG,EAClE;IACD,UAAU,EAAE,IAAI,kBAAkB,yBAAyB,EAAE;IAC7D,KAAK,EAAE,IAAI,YAAY,IAAI,WAAW,IAAI,IAAI,WAAW,IAAI,GAAG,EAAE;IACnE;GACD,UAAU,EACR,MAAM,EACJ,IAAI,YACF,mBAAmB,YAAY,SAAS,KAAK,GAAG,EAChDA,SAAW,KAAK,GACjB,EACF,EACF;GACF;UACM,OAAO;AACd,MAAI,iBAAiB,iBAAkB,OAAM;AAC7C,QAAM,IAAI,iBACR,qBAAqB,uBACrB,gCAAgC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GACvF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@manifest-network/manifest-mcp-core",
3
- "version": "0.4.5",
3
+ "version": "0.4.6",
4
4
  "description": "Shared library for Cosmos SDK blockchain logic, tool functions, and server utilities (Manifest Network)",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",