@thru/abi 0.2.0 → 0.2.1

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/bytes.ts","../src/utils/runtime.ts","../src/wasmBridge.ts"],"names":["result"],"mappings":"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","file":"index.js","sourcesContent":["export function bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nexport function alignUp(offset: number, alignment: number): number {\n return (offset + alignment - 1) & ~(alignment - 1);\n}\n\nexport function hexToBytes(hex: string): Uint8Array {\n let normalized = hex.trim().replace(/[\\s_]/g, \"\");\n if (normalized.startsWith(\"0x\") || normalized.startsWith(\"0X\")) {\n normalized = normalized.slice(2);\n }\n if (normalized.length === 0) return new Uint8Array();\n if (normalized.length % 2 !== 0) {\n throw new Error(\"Hex input must contain an even number of characters\");\n }\n const bytes = new Uint8Array(normalized.length / 2);\n for (let i = 0; i < normalized.length; i += 2) {\n const byte = Number.parseInt(normalized.slice(i, i + 2), 16);\n if (Number.isNaN(byte)) {\n throw new Error(\"Hex input contains non-hexadecimal characters\");\n }\n bytes[i / 2] = byte;\n }\n return bytes;\n}\n\nexport function toUint8Array(\n input: Uint8Array | ArrayBuffer | ArrayBufferView | number[],\n): Uint8Array {\n if (input instanceof Uint8Array) {\n return input;\n }\n if (ArrayBuffer.isView(input)) {\n return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n }\n if (input instanceof ArrayBuffer) {\n return new Uint8Array(input);\n }\n if (Array.isArray(input)) {\n return Uint8Array.from(input);\n }\n throw new TypeError(\"Unsupported buffer input\");\n}\n","export function isNodeRuntime(): boolean {\n return typeof process !== \"undefined\" && Boolean(process.versions?.node);\n}\n","import { hexToBytes, toUint8Array } from \"./utils/bytes\";\nimport { isNodeRuntime } from \"./utils/runtime\";\nimport type { FormattedReflection } from \"./types\";\n\ntype WasmReflectBindings = {\n reflect: (abi: string, typeName: string, buffer: Uint8Array) => string;\n reflect_instruction: (abi: string, buffer: Uint8Array) => string;\n reflect_account: (abi: string, buffer: Uint8Array) => string;\n reflect_event: (abi: string, buffer: Uint8Array) => string;\n build_layout_ir: (abi: string) => string;\n format_reflection: (raw: string) => string;\n format_reflection_with_options: (raw: string, options: string) => string;\n wasm_start?: () => void;\n};\n\ntype JsonValue = unknown;\n\n// Configuration for WASM loading\nlet configuredWasmUrl: string | undefined;\n\n/**\n * Configure the URL from which to load the WASM file.\n * Must be called before any reflection functions are used.\n *\n * This is useful for environments like Next.js where bundler-based WASM loading\n * doesn't work. Instead, copy the WASM file to your public directory and call:\n *\n * @example\n * ```ts\n * import { configureWasm } from \"@thru/abi\";\n * configureWasm(\"/wasm/abi_reflect_wasm_bg.wasm\");\n * ```\n *\n * @param url - URL or path to the WASM file (e.g., \"/wasm/abi_reflect_wasm_bg.wasm\")\n */\nexport function configureWasm(url: string): void {\n if (cachedBindings) {\n console.warn(\"configureWasm called after WASM was already loaded. Configuration ignored.\");\n return;\n }\n configuredWasmUrl = url;\n}\n\nconst wasmDir = resolveWasmDir();\nlet bindingsPromise: Promise<WasmReflectBindings> | undefined;\nlet cachedBindings: WasmReflectBindings | undefined;\n\nfunction resolveWasmDir(): string {\n const url = import.meta.url;\n if (url.includes(\"/src/\")) return \"../wasm\";\n if (url.includes(\"/dist/\")) return \"./wasm\";\n return \"./wasm\";\n}\n\nasync function loadBindings(): Promise<WasmReflectBindings> {\n if (cachedBindings) {\n return cachedBindings;\n }\n if (!bindingsPromise) {\n let loader: Promise<WasmReflectBindings>;\n if (isNodeRuntime()) {\n loader = loadNodeBindings();\n } else if (configuredWasmUrl) {\n loader = loadWebBindings(configuredWasmUrl);\n } else {\n loader = loadBundlerBindings();\n }\n bindingsPromise = loader.then((bindings) => {\n cachedBindings = bindings;\n return bindings;\n });\n }\n return bindingsPromise;\n}\n\nasync function loadWebBindings(wasmUrl: string): Promise<WasmReflectBindings> {\n const moduleUrl = new URL(`${wasmDir}/web/abi_reflect_wasm.js`, import.meta.url);\n const mod = (await import(\n /* webpackIgnore: true */\n /* @vite-ignore */\n moduleUrl.href\n )) as WasmReflectBindings & { default: (url: string) => Promise<void> };\n\n // Initialize with the configured WASM URL\n await mod.default(wasmUrl);\n\n return mod;\n}\n\nasync function loadBundlerBindings(): Promise<WasmReflectBindings> {\n const mod = await importBindings(\"bundler/abi_reflect_wasm.js\");\n return mod;\n}\n\nasync function loadNodeBindings(): Promise<WasmReflectBindings> {\n const mod = await importBindings(\"node/abi_reflect_wasm.js\");\n if (typeof mod.wasm_start === \"function\") {\n mod.wasm_start();\n }\n return mod;\n}\n\nasync function importBindings(relativePath: string): Promise<WasmReflectBindings> {\n const moduleUrl = new URL(`${wasmDir}/${relativePath}`, import.meta.url);\n const imported = (await import(\n /* webpackIgnore: true */\n /* @vite-ignore */\n moduleUrl.href\n )) as WasmReflectBindings | { default: WasmReflectBindings };\n const bindings = \"default\" in imported ? imported.default : imported;\n return bindings;\n}\n\nasync function callReflect(\n abiYaml: string,\n typeName: string,\n buffer: Uint8Array,\n): Promise<JsonValue> {\n const bindings = await loadBindings();\n const result = bindings.reflect(abiYaml, typeName, buffer);\n return JSON.parse(result);\n}\n\nasync function callLayoutIr(abiYaml: string): Promise<JsonValue> {\n const bindings = await loadBindings();\n const result = bindings.build_layout_ir(abiYaml);\n return JSON.parse(result);\n}\n\nasync function callReflectInstruction(\n abiYaml: string,\n buffer: Uint8Array,\n): Promise<JsonValue> {\n const bindings = await loadBindings();\n const result = bindings.reflect_instruction(abiYaml, buffer);\n return JSON.parse(result);\n}\n\nasync function callReflectAccount(\n abiYaml: string,\n buffer: Uint8Array,\n): Promise<JsonValue> {\n const bindings = await loadBindings();\n const result = bindings.reflect_account(abiYaml, buffer);\n return JSON.parse(result);\n}\n\nasync function callReflectEvent(\n abiYaml: string,\n buffer: Uint8Array,\n): Promise<JsonValue> {\n const bindings = await loadBindings();\n const result = bindings.reflect_event(abiYaml, buffer);\n return JSON.parse(result);\n}\n\nexport type BinaryLike = Uint8Array | ArrayBuffer | ArrayBufferView | number[];\n\nexport async function reflect(\n abiYaml: string,\n typeName: string,\n payload: {type: 'binary', value: BinaryLike} | {type: 'hex', value: string },\n): Promise<JsonValue> {\n if (payload.type === 'binary') {\n return callReflect(abiYaml, typeName, toUint8Array(payload.value));\n }\n if (payload.type === 'hex') {\n return callReflect(abiYaml, typeName, hexToBytes(payload.value));\n }\n throw new Error(`Invalid payload type`);\n}\n\nexport async function buildLayoutIr(abiYaml: string): Promise<JsonValue> {\n return callLayoutIr(abiYaml);\n}\n\nexport type ReflectRootPayload = {type: 'binary', value: BinaryLike} | {type: 'hex', value: string };\n\nexport async function reflectInstruction(\n abiYaml: string,\n payload: ReflectRootPayload,\n): Promise<JsonValue> {\n if (payload.type === 'binary') {\n return callReflectInstruction(abiYaml, toUint8Array(payload.value));\n }\n if (payload.type === 'hex') {\n return callReflectInstruction(abiYaml, hexToBytes(payload.value));\n }\n throw new Error(`Invalid payload type`);\n}\n\nexport async function reflectAccount(\n abiYaml: string,\n payload: ReflectRootPayload,\n): Promise<JsonValue> {\n if (payload.type === 'binary') {\n return callReflectAccount(abiYaml, toUint8Array(payload.value));\n }\n if (payload.type === 'hex') {\n return callReflectAccount(abiYaml, hexToBytes(payload.value));\n }\n throw new Error(`Invalid payload type`);\n}\n\nexport async function reflectEvent(\n abiYaml: string,\n payload: ReflectRootPayload,\n): Promise<JsonValue> {\n if (payload.type === 'binary') {\n return callReflectEvent(abiYaml, toUint8Array(payload.value));\n }\n if (payload.type === 'hex') {\n return callReflectEvent(abiYaml, hexToBytes(payload.value));\n }\n throw new Error(`Invalid payload type`);\n}\n\nexport async function ensureWasmLoaded(): Promise<void> {\n await loadBindings();\n}\n\nfunction requireBindings(): WasmReflectBindings {\n if (cachedBindings) {\n return cachedBindings;\n }\n throw new Error(\"WASM bindings are not loaded. Call ensureWasmLoaded() first.\");\n}\n\nexport interface FormatOptions {\n includeByteOffsets?: boolean;\n}\n\nexport function formatReflection(raw: JsonValue, options?: FormatOptions): FormattedReflection {\n const bindings = requireBindings();\n const serialized = JSON.stringify(raw);\n\n if (options && Object.keys(options).length > 0) {\n const optionsJson = JSON.stringify(options);\n const result = bindings.format_reflection_with_options(serialized, optionsJson);\n return JSON.parse(result) as FormattedReflection;\n }\n\n const result = bindings.format_reflection(serialized);\n return JSON.parse(result) as FormattedReflection;\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/bytes.ts","../src/utils/runtime.ts","../src/wasmBridge.ts","../src/imports/types.ts","../src/imports/onchainFetcher.ts","../src/imports/resolveImports.ts"],"names":["result","a","b","c","d","triple","temp1","temp2","value"],"mappings":"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","file":"index.js","sourcesContent":["export function bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nexport function alignUp(offset: number, alignment: number): number {\n return (offset + alignment - 1) & ~(alignment - 1);\n}\n\nexport function hexToBytes(hex: string): Uint8Array {\n let normalized = hex.trim().replace(/[\\s_]/g, \"\");\n if (normalized.startsWith(\"0x\") || normalized.startsWith(\"0X\")) {\n normalized = normalized.slice(2);\n }\n if (normalized.length === 0) return new Uint8Array();\n if (normalized.length % 2 !== 0) {\n throw new Error(\"Hex input must contain an even number of characters\");\n }\n const bytes = new Uint8Array(normalized.length / 2);\n for (let i = 0; i < normalized.length; i += 2) {\n const byte = Number.parseInt(normalized.slice(i, i + 2), 16);\n if (Number.isNaN(byte)) {\n throw new Error(\"Hex input contains non-hexadecimal characters\");\n }\n bytes[i / 2] = byte;\n }\n return bytes;\n}\n\nexport function toUint8Array(\n input: Uint8Array | ArrayBuffer | ArrayBufferView | number[],\n): Uint8Array {\n if (input instanceof Uint8Array) {\n return input;\n }\n if (ArrayBuffer.isView(input)) {\n return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n }\n if (input instanceof ArrayBuffer) {\n return new Uint8Array(input);\n }\n if (Array.isArray(input)) {\n return Uint8Array.from(input);\n }\n throw new TypeError(\"Unsupported buffer input\");\n}\n","export function isNodeRuntime(): boolean {\n return typeof process !== \"undefined\" && Boolean(process.versions?.node);\n}\n","import { hexToBytes, toUint8Array } from \"./utils/bytes\";\nimport { isNodeRuntime } from \"./utils/runtime\";\nimport type { FormattedReflection } from \"./types\";\n\ntype WasmReflectBindings = {\n reflect: (abi: string, typeName: string, buffer: Uint8Array) => string;\n reflect_instruction: (abi: string, buffer: Uint8Array) => string;\n reflect_account: (abi: string, buffer: Uint8Array) => string;\n reflect_event: (abi: string, buffer: Uint8Array) => string;\n build_layout_ir: (abi: string) => string;\n format_reflection: (raw: string) => string;\n format_reflection_with_options: (raw: string, options: string) => string;\n /* Manifest-based functions for ABIs with imports */\n reflect_with_manifest: (manifest: string, rootPackage: string, typeName: string, buffer: Uint8Array) => string;\n reflect_instruction_with_manifest: (manifest: string, rootPackage: string, buffer: Uint8Array) => string;\n reflect_account_with_manifest: (manifest: string, rootPackage: string, buffer: Uint8Array) => string;\n reflect_event_with_manifest: (manifest: string, rootPackage: string, buffer: Uint8Array) => string;\n build_layout_ir_with_manifest: (manifest: string, rootPackage: string) => string;\n get_manifest_packages: (manifest: string) => string;\n validate_manifest: (manifest: string) => string;\n wasm_start?: () => void;\n};\n\ntype JsonValue = unknown;\n\n// Configuration for WASM loading\nlet configuredWasmUrl: string | undefined;\n\n/**\n * Configure the URL from which to load the WASM file.\n * Must be called before any reflection functions are used.\n *\n * This is useful for environments like Next.js where bundler-based WASM loading\n * doesn't work. Instead, copy the WASM file to your public directory and call:\n *\n * @example\n * ```ts\n * import { configureWasm } from \"@thru/abi\";\n * configureWasm(\"/wasm/abi_reflect_wasm_bg.wasm\");\n * ```\n *\n * @param url - URL or path to the WASM file (e.g., \"/wasm/abi_reflect_wasm_bg.wasm\")\n */\nexport function configureWasm(url: string): void {\n if (cachedBindings) {\n console.warn(\"configureWasm called after WASM was already loaded. Configuration ignored.\");\n return;\n }\n configuredWasmUrl = url;\n}\n\nconst wasmDir = resolveWasmDir();\nlet bindingsPromise: Promise<WasmReflectBindings> | undefined;\nlet cachedBindings: WasmReflectBindings | undefined;\n\nfunction resolveWasmDir(): string {\n const url = import.meta.url;\n if (url.includes(\"/src/\")) return \"../wasm\";\n if (url.includes(\"/dist/\")) return \"./wasm\";\n return \"./wasm\";\n}\n\nasync function loadBindings(): Promise<WasmReflectBindings> {\n if (cachedBindings) {\n return cachedBindings;\n }\n if (!bindingsPromise) {\n let loader: Promise<WasmReflectBindings>;\n if (isNodeRuntime()) {\n loader = loadNodeBindings();\n } else if (configuredWasmUrl) {\n loader = loadWebBindings(configuredWasmUrl);\n } else {\n loader = loadBundlerBindings();\n }\n bindingsPromise = loader.then((bindings) => {\n cachedBindings = bindings;\n return bindings;\n });\n }\n return bindingsPromise;\n}\n\nasync function loadWebBindings(wasmUrl: string): Promise<WasmReflectBindings> {\n const moduleUrl = new URL(`${wasmDir}/web/abi_reflect_wasm.js`, import.meta.url);\n const mod = (await import(\n /* webpackIgnore: true */\n /* @vite-ignore */\n moduleUrl.href\n )) as WasmReflectBindings & { default: (url: string) => Promise<void> };\n\n // Initialize with the configured WASM URL\n await mod.default(wasmUrl);\n\n return mod;\n}\n\nasync function loadBundlerBindings(): Promise<WasmReflectBindings> {\n const mod = await importBindings(\"bundler/abi_reflect_wasm.js\");\n return mod;\n}\n\nasync function loadNodeBindings(): Promise<WasmReflectBindings> {\n const mod = await importBindings(\"node/abi_reflect_wasm.js\");\n if (typeof mod.wasm_start === \"function\") {\n mod.wasm_start();\n }\n return mod;\n}\n\nasync function importBindings(relativePath: string): Promise<WasmReflectBindings> {\n const moduleUrl = new URL(`${wasmDir}/${relativePath}`, import.meta.url);\n const imported = (await import(\n /* webpackIgnore: true */\n /* @vite-ignore */\n moduleUrl.href\n )) as WasmReflectBindings | { default: WasmReflectBindings };\n const bindings = \"default\" in imported ? imported.default : imported;\n return bindings;\n}\n\nasync function callReflect(\n abiYaml: string,\n typeName: string,\n buffer: Uint8Array,\n): Promise<JsonValue> {\n const bindings = await loadBindings();\n const result = bindings.reflect(abiYaml, typeName, buffer);\n return JSON.parse(result);\n}\n\nasync function callLayoutIr(abiYaml: string): Promise<JsonValue> {\n const bindings = await loadBindings();\n const result = bindings.build_layout_ir(abiYaml);\n return JSON.parse(result);\n}\n\nasync function callReflectInstruction(\n abiYaml: string,\n buffer: Uint8Array,\n): Promise<JsonValue> {\n const bindings = await loadBindings();\n const result = bindings.reflect_instruction(abiYaml, buffer);\n return JSON.parse(result);\n}\n\nasync function callReflectAccount(\n abiYaml: string,\n buffer: Uint8Array,\n): Promise<JsonValue> {\n const bindings = await loadBindings();\n const result = bindings.reflect_account(abiYaml, buffer);\n return JSON.parse(result);\n}\n\nasync function callReflectEvent(\n abiYaml: string,\n buffer: Uint8Array,\n): Promise<JsonValue> {\n const bindings = await loadBindings();\n const result = bindings.reflect_event(abiYaml, buffer);\n return JSON.parse(result);\n}\n\nexport type BinaryLike = Uint8Array | ArrayBuffer | ArrayBufferView | number[];\n\nexport async function reflect(\n abiYaml: string,\n typeName: string,\n payload: {type: 'binary', value: BinaryLike} | {type: 'hex', value: string },\n): Promise<JsonValue> {\n if (payload.type === 'binary') {\n return callReflect(abiYaml, typeName, toUint8Array(payload.value));\n }\n if (payload.type === 'hex') {\n return callReflect(abiYaml, typeName, hexToBytes(payload.value));\n }\n throw new Error(`Invalid payload type`);\n}\n\nexport async function buildLayoutIr(abiYaml: string): Promise<JsonValue> {\n return callLayoutIr(abiYaml);\n}\n\nexport type ReflectRootPayload = {type: 'binary', value: BinaryLike} | {type: 'hex', value: string };\n\nexport async function reflectInstruction(\n abiYaml: string,\n payload: ReflectRootPayload,\n): Promise<JsonValue> {\n if (payload.type === 'binary') {\n return callReflectInstruction(abiYaml, toUint8Array(payload.value));\n }\n if (payload.type === 'hex') {\n return callReflectInstruction(abiYaml, hexToBytes(payload.value));\n }\n throw new Error(`Invalid payload type`);\n}\n\nexport async function reflectAccount(\n abiYaml: string,\n payload: ReflectRootPayload,\n): Promise<JsonValue> {\n if (payload.type === 'binary') {\n return callReflectAccount(abiYaml, toUint8Array(payload.value));\n }\n if (payload.type === 'hex') {\n return callReflectAccount(abiYaml, hexToBytes(payload.value));\n }\n throw new Error(`Invalid payload type`);\n}\n\nexport async function reflectEvent(\n abiYaml: string,\n payload: ReflectRootPayload,\n): Promise<JsonValue> {\n if (payload.type === 'binary') {\n return callReflectEvent(abiYaml, toUint8Array(payload.value));\n }\n if (payload.type === 'hex') {\n return callReflectEvent(abiYaml, hexToBytes(payload.value));\n }\n throw new Error(`Invalid payload type`);\n}\n\nexport async function ensureWasmLoaded(): Promise<void> {\n await loadBindings();\n}\n\nfunction requireBindings(): WasmReflectBindings {\n if (cachedBindings) {\n return cachedBindings;\n }\n throw new Error(\"WASM bindings are not loaded. Call ensureWasmLoaded() first.\");\n}\n\nexport interface FormatOptions {\n includeByteOffsets?: boolean;\n}\n\nexport function formatReflection(raw: JsonValue, options?: FormatOptions): FormattedReflection {\n const bindings = requireBindings();\n const serialized = JSON.stringify(raw);\n\n if (options && Object.keys(options).length > 0) {\n const optionsJson = JSON.stringify(options);\n const result = bindings.format_reflection_with_options(serialized, optionsJson);\n return JSON.parse(result) as FormattedReflection;\n }\n\n const result = bindings.format_reflection(serialized);\n return JSON.parse(result) as FormattedReflection;\n}\n\n/* ============================================================================\n Manifest-based Functions\n\n These functions support ABIs with imports by accepting a pre-resolved manifest\n (a map of package names to their ABI YAML content).\n ============================================================================ */\n\nexport type Manifest = Record<string, string>;\n\nasync function callReflectWithManifest(\n manifest: Manifest,\n rootPackage: string,\n typeName: string,\n buffer: Uint8Array,\n): Promise<JsonValue> {\n const bindings = await loadBindings();\n const manifestJson = JSON.stringify(manifest);\n const result = bindings.reflect_with_manifest(manifestJson, rootPackage, typeName, buffer);\n return JSON.parse(result);\n}\n\nasync function callReflectInstructionWithManifest(\n manifest: Manifest,\n rootPackage: string,\n buffer: Uint8Array,\n): Promise<JsonValue> {\n const bindings = await loadBindings();\n const manifestJson = JSON.stringify(manifest);\n const result = bindings.reflect_instruction_with_manifest(manifestJson, rootPackage, buffer);\n return JSON.parse(result);\n}\n\nasync function callReflectAccountWithManifest(\n manifest: Manifest,\n rootPackage: string,\n buffer: Uint8Array,\n): Promise<JsonValue> {\n const bindings = await loadBindings();\n const manifestJson = JSON.stringify(manifest);\n const result = bindings.reflect_account_with_manifest(manifestJson, rootPackage, buffer);\n return JSON.parse(result);\n}\n\nasync function callReflectEventWithManifest(\n manifest: Manifest,\n rootPackage: string,\n buffer: Uint8Array,\n): Promise<JsonValue> {\n const bindings = await loadBindings();\n const manifestJson = JSON.stringify(manifest);\n const result = bindings.reflect_event_with_manifest(manifestJson, rootPackage, buffer);\n return JSON.parse(result);\n}\n\n/**\n * Reflect a binary buffer using a pre-resolved manifest.\n *\n * @param manifest - Map of package names to ABI YAML content\n * @param rootPackage - The package containing the target type\n * @param typeName - The type name to parse\n * @param payload - Binary data to reflect\n */\nexport async function reflectWithManifest(\n manifest: Manifest,\n rootPackage: string,\n typeName: string,\n payload: ReflectRootPayload,\n): Promise<JsonValue> {\n if (payload.type === 'binary') {\n return callReflectWithManifest(manifest, rootPackage, typeName, toUint8Array(payload.value));\n }\n if (payload.type === 'hex') {\n return callReflectWithManifest(manifest, rootPackage, typeName, hexToBytes(payload.value));\n }\n throw new Error(`Invalid payload type`);\n}\n\n/**\n * Reflect an instruction using a pre-resolved manifest.\n */\nexport async function reflectInstructionWithManifest(\n manifest: Manifest,\n rootPackage: string,\n payload: ReflectRootPayload,\n): Promise<JsonValue> {\n if (payload.type === 'binary') {\n return callReflectInstructionWithManifest(manifest, rootPackage, toUint8Array(payload.value));\n }\n if (payload.type === 'hex') {\n return callReflectInstructionWithManifest(manifest, rootPackage, hexToBytes(payload.value));\n }\n throw new Error(`Invalid payload type`);\n}\n\n/**\n * Reflect an account using a pre-resolved manifest.\n */\nexport async function reflectAccountWithManifest(\n manifest: Manifest,\n rootPackage: string,\n payload: ReflectRootPayload,\n): Promise<JsonValue> {\n if (payload.type === 'binary') {\n return callReflectAccountWithManifest(manifest, rootPackage, toUint8Array(payload.value));\n }\n if (payload.type === 'hex') {\n return callReflectAccountWithManifest(manifest, rootPackage, hexToBytes(payload.value));\n }\n throw new Error(`Invalid payload type`);\n}\n\n/**\n * Reflect an event using a pre-resolved manifest.\n */\nexport async function reflectEventWithManifest(\n manifest: Manifest,\n rootPackage: string,\n payload: ReflectRootPayload,\n): Promise<JsonValue> {\n if (payload.type === 'binary') {\n return callReflectEventWithManifest(manifest, rootPackage, toUint8Array(payload.value));\n }\n if (payload.type === 'hex') {\n return callReflectEventWithManifest(manifest, rootPackage, hexToBytes(payload.value));\n }\n throw new Error(`Invalid payload type`);\n}\n\n/**\n * Build layout IR using a pre-resolved manifest.\n */\nexport async function buildLayoutIrWithManifest(\n manifest: Manifest,\n rootPackage: string,\n): Promise<JsonValue> {\n const bindings = await loadBindings();\n const manifestJson = JSON.stringify(manifest);\n const result = bindings.build_layout_ir_with_manifest(manifestJson, rootPackage);\n return JSON.parse(result);\n}\n\n/**\n * Get the list of package names in a manifest.\n */\nexport async function getManifestPackages(manifest: Manifest): Promise<string[]> {\n const bindings = await loadBindings();\n const manifestJson = JSON.stringify(manifest);\n const result = bindings.get_manifest_packages(manifestJson);\n return JSON.parse(result);\n}\n\nexport interface ManifestPackageInfo {\n name: string;\n package: string;\n version: number;\n type_count: number;\n has_root_types: boolean;\n}\n\n/**\n * Validate a manifest and return information about its contents.\n */\nexport async function validateManifest(manifest: Manifest): Promise<ManifestPackageInfo[]> {\n const bindings = await loadBindings();\n const manifestJson = JSON.stringify(manifest);\n const result = bindings.validate_manifest(manifestJson);\n return JSON.parse(result);\n}\n","/**\n * Import Source Types\n *\n * These types mirror the Rust ImportSource enum and related types.\n */\n\n/* Target type for on-chain ABI imports */\nexport type OnchainTarget = \"program\" | \"abi-meta\" | \"abi\";\n\n/* Revision specifier for on-chain imports */\nexport type RevisionSpec =\n | { type: \"exact\"; value: number }\n | { type: \"minimum\"; value: number }\n | { type: \"latest\" };\n\n/* Import source specification */\nexport type ImportSource =\n | { type: \"path\"; path: string }\n | { type: \"git\"; url: string; ref: string; path: string }\n | { type: \"http\"; url: string }\n | {\n type: \"onchain\";\n address: string;\n target: OnchainTarget;\n network: string;\n revision: RevisionSpec;\n };\n\n/* Package identifier */\nexport interface PackageId {\n packageName: string;\n version: string;\n}\n\n/* Resolved package information */\nexport interface ResolvedPackage {\n id: PackageId;\n source: ImportSource;\n abiYaml: string;\n dependencies: PackageId[];\n isRemote: boolean;\n}\n\n/* Resolution result */\nexport interface ResolutionResult {\n root: ResolvedPackage;\n allPackages: ResolvedPackage[];\n manifest: Record<string, string>;\n}\n\n/* Resolution error */\nexport class ResolutionError extends Error {\n constructor(\n public code:\n | \"CYCLIC_DEPENDENCY\"\n | \"VERSION_CONFLICT\"\n | \"FETCH_ERROR\"\n | \"PARSE_ERROR\"\n | \"NOT_FOUND\"\n | \"UNSUPPORTED_IMPORT_TYPE\",\n message: string,\n public details?: unknown\n ) {\n super(message);\n this.name = \"ResolutionError\";\n }\n}\n\n/* ABI account header constants (matches Rust) */\nexport const ABI_ACCOUNT_HEADER_SIZE = 45;\nexport const ABI_STATE_OPEN = 0x00;\nexport const ABI_STATE_FINALIZED = 0x01;\n\n/* Parsed ABI account data */\nexport interface AbiAccountData {\n abiMetaAccount: Uint8Array;\n revision: bigint;\n state: number;\n content: string;\n}\n\n/* RPC endpoint configuration */\nexport interface RpcEndpoints {\n [network: string]: string;\n}\n\n/* Default RPC endpoints */\nexport const DEFAULT_RPC_ENDPOINTS: RpcEndpoints = {\n mainnet: \"https://rpc.thru.network\",\n testnet: \"https://rpc-testnet.thru.network\",\n};\n\n/* ABI metadata parsed from YAML */\nexport interface AbiMetadata {\n package: string;\n name?: string;\n \"abi-version\": number;\n \"package-version\": string;\n description: string;\n imports?: ImportSourceYaml[];\n}\n\n/* Import source as it appears in YAML */\nexport type ImportSourceYaml =\n | { type: \"path\"; path: string }\n | { type: \"git\"; url: string; ref: string; path: string }\n | { type: \"http\"; url: string }\n | {\n type: \"onchain\";\n address: string;\n target?: OnchainTarget;\n network: string;\n revision?: number | string;\n };\n\n/* Parsed ABI file */\nexport interface AbiFile {\n abi: AbiMetadata;\n types: unknown[];\n}\n","/**\n * On-chain ABI Fetcher\n *\n * Fetches ABI content from on-chain accounts.\n */\n\nimport type { AbiAccountData, RpcEndpoints, RevisionSpec, OnchainTarget } from \"./types\";\nimport {\n ABI_ACCOUNT_HEADER_SIZE,\n ABI_STATE_OPEN,\n ABI_STATE_FINALIZED,\n DEFAULT_RPC_ENDPOINTS,\n} from \"./types\";\n\n/**\n * Minimal interface for a Thru RPC client that can fetch raw accounts.\n * This is compatible with @thru/thru-sdk client but doesn't require it.\n */\nexport interface ThruRpcClient {\n query: {\n getRawAccount: (request: {\n address: { value: Uint8Array };\n versionContext: Record<string, unknown>;\n }) => Promise<{ rawData?: Uint8Array }>;\n };\n}\n\n/* ABI account seed suffix (matches on-chain ABI manager) */\nconst ABI_ACCOUNT_SUFFIX = \"_abi_account\";\nconst ABI_ACCOUNT_SUFFIX_BYTES = new TextEncoder().encode(ABI_ACCOUNT_SUFFIX);\n\nconst ABI_META_HEADER_SIZE = 4;\nconst ABI_META_BODY_SIZE = 96;\nconst ABI_META_ACCOUNT_SIZE = ABI_META_HEADER_SIZE + ABI_META_BODY_SIZE;\n\nconst ABI_META_VERSION = 1;\nconst ABI_META_KIND_OFFICIAL = 0;\nconst ABI_META_KIND_EXTERNAL = 1;\n\nconst DEFAULT_ABI_MANAGER_PROGRAM_ID =\n \"taWqAAOSe9pavaaMpkc9VbSLBUMbuW6Mk59sZlSbcNHsJA\";\n\nasync function sha256Bytes(data: Uint8Array): Promise<Uint8Array> {\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", data as BufferSource);\n return new Uint8Array(hashBuffer);\n}\n\nfunction concatBytes(...chunks: Uint8Array[]): Uint8Array {\n const total = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const out = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n out.set(chunk, offset);\n offset += chunk.length;\n }\n return out;\n}\n\nfunction abiMetaBodyForProgram(program: Uint8Array): Uint8Array {\n const body = new Uint8Array(ABI_META_BODY_SIZE);\n body.set(program.slice(0, 32), 0);\n return body;\n}\n\nasync function deriveAbiAccountSeed(kind: number, body: Uint8Array): Promise<Uint8Array> {\n return sha256Bytes(concatBytes(new Uint8Array([kind]), body, ABI_ACCOUNT_SUFFIX_BYTES));\n}\n\nasync function createProgramDefinedAccountAddress(\n owner: Uint8Array,\n isEphemeral: boolean,\n seed: Uint8Array\n): Promise<Uint8Array> {\n const flag = new Uint8Array([isEphemeral ? 1 : 0]);\n return sha256Bytes(concatBytes(owner, flag, seed));\n}\n\nasync function deriveAbiAccountAddress(\n kind: number,\n body: Uint8Array,\n owner: Uint8Array,\n isEphemeral: boolean\n): Promise<Uint8Array> {\n const seed = await deriveAbiAccountSeed(kind, body);\n return createProgramDefinedAccountAddress(owner, isEphemeral, seed);\n}\n\n/**\n * Derive the official ABI account address for a given program.\n *\n * This performs the same derivation as OnchainFetcher.fetch() with target=\"program\",\n * returning the raw 32-byte address of the ABI account.\n */\nexport async function deriveOfficialAbiAddress(\n programAddress: string,\n abiManagerProgramId: string = DEFAULT_ABI_MANAGER_PROGRAM_ID\n): Promise<Uint8Array> {\n const programBytes = decodeAddress(programAddress);\n const managerBytes = decodeAddress(abiManagerProgramId);\n const body = abiMetaBodyForProgram(programBytes);\n return deriveAbiAccountAddress(ABI_META_KIND_OFFICIAL, body, managerBytes, false);\n}\n\ntype AbiMetaAccount = {\n version: number;\n kind: number;\n flags: number;\n body: Uint8Array;\n};\n\nfunction parseAbiMetaAccount(data: Uint8Array): AbiMetaAccount {\n if (data.length < ABI_META_ACCOUNT_SIZE) {\n throw new Error(\n `ABI meta account data too short: ${data.length} bytes, expected at least ${ABI_META_ACCOUNT_SIZE}`\n );\n }\n\n const version = data[0];\n const kind = data[1];\n const flags = data[2] | (data[3] << 8);\n const body = data.slice(ABI_META_HEADER_SIZE, ABI_META_HEADER_SIZE + ABI_META_BODY_SIZE);\n\n if (version !== ABI_META_VERSION) {\n throw new Error(`Unsupported ABI meta version: ${version}`);\n }\n if (kind !== ABI_META_KIND_OFFICIAL && kind !== ABI_META_KIND_EXTERNAL) {\n throw new Error(`Unsupported ABI meta kind: ${kind}`);\n }\n\n return { version, kind, flags, body };\n}\n\n/**\n * Parse ABI account data from raw bytes.\n *\n * Account header layout (45 bytes):\n * - abi_meta_account: [u8; 32]\n * - revision: u64 (little-endian)\n * - state: u8 (0x00=OPEN, 0x01=FINALIZED)\n * - content_sz: u32 (little-endian)\n * - content: [u8; content_sz]\n */\nexport function parseAbiAccountData(data: Uint8Array): AbiAccountData {\n if (data.length < ABI_ACCOUNT_HEADER_SIZE) {\n throw new Error(\n `ABI account data too short: ${data.length} bytes, expected at least ${ABI_ACCOUNT_HEADER_SIZE}`\n );\n }\n\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\n const abiMetaAccount = data.slice(0, 32);\n const revision = view.getBigUint64(32, true);\n const state = data[40];\n const contentSize = view.getUint32(41, true);\n\n if (state !== ABI_STATE_OPEN && state !== ABI_STATE_FINALIZED) {\n throw new Error(`Invalid ABI account state: ${state}`);\n }\n\n const expectedSize = ABI_ACCOUNT_HEADER_SIZE + contentSize;\n if (data.length < expectedSize) {\n throw new Error(\n `ABI account data truncated: ${data.length} bytes, expected ${expectedSize}`\n );\n }\n\n const contentBytes = data.slice(ABI_ACCOUNT_HEADER_SIZE, expectedSize);\n const content = new TextDecoder().decode(contentBytes);\n\n return {\n abiMetaAccount,\n revision,\n state,\n content,\n };\n}\n\n/**\n * Check if a revision matches the specification.\n */\nexport function revisionMatches(revision: bigint, spec: RevisionSpec): boolean {\n switch (spec.type) {\n case \"latest\":\n return true;\n case \"exact\":\n return revision === BigInt(spec.value);\n case \"minimum\":\n return revision >= BigInt(spec.value);\n default:\n return false;\n }\n}\n\nexport interface OnchainFetcherConfig {\n rpcEndpoints?: RpcEndpoints;\n thruClient?: ThruRpcClient;\n abiManagerProgramId?: string;\n abiManagerIsEphemeral?: boolean;\n}\n\nexport interface FetchResult {\n abiYaml: string;\n revision: bigint;\n isFinalized: boolean;\n}\n\n/**\n * Fetcher for on-chain ABI accounts.\n *\n * Supports fetching ABI from:\n * - Official ABI via program (target: \"program\")\n * - ABI via ABI meta account (target: \"abi-meta\")\n * - Direct ABI account (target: \"abi\")\n */\nexport class OnchainFetcher {\n private rpcEndpoints: RpcEndpoints;\n private thruClient?: ThruRpcClient;\n private abiManagerProgramId: Uint8Array;\n private abiManagerIsEphemeral: boolean;\n\n constructor(config: OnchainFetcherConfig = {}) {\n this.rpcEndpoints = { ...DEFAULT_RPC_ENDPOINTS, ...config.rpcEndpoints };\n this.thruClient = config.thruClient;\n const managerId = config.abiManagerProgramId ?? DEFAULT_ABI_MANAGER_PROGRAM_ID;\n this.abiManagerProgramId = decodeAddress(managerId);\n this.abiManagerIsEphemeral = config.abiManagerIsEphemeral ?? false;\n }\n\n /**\n * Fetch ABI content from an on-chain account.\n */\n async fetch(\n address: string,\n target: OnchainTarget,\n network: string,\n revision: RevisionSpec\n ): Promise<FetchResult> {\n const addressBytes = this.parseAddress(address);\n let abiAddress: Uint8Array;\n if (target === \"program\") {\n const body = abiMetaBodyForProgram(addressBytes);\n abiAddress = await deriveAbiAccountAddress(\n ABI_META_KIND_OFFICIAL,\n body,\n this.abiManagerProgramId,\n this.abiManagerIsEphemeral\n );\n } else if (target === \"abi-meta\") {\n const metaData = await this.fetchAccountData(addressBytes, network);\n const meta = parseAbiMetaAccount(metaData);\n abiAddress = await deriveAbiAccountAddress(\n meta.kind,\n meta.body,\n this.abiManagerProgramId,\n this.abiManagerIsEphemeral\n );\n } else {\n abiAddress = addressBytes;\n }\n\n const accountData = await this.fetchAccountData(abiAddress, network);\n const parsed = parseAbiAccountData(accountData);\n\n if (!revisionMatches(parsed.revision, revision)) {\n const revisionStr =\n revision.type === \"exact\"\n ? `exactly ${revision.value}`\n : revision.type === \"minimum\"\n ? `at least ${revision.value}`\n : \"latest\";\n throw new Error(\n `ABI revision mismatch: got ${parsed.revision}, expected ${revisionStr}`\n );\n }\n\n return {\n abiYaml: parsed.content,\n revision: parsed.revision,\n isFinalized: parsed.state === ABI_STATE_FINALIZED,\n };\n }\n\n /**\n * Get the RPC endpoint for a network.\n */\n getRpcEndpoint(network: string): string {\n const endpoint = this.rpcEndpoints[network];\n if (!endpoint) {\n throw new Error(\n `Unknown network: ${network}. Configure rpcEndpoints for this network.`\n );\n }\n return endpoint;\n }\n\n private parseAddress(address: string): Uint8Array {\n return decodeAddress(address);\n }\n\n private async fetchAccountData(address: Uint8Array, network: string): Promise<Uint8Array> {\n if (this.thruClient) {\n return this.fetchWithThruClient(address);\n }\n return this.fetchWithHttp(address, network);\n }\n\n private async fetchWithThruClient(address: Uint8Array): Promise<Uint8Array> {\n if (!this.thruClient) {\n throw new Error(\"ThruClient not configured\");\n }\n\n const response = await this.thruClient.query.getRawAccount({\n address: { value: address },\n versionContext: {},\n });\n\n if (!response.rawData) {\n throw new Error(\"Account not found or has no data\");\n }\n\n return response.rawData;\n }\n\n private async fetchWithHttp(address: Uint8Array, network: string): Promise<Uint8Array> {\n const endpoint = this.getRpcEndpoint(network);\n const addressStr = encodeThruAddress(address);\n\n /* Use HTTP/JSON-RPC fallback */\n const response = await fetch(`${endpoint}/v1/accounts/${addressStr}:raw`, {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n },\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(`ABI account not found: ${addressStr}`);\n }\n throw new Error(`Failed to fetch account: ${response.status} ${response.statusText}`);\n }\n\n const json = await response.json();\n if (!json.rawData) {\n throw new Error(\"Account has no data\");\n }\n\n /* rawData is base64 encoded */\n return base64Decode(json.rawData);\n }\n}\n\nconst BASE64_URL_ALPHABET =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\n\nfunction decodeAddress(address: string): Uint8Array {\n if (address.startsWith(\"ta\") && address.length === 46) {\n return decodeThruAddress(address);\n }\n throw new Error(`Invalid Thru address format: ${address} (expected 46-char ta-prefixed address)`);\n}\n\nfunction decodeThruAddress(address: string): Uint8Array {\n if (address.length !== 46 || !address.startsWith(\"ta\")) {\n throw new Error(`Invalid Thru address: ${address}`);\n }\n\n const invlut = new Int16Array(256);\n invlut.fill(-1);\n for (let i = 0; i < BASE64_URL_ALPHABET.length; i += 1) {\n invlut[BASE64_URL_ALPHABET.charCodeAt(i)] = i;\n }\n\n let inIdx = 2;\n let inSz = 40;\n let outIdx = 0;\n let checksum = 0;\n const out = new Uint8Array(32);\n\n while (inSz >= 4) {\n const a = invlut[address.charCodeAt(inIdx + 0)];\n const b = invlut[address.charCodeAt(inIdx + 1)];\n const c = invlut[address.charCodeAt(inIdx + 2)];\n const d = invlut[address.charCodeAt(inIdx + 3)];\n if (a < 0 || b < 0 || c < 0 || d < 0) {\n throw new Error(`Invalid Thru address character at ${inIdx}`);\n }\n const triple = (a << 18) | (b << 12) | (c << 6) | d;\n const temp1 = (triple >> 16) & 0xff;\n checksum += temp1;\n out[outIdx++] = temp1;\n const temp2 = (triple >> 8) & 0xff;\n checksum += temp2;\n out[outIdx++] = temp2;\n const temp3 = triple & 0xff;\n checksum += temp3;\n out[outIdx++] = temp3;\n inIdx += 4;\n inSz -= 4;\n }\n\n const a = invlut[address.charCodeAt(inIdx + 0)];\n const b = invlut[address.charCodeAt(inIdx + 1)];\n const c = invlut[address.charCodeAt(inIdx + 2)];\n const d = invlut[address.charCodeAt(inIdx + 3)];\n if (a < 0 || b < 0 || c < 0 || d < 0) {\n throw new Error(`Invalid Thru address character at ${inIdx}`);\n }\n const triple = (a << 18) | (b << 12) | (c << 6) | d;\n const temp1 = (triple >> 16) & 0xff;\n checksum += temp1;\n out[outIdx++] = temp1;\n const temp2 = (triple >> 8) & 0xff;\n checksum += temp2;\n out[outIdx++] = temp2;\n const incomingChecksum = triple & 0xff;\n if ((checksum & 0xff) !== incomingChecksum) {\n throw new Error(\"Invalid Thru address checksum\");\n }\n\n return out;\n}\n\nfunction encodeThruAddress(bytes: Uint8Array): string {\n if (bytes.length !== 32) {\n throw new Error(`Expected 32 bytes, got ${bytes.length}`);\n }\n\n function maskForBits(bits: number): number {\n return bits === 0 ? 0 : (1 << bits) - 1;\n }\n\n let output = \"ta\";\n let checksum = 0;\n let accumulator = 0;\n let bitsCollected = 0;\n\n for (let i = 0; i < 30; i++) {\n const byte = bytes[i];\n checksum += byte;\n accumulator = (accumulator << 8) | byte;\n bitsCollected += 8;\n while (bitsCollected >= 6) {\n const index = (accumulator >> (bitsCollected - 6)) & 0x3f;\n output += BASE64_URL_ALPHABET[index];\n bitsCollected -= 6;\n accumulator &= maskForBits(bitsCollected);\n }\n }\n\n const secondLast = bytes[30];\n checksum += secondLast;\n accumulator = (accumulator << 8) | secondLast;\n bitsCollected += 8;\n\n const last = bytes[31];\n checksum += last;\n accumulator = (accumulator << 8) | last;\n bitsCollected += 8;\n\n accumulator = (accumulator << 8) | (checksum & 0xff);\n bitsCollected += 8;\n\n while (bitsCollected >= 6) {\n const index = (accumulator >> (bitsCollected - 6)) & 0x3f;\n output += BASE64_URL_ALPHABET[index];\n bitsCollected -= 6;\n accumulator &= maskForBits(bitsCollected);\n }\n\n return output;\n}\n\nfunction base64Decode(str: string): Uint8Array {\n const binaryStr = atob(str);\n const bytes = new Uint8Array(binaryStr.length);\n for (let i = 0; i < binaryStr.length; i++) {\n bytes[i] = binaryStr.charCodeAt(i);\n }\n return bytes;\n}\n","/**\n * Import Resolver\n *\n * Resolves ABI imports and builds a manifest for WASM consumption.\n */\n\nimport * as yaml from \"yaml\";\nimport type {\n ImportSource,\n ImportSourceYaml,\n PackageId,\n ResolvedPackage,\n ResolutionResult,\n AbiMetadata,\n AbiFile,\n RpcEndpoints,\n RevisionSpec,\n} from \"./types\";\nimport { ResolutionError, DEFAULT_RPC_ENDPOINTS } from \"./types\";\nimport { OnchainFetcher, type OnchainFetcherConfig } from \"./onchainFetcher\";\n\nexport interface ResolverConfig {\n onchainFetcher?: OnchainFetcher;\n rpcEndpoints?: RpcEndpoints;\n maxDepth?: number;\n}\n\n/**\n * Resolve all imports for an ABI and return a manifest.\n *\n * The resolver only supports on-chain imports for browser environments.\n * For path imports, use the CLI `bundle` command.\n */\nexport async function resolveImports(\n rootAbiYaml: string,\n config: ResolverConfig = {}\n): Promise<ResolutionResult> {\n const resolver = new ImportResolver(config);\n return resolver.resolve(rootAbiYaml);\n}\n\n/**\n * Create a manifest from an ABI and its resolved imports.\n *\n * The manifest maps package names to ABI YAML content.\n */\nexport function createManifest(result: ResolutionResult): Record<string, string> {\n return result.manifest;\n}\n\nclass ImportResolver {\n private onchainFetcher: OnchainFetcher;\n private maxDepth: number;\n private visited: Map<string, ResolvedPackage>;\n private inProgress: Set<string>;\n\n constructor(config: ResolverConfig = {}) {\n this.onchainFetcher =\n config.onchainFetcher ??\n new OnchainFetcher({\n rpcEndpoints: { ...DEFAULT_RPC_ENDPOINTS, ...config.rpcEndpoints },\n });\n this.maxDepth = config.maxDepth ?? 10;\n this.visited = new Map();\n this.inProgress = new Set();\n }\n\n async resolve(rootAbiYaml: string): Promise<ResolutionResult> {\n this.visited.clear();\n this.inProgress.clear();\n\n const rootPackage = await this.resolvePackage(rootAbiYaml, false, 0);\n const allPackages = Array.from(this.visited.values());\n const manifest: Record<string, string> = {};\n\n for (const pkg of allPackages) {\n manifest[pkg.id.packageName] = pkg.abiYaml;\n }\n\n return {\n root: rootPackage,\n allPackages,\n manifest,\n };\n }\n\n private async resolvePackage(\n abiYaml: string,\n isRemote: boolean,\n depth: number\n ): Promise<ResolvedPackage> {\n if (depth > this.maxDepth) {\n throw new ResolutionError(\n \"CYCLIC_DEPENDENCY\",\n `Maximum resolution depth (${this.maxDepth}) exceeded`\n );\n }\n\n const abiFile = this.parseAbiYaml(abiYaml);\n const packageId = this.extractPackageId(abiFile);\n const canonicalKey = `${packageId.packageName}@${packageId.version}`;\n\n /* Check for cycle */\n if (this.inProgress.has(canonicalKey)) {\n throw new ResolutionError(\n \"CYCLIC_DEPENDENCY\",\n `Cyclic dependency detected: ${canonicalKey}`\n );\n }\n\n /* Check if already resolved (keyed by name@version to match inProgress) */\n const existing = this.visited.get(canonicalKey);\n if (existing) {\n return existing;\n }\n\n /* Check for version conflict: same package name, different version */\n for (const [key, pkg] of this.visited) {\n if (pkg.id.packageName === packageId.packageName && pkg.id.version !== packageId.version) {\n throw new ResolutionError(\n \"VERSION_CONFLICT\",\n `Version conflict for ${packageId.packageName}: ` +\n `${pkg.id.version} vs ${packageId.version}`,\n { existing: pkg.id, conflicting: packageId }\n );\n }\n }\n\n this.inProgress.add(canonicalKey);\n\n const imports = abiFile.abi.imports ?? [];\n const dependencies: PackageId[] = [];\n\n for (const importYaml of imports) {\n const importSource = this.normalizeImportSource(importYaml);\n\n /* Enforce local import restriction */\n if (isRemote && importSource.type === \"path\") {\n throw new ResolutionError(\n \"UNSUPPORTED_IMPORT_TYPE\",\n `Remote package ${packageId.packageName} cannot import local path: ${importSource.path}`\n );\n }\n\n /* Determine child remoteness from the import source type, not the parent.\n Non-path imports (onchain, git, http) are always remote. */\n const childIsRemote = importSource.type !== \"path\";\n const depPackage = await this.resolveImport(importSource, childIsRemote, depth + 1);\n dependencies.push(depPackage.id);\n }\n\n this.inProgress.delete(canonicalKey);\n\n const resolvedPackage: ResolvedPackage = {\n id: packageId,\n source: { type: \"path\", path: \"<root>\" },\n abiYaml,\n dependencies,\n isRemote,\n };\n\n this.visited.set(canonicalKey, resolvedPackage);\n return resolvedPackage;\n }\n\n private async resolveImport(\n source: ImportSource,\n parentIsRemote: boolean,\n depth: number\n ): Promise<ResolvedPackage> {\n switch (source.type) {\n case \"path\":\n throw new ResolutionError(\n \"UNSUPPORTED_IMPORT_TYPE\",\n `Path imports are not supported in browser. Use CLI 'bundle' command. Path: ${source.path}`\n );\n\n case \"git\":\n throw new ResolutionError(\n \"UNSUPPORTED_IMPORT_TYPE\",\n `Git imports are not supported in browser. Use CLI 'bundle' command. URL: ${source.url}`\n );\n\n case \"http\":\n throw new ResolutionError(\n \"UNSUPPORTED_IMPORT_TYPE\",\n `HTTP imports are not supported in browser. Use CLI 'bundle' command. URL: ${source.url}`\n );\n\n case \"onchain\":\n return this.resolveOnchainImport(source, depth);\n\n default:\n throw new ResolutionError(\n \"UNSUPPORTED_IMPORT_TYPE\",\n `Unknown import type: ${(source as ImportSource).type}`\n );\n }\n }\n\n private async resolveOnchainImport(\n source: Extract<ImportSource, { type: \"onchain\" }>,\n depth: number\n ): Promise<ResolvedPackage> {\n const result = await this.onchainFetcher.fetch(\n source.address,\n source.target,\n source.network,\n source.revision\n );\n\n const resolved = await this.resolvePackage(result.abiYaml, true, depth);\n resolved.source = source;\n resolved.isRemote = true;\n\n return resolved;\n }\n\n private parseAbiYaml(yamlContent: string): AbiFile {\n try {\n const parsed = yaml.parse(yamlContent);\n if (!parsed || typeof parsed !== \"object\") {\n throw new Error(\"Invalid ABI YAML: not an object\");\n }\n if (!parsed.abi || typeof parsed.abi !== \"object\") {\n throw new Error(\"Invalid ABI YAML: missing 'abi' section\");\n }\n return parsed as AbiFile;\n } catch (error) {\n throw new ResolutionError(\n \"PARSE_ERROR\",\n `Failed to parse ABI YAML: ${error instanceof Error ? error.message : String(error)}`,\n error\n );\n }\n }\n\n private extractPackageId(abiFile: AbiFile): PackageId {\n const metadata = abiFile.abi;\n if (!metadata.package) {\n throw new ResolutionError(\"PARSE_ERROR\", \"ABI missing 'package' field\");\n }\n return {\n packageName: metadata.package,\n version: metadata[\"package-version\"] ?? \"0.0.0\",\n };\n }\n\n private normalizeImportSource(source: ImportSourceYaml): ImportSource {\n switch (source.type) {\n case \"path\":\n return { type: \"path\", path: source.path };\n\n case \"git\":\n return {\n type: \"git\",\n url: source.url,\n ref: source.ref,\n path: source.path,\n };\n\n case \"http\":\n return { type: \"http\", url: source.url };\n\n case \"onchain\": {\n const revision = this.parseRevisionSpec(source.revision);\n return {\n type: \"onchain\",\n address: source.address,\n target: source.target ?? \"program\",\n network: source.network,\n revision,\n };\n }\n\n default:\n throw new ResolutionError(\n \"UNSUPPORTED_IMPORT_TYPE\",\n `Unknown import type: ${(source as ImportSourceYaml).type}`\n );\n }\n }\n\n private parseRevisionSpec(revision: number | string | undefined): RevisionSpec {\n if (revision === undefined || revision === \"latest\") {\n return { type: \"latest\" };\n }\n if (typeof revision === \"number\") {\n return { type: \"exact\", value: revision };\n }\n if (typeof revision === \"string\") {\n if (revision.startsWith(\">=\")) {\n const value = parseInt(revision.slice(2), 10);\n if (isNaN(value)) {\n throw new Error(`Invalid minimum revision: ${revision}`);\n }\n return { type: \"minimum\", value };\n }\n const value = parseInt(revision, 10);\n if (!isNaN(value)) {\n return { type: \"exact\", value };\n }\n }\n throw new Error(`Invalid revision specification: ${revision}`);\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thru/abi",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -10,19 +10,25 @@
10
10
  "types": "./dist/index.d.ts"
11
11
  }
12
12
  },
13
+ "dependencies": {
14
+ "yaml": "^2.7.0"
15
+ },
13
16
  "devDependencies": {
14
17
  "@types/node": "^24.10.1",
15
18
  "tsup": "^8.5.0",
16
19
  "typescript": "^5.9.3",
17
- "vitest": "^3.2.4"
20
+ "vitest": "^3.2.4",
21
+ "@thru/thru-sdk": "0.2.1"
18
22
  },
19
23
  "scripts": {
20
24
  "build": "tsup && node ./scripts/copy-wasm.mjs",
21
25
  "dev": "tsup --watch",
22
26
  "test": "vitest run",
27
+ "test:run": "vitest run",
23
28
  "test:watch": "vitest watch",
24
29
  "test:coverage": "vitest run --coverage",
25
30
  "clean": "rm -rf dist",
31
+ "resolve-imports": "node ./scripts/resolve-imports.mjs",
26
32
  "wasm:bundler": "cd ../../../abi/abi_reflect_wasm && wasm-pack build --release --target bundler --out-dir pkg/bundler",
27
33
  "wasm:node": "cd ../../../abi/abi_reflect_wasm && wasm-pack build --release --target nodejs --out-dir pkg/node",
28
34
  "wasm:web": "cd ../../../abi/abi_reflect_wasm && wasm-pack build --release --target web --out-dir pkg/web",
@@ -0,0 +1,240 @@
1
+ #!/usr/bin/env node
2
+ import { readFile, writeFile } from "node:fs/promises";
3
+ import { existsSync } from "node:fs";
4
+ import { resolve } from "node:path";
5
+ import process from "node:process";
6
+ import { webcrypto } from "node:crypto";
7
+ import { fileURLToPath } from "node:url";
8
+ import yaml from "yaml";
9
+
10
+ import { createThruClient } from "@thru/thru-sdk/client";
11
+ import {
12
+ createManifest,
13
+ OnchainFetcher,
14
+ resolveImports,
15
+ } from "../dist/index.js";
16
+
17
+ const DEFAULT_BASE_URL = "https://grpc-web.alphanet.thruput.org";
18
+ const PKG_ROOT = resolve(fileURLToPath(new URL(".", import.meta.url)), "..");
19
+ const WORKSPACE_ROOT = resolve(PKG_ROOT, "../../../");
20
+
21
+ function ensureWebCrypto() {
22
+ if (!globalThis.crypto?.subtle) {
23
+ globalThis.crypto = webcrypto;
24
+ }
25
+ if (typeof globalThis.atob !== "function") {
26
+ globalThis.atob = (value) =>
27
+ Buffer.from(value, "base64").toString("binary");
28
+ }
29
+ }
30
+
31
+ function usage(message) {
32
+ if (message) {
33
+ console.error(message);
34
+ }
35
+ console.error(
36
+ [
37
+ "Usage:",
38
+ " node scripts/resolve-imports.mjs --file <abi.yaml> [options]",
39
+ " node scripts/resolve-imports.mjs --import-onchain <address> [options]",
40
+ "",
41
+ "Options:",
42
+ " --base-url <url> gRPC-web endpoint (default: alphanet)",
43
+ " --network <name> network name for synthetic import (default: alphanet)",
44
+ " --target <program|abi-meta|abi> on-chain import target (default: program)",
45
+ " --max-depth <n> max resolution depth (default: 10)",
46
+ " --out <path> write manifest JSON to file",
47
+ ].join("\n")
48
+ );
49
+ }
50
+
51
+ function parseArgs(argv) {
52
+ const opts = {
53
+ baseUrl: DEFAULT_BASE_URL,
54
+ network: "alphanet",
55
+ target: "program",
56
+ maxDepth: 10,
57
+ file: null,
58
+ importOnchain: null,
59
+ out: null,
60
+ };
61
+
62
+ for (let i = 2; i < argv.length; i += 1) {
63
+ const arg = argv[i];
64
+ switch (arg) {
65
+ case "--base-url":
66
+ opts.baseUrl = requireValue(arg, argv[++i]);
67
+ break;
68
+ case "--network":
69
+ opts.network = requireValue(arg, argv[++i]);
70
+ break;
71
+ case "--target":
72
+ opts.target = requireValue(arg, argv[++i]);
73
+ break;
74
+ case "--max-depth":
75
+ opts.maxDepth = Number.parseInt(requireValue(arg, argv[++i]), 10);
76
+ break;
77
+ case "--file":
78
+ opts.file = requireValue(arg, argv[++i]);
79
+ break;
80
+ case "--import-onchain":
81
+ opts.importOnchain = requireValue(arg, argv[++i]);
82
+ break;
83
+ case "--out":
84
+ opts.out = requireValue(arg, argv[++i]);
85
+ break;
86
+ case "--help":
87
+ case "-h":
88
+ usage();
89
+ process.exit(0);
90
+ default:
91
+ usage(`Unknown argument: ${arg}`);
92
+ process.exit(1);
93
+ }
94
+ }
95
+
96
+ if (!opts.file && !opts.importOnchain) {
97
+ usage("Expected --file or --import-onchain");
98
+ process.exit(1);
99
+ }
100
+
101
+ if (opts.file && opts.importOnchain) {
102
+ usage("Use only one of --file or --import-onchain");
103
+ process.exit(1);
104
+ }
105
+
106
+ if (!Number.isFinite(opts.maxDepth) || opts.maxDepth <= 0) {
107
+ usage("--max-depth must be a positive integer");
108
+ process.exit(1);
109
+ }
110
+
111
+ if (opts.target !== "program" && opts.target !== "abi-meta" && opts.target !== "abi") {
112
+ usage("--target must be 'program', 'abi-meta', or 'abi'");
113
+ process.exit(1);
114
+ }
115
+
116
+ return opts;
117
+ }
118
+
119
+ function requireValue(flag, value) {
120
+ if (!value || value.startsWith("-")) {
121
+ usage(`Expected value after ${flag}`);
122
+ process.exit(1);
123
+ }
124
+ return value;
125
+ }
126
+
127
+ function buildSyntheticRootImport(address, network, target) {
128
+ return {
129
+ abi: {
130
+ package: "local.import.test",
131
+ "abi-version": 1,
132
+ "package-version": "0.0.0",
133
+ description: "Synthetic root for ABI import resolver test.",
134
+ imports: [
135
+ {
136
+ type: "onchain",
137
+ address,
138
+ target,
139
+ network,
140
+ revision: "latest",
141
+ },
142
+ ],
143
+ },
144
+ types: [],
145
+ };
146
+ }
147
+
148
+ function normalizeWorkspacePath(input) {
149
+ let path = input;
150
+ while (path.startsWith("../") || path.startsWith("./")) {
151
+ path = path.startsWith("../") ? path.slice(3) : path.slice(2);
152
+ }
153
+ return path;
154
+ }
155
+
156
+ function resolveInputPath(input) {
157
+ if (input.startsWith("/") || input.match(/^[A-Za-z]:\\/)) {
158
+ return input;
159
+ }
160
+ if (existsSync(input)) {
161
+ return input;
162
+ }
163
+ const workspaceRelative = normalizeWorkspacePath(input);
164
+ const workspacePath = resolve(WORKSPACE_ROOT, workspaceRelative);
165
+ if (existsSync(workspacePath)) {
166
+ return workspacePath;
167
+ }
168
+ return input;
169
+ }
170
+
171
+ async function loadAbiYaml(opts) {
172
+ if (opts.file) {
173
+ const resolvedPath = resolveInputPath(opts.file);
174
+ const data = await readFile(resolvedPath, "utf8");
175
+ const parsed = yaml.parse(data);
176
+ const imports = parsed?.abi?.imports ?? [];
177
+ for (const entry of imports) {
178
+ const type = entry?.type;
179
+ if (type === "path" || type === "git" || type === "http") {
180
+ throw new Error(
181
+ "Browser import resolver only supports on-chain imports. " +
182
+ "Use the Rust CLI 'abi bundle' for path/git/http, or pass --import-onchain."
183
+ );
184
+ }
185
+ }
186
+ return { abiYaml: data, sourceLabel: resolvedPath };
187
+ }
188
+
189
+ const root = buildSyntheticRootImport(
190
+ opts.importOnchain,
191
+ opts.network,
192
+ opts.target
193
+ );
194
+ const abiYaml = yaml.stringify(root);
195
+ return { abiYaml, sourceLabel: "synthetic import" };
196
+ }
197
+
198
+ async function main() {
199
+ ensureWebCrypto();
200
+ const opts = parseArgs(process.argv);
201
+ const { abiYaml, sourceLabel } = await loadAbiYaml(opts);
202
+
203
+ const thru = createThruClient({ baseUrl: opts.baseUrl });
204
+ const fetcher = new OnchainFetcher({
205
+ thruClient: {
206
+ query: {
207
+ getRawAccount: async (request) => {
208
+ const raw = await thru.accounts.getRaw(request.address.value);
209
+ return { rawData: raw.rawData };
210
+ },
211
+ },
212
+ },
213
+ });
214
+
215
+ const result = await resolveImports(abiYaml, {
216
+ onchainFetcher: fetcher,
217
+ maxDepth: opts.maxDepth,
218
+ });
219
+ const manifest = createManifest(result);
220
+
221
+ console.log(
222
+ `Resolved ${result.allPackages.length} packages from ${sourceLabel}`
223
+ );
224
+ for (const pkg of result.allPackages) {
225
+ console.log(`- ${pkg.id.packageName}@${pkg.id.version}`);
226
+ }
227
+
228
+ if (opts.out) {
229
+ const outPath = resolve(opts.out);
230
+ await writeFile(outPath, JSON.stringify(manifest, null, 2));
231
+ console.log(`Wrote manifest to ${outPath}`);
232
+ } else {
233
+ console.log(JSON.stringify(manifest, null, 2));
234
+ }
235
+ }
236
+
237
+ main().catch((err) => {
238
+ console.error(err);
239
+ process.exit(1);
240
+ });
@@ -0,0 +1,10 @@
1
+ /**
2
+ * ABI Import Resolver Module
3
+ *
4
+ * This module provides functionality for resolving ABI imports from various sources,
5
+ * with a focus on on-chain imports for browser environments.
6
+ */
7
+
8
+ export * from "./types";
9
+ export * from "./onchainFetcher";
10
+ export * from "./resolveImports";