@manifest-network/manifest-mcp-core 0.4.5 → 0.4.7
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 +1 -1
- package/dist/index.js +1 -1
- package/dist/lcd-adapter.d.ts +8 -1
- package/dist/lcd-adapter.d.ts.map +1 -1
- package/dist/lcd-adapter.js +34 -2
- package/dist/lcd-adapter.js.map +1 -1
- package/package.json +1 -1
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";
|
package/dist/lcd-adapter.d.ts
CHANGED
|
@@ -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":";;;
|
|
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,iBAqCzB,oBAAA,CACpB,YAAA,WACC,OAAA,CAAQ,mBAAA"}
|
package/dist/lcd-adapter.js
CHANGED
|
@@ -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, toUtf8 } 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,36 @@ 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] = async (params) => {
|
|
72
|
+
const queryData = params.queryData;
|
|
73
|
+
const result = await original.call(mod, {
|
|
74
|
+
...params,
|
|
75
|
+
queryData: queryData instanceof Uint8Array ? toBase64(queryData) : queryData
|
|
76
|
+
});
|
|
77
|
+
if (result.data != null && typeof result.data !== "string") return {
|
|
78
|
+
...result,
|
|
79
|
+
data: toBase64(toUtf8(JSON.stringify(result.data)))
|
|
80
|
+
};
|
|
81
|
+
return result;
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
return patched;
|
|
85
|
+
}
|
|
54
86
|
async function createLCDQueryClient(restEndpoint) {
|
|
55
87
|
let lcd;
|
|
56
88
|
let cosmwasmLcd;
|
|
@@ -87,7 +119,7 @@ async function createLCDQueryClient(restEndpoint) {
|
|
|
87
119
|
manifest: { v1: unsupportedModule("liftedinit.manifest.v1") },
|
|
88
120
|
sku: { v1: adaptModule(lcd.liftedinit.sku.v1, liftedinit.sku.v1) }
|
|
89
121
|
},
|
|
90
|
-
cosmwasm: { wasm: { v1: adaptModule(cosmwasmLcd.cosmwasm.wasm.v1, cosmwasm.wasm.v1) } }
|
|
122
|
+
cosmwasm: { wasm: { v1: adaptModule(patchWasmQueryData(cosmwasmLcd.cosmwasm.wasm.v1), cosmwasm.wasm.v1) } }
|
|
91
123
|
};
|
|
92
124
|
} catch (error) {
|
|
93
125
|
if (error instanceof ManifestMCPError) throw error;
|
|
@@ -95,6 +127,6 @@ async function createLCDQueryClient(restEndpoint) {
|
|
|
95
127
|
}
|
|
96
128
|
}
|
|
97
129
|
//#endregion
|
|
98
|
-
export { adaptModule as _adaptModule, findConverter as _findConverter, snakeToCamelDeep as _snakeToCamelDeep, unsupportedModule as _unsupportedModule, createLCDQueryClient };
|
|
130
|
+
export { adaptModule as _adaptModule, findConverter as _findConverter, patchWasmQueryData as _patchWasmQueryData, snakeToCamelDeep as _snakeToCamelDeep, unsupportedModule as _unsupportedModule, createLCDQueryClient };
|
|
99
131
|
|
|
100
132
|
//# sourceMappingURL=lcd-adapter.js.map
|
package/dist/lcd-adapter.js.map
CHANGED
|
@@ -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, toUtf8 } 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] = async (params: Record<string, unknown>) => {\n const queryData = params.queryData;\n const result = (await original.call(mod, {\n ...params,\n queryData:\n queryData instanceof Uint8Array ? toBase64(queryData) : queryData,\n })) as Record<string, unknown>;\n\n // The LCD REST API returns `data` as a parsed JSON object, but the\n // protobuf `fromJSON` converter expects a base64 string representing\n // the UTF-8 bytes of the JSON payload. Re-encode so the adapter's\n // normal snakeToCamel → fromJSON pipeline works correctly.\n if (result.data != null && typeof result.data !== 'string') {\n return {\n ...result,\n data: toBase64(toUtf8(JSON.stringify(result.data))),\n };\n }\n return result;\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":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@manifest-network/manifest-mcp-core",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.7",
|
|
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",
|