@lucid-evolution/tx-graph 0.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/parse.ts","../src/core.ts","../src/resolve.ts","../src/render/common.ts","../src/render/options.ts","../src/render/semantic-format.ts","../src/render/semantic.ts","../src/render/dot.ts","../src/render/measure.ts","../src/render/layout.ts","../src/render/edge-renderer.ts","../src/render/node-renderer.ts","../src/render/svg.ts","../src/render/html.ts","../src/render/mermaid.ts","../src/provider-wrapper.ts","../src/graph.ts","../src/labels.ts","../src/render/json.ts"],"sourcesContent":["import type {\n Assets,\n Credential,\n Script,\n Transaction,\n} from \"@lucid-evolution/core-types\";\nimport {\n coreToOutRef,\n coreToTxOutput,\n fromCMLRedeemerTag,\n getAddressDetails,\n} from \"@lucid-evolution/utils\";\nimport { CML } from \"./core.js\";\nimport type {\n TraceAssets,\n TraceCertificate,\n TraceOutRef,\n TraceRedeemer,\n TraceScriptRef,\n TraceStatus,\n TraceTransaction,\n TraceTxOutput,\n TraceUtxo,\n TraceWithdrawal,\n} from \"./model.js\";\n\nexport type TxGraphTransactionInput =\n | Transaction\n | CML.Transaction\n | {\n toCBOR: (options?: { canonical: boolean }) => Transaction;\n }\n | {\n toTransaction: () => CML.Transaction;\n };\n\nexport type ParseTransactionOptions = {\n readonly label?: string;\n readonly status?: TraceStatus;\n};\n\nexport const parseTransaction = (\n input: TxGraphTransactionInput,\n options: ParseTransactionOptions = {},\n): TraceTransaction => {\n const tx = normalizeTransaction(input);\n const body = tx.body();\n const hash = CML.hash_transaction(body).to_hex();\n const outputs = parseOutputs(hash, body.outputs());\n const mint = parseMint(body.mint());\n const splitMint = splitMintAssets(mint);\n const auxiliaryDataHash = body.auxiliary_data_hash()?.to_hex();\n\n return {\n hash,\n label: options.label,\n status: options.status ?? \"built\",\n cbor: tx.to_cbor_hex(),\n sizeBytes: tx.to_cbor_bytes().length,\n fee: body.fee().toString(),\n validityInterval: {\n validFrom: body.validity_interval_start()?.toString(),\n validTo: body.ttl()?.toString(),\n },\n inputs: parseInputList(body.inputs()),\n referenceInputs: parseInputList(body.reference_inputs()),\n collateralInputs: parseInputList(body.collateral_inputs()),\n collateralReturn: parseOptionalOutput(body.collateral_return()),\n totalCollateral: body.total_collateral()?.toString(),\n outputs,\n mint,\n mintedAssets: splitMint.mintedAssets,\n burnedAssets: splitMint.burnedAssets,\n withdrawals: parseWithdrawals(body.withdrawals()),\n certificates: parseCertificates(body.certs()),\n redeemers: parseRedeemers(tx.witness_set().redeemers()),\n requiredSigners: parseRequiredSigners(body.required_signers()),\n auxiliaryDataHash,\n };\n};\n\nexport const parseTransactionCbor = (\n cbor: Transaction,\n options: ParseTransactionOptions = {},\n): TraceTransaction => parseTransaction(cbor, options);\n\nconst normalizeTransaction = (\n input: TxGraphTransactionInput,\n): CML.Transaction => {\n if (typeof input === \"string\") {\n return CML.Transaction.from_cbor_hex(input);\n }\n if (hasToTransaction(input)) {\n return input.toTransaction();\n }\n if (isCmlTransaction(input)) {\n return input;\n }\n if (hasToCBOR(input)) {\n return CML.Transaction.from_cbor_hex(input.toCBOR({ canonical: false }));\n }\n throw new TypeError(\"Unsupported transaction input\");\n};\n\nconst hasToTransaction = (\n input: unknown,\n): input is { toTransaction: () => CML.Transaction } =>\n typeof input === \"object\" &&\n input !== null &&\n \"toTransaction\" in input &&\n typeof input.toTransaction === \"function\";\n\nconst hasToCBOR = (\n input: unknown,\n): input is { toCBOR: (options?: { canonical: boolean }) => Transaction } =>\n typeof input === \"object\" &&\n input !== null &&\n \"toCBOR\" in input &&\n typeof input.toCBOR === \"function\";\n\nconst isCmlTransaction = (input: unknown): input is CML.Transaction =>\n typeof input === \"object\" &&\n input !== null &&\n \"body\" in input &&\n \"witness_set\" in input &&\n typeof input.body === \"function\" &&\n typeof input.witness_set === \"function\";\n\nconst parseInputList = (\n inputs: CML.TransactionInputList | undefined,\n): TraceOutRef[] => {\n if (!inputs) return [];\n const result: TraceOutRef[] = [];\n for (let index = 0; index < inputs.len(); index++) {\n result.push(coreToOutRef(inputs.get(index)));\n }\n return result;\n};\n\nconst parseOutputs = (\n txHash: string,\n outputs: CML.TransactionOutputList,\n): TraceUtxo[] => {\n const result: TraceUtxo[] = [];\n for (let index = 0; index < outputs.len(); index++) {\n result.push({\n txHash,\n outputIndex: index,\n ...parseTxOutput(outputs.get(index)),\n resolution: \"resolved\",\n tags: [],\n });\n }\n return result;\n};\n\nconst parseOptionalOutput = (\n output: CML.TransactionOutput | undefined,\n): TraceTxOutput | undefined => (output ? parseTxOutput(output) : undefined);\n\nconst parseTxOutput = (output: CML.TransactionOutput): TraceTxOutput => {\n const txOutput = coreToTxOutput(output);\n const credentials = credentialsOf(txOutput.address);\n return {\n address: txOutput.address,\n paymentCredential: credentials.paymentCredential,\n stakeCredential: credentials.stakeCredential,\n assets: traceAssets(txOutput.assets),\n datumHash: txOutput.datumHash ?? undefined,\n datum: txOutput.datum ?? undefined,\n scriptRef: txOutput.scriptRef\n ? traceScriptRef(txOutput.scriptRef)\n : undefined,\n };\n};\n\nconst credentialsOf = (\n address: string,\n): {\n paymentCredential?: Credential;\n stakeCredential?: Credential;\n} => {\n try {\n const { paymentCredential, stakeCredential } = getAddressDetails(address);\n return {\n paymentCredential: paymentCredential ?? undefined,\n stakeCredential: stakeCredential ?? undefined,\n };\n } catch {\n return {};\n }\n};\n\nconst traceAssets = (assets: Assets): TraceAssets => {\n const result: TraceAssets = {};\n for (const unit of Object.keys(assets).sort()) {\n result[unit] = assets[unit].toString();\n }\n return result;\n};\n\nconst traceScriptRef = (script: Script): TraceScriptRef => ({\n type: script.type,\n hash: scriptHash(script),\n sizeBytes: script.script.length / 2,\n});\n\nconst scriptHash = (script: Script): string | undefined => {\n try {\n switch (script.type) {\n case \"Native\":\n return CML.NativeScript.from_cbor_hex(script.script).hash().to_hex();\n case \"PlutusV1\":\n return CML.PlutusScript.from_v1(\n CML.PlutusV1Script.from_cbor_hex(script.script),\n )\n .hash()\n .to_hex();\n case \"PlutusV2\":\n return CML.PlutusScript.from_v2(\n CML.PlutusV2Script.from_cbor_hex(script.script),\n )\n .hash()\n .to_hex();\n case \"PlutusV3\":\n return CML.PlutusScript.from_v3(\n CML.PlutusV3Script.from_cbor_hex(script.script),\n )\n .hash()\n .to_hex();\n }\n } catch {\n return undefined;\n }\n};\n\nconst parseMint = (mint: CML.Mint | undefined): TraceAssets => {\n const assets: Assets = {};\n if (!mint) return {};\n const policies = mint.keys();\n for (let policyIndex = 0; policyIndex < policies.len(); policyIndex++) {\n const policy = policies.get(policyIndex);\n const policyId = policy.to_hex();\n const policyAssets = mint.get_assets(policy);\n if (!policyAssets) continue;\n const assetNames = policyAssets.keys();\n for (let assetIndex = 0; assetIndex < assetNames.len(); assetIndex++) {\n const assetName = assetNames.get(assetIndex);\n const quantity = policyAssets.get(assetName);\n if (quantity === undefined || quantity === 0n) continue;\n assets[policyId + assetName.to_js_value()] = quantity;\n }\n }\n return traceAssets(assets);\n};\n\nconst splitMintAssets = (\n mint: TraceAssets,\n): {\n mintedAssets: TraceAssets;\n burnedAssets: TraceAssets;\n} => {\n const mintedAssets: TraceAssets = {};\n const burnedAssets: TraceAssets = {};\n for (const unit of Object.keys(mint).sort()) {\n const quantity = BigInt(mint[unit]);\n if (quantity > 0n) {\n mintedAssets[unit] = quantity.toString();\n } else if (quantity < 0n) {\n burnedAssets[unit] = (-quantity).toString();\n }\n }\n return { mintedAssets, burnedAssets };\n};\n\nconst parseWithdrawals = (\n withdrawals: CML.MapRewardAccountToCoin | undefined,\n): TraceWithdrawal[] => {\n if (!withdrawals) return [];\n const result: TraceWithdrawal[] = [];\n const rewardAccounts = withdrawals.keys();\n for (let index = 0; index < rewardAccounts.len(); index++) {\n const rewardAccount = rewardAccounts.get(index);\n const amount = withdrawals.get(rewardAccount);\n if (amount === undefined) continue;\n result.push({\n rewardAddress: rewardAccount.to_address().to_bech32(undefined),\n amount: amount.toString(),\n });\n }\n return result;\n};\n\nconst parseCertificates = (\n certificates: CML.CertificateList | undefined,\n): TraceCertificate[] => {\n if (!certificates) return [];\n const result: TraceCertificate[] = [];\n for (let index = 0; index < certificates.len(); index++) {\n const certificate = certificates.get(index);\n const kind = certificate.kind();\n result.push({\n index,\n kind,\n kindName: certificateKindName(kind),\n cbor: cborHex(certificate),\n });\n }\n return result;\n};\n\nconst certificateKindName = (kind: number): string => {\n for (const [name, value] of Object.entries(CML.CertificateKind)) {\n if (typeof value === \"number\" && value === kind) return name;\n }\n return `Unknown(${kind})`;\n};\n\nconst parseRequiredSigners = (\n signers: CML.Ed25519KeyHashList | undefined,\n): string[] => {\n if (!signers) return [];\n const result: string[] = [];\n for (let index = 0; index < signers.len(); index++) {\n result.push(signers.get(index).to_hex());\n }\n return result;\n};\n\nconst parseRedeemers = (\n redeemers: CML.Redeemers | undefined,\n): TraceRedeemer[] => {\n if (!redeemers) return [];\n return canonicalRedeemerEntries(redeemers).map(\n (entry, redeemerListIndex) => ({\n tag: fromCMLRedeemerTag(entry.tag),\n index: entry.index.toString(),\n redeemerListIndex,\n data: entry.data.to_cbor_hex(),\n exUnits: {\n mem: entry.exUnits.mem().toString(),\n steps: entry.exUnits.steps().toString(),\n },\n }),\n );\n};\n\ntype CanonicalRedeemerEntry = {\n readonly tag: CML.RedeemerTag;\n readonly index: bigint;\n readonly data: CML.PlutusData;\n readonly exUnits: CML.ExUnits;\n readonly sortKey: Uint8Array;\n};\n\nconst canonicalRedeemerEntries = (\n redeemers: CML.Redeemers,\n): CanonicalRedeemerEntry[] => {\n const entries: CanonicalRedeemerEntry[] = [];\n const legacyRedeemers = redeemers.as_arr_legacy_redeemer();\n if (legacyRedeemers) {\n for (let index = 0; index < legacyRedeemers.len(); index++) {\n const redeemer = legacyRedeemers.get(index);\n const tag = redeemer.tag();\n const redeemerIndex = redeemer.index();\n entries.push({\n tag,\n index: redeemerIndex,\n data: redeemer.data(),\n exUnits: redeemer.ex_units(),\n sortKey: redeemerKeyBytes(tag, redeemerIndex),\n });\n }\n }\n\n const mapRedeemers = redeemers.as_map_redeemer_key_to_redeemer_val();\n if (mapRedeemers) {\n const keys = mapRedeemers.keys();\n for (let index = 0; index < keys.len(); index++) {\n const key = keys.get(index);\n const value = mapRedeemers.get(key);\n if (!value) continue;\n const tag = key.tag();\n const redeemerIndex = key.index();\n entries.push({\n tag,\n index: redeemerIndex,\n data: value.data(),\n exUnits: value.ex_units(),\n sortKey: redeemerKeyBytes(tag, redeemerIndex),\n });\n }\n }\n\n return entries.sort((left, right) =>\n compareBytes(left.sortKey, right.sortKey),\n );\n};\n\nconst redeemerKeyBytes = (tag: CML.RedeemerTag, index: bigint): Uint8Array =>\n CML.RedeemerKey.new(tag, index).to_canonical_cbor_bytes();\n\nconst compareBytes = (left: Uint8Array, right: Uint8Array): number => {\n if (left.length !== right.length) return left.length - right.length;\n for (let index = 0; index < left.length; index++) {\n if (left[index] !== right[index]) return left[index] - right[index];\n }\n return 0;\n};\n\nconst cborHex = (value: { to_cbor_hex?: () => string }): string | undefined => {\n try {\n return value.to_cbor_hex?.();\n } catch {\n return undefined;\n }\n};\n","export * as CML from \"@anastasia-labs/cardano-multiplatform-lib-nodejs\";\n","import type {\n Assets,\n Credential,\n OutRef,\n Provider,\n Script,\n TxOutput,\n UTxO,\n} from \"@lucid-evolution/core-types\";\nimport { getAddressDetails } from \"@lucid-evolution/utils\";\nimport { CML } from \"./core.js\";\nimport type {\n TraceAssets,\n TraceOutRef,\n TraceScriptRef,\n TraceTransaction,\n TraceTxOutput,\n TraceUtxo,\n TraceWarning,\n} from \"./model.js\";\n\nexport type TxGraphResolutionProvider = Pick<Provider, \"getUtxosByOutRef\">;\n\nexport type TxGraphUtxoResolver = (\n outRefs: TraceOutRef[],\n) => Promise<ReadonlyArray<UTxO | TraceUtxo>> | ReadonlyArray<UTxO | TraceUtxo>;\n\nexport type TxGraphResolutionSource =\n | \"scenario-cache\"\n | \"provider\"\n | \"known-utxos\"\n | \"resolver\"\n | \"genesis\"\n | \"unresolved\";\n\nexport type ResolveOutRefsOptions = {\n readonly provider?: TxGraphResolutionProvider;\n readonly resolver?: TxGraphUtxoResolver;\n};\n\nexport type ResolveOutRefsResult = {\n readonly utxos: TraceUtxo[];\n readonly sources: Record<string, TxGraphResolutionSource>;\n readonly warnings: TraceWarning[];\n};\n\nexport type TxGraphResolutionCache = {\n addProducedUtxos: (utxos: ReadonlyArray<TraceUtxo>) => void;\n addTransactionOutputs: (\n transaction: Pick<TraceTransaction, \"outputs\">,\n ) => void;\n addResolvedUtxos: (utxos: ReadonlyArray<UTxO | TraceUtxo>) => void;\n getProducedUtxo: (outRef: TraceOutRef) => TraceUtxo | undefined;\n getKnownUtxo: (outRef: TraceOutRef) => TraceUtxo | undefined;\n resolveOutRefs: (\n outRefs: ReadonlyArray<TraceOutRef>,\n options?: ResolveOutRefsOptions,\n ) => Promise<ResolveOutRefsResult>;\n};\n\nexport const createResolutionCache = (): TxGraphResolutionCache => {\n const producedUtxos = new Map<string, TraceUtxo>();\n const knownUtxos = new Map<string, TraceUtxo>();\n\n const addProducedUtxos = (utxos: ReadonlyArray<TraceUtxo>): void => {\n for (const utxo of utxos) {\n producedUtxos.set(outRefKey(utxo), normalizeTraceUtxo(utxo));\n }\n };\n\n const addResolvedUtxos = (utxos: ReadonlyArray<UTxO | TraceUtxo>): void => {\n for (const utxo of utxos) {\n const traceUtxo = normalizeResolvedUtxo(utxo);\n knownUtxos.set(outRefKey(traceUtxo), traceUtxo);\n }\n };\n\n return {\n addProducedUtxos,\n addTransactionOutputs: (transaction) =>\n addProducedUtxos(producedUtxosFromTransaction(transaction)),\n addResolvedUtxos,\n getProducedUtxo: (outRef) => producedUtxos.get(outRefKey(outRef)),\n getKnownUtxo: (outRef) => knownUtxos.get(outRefKey(outRef)),\n resolveOutRefs: (outRefs, options = {}) =>\n resolveOutRefs(outRefs, {\n ...options,\n producedUtxos,\n knownUtxos,\n }),\n };\n};\n\nexport const outRefKey = (outRef: TraceOutRef): string =>\n `${outRef.txHash}#${outRef.outputIndex}`;\n\nexport const parseOutRefKey = (key: string): TraceOutRef => {\n const separator = key.lastIndexOf(\"#\");\n if (separator < 1) throw new Error(`Invalid out ref key: ${key}`);\n const outputIndex = Number(key.slice(separator + 1));\n if (!Number.isInteger(outputIndex) || outputIndex < 0) {\n throw new Error(`Invalid out ref key: ${key}`);\n }\n return {\n txHash: key.slice(0, separator),\n outputIndex,\n };\n};\n\nexport const producedUtxosFromTransaction = (\n transaction: Pick<TraceTransaction, \"outputs\">,\n): TraceUtxo[] => transaction.outputs.map((utxo) => normalizeTraceUtxo(utxo));\n\nexport const toTraceUtxo = (\n utxo: UTxO,\n options: {\n readonly tags?: ReadonlyArray<string>;\n readonly resolution?: TraceUtxo[\"resolution\"];\n readonly unresolvedReason?: string;\n } = {},\n): TraceUtxo => ({\n txHash: utxo.txHash,\n outputIndex: utxo.outputIndex,\n ...toTraceTxOutput(utxo),\n resolution: options.resolution ?? \"resolved\",\n unresolvedReason: options.unresolvedReason,\n tags: [...(options.tags ?? [])],\n});\n\nexport const toTraceTxOutput = (output: TxOutput): TraceTxOutput => {\n const credentials = credentialsOf(output.address);\n return {\n address: output.address,\n paymentCredential: credentials.paymentCredential,\n stakeCredential: credentials.stakeCredential,\n assets: traceAssets(output.assets),\n datumHash: output.datumHash ?? undefined,\n datum: output.datum ?? undefined,\n scriptRef: output.scriptRef ? traceScriptRef(output.scriptRef) : undefined,\n };\n};\n\nexport const unresolvedUtxo = (\n outRef: TraceOutRef,\n reason: string,\n): TraceUtxo => ({\n txHash: outRef.txHash,\n outputIndex: outRef.outputIndex,\n address: \"unresolved\",\n assets: {},\n resolution: \"unresolved\",\n unresolvedReason: reason,\n tags: [],\n});\n\nexport const genesisUtxo = (outRef: TraceOutRef): TraceUtxo => ({\n txHash: outRef.txHash,\n outputIndex: outRef.outputIndex,\n address: \"genesis\",\n assets: {},\n resolution: \"genesis\",\n tags: [\"genesis\"],\n});\n\ntype ResolveOutRefsInternalOptions = ResolveOutRefsOptions & {\n readonly producedUtxos?: ReadonlyMap<string, TraceUtxo>;\n readonly knownUtxos?: ReadonlyMap<string, TraceUtxo>;\n};\n\nconst resolveOutRefs = async (\n outRefs: ReadonlyArray<TraceOutRef>,\n options: ResolveOutRefsInternalOptions,\n): Promise<ResolveOutRefsResult> => {\n const requested = uniqueOutRefs(outRefs);\n const requestedKeys = new Set(requested.map(outRefKey));\n const resolved = new Map<string, TraceUtxo>();\n const sources: Record<string, TxGraphResolutionSource> = {};\n const missReasons = new Map<string, string>();\n const warnings: TraceWarning[] = [];\n\n const recordResolved = (\n utxo: UTxO | TraceUtxo,\n source: TxGraphResolutionSource,\n ): void => {\n const traceUtxo =\n source === \"genesis\"\n ? normalizeGenesisUtxo(utxo)\n : normalizeResolvedUtxo(utxo);\n const key = outRefKey(traceUtxo);\n if (!requestedKeys.has(key) || resolved.has(key)) return;\n resolved.set(key, traceUtxo);\n sources[key] = source;\n missReasons.delete(key);\n };\n\n for (const outRef of requested) {\n if (!isGenesisOutRef(outRef)) continue;\n const knownGenesisUtxo = options.knownUtxos?.get(outRefKey(outRef));\n recordResolved(knownGenesisUtxo ?? genesisUtxo(outRef), \"genesis\");\n }\n\n for (const outRef of requested) {\n const utxo = options.producedUtxos?.get(outRefKey(outRef));\n if (utxo) recordResolved(utxo, \"scenario-cache\");\n }\n\n let missing = unresolvedOutRefs(requested, resolved);\n if (missing.length > 0) {\n if (options.provider) {\n try {\n const providerUtxos = await options.provider.getUtxosByOutRef(\n missing.map(toProviderOutRef),\n );\n for (const utxo of providerUtxos) {\n recordResolved(utxo, \"provider\");\n }\n for (const outRef of unresolvedOutRefs(missing, resolved)) {\n missReasons.set(outRefKey(outRef), \"provider-miss\");\n }\n } catch (error) {\n const message = errorMessage(error);\n warnings.push({\n code: \"provider-resolution-error\",\n message,\n });\n for (const outRef of missing) {\n missReasons.set(outRefKey(outRef), \"provider-error\");\n }\n }\n } else {\n for (const outRef of missing) {\n missReasons.set(outRefKey(outRef), \"missing-provider\");\n }\n }\n }\n\n missing = unresolvedOutRefs(requested, resolved);\n for (const outRef of missing) {\n const utxo = options.knownUtxos?.get(outRefKey(outRef));\n if (utxo) recordResolved(utxo, \"known-utxos\");\n }\n\n missing = unresolvedOutRefs(requested, resolved);\n if (missing.length > 0 && options.resolver) {\n try {\n const resolverUtxos = await options.resolver([...missing]);\n for (const utxo of resolverUtxos) {\n recordResolved(utxo, \"resolver\");\n }\n for (const outRef of unresolvedOutRefs(missing, resolved)) {\n missReasons.set(outRefKey(outRef), \"resolver-miss\");\n }\n } catch (error) {\n const message = errorMessage(error);\n warnings.push({\n code: \"resolver-resolution-error\",\n message,\n });\n for (const outRef of missing) {\n missReasons.set(outRefKey(outRef), \"resolver-error\");\n }\n }\n }\n\n const utxos = outRefs.map((outRef) => {\n const key = outRefKey(outRef);\n const utxo = resolved.get(key);\n if (utxo) return utxo;\n sources[key] = \"unresolved\";\n return unresolvedUtxo(outRef, missReasons.get(key) ?? \"unresolved\");\n });\n\n return { utxos, sources, warnings };\n};\n\nconst uniqueOutRefs = (outRefs: ReadonlyArray<TraceOutRef>): TraceOutRef[] => {\n const seen = new Set<string>();\n const result: TraceOutRef[] = [];\n for (const outRef of outRefs) {\n const key = outRefKey(outRef);\n if (seen.has(key)) continue;\n seen.add(key);\n result.push(outRef);\n }\n return result;\n};\n\nconst unresolvedOutRefs = (\n outRefs: ReadonlyArray<TraceOutRef>,\n resolved: ReadonlyMap<string, TraceUtxo>,\n): TraceOutRef[] =>\n outRefs.filter((outRef) => !resolved.has(outRefKey(outRef)));\n\nconst toProviderOutRef = (outRef: TraceOutRef): OutRef => ({\n txHash: outRef.txHash,\n outputIndex: outRef.outputIndex,\n});\n\nconst isGenesisOutRef = (outRef: TraceOutRef): boolean =>\n /^0{64}$/.test(outRef.txHash);\n\nconst normalizeResolvedUtxo = (utxo: UTxO | TraceUtxo): TraceUtxo => {\n const traceUtxo = isTraceUtxo(utxo)\n ? normalizeTraceUtxo({ ...utxo, resolution: \"resolved\" })\n : toTraceUtxo(utxo);\n return isGenesisOutRef(traceUtxo)\n ? normalizeGenesisUtxo(traceUtxo)\n : traceUtxo;\n};\n\nconst normalizeGenesisUtxo = (utxo: UTxO | TraceUtxo): TraceUtxo => {\n const traceUtxo = isTraceUtxo(utxo)\n ? normalizeTraceUtxo(utxo)\n : toTraceUtxo(utxo);\n return normalizeTraceUtxo({\n ...traceUtxo,\n resolution: \"genesis\",\n unresolvedReason: undefined,\n tags: [...new Set([\"genesis\", ...traceUtxo.tags])],\n });\n};\n\nconst normalizeTraceUtxo = (utxo: TraceUtxo): TraceUtxo => ({\n ...utxo,\n assets: sortedTraceAssets(utxo.assets),\n tags: [...utxo.tags].sort(),\n});\n\nconst isTraceUtxo = (utxo: UTxO | TraceUtxo): utxo is TraceUtxo =>\n \"resolution\" in utxo && \"tags\" in utxo;\n\nconst credentialsOf = (\n address: string,\n): {\n paymentCredential?: Credential;\n stakeCredential?: Credential;\n} => {\n try {\n const { paymentCredential, stakeCredential } = getAddressDetails(address);\n return {\n paymentCredential: paymentCredential ?? undefined,\n stakeCredential: stakeCredential ?? undefined,\n };\n } catch {\n return {};\n }\n};\n\nconst traceAssets = (assets: Assets): TraceAssets => {\n const result: TraceAssets = {};\n for (const unit of Object.keys(assets).sort()) {\n result[unit] = assets[unit].toString();\n }\n return result;\n};\n\nconst sortedTraceAssets = (assets: TraceAssets): TraceAssets => {\n const result: TraceAssets = {};\n for (const unit of Object.keys(assets).sort()) {\n result[unit] = assets[unit];\n }\n return result;\n};\n\nconst traceScriptRef = (script: Script): TraceScriptRef => ({\n type: script.type,\n hash: scriptHash(script),\n sizeBytes: script.script.length / 2,\n});\n\nconst scriptHash = (script: Script): string | undefined => {\n try {\n switch (script.type) {\n case \"Native\":\n return CML.NativeScript.from_cbor_hex(script.script).hash().to_hex();\n case \"PlutusV1\":\n return CML.PlutusScript.from_v1(\n CML.PlutusV1Script.from_cbor_hex(script.script),\n )\n .hash()\n .to_hex();\n case \"PlutusV2\":\n return CML.PlutusScript.from_v2(\n CML.PlutusV2Script.from_cbor_hex(script.script),\n )\n .hash()\n .to_hex();\n case \"PlutusV3\":\n return CML.PlutusScript.from_v3(\n CML.PlutusV3Script.from_cbor_hex(script.script),\n )\n .hash()\n .to_hex();\n }\n } catch {\n return undefined;\n }\n};\n\nconst errorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error);\n","import type {\n TraceAssets,\n TraceEdge,\n TraceEdgeKind,\n TraceOutRef,\n TraceTransaction,\n TraceUtxo,\n TxGraphTrace,\n} from \"../model.js\";\nimport { outRefKey } from \"../resolve.js\";\n\nexport type RenderNodeKind =\n | \"transaction\"\n | \"utxo\"\n | \"asset\"\n | \"withdrawal\"\n | \"certificate\"\n | \"signer\"\n | \"collateralReturn\"\n | \"external\";\n\nexport type RenderNode = {\n readonly id: string;\n readonly kind: RenderNodeKind;\n readonly label: string;\n readonly unresolved?: boolean;\n readonly genesis?: boolean;\n};\n\nexport type RenderGraph = {\n readonly nodes: RenderNode[];\n readonly edges: TraceEdge[];\n};\n\nexport type RenderLabelOptions = {\n readonly maxAssets?: number;\n readonly maxWarnings?: number;\n};\n\nexport const buildRenderGraph = (trace: TxGraphTrace): RenderGraph => {\n const nodes = new Map<string, RenderNode>();\n for (const transaction of trace.transactions) {\n nodes.set(txNodeId(transaction.hash), {\n id: txNodeId(transaction.hash),\n kind: \"transaction\",\n label: transactionLabel(transaction, trace),\n });\n }\n for (const [key, utxo] of Object.entries(trace.utxos).sort(([a], [b]) =>\n a.localeCompare(b),\n )) {\n nodes.set(utxoNodeId(utxo), {\n id: utxoNodeId(utxo),\n kind: \"utxo\",\n label: utxoLabel(key, utxo, trace),\n unresolved: utxo.resolution === \"unresolved\",\n genesis: utxo.resolution === \"genesis\",\n });\n }\n for (const edge of sortedEdges(trace.edges)) {\n ensureEndpointNode(nodes, edge.from, trace);\n ensureEndpointNode(nodes, edge.to, trace);\n }\n return {\n nodes: [...nodes.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n ),\n edges: sortedEdges(trace.edges),\n };\n};\n\nexport const sortedEdges = (edges: ReadonlyArray<TraceEdge>): TraceEdge[] =>\n [...edges].sort((left, right) =>\n edgeSortKey(left).localeCompare(edgeSortKey(right)),\n );\n\nexport const edgeStyle = (\n kind: TraceEdgeKind,\n): {\n readonly label: string;\n readonly color: string;\n readonly style: \"solid\" | \"dashed\" | \"dotted\";\n} => {\n switch (kind) {\n case \"spends\":\n return { label: \"spends\", color: \"#374151\", style: \"solid\" };\n case \"reads\":\n return { label: \"reads\", color: \"#2563eb\", style: \"dashed\" };\n case \"collateral\":\n return { label: \"collateral\", color: \"#d97706\", style: \"dashed\" };\n case \"collateralReturn\":\n return { label: \"collateral return\", color: \"#f59e0b\", style: \"solid\" };\n case \"produces\":\n return { label: \"produces\", color: \"#15803d\", style: \"solid\" };\n case \"mints\":\n return { label: \"mints\", color: \"#7c3aed\", style: \"solid\" };\n case \"burns\":\n return { label: \"burns\", color: \"#dc2626\", style: \"solid\" };\n case \"withdraws\":\n return { label: \"withdraws\", color: \"#0891b2\", style: \"solid\" };\n case \"certifies\":\n return { label: \"certifies\", color: \"#4f46e5\", style: \"solid\" };\n case \"requiresSigner\":\n return { label: \"requires signer\", color: \"#6b7280\", style: \"dotted\" };\n }\n};\n\nexport const txNodeId = (txHash: string): string => `tx:${txHash}`;\nexport const utxoNodeId = (outRef: TraceOutRef): string =>\n `utxo:${outRefKey(outRef)}`;\n\nexport const shortHash = (value: string, size = 8): string =>\n value.length <= size * 2\n ? value\n : `${value.slice(0, size)}...${value.slice(-size)}`;\n\nexport const assetName = (unit: string, trace: TxGraphTrace): string => {\n const alias = trace.aliases.assets[unit];\n if (alias) return alias;\n if (unit === \"lovelace\") return \"lovelace\";\n return shortHash(unit, 6);\n};\n\nexport const addressName = (address: string, trace: TxGraphTrace): string =>\n trace.aliases.addresses[address] ?? shortHash(address, 10);\n\nexport const formatAssets = (\n assets: TraceAssets,\n trace: TxGraphTrace,\n options: RenderLabelOptions = {},\n): string => {\n const units = Object.keys(assets).sort(assetUnitSort);\n const maxAssets = options.maxAssets ?? 4;\n const visible = units.slice(0, maxAssets);\n const rendered = visible.map(\n (unit) => `${assets[unit]} ${assetName(unit, trace)}`,\n );\n if (units.length > visible.length) {\n rendered.push(`+${units.length - visible.length} more`);\n }\n return rendered.length > 0 ? rendered.join(\"\\\\n\") : \"no assets\";\n};\n\nexport const transactionLabel = (\n transaction: TraceTransaction,\n trace: TxGraphTrace,\n): string => {\n const lines = [\n transaction.label ?? `tx ${shortHash(transaction.hash)}`,\n `status: ${transaction.status}`,\n `fee: ${transaction.fee}`,\n ];\n if (Object.keys(transaction.mintedAssets).length > 0) {\n lines.push(`mint: ${formatAssets(transaction.mintedAssets, trace)}`);\n }\n if (Object.keys(transaction.burnedAssets).length > 0) {\n lines.push(`burn: ${formatAssets(transaction.burnedAssets, trace)}`);\n }\n const warningCount = trace.warnings.filter(\n (warning) => warning.txHash === transaction.hash,\n ).length;\n if (warningCount > 0) lines.push(`warnings: ${warningCount}`);\n return lines.join(\"\\\\n\");\n};\n\nexport const utxoLabel = (\n key: string,\n utxo: TraceUtxo,\n trace: TxGraphTrace,\n): string => {\n if (utxo.resolution === \"genesis\") {\n const lines = [\"genesis UTxO\", key];\n if (Object.keys(utxo.assets).length > 0) {\n lines.push(formatAssets(utxo.assets, trace));\n }\n lines.push(\"external funding source\");\n return lines.join(\"\\\\n\");\n }\n\n const lines = [\n utxo.tags.length > 0 ? `[${utxo.tags.join(\", \")}]` : key,\n formatAssets(utxo.assets, trace),\n addressName(utxo.address, trace),\n ];\n if (utxo.datum) {\n lines.push(\"inline datum\");\n } else if (utxo.datumHash) {\n lines.push(`datum ${shortHash(utxo.datumHash)}`);\n }\n if (utxo.scriptRef) {\n lines.push(\n `script ref ${utxo.scriptRef.type}${\n utxo.scriptRef.hash ? ` ${shortHash(utxo.scriptRef.hash)}` : \"\"\n }`,\n );\n }\n if (utxo.resolution === \"unresolved\") {\n lines.push(`unresolved: ${utxo.unresolvedReason ?? \"unknown\"}`);\n }\n return lines.join(\"\\\\n\");\n};\n\nexport const externalNodeLabel = (\n nodeId: string,\n trace: TxGraphTrace,\n): string => {\n if (nodeId.startsWith(\"asset:\")) {\n return assetName(nodeId.slice(\"asset:\".length), trace);\n }\n if (nodeId.startsWith(\"withdrawal:\")) {\n return `withdrawal\\\\n${addressName(nodeId.slice(\"withdrawal:\".length), trace)}`;\n }\n if (nodeId.startsWith(\"signer:\")) {\n return `signer\\\\n${shortHash(nodeId.slice(\"signer:\".length))}`;\n }\n if (nodeId.startsWith(\"collateral-return:\")) {\n return `collateral return\\\\n${shortHash(\n nodeId.slice(\"collateral-return:\".length),\n )}`;\n }\n if (nodeId.startsWith(\"certificate:\")) {\n const { txHash, index } = parseIndexedNode(\n nodeId.slice(\"certificate:\".length),\n );\n const certificate = trace.transactions\n .find((transaction) => transaction.hash === txHash)\n ?.certificates.find((candidate) => candidate.index === index);\n return certificate\n ? `certificate\\\\n${certificate.kindName}`\n : `certificate\\\\n${shortHash(txHash)}#${index}`;\n }\n return nodeId;\n};\n\nconst ensureEndpointNode = (\n nodes: Map<string, RenderNode>,\n nodeId: string,\n trace: TxGraphTrace,\n): void => {\n if (nodes.has(nodeId)) return;\n nodes.set(nodeId, {\n id: nodeId,\n kind: externalNodeKind(nodeId),\n label: externalNodeLabel(nodeId, trace),\n });\n};\n\nconst externalNodeKind = (nodeId: string): RenderNodeKind => {\n if (nodeId.startsWith(\"asset:\")) return \"asset\";\n if (nodeId.startsWith(\"withdrawal:\")) return \"withdrawal\";\n if (nodeId.startsWith(\"certificate:\")) return \"certificate\";\n if (nodeId.startsWith(\"signer:\")) return \"signer\";\n if (nodeId.startsWith(\"collateral-return:\")) return \"collateralReturn\";\n return \"external\";\n};\n\nconst edgeSortKey = (edge: TraceEdge): string =>\n `${edge.from}\\u0000${edge.kind}\\u0000${edge.to}`;\n\nconst assetUnitSort = (left: string, right: string): number => {\n if (left === \"lovelace\") return -1;\n if (right === \"lovelace\") return 1;\n return left.localeCompare(right);\n};\n\nconst parseIndexedNode = (\n value: string,\n): {\n readonly txHash: string;\n readonly index: number;\n} => {\n const separator = value.lastIndexOf(\"#\");\n return {\n txHash: separator >= 0 ? value.slice(0, separator) : value,\n index: separator >= 0 ? Number(value.slice(separator + 1)) : 0,\n };\n};\n","export type VisualRenderMode = \"overview\" | \"audit\" | \"debug\";\nexport type VisualRenderView = \"flow\" | \"scriptInteraction\";\n\nexport type VisualPrivacyPolicy = {\n readonly hash: \"full\" | \"short\" | \"hidden\";\n readonly address: \"alias\" | \"short\" | \"full\" | \"hidden\";\n readonly datum: \"marker\" | \"hash\" | \"short\" | \"full\" | \"hidden\";\n readonly redeemer: \"label\" | \"constructor\" | \"short\" | \"full\" | \"hidden\";\n readonly cbor: \"hidden\" | \"prefix\" | \"full\";\n};\n\nexport type VisualComplexityBudget = {\n readonly maxVisibleInputs: number;\n readonly maxVisibleOutputs: number;\n readonly maxVisibleAssetsPerUtxo: number;\n readonly maxVisibleSigners: number;\n readonly maxVisibleWarnings: number;\n readonly maxVisibleRedeemerFields: number;\n};\n\nexport type VisualRendererOptions = {\n readonly mode?: VisualRenderMode;\n readonly view?: VisualRenderView;\n readonly privacy?: Partial<VisualPrivacyPolicy>;\n readonly budget?: Partial<VisualComplexityBudget>;\n};\n\nexport type ResolvedVisualRendererOptions = {\n readonly mode: VisualRenderMode;\n readonly view: VisualRenderView;\n readonly privacy: VisualPrivacyPolicy;\n readonly budget: VisualComplexityBudget;\n};\n\nexport type VisualEdgeStyle = {\n readonly color: string;\n readonly style: \"solid\" | \"dashed\" | \"dotted\";\n};\n\nexport const resolveVisualRendererOptions = (\n options: VisualRendererOptions = {},\n): ResolvedVisualRendererOptions => {\n const mode = options.mode ?? \"overview\";\n return {\n mode,\n view: options.view ?? \"flow\",\n privacy: { ...privacyByMode[mode], ...options.privacy },\n budget: { ...budgetByMode[mode], ...options.budget },\n };\n};\n\nexport const visualEdgeStyle = (kind: string): VisualEdgeStyle => {\n switch (kind) {\n case \"spend\":\n return { color: \"#374151\", style: \"solid\" };\n case \"read\":\n return { color: \"#2563eb\", style: \"dashed\" };\n case \"collateral\":\n return { color: \"#d97706\", style: \"dashed\" };\n case \"collateralReturn\":\n return { color: \"#f59e0b\", style: \"solid\" };\n case \"produce\":\n return { color: \"#15803d\", style: \"solid\" };\n case \"mint\":\n return { color: \"#7c3aed\", style: \"solid\" };\n case \"burn\":\n return { color: \"#dc2626\", style: \"solid\" };\n case \"withdraw\":\n return { color: \"#0891b2\", style: \"solid\" };\n case \"certify\":\n return { color: \"#4f46e5\", style: \"solid\" };\n case \"sign\":\n return { color: \"#6b7280\", style: \"dotted\" };\n case \"diagnostic\":\n return { color: \"#dc2626\", style: \"dashed\" };\n case \"summary\":\n return { color: \"#6b7280\", style: \"dashed\" };\n default:\n return { color: \"#6b7280\", style: \"solid\" };\n }\n};\n\nconst privacyByMode: Record<VisualRenderMode, VisualPrivacyPolicy> = {\n overview: {\n hash: \"short\",\n address: \"alias\",\n datum: \"marker\",\n redeemer: \"label\",\n cbor: \"hidden\",\n },\n audit: {\n hash: \"short\",\n address: \"alias\",\n datum: \"hash\",\n redeemer: \"constructor\",\n cbor: \"prefix\",\n },\n debug: {\n hash: \"full\",\n address: \"full\",\n datum: \"full\",\n redeemer: \"full\",\n cbor: \"prefix\",\n },\n};\n\nconst budgetByMode: Record<VisualRenderMode, VisualComplexityBudget> = {\n overview: {\n maxVisibleInputs: 4,\n maxVisibleOutputs: 4,\n maxVisibleAssetsPerUtxo: 4,\n maxVisibleSigners: 3,\n maxVisibleWarnings: 3,\n maxVisibleRedeemerFields: 2,\n },\n audit: {\n maxVisibleInputs: 12,\n maxVisibleOutputs: 12,\n maxVisibleAssetsPerUtxo: 12,\n maxVisibleSigners: 8,\n maxVisibleWarnings: 8,\n maxVisibleRedeemerFields: 6,\n },\n debug: {\n maxVisibleInputs: Number.POSITIVE_INFINITY,\n maxVisibleOutputs: Number.POSITIVE_INFINITY,\n maxVisibleAssetsPerUtxo: Number.POSITIVE_INFINITY,\n maxVisibleSigners: Number.POSITIVE_INFINITY,\n maxVisibleWarnings: Number.POSITIVE_INFINITY,\n maxVisibleRedeemerFields: Number.POSITIVE_INFINITY,\n },\n};\n","import type { TraceRedeemer, TxGraphTrace } from \"../model.js\";\nimport { outRefKey } from \"../resolve.js\";\nimport { shortHash } from \"./common.js\";\nimport type { ResolvedVisualRendererOptions } from \"./options.js\";\nimport type {\n SemanticRenderGraph,\n VisualDiagnostic,\n VisualEdge,\n VisualField,\n VisualNode,\n VisualSection,\n} from \"./semantic.js\";\n\nexport type FormattedSemanticGraph = {\n readonly nodes: VisualNode[];\n readonly edges: VisualEdge[];\n};\n\nexport const formatSemanticGraph = (\n graph: SemanticRenderGraph,\n options: ResolvedVisualRendererOptions,\n): FormattedSemanticGraph => {\n const nodes = new Map(graph.nodes.map((node) => [node.id, node] as const));\n const edges = [...graph.edges];\n applyViewAnnotations(options, nodes);\n addDiagnosticNodes(graph, options, nodes, edges);\n addBudgetSummaries(options, nodes, edges);\n\n const connectedNodeIds = new Set<string>();\n for (const edge of edges) {\n connectedNodeIds.add(edge.from);\n connectedNodeIds.add(edge.to);\n }\n\n return {\n nodes: [...nodes.values()]\n .filter(\n (node) =>\n node.kind === \"transaction\" ||\n node.kind === \"diagnostic\" ||\n connectedNodeIds.has(node.id),\n )\n .sort((left, right) => left.id.localeCompare(right.id)),\n edges: edges.sort((left, right) => left.id.localeCompare(right.id)),\n };\n};\n\nexport const semanticEdgeLabel = (\n trace: TxGraphTrace,\n edge: VisualEdge,\n options: ResolvedVisualRendererOptions,\n): string => {\n if (!edge.redeemerKey || !edge.action) return edge.label;\n const base = `${edge.redeemerKey.tag} #${edge.redeemerKey.index}`;\n if (options.privacy.redeemer === \"hidden\") return base;\n if (options.mode === \"overview\" || options.privacy.redeemer === \"label\") {\n return edge.action.label;\n }\n\n const redeemer = findRedeemer(trace, edge);\n const parts = [base];\n if (edge.action.label !== base) parts.push(edge.action.label);\n parts.push(`redeemer list #${edge.redeemerKey.redeemerListIndex}`);\n if (redeemer)\n parts.push(`ex ${redeemer.exUnits.mem}/${redeemer.exUnits.steps}`);\n if (\n options.mode === \"debug\" ||\n options.privacy.redeemer === \"constructor\" ||\n options.privacy.redeemer === \"full\"\n ) {\n parts.push(\n ...Object.entries(edge.action.fields ?? {})\n .slice(0, options.budget.maxVisibleRedeemerFields)\n .map(([label, value]) => `${label}: ${value}`),\n );\n }\n if (options.mode === \"debug\") {\n parts.push(`${edge.action.source}/${edge.action.confidence}`);\n }\n return parts.join(\" · \");\n};\n\nexport const semanticChipLabels = (\n node: VisualNode,\n options: ResolvedVisualRendererOptions,\n): string[] => {\n if (node.rawRef.type === \"assetPolicy\") {\n return [formatHash(node.rawRef.policyId, options)];\n }\n return node.chips\n .map((chip) => chip.label)\n .filter((label) => node.kind !== \"utxo\" || label !== \"resolved\");\n};\n\nexport const visibleSemanticSections = (\n node: VisualNode,\n options: ResolvedVisualRendererOptions,\n): VisualSection[] => {\n if (options.mode !== \"overview\") return node.sections;\n if (node.kind === \"transaction\") {\n return node.sections.filter((section) =>\n [\"facts\", \"inputs\", \"assets\", \"redeemers\"].includes(section.id),\n );\n }\n return node.sections;\n};\n\nexport const visibleSemanticRows = (\n section: VisualSection,\n _node: VisualNode,\n options: ResolvedVisualRendererOptions,\n): VisualField[] => {\n const maxRows =\n section.id === \"assets\"\n ? options.budget.maxVisibleAssetsPerUtxo\n : section.id === \"redeemers\"\n ? options.budget.maxVisibleRedeemerFields\n : Number.POSITIVE_INFINITY;\n const rows = section.rows.slice(0, maxRows);\n if (section.rows.length <= rows.length) return rows;\n return [\n ...rows,\n {\n id: `${section.id}:more`,\n label: \"More\",\n value: `+${section.rows.length - rows.length} more`,\n tone: \"neutral\",\n },\n ];\n};\n\nexport const semanticFieldValue = (\n row: VisualField,\n options: ResolvedVisualRendererOptions,\n): string => {\n if (row.id.startsWith(\"asset:\") && row.rawValue) {\n const defaultShort = shortHash(row.rawValue, 6);\n if (\n options.privacy.hash === \"hidden\" &&\n (row.value === defaultShort || row.value === row.rawValue)\n ) {\n return \"asset\";\n }\n if (options.privacy.hash === \"full\" && row.value === defaultShort) {\n return row.rawValue;\n }\n }\n if (row.id === \"address\") {\n switch (options.privacy.address) {\n case \"hidden\":\n return \"hidden\";\n case \"full\":\n return row.rawValue ?? row.value;\n case \"short\":\n return row.rawValue ? shortHash(row.rawValue, 10) : row.value;\n case \"alias\":\n return row.value;\n }\n }\n if (row.id.startsWith(\"datum\")) {\n switch (options.privacy.datum) {\n case \"hidden\":\n return \"hidden\";\n case \"marker\":\n return \"present\";\n case \"full\":\n return row.rawValue ?? row.value;\n default:\n return row.value;\n }\n }\n if (row.id === \"keyHash\" && row.rawValue) {\n return formatHash(row.rawValue, options);\n }\n if (row.id === \"scriptRef\" && row.rawValue) {\n if (options.privacy.hash === \"hidden\") {\n return row.rawValue.split(\" \")[0] ?? \"script ref\";\n }\n return options.privacy.hash === \"full\" ? row.rawValue : row.value;\n }\n return row.value;\n};\n\nexport const semanticFieldLabel = (\n row: VisualField,\n options: ResolvedVisualRendererOptions,\n): string => {\n if (row.id.startsWith(\"asset:\") && row.rawLabel) {\n const defaultShort = shortHash(row.rawLabel, 6);\n if (\n options.privacy.hash === \"hidden\" &&\n (row.label === defaultShort || row.label === row.rawLabel)\n ) {\n return \"asset\";\n }\n if (options.privacy.hash === \"full\" && row.label === defaultShort) {\n return row.rawLabel;\n }\n }\n return row.label;\n};\n\nexport const semanticNodeTitle = (\n node: VisualNode,\n options: ResolvedVisualRendererOptions,\n): string => {\n if (\n node.rawRef.type === \"transaction\" &&\n node.title === `tx ${shortHash(node.rawRef.txHash)}`\n ) {\n return `tx ${formatHash(node.rawRef.txHash, options)}`;\n }\n if (\n node.rawRef.type === \"utxo\" &&\n node.title === outRefKey(node.rawRef.outRef)\n ) {\n return `UTxO ${formatOutRef(node.rawRef.outRef, options)}`;\n }\n if (node.rawRef.type === \"assetPolicy\" && node.title.startsWith(\"policy \")) {\n return `policy ${formatHash(node.rawRef.policyId, options)}`;\n }\n return node.title;\n};\n\nexport const semanticNodeSubtitle = (\n node: VisualNode,\n options: ResolvedVisualRendererOptions,\n): string | undefined => {\n if (options.privacy.hash === \"hidden\") return undefined;\n switch (node.rawRef.type) {\n case \"transaction\":\n return formatHash(node.rawRef.txHash, options);\n case \"utxo\":\n return formatOutRef(node.rawRef.outRef, options);\n case \"assetPolicy\":\n return formatHash(node.rawRef.policyId, options);\n case \"signer\":\n return formatHash(node.rawRef.keyHash, options);\n case \"withdrawal\":\n return formatAddress(node.rawRef.rewardAddress, node.subtitle, options);\n case \"certificate\":\n return `${formatHash(node.rawRef.txHash, options)}#${node.rawRef.index}`;\n case \"collateralReturn\":\n return formatHash(node.rawRef.txHash, options);\n default:\n return node.subtitle;\n }\n};\n\nexport const isGenesisNode = (node: VisualNode): boolean =>\n node.kind === \"utxo\" && node.chips.some((chip) => chip.label === \"genesis\");\n\nexport const isScriptNode = (node: VisualNode): boolean =>\n node.kind === \"utxo\" &&\n (node.sections.some((section) =>\n section.rows.some((row) =>\n [\"datum\", \"datumHash\", \"scriptRef\"].includes(row.id),\n ),\n ) ||\n node.chips.some((chip) => /script|datum|state/i.test(chip.label)));\n\nexport const isScriptInteractionEdge = (\n edge: VisualEdge,\n nodes: ReadonlyMap<string, VisualNode>,\n): boolean =>\n ([\"spend\", \"read\", \"produce\", \"mint\", \"burn\"].includes(edge.kind) &&\n [edge.from, edge.to].some((id) => {\n const node = nodes.get(id);\n return node ? isScriptNode(node) : false;\n })) ||\n edge.kind === \"collateral\";\n\nconst addDiagnosticNodes = (\n graph: SemanticRenderGraph,\n options: ResolvedVisualRendererOptions,\n nodes: Map<string, VisualNode>,\n edges: VisualEdge[],\n): void => {\n const byTx = new Map<string, VisualDiagnostic[]>();\n for (const diagnostic of graph.diagnostics) {\n const key = diagnostic.txHash ?? \"global\";\n byTx.set(key, [...(byTx.get(key) ?? []), diagnostic]);\n }\n\n for (const [txHash, diagnostics] of byTx) {\n const visible = diagnostics.slice(0, options.budget.maxVisibleWarnings);\n for (const diagnostic of visible) {\n addDiagnosticNode(options, diagnostic, nodes, edges);\n }\n if (diagnostics.length > visible.length) {\n const hiddenCount = diagnostics.length - visible.length;\n const node = summaryNode(\n `summary:${txHash}:diagnostics`,\n `+${hiddenCount} diagnostics`,\n \"warnings\",\n hiddenCount,\n );\n nodes.set(node.id, node);\n if (txHash !== \"global\") {\n edges.push(summaryEdge(node.id, `tx:${txHash}`, txHash, \"warnings\"));\n }\n }\n }\n};\n\nconst applyViewAnnotations = (\n options: ResolvedVisualRendererOptions,\n nodes: Map<string, VisualNode>,\n): void => {\n if (options.view !== \"scriptInteraction\") return;\n for (const [id, node] of nodes) {\n if (node.kind !== \"utxo\" || !isScriptNode(node)) continue;\n nodes.set(id, {\n ...node,\n chips: [\n { label: \"script interaction\", tone: \"accent\" },\n ...node.chips.filter((chip) => chip.label !== \"script interaction\"),\n ],\n });\n }\n};\n\nconst addDiagnosticNode = (\n options: ResolvedVisualRendererOptions,\n diagnostic: VisualDiagnostic,\n nodes: Map<string, VisualNode>,\n edges: VisualEdge[],\n): void => {\n const node: VisualNode = {\n id: `diagnostic:${diagnostic.id}`,\n kind: \"diagnostic\",\n title: diagnostic.code,\n sections: [\n {\n id: \"diagnostic\",\n title: \"Diagnostic\",\n rows: [\n {\n id: \"message\",\n label: \"Message\",\n value: diagnosticMessage(diagnostic, options),\n },\n ],\n },\n ],\n ports: [],\n chips: [{ label: diagnostic.severity, tone: \"danger\" }],\n severity: diagnostic.severity === \"error\" ? \"error\" : \"warning\",\n rawRef: { type: \"diagnostic\", code: diagnostic.code },\n };\n nodes.set(node.id, node);\n if (diagnostic.txHash) {\n edges.push({\n id: `diagnostic-edge:${diagnostic.id}`,\n kind: \"diagnostic\",\n from: node.id,\n to: `tx:${diagnostic.txHash}`,\n label: diagnostic.severity,\n targetRef: {\n type: \"diagnostic\",\n txHash: diagnostic.txHash,\n code: diagnostic.code,\n },\n rawRef: { type: \"diagnostic\", code: diagnostic.code },\n });\n }\n};\n\nconst addBudgetSummaries = (\n options: ResolvedVisualRendererOptions,\n nodes: Map<string, VisualNode>,\n edges: VisualEdge[],\n): void => {\n const hidden = new Set<string>();\n for (const txHash of transactionHashes(nodes)) {\n hideExcessEdges(\n edges,\n txHash,\n \"inputs\",\n options.budget.maxVisibleInputs,\n (edge) =>\n edge.targetRef.txHash === txHash &&\n [\"spend\", \"read\", \"collateral\"].includes(edge.kind),\n hidden,\n nodes,\n );\n hideExcessEdges(\n edges,\n txHash,\n \"outputs\",\n options.budget.maxVisibleOutputs,\n (edge) => edge.targetRef.txHash === txHash && edge.kind === \"produce\",\n hidden,\n nodes,\n );\n hideExcessEdges(\n edges,\n txHash,\n \"signers\",\n options.budget.maxVisibleSigners,\n (edge) => edge.targetRef.txHash === txHash && edge.kind === \"sign\",\n hidden,\n nodes,\n );\n }\n for (let index = edges.length - 1; index >= 0; index--) {\n if (hidden.has(edges[index]!.id)) edges.splice(index, 1);\n }\n};\n\nconst hideExcessEdges = (\n edges: VisualEdge[],\n txHash: string,\n group: \"inputs\" | \"outputs\" | \"signers\",\n maxVisible: number,\n matches: (edge: VisualEdge) => boolean,\n hidden: Set<string>,\n nodes: Map<string, VisualNode>,\n): void => {\n const visibleLimit = Number.isFinite(maxVisible) ? maxVisible : edges.length;\n const candidates = edges\n .filter(matches)\n .sort((left, right) => left.id.localeCompare(right.id));\n const extra = candidates.slice(visibleLimit);\n for (const edge of extra) hidden.add(edge.id);\n if (extra.length === 0) return;\n\n const node = summaryNode(\n `summary:${txHash}:${group}`,\n `+${extra.length} ${group}`,\n group,\n extra.length,\n );\n nodes.set(node.id, node);\n edges.push(\n group === \"outputs\"\n ? summaryEdge(`tx:${txHash}`, node.id, txHash, group)\n : summaryEdge(node.id, `tx:${txHash}`, txHash, group),\n );\n};\n\nconst summaryNode = (\n id: string,\n title: string,\n group: string,\n count: number,\n): VisualNode => ({\n id,\n kind: \"diagnostic\",\n title,\n sections: [\n {\n id: \"summary\",\n title: \"Collapsed\",\n rows: [{ id: \"count\", label: \"Count\", value: String(count) }],\n },\n ],\n ports: [],\n chips: [{ label: \"collapsed\", tone: \"neutral\" }],\n rawRef: { type: \"diagnostic\", code: \"collapsed\", count, group },\n});\n\nconst summaryEdge = (\n from: string,\n to: string,\n txHash: string,\n group: string,\n): VisualEdge => ({\n id: `summary-edge:${txHash}:${group}:${from}->${to}`,\n kind: \"summary\",\n from,\n to,\n label: group,\n targetRef: {\n type: \"diagnostic\",\n txHash,\n code: \"collapsed\",\n group,\n },\n rawRef: { type: \"diagnostic\", code: \"collapsed\", group },\n});\n\nconst transactionHashes = (nodes: ReadonlyMap<string, VisualNode>): string[] =>\n [...nodes.values()]\n .filter(\n (\n node,\n ): node is VisualNode & {\n rawRef: { type: \"transaction\"; txHash: string };\n } => node.rawRef.type === \"transaction\",\n )\n .map((node) => node.rawRef.txHash)\n .sort();\n\nconst formatOutRef = (\n outRef: { readonly txHash: string; readonly outputIndex: number },\n options: ResolvedVisualRendererOptions,\n): string => {\n if (options.privacy.hash === \"hidden\") return `#${outRef.outputIndex}`;\n return `${formatHash(outRef.txHash, options)}#${outRef.outputIndex}`;\n};\n\nconst formatHash = (\n hash: string,\n options: ResolvedVisualRendererOptions,\n): string =>\n options.privacy.hash === \"full\"\n ? hash\n : options.privacy.hash === \"hidden\"\n ? \"hidden\"\n : shortHash(hash);\n\nconst formatAddress = (\n rawAddress: string,\n aliasOrShort: string | undefined,\n options: ResolvedVisualRendererOptions,\n): string | undefined => {\n switch (options.privacy.address) {\n case \"hidden\":\n return undefined;\n case \"full\":\n return rawAddress;\n case \"short\":\n return shortHash(rawAddress, 10);\n case \"alias\":\n return aliasOrShort ?? shortHash(rawAddress, 10);\n }\n};\n\nconst diagnosticMessage = (\n diagnostic: VisualDiagnostic,\n options: ResolvedVisualRendererOptions,\n): string => {\n let message = diagnostic.message;\n if (diagnostic.outRef) {\n message = message.replace(\n outRefKey(diagnostic.outRef),\n formatOutRef(diagnostic.outRef, options),\n );\n }\n if (diagnostic.txHash) {\n message = message.replaceAll(\n diagnostic.txHash,\n formatHash(diagnostic.txHash, options),\n );\n }\n return message;\n};\n\nconst findRedeemer = (\n trace: TxGraphTrace,\n edge: VisualEdge,\n): TraceRedeemer | undefined => {\n const key = edge.redeemerKey;\n if (!key) return undefined;\n return trace.transactions\n .find((transaction) => transaction.hash === edge.targetRef.txHash)\n ?.redeemers.find(\n (redeemer) =>\n redeemer.tag === key.tag &&\n redeemer.index === key.index &&\n redeemer.redeemerListIndex === key.redeemerListIndex,\n );\n};\n","import type {\n TraceAliases,\n TraceOutRef,\n TraceRedeemer,\n TraceTransaction,\n TraceUtxo,\n TraceWarning,\n TxGraphTrace,\n} from \"../model.js\";\nimport { CML } from \"../core.js\";\nimport { outRefKey } from \"../resolve.js\";\nimport { addressName, assetName, shortHash } from \"./common.js\";\n\nexport type VisualTone =\n | \"neutral\"\n | \"info\"\n | \"success\"\n | \"warning\"\n | \"danger\"\n | \"accent\";\n\nexport type VisualNodeKind =\n | \"transaction\"\n | \"utxo\"\n | \"asset\"\n | \"signer\"\n | \"withdrawal\"\n | \"certificate\"\n | \"collateralReturn\"\n | \"diagnostic\";\n\nexport type VisualEdgeKind =\n | \"spend\"\n | \"read\"\n | \"collateral\"\n | \"produce\"\n | \"collateralReturn\"\n | \"mint\"\n | \"burn\"\n | \"withdraw\"\n | \"certify\"\n | \"sign\"\n | \"diagnostic\"\n | \"summary\";\n\nexport type VisualPortSide = \"left\" | \"right\" | \"top\" | \"bottom\";\n\nexport type VisualField = {\n readonly id: string;\n readonly label: string;\n readonly rawLabel?: string;\n readonly value: string;\n readonly rawValue?: string;\n readonly tone?: VisualTone;\n readonly mono?: boolean;\n};\n\nexport type VisualSection = {\n readonly id: string;\n readonly title: string;\n readonly rows: VisualField[];\n readonly collapsed?: boolean;\n};\n\nexport type VisualChip = {\n readonly label: string;\n readonly tone?: VisualTone;\n};\n\nexport type VisualPort = {\n readonly id: string;\n readonly nodeId: string;\n readonly side: VisualPortSide;\n readonly label: string;\n readonly edgeKind?: VisualEdgeKind;\n};\n\nexport type VisualRawRef =\n | { readonly type: \"transaction\"; readonly txHash: string }\n | { readonly type: \"utxo\"; readonly outRef: TraceOutRef }\n | { readonly type: \"assetPolicy\"; readonly policyId: string }\n | { readonly type: \"signer\"; readonly keyHash: string }\n | { readonly type: \"withdrawal\"; readonly rewardAddress: string }\n | {\n readonly type: \"certificate\";\n readonly txHash: string;\n readonly index: number;\n }\n | { readonly type: \"collateralReturn\"; readonly txHash: string }\n | {\n readonly type: \"diagnostic\";\n readonly code: string;\n readonly count?: number;\n readonly group?: string;\n };\n\nexport type VisualNode = {\n readonly id: string;\n readonly kind: VisualNodeKind;\n readonly title: string;\n readonly subtitle?: string;\n readonly sections: VisualSection[];\n readonly ports: VisualPort[];\n readonly chips: VisualChip[];\n readonly severity?: \"info\" | \"warning\" | \"error\";\n readonly rawRef: VisualRawRef;\n};\n\nexport type RedeemerKey = {\n readonly tag: TraceRedeemer[\"tag\"];\n readonly index: string;\n readonly redeemerListIndex: number;\n};\n\nexport type VisualAction = {\n readonly label: string;\n readonly intent?: string;\n readonly fields?: Record<string, string>;\n readonly source: \"user\" | \"schema\" | \"constructor\" | \"generic\";\n readonly confidence: \"high\" | \"medium\" | \"fallback\";\n};\n\nexport type VisualEdgeTargetRef =\n | {\n readonly type: \"input\";\n readonly inputKind: \"spend\" | \"read\" | \"collateral\";\n readonly txHash: string;\n readonly index: number;\n readonly outRef: TraceOutRef;\n }\n | {\n readonly type: \"output\";\n readonly txHash: string;\n readonly index: number;\n readonly outRef: TraceOutRef;\n }\n | {\n readonly type: \"assetPolicy\";\n readonly txHash: string;\n readonly policyId: string;\n readonly policyIndex: number;\n readonly assets: Record<string, string>;\n }\n | {\n readonly type: \"withdrawal\";\n readonly txHash: string;\n readonly index: number;\n readonly rewardAddress: string;\n }\n | {\n readonly type: \"certificate\";\n readonly txHash: string;\n readonly index: number;\n }\n | {\n readonly type: \"signer\";\n readonly txHash: string;\n readonly keyHash: string;\n }\n | {\n readonly type: \"collateralReturn\";\n readonly txHash: string;\n }\n | {\n readonly type: \"diagnostic\";\n readonly txHash?: string;\n readonly code: string;\n readonly count?: number;\n readonly group?: string;\n };\n\nexport type VisualEdge = {\n readonly id: string;\n readonly kind: VisualEdgeKind;\n readonly from: string;\n readonly to: string;\n readonly fromPort?: string;\n readonly toPort?: string;\n readonly label: string;\n readonly action?: VisualAction;\n readonly redeemerKey?: RedeemerKey;\n readonly targetRef: VisualEdgeTargetRef;\n readonly severity?: \"info\" | \"warning\" | \"error\";\n readonly rawRef: VisualRawRef;\n};\n\nexport type VisualDiagnostic = {\n readonly id: string;\n readonly severity: \"warning\" | \"error\";\n readonly code: string;\n readonly message: string;\n readonly txHash?: string;\n readonly outRef?: TraceOutRef;\n readonly redeemerKey?: RedeemerKey;\n};\n\nexport type VisualLegendItem = {\n readonly kind: string;\n readonly label: string;\n};\n\nexport type VisualLegend = {\n readonly nodes: VisualLegendItem[];\n readonly edges: VisualLegendItem[];\n};\n\nexport type SemanticRenderGraph = {\n readonly version: 1;\n readonly nodes: VisualNode[];\n readonly edges: VisualEdge[];\n readonly diagnostics: VisualDiagnostic[];\n readonly legend: VisualLegend;\n readonly aliases: TraceAliases;\n};\n\nexport type RedeemerDescriberContext = {\n readonly trace: TxGraphTrace;\n readonly transaction: TraceTransaction;\n readonly redeemer: TraceRedeemer;\n readonly target: VisualEdgeTargetRef;\n readonly edge: Omit<VisualEdge, \"action\">;\n};\n\nexport type RedeemerDescriber = (\n context: RedeemerDescriberContext,\n) => VisualAction | undefined;\n\nexport type RedeemerSelector = {\n readonly tag: TraceRedeemer[\"tag\"];\n readonly index: number | string;\n readonly txHash?: string;\n readonly target?: (target: VisualEdgeTargetRef) => boolean;\n};\n\nexport type ConstructorRedeemerSelector = RedeemerSelector & {\n readonly constructor: number;\n};\n\nexport type SemanticRenderOptions = {\n readonly redeemers?: ReadonlyArray<RedeemerDescriber>;\n};\n\nexport const buildSemanticRenderGraph = (\n trace: TxGraphTrace,\n options: SemanticRenderOptions = {},\n): SemanticRenderGraph => {\n const nodes = new Map<string, VisualNode>();\n const edges: VisualEdge[] = [];\n const mappedRedeemers = new Set<string>();\n\n for (const [key, utxo] of Object.entries(trace.utxos).sort(\n ([left], [right]) => left.localeCompare(right),\n )) {\n nodes.set(utxoNodeId(utxo), utxoNode(key, utxo, trace));\n }\n\n for (const transaction of trace.transactions) {\n nodes.set(\n transactionNodeId(transaction.hash),\n transactionNode(transaction, trace),\n );\n addTransactionEdges(trace, transaction, nodes, edges, mappedRedeemers);\n }\n\n const diagnostics = [\n ...trace.warnings.map(visualDiagnostic),\n ...unmappedRedeemerDiagnostics(trace, mappedRedeemers),\n ];\n\n return {\n version: 1,\n nodes: [...nodes.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n ),\n edges: edges\n .map((edge) => applyAction(trace, edge, options.redeemers ?? []))\n .sort((left, right) => left.id.localeCompare(right.id)),\n diagnostics,\n legend: defaultLegend,\n aliases: trace.aliases,\n };\n};\n\nexport const labelRedeemer =\n (\n selector: RedeemerSelector,\n label: string,\n intent?: string,\n ): RedeemerDescriber =>\n (context) => {\n if (!matchesRedeemer(selector, context)) return undefined;\n return {\n label,\n ...(intent ? { intent } : {}),\n source: \"user\",\n confidence: \"high\",\n };\n };\n\nexport const describeRedeemerByConstructor =\n (\n selector: ConstructorRedeemerSelector,\n label: string,\n intent?: string,\n ): RedeemerDescriber =>\n (context) => {\n const { redeemer } = context;\n if (!matchesRedeemer(selector, context)) return undefined;\n if (constructorOf(redeemer.data) !== selector.constructor) return undefined;\n return {\n label,\n ...(intent ? { intent } : {}),\n fields: { constructor: String(selector.constructor) },\n source: \"constructor\",\n confidence: \"medium\",\n };\n };\n\nexport const describeRedeemerWith =\n (describe: RedeemerDescriber): RedeemerDescriber =>\n (context) =>\n describe(context);\n\nconst addTransactionEdges = (\n trace: TxGraphTrace,\n transaction: TraceTransaction,\n nodes: Map<string, VisualNode>,\n edges: VisualEdge[],\n mappedRedeemers: Set<string>,\n): void => {\n addInputEdges(\n trace,\n transaction,\n nodes,\n edges,\n mappedRedeemers,\n \"spend\",\n transaction.inputs,\n );\n addInputEdges(\n trace,\n transaction,\n nodes,\n edges,\n mappedRedeemers,\n \"read\",\n transaction.referenceInputs,\n );\n addInputEdges(\n trace,\n transaction,\n nodes,\n edges,\n mappedRedeemers,\n \"collateral\",\n transaction.collateralInputs,\n );\n addOutputEdges(transaction, edges);\n addAssetPolicyEdges(\n trace,\n transaction,\n nodes,\n edges,\n mappedRedeemers,\n \"mint\",\n );\n addAssetPolicyEdges(\n trace,\n transaction,\n nodes,\n edges,\n mappedRedeemers,\n \"burn\",\n );\n addWithdrawalEdges(trace, transaction, nodes, edges, mappedRedeemers);\n addCertificateEdges(transaction, nodes, edges, mappedRedeemers);\n addSignerEdges(transaction, nodes, edges);\n addCollateralReturnEdge(transaction, nodes, edges);\n};\n\nconst addInputEdges = (\n trace: TxGraphTrace,\n transaction: TraceTransaction,\n nodes: Map<string, VisualNode>,\n edges: VisualEdge[],\n mappedRedeemers: Set<string>,\n kind: \"spend\" | \"read\" | \"collateral\",\n inputs: ReadonlyArray<TraceOutRef>,\n): void => {\n inputs.forEach((outRef, index) => {\n const inputKey = outRefKey(outRef);\n const from = utxoNodeId(outRef);\n const to = transactionNodeId(transaction.hash);\n const redeemerKey =\n kind === \"spend\"\n ? redeemerKeyFor(transaction, \"spend\", index, mappedRedeemers)\n : undefined;\n ensureUtxoPlaceholder(trace, nodes, outRef);\n edges.push({\n id: `${to}:${kind}:${index}:${inputKey}`,\n kind,\n from,\n to,\n fromPort: utxoPortId(inputKey, \"out\"),\n toPort: transactionPortId(transaction.hash, kind, index),\n label: `${kind} #${index}`,\n ...(redeemerKey ? { redeemerKey } : {}),\n targetRef: {\n type: \"input\",\n inputKind: kind,\n txHash: transaction.hash,\n index,\n outRef,\n },\n rawRef: { type: \"utxo\", outRef },\n });\n });\n};\n\nconst addOutputEdges = (\n transaction: TraceTransaction,\n edges: VisualEdge[],\n): void => {\n transaction.outputs.forEach((output, index) => {\n const outputKey = outRefKey(output);\n edges.push({\n id: `${transactionNodeId(transaction.hash)}:produce:${index}`,\n kind: \"produce\",\n from: transactionNodeId(transaction.hash),\n to: utxoNodeId(output),\n fromPort: transactionPortId(transaction.hash, \"produce\", index),\n toPort: utxoPortId(outputKey, \"in\"),\n label: `output #${index}`,\n targetRef: {\n type: \"output\",\n txHash: transaction.hash,\n index,\n outRef: {\n txHash: output.txHash,\n outputIndex: output.outputIndex,\n },\n },\n rawRef: {\n type: \"utxo\",\n outRef: {\n txHash: output.txHash,\n outputIndex: output.outputIndex,\n },\n },\n });\n });\n};\n\nconst addAssetPolicyEdges = (\n trace: TxGraphTrace,\n transaction: TraceTransaction,\n nodes: Map<string, VisualNode>,\n edges: VisualEdge[],\n mappedRedeemers: Set<string>,\n kind: \"mint\" | \"burn\",\n): void => {\n const assets =\n kind === \"mint\" ? transaction.mintedAssets : transaction.burnedAssets;\n const byPolicy = assetsByPolicy(assets);\n const policyIds = sortedPolicyIds(transaction.mint);\n for (const [policyId, policyAssets] of Object.entries(byPolicy).sort(\n ([a], [b]) => a.localeCompare(b),\n )) {\n const policyIndex = policyIds.indexOf(policyId);\n const index = policyIndex >= 0 ? policyIndex : 0;\n const redeemerKey = redeemerKeyFor(\n transaction,\n \"mint\",\n index,\n mappedRedeemers,\n );\n const assetNode = assetPolicyNode(policyId, policyAssets, trace);\n nodes.set(\n assetNode.id,\n mergeAssetPolicyNode(nodes.get(assetNode.id), assetNode),\n );\n const edge: VisualEdge = {\n id: `${transactionNodeId(transaction.hash)}:${kind}:${index}:${policyId}`,\n kind,\n from:\n kind === \"mint\"\n ? transactionNodeId(transaction.hash)\n : assetPolicyNodeId(policyId),\n to:\n kind === \"mint\"\n ? assetPolicyNodeId(policyId)\n : transactionNodeId(transaction.hash),\n fromPort:\n kind === \"mint\"\n ? transactionPortId(transaction.hash, \"mint\", index)\n : assetPolicyPortId(policyId),\n toPort:\n kind === \"mint\"\n ? assetPolicyPortId(policyId)\n : transactionPortId(transaction.hash, \"burn\", index),\n label: `${kind} #${index}`,\n ...(redeemerKey ? { redeemerKey } : {}),\n targetRef: {\n type: \"assetPolicy\",\n txHash: transaction.hash,\n policyId,\n policyIndex: index,\n assets: policyAssets,\n },\n rawRef: { type: \"assetPolicy\", policyId },\n };\n edges.push(edge);\n }\n};\n\nconst addWithdrawalEdges = (\n trace: TxGraphTrace,\n transaction: TraceTransaction,\n nodes: Map<string, VisualNode>,\n edges: VisualEdge[],\n mappedRedeemers: Set<string>,\n): void => {\n transaction.withdrawals.forEach((withdrawal, index) => {\n const node = withdrawalNode(withdrawal.rewardAddress, trace);\n const redeemerKey = redeemerKeyFor(\n transaction,\n \"withdraw\",\n index,\n mappedRedeemers,\n );\n nodes.set(node.id, node);\n edges.push({\n id: `${transactionNodeId(transaction.hash)}:withdraw:${index}:${withdrawal.rewardAddress}`,\n kind: \"withdraw\",\n from: node.id,\n to: transactionNodeId(transaction.hash),\n fromPort: withdrawalPortId(withdrawal.rewardAddress),\n toPort: transactionPortId(transaction.hash, \"withdraw\", index),\n label: `withdraw #${index}`,\n ...(redeemerKey ? { redeemerKey } : {}),\n targetRef: {\n type: \"withdrawal\",\n txHash: transaction.hash,\n index,\n rewardAddress: withdrawal.rewardAddress,\n },\n rawRef: { type: \"withdrawal\", rewardAddress: withdrawal.rewardAddress },\n });\n });\n};\n\nconst addCertificateEdges = (\n transaction: TraceTransaction,\n nodes: Map<string, VisualNode>,\n edges: VisualEdge[],\n mappedRedeemers: Set<string>,\n): void => {\n transaction.certificates.forEach((certificate) => {\n const node = certificateNode(\n transaction.hash,\n certificate.index,\n certificate.kindName,\n );\n const redeemerKey = redeemerKeyFor(\n transaction,\n \"publish\",\n certificate.index,\n mappedRedeemers,\n );\n nodes.set(node.id, node);\n edges.push({\n id: `${transactionNodeId(transaction.hash)}:cert:${certificate.index}`,\n kind: \"certify\",\n from: transactionNodeId(transaction.hash),\n to: node.id,\n fromPort: transactionPortId(\n transaction.hash,\n \"certify\",\n certificate.index,\n ),\n toPort: certificatePortId(transaction.hash, certificate.index),\n label: `cert #${certificate.index}`,\n ...(redeemerKey ? { redeemerKey } : {}),\n targetRef: {\n type: \"certificate\",\n txHash: transaction.hash,\n index: certificate.index,\n },\n rawRef: {\n type: \"certificate\",\n txHash: transaction.hash,\n index: certificate.index,\n },\n });\n });\n};\n\nconst addSignerEdges = (\n transaction: TraceTransaction,\n nodes: Map<string, VisualNode>,\n edges: VisualEdge[],\n): void => {\n transaction.requiredSigners.forEach((keyHash, index) => {\n const node = signerNode(keyHash);\n nodes.set(node.id, node);\n edges.push({\n id: `${transactionNodeId(transaction.hash)}:signer:${keyHash}`,\n kind: \"sign\",\n from: node.id,\n to: transactionNodeId(transaction.hash),\n fromPort: signerPortId(keyHash),\n toPort: transactionPortId(transaction.hash, \"sign\", index),\n label: \"requires signer\",\n targetRef: {\n type: \"signer\",\n txHash: transaction.hash,\n keyHash,\n },\n rawRef: { type: \"signer\", keyHash },\n });\n });\n};\n\nconst addCollateralReturnEdge = (\n transaction: TraceTransaction,\n nodes: Map<string, VisualNode>,\n edges: VisualEdge[],\n): void => {\n if (!transaction.collateralReturn) return;\n const node = collateralReturnNode(transaction);\n nodes.set(node.id, node);\n edges.push({\n id: `${transactionNodeId(transaction.hash)}:collateral-return`,\n kind: \"collateralReturn\",\n from: transactionNodeId(transaction.hash),\n to: node.id,\n fromPort: transactionPortId(transaction.hash, \"collateralReturn\", 0),\n toPort: collateralReturnPortId(transaction.hash),\n label: \"collateral return\",\n targetRef: {\n type: \"collateralReturn\",\n txHash: transaction.hash,\n },\n rawRef: { type: \"collateralReturn\", txHash: transaction.hash },\n });\n};\n\nconst transactionNode = (\n transaction: TraceTransaction,\n trace: TxGraphTrace,\n): VisualNode => {\n const warningCount = trace.warnings.filter(\n (warning) => warning.txHash === transaction.hash,\n ).length;\n return {\n id: transactionNodeId(transaction.hash),\n kind: \"transaction\",\n title: transaction.label ?? `tx ${shortHash(transaction.hash)}`,\n subtitle: shortHash(transaction.hash),\n chips: [\n { label: transaction.status, tone: statusTone(transaction.status) },\n ...(warningCount > 0\n ? [{ label: `${warningCount} warnings`, tone: \"warning\" as const }]\n : []),\n ],\n sections: [\n section(\"facts\", \"Facts\", [\n field(\"fee\", \"Fee\", transaction.fee),\n field(\"size\", \"Size\", `${transaction.sizeBytes} bytes`),\n ...(transaction.validityInterval.validFrom\n ? [\n field(\n \"validFrom\",\n \"Valid from\",\n transaction.validityInterval.validFrom,\n ),\n ]\n : []),\n ...(transaction.validityInterval.validTo\n ? [field(\"validTo\", \"Valid to\", transaction.validityInterval.validTo)]\n : []),\n ]),\n section(\"inputs\", \"Inputs\", [\n field(\"spend\", \"Spend\", String(transaction.inputs.length)),\n field(\"read\", \"Read\", String(transaction.referenceInputs.length)),\n field(\n \"collateral\",\n \"Collateral\",\n String(transaction.collateralInputs.length),\n ),\n ]),\n section(\"assets\", \"Assets\", [\n field(\n \"mint\",\n \"Mint policies\",\n String(sortedPolicyIds(transaction.mintedAssets).length),\n ),\n field(\n \"burn\",\n \"Burn policies\",\n String(sortedPolicyIds(transaction.burnedAssets).length),\n ),\n ]),\n section(\"authority\", \"Authority\", [\n field(\"signers\", \"Signers\", String(transaction.requiredSigners.length)),\n field(\n \"certificates\",\n \"Certificates\",\n String(transaction.certificates.length),\n ),\n field(\n \"withdrawals\",\n \"Withdrawals\",\n String(transaction.withdrawals.length),\n ),\n ]),\n section(\"redeemers\", \"Redeemers\", [\n field(\"redeemers\", \"Redeemers\", String(transaction.redeemers.length)),\n ]),\n ],\n ports: transactionPorts(transaction),\n ...(transaction.status === \"failed\" ? { severity: \"error\" as const } : {}),\n rawRef: { type: \"transaction\", txHash: transaction.hash },\n };\n};\n\nconst utxoNode = (\n key: string,\n utxo: TraceUtxo,\n trace: TxGraphTrace,\n): VisualNode => {\n const title =\n utxo.resolution === \"genesis\"\n ? \"genesis UTxO\"\n : utxo.tags.length > 0\n ? utxo.tags.join(\", \")\n : key;\n return {\n id: utxoNodeId(utxo),\n kind: \"utxo\",\n title,\n subtitle: key,\n chips: [\n {\n label: utxo.resolution,\n tone:\n utxo.resolution === \"unresolved\"\n ? \"danger\"\n : utxo.resolution === \"genesis\"\n ? \"warning\"\n : \"success\",\n },\n ...utxo.tags.map((tag) => ({ label: tag, tone: \"neutral\" as const })),\n ],\n sections: [\n section(\"owner\", \"Owner\", [\n field(\n \"address\",\n \"Address\",\n addressName(utxo.address, trace),\n true,\n undefined,\n utxo.address,\n ),\n ]),\n section(\n \"assets\",\n \"Assets\",\n Object.entries(utxo.assets)\n .sort(([left], [right]) => assetSort(left, right))\n .map(([unit, amount]) =>\n field(\n `asset:${unit}`,\n assetName(unit, trace),\n amount,\n false,\n undefined,\n undefined,\n unit,\n ),\n ),\n ),\n section(\"state\", \"State\", [\n ...(utxo.datum ? [field(\"datum\", \"Datum\", \"inline datum\")] : []),\n ...(utxo.datumHash\n ? [\n field(\n \"datumHash\",\n \"Datum hash\",\n shortHash(utxo.datumHash),\n true,\n undefined,\n utxo.datumHash,\n ),\n ]\n : []),\n ...(utxo.scriptRef\n ? [\n field(\n \"scriptRef\",\n \"Script ref\",\n `${utxo.scriptRef.type}${\n utxo.scriptRef.hash\n ? ` ${shortHash(utxo.scriptRef.hash)}`\n : \"\"\n }`,\n false,\n undefined,\n utxo.scriptRef.hash\n ? `${utxo.scriptRef.type} ${utxo.scriptRef.hash}`\n : utxo.scriptRef.type,\n ),\n ]\n : []),\n ...(utxo.unresolvedReason\n ? [\n field(\n \"unresolved\",\n \"Unresolved\",\n utxo.unresolvedReason,\n false,\n \"danger\",\n ),\n ]\n : []),\n ]),\n ],\n ports: [\n port(utxoPortId(key, \"in\"), utxoNodeId(utxo), \"left\", \"in\"),\n port(utxoPortId(key, \"out\"), utxoNodeId(utxo), \"right\", \"out\"),\n ],\n ...(utxo.resolution === \"unresolved\" ? { severity: \"error\" as const } : {}),\n rawRef: {\n type: \"utxo\",\n outRef: { txHash: utxo.txHash, outputIndex: utxo.outputIndex },\n },\n };\n};\n\nconst assetPolicyNode = (\n policyId: string,\n assets: Record<string, string>,\n trace: TxGraphTrace,\n): VisualNode => ({\n id: assetPolicyNodeId(policyId),\n kind: \"asset\",\n title: `policy ${shortHash(policyId, 6)}`,\n sections: [\n section(\n \"assets\",\n \"Assets\",\n Object.entries(assets)\n .sort(([left], [right]) => assetSort(left, right))\n .map(([unit]) =>\n field(\n `asset:${unit}`,\n \"Asset\",\n assetName(unit, trace),\n false,\n undefined,\n unit,\n ),\n ),\n ),\n ],\n ports: [\n port(\n assetPolicyPortId(policyId),\n assetPolicyNodeId(policyId),\n \"left\",\n \"asset\",\n ),\n ],\n chips: [{ label: shortHash(policyId, 6), tone: \"accent\" }],\n rawRef: { type: \"assetPolicy\", policyId },\n});\n\nconst mergeAssetPolicyNode = (\n existing: VisualNode | undefined,\n next: VisualNode,\n): VisualNode => {\n if (!existing) return next;\n const rows = new Map<string, VisualField>();\n for (const node of [existing, next]) {\n const assetRows = node.sections.find(\n (section) => section.id === \"assets\",\n )?.rows;\n for (const row of assetRows ?? []) {\n rows.set(row.id, row);\n }\n }\n return {\n ...existing,\n sections: [\n section(\n \"assets\",\n \"Assets\",\n [...rows.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n ),\n ),\n ],\n };\n};\n\nconst withdrawalNode = (\n rewardAddress: string,\n trace: TxGraphTrace,\n): VisualNode => ({\n id: withdrawalNodeId(rewardAddress),\n kind: \"withdrawal\",\n title: \"withdrawal\",\n subtitle: addressName(rewardAddress, trace),\n sections: [\n section(\"reward\", \"Reward address\", [\n field(\n \"address\",\n \"Address\",\n addressName(rewardAddress, trace),\n true,\n undefined,\n rewardAddress,\n ),\n ]),\n ],\n ports: [\n port(\n withdrawalPortId(rewardAddress),\n withdrawalNodeId(rewardAddress),\n \"right\",\n \"withdraw\",\n ),\n ],\n chips: [],\n rawRef: { type: \"withdrawal\", rewardAddress },\n});\n\nconst certificateNode = (\n txHash: string,\n index: number,\n kindName: string,\n): VisualNode => ({\n id: certificateNodeId(txHash, index),\n kind: \"certificate\",\n title: kindName,\n subtitle: `certificate #${index}`,\n sections: [\n section(\"certificate\", \"Certificate\", [field(\"kind\", \"Kind\", kindName)]),\n ],\n ports: [\n port(\n certificatePortId(txHash, index),\n certificateNodeId(txHash, index),\n \"left\",\n \"cert\",\n ),\n ],\n chips: [],\n rawRef: { type: \"certificate\", txHash, index },\n});\n\nconst signerNode = (keyHash: string): VisualNode => ({\n id: signerNodeId(keyHash),\n kind: \"signer\",\n title: \"signer\",\n subtitle: shortHash(keyHash),\n sections: [\n section(\"signer\", \"Signer\", [\n field(\n \"keyHash\",\n \"Key hash\",\n shortHash(keyHash),\n true,\n undefined,\n keyHash,\n ),\n ]),\n ],\n ports: [port(signerPortId(keyHash), signerNodeId(keyHash), \"right\", \"sign\")],\n chips: [],\n rawRef: { type: \"signer\", keyHash },\n});\n\nconst collateralReturnNode = (transaction: TraceTransaction): VisualNode => ({\n id: collateralReturnNodeId(transaction.hash),\n kind: \"collateralReturn\",\n title: \"collateral return\",\n subtitle: shortHash(transaction.hash),\n sections: [\n section(\"assets\", \"Assets\", [\n ...Object.entries(transaction.collateralReturn?.assets ?? {})\n .sort(([left], [right]) => assetSort(left, right))\n .map(([unit, amount]) =>\n field(\n `asset:${unit}`,\n unit,\n amount,\n false,\n undefined,\n undefined,\n unit,\n ),\n ),\n ]),\n ],\n ports: [\n port(\n collateralReturnPortId(transaction.hash),\n collateralReturnNodeId(transaction.hash),\n \"left\",\n \"collateral return\",\n ),\n ],\n chips: [],\n rawRef: { type: \"collateralReturn\", txHash: transaction.hash },\n});\n\nconst ensureUtxoPlaceholder = (\n trace: TxGraphTrace,\n nodes: Map<string, VisualNode>,\n outRef: TraceOutRef,\n): void => {\n const id = utxoNodeId(outRef);\n if (nodes.has(id)) return;\n const key = outRefKey(outRef);\n nodes.set(\n id,\n utxoNode(\n key,\n {\n ...outRef,\n address: \"unresolved\",\n assets: {},\n resolution: \"unresolved\",\n unresolvedReason: \"missing-from-trace\",\n tags: [],\n },\n trace,\n ),\n );\n};\n\nconst transactionPorts = (transaction: TraceTransaction): VisualPort[] => [\n ...transaction.inputs.map((_input, index) =>\n port(\n transactionPortId(transaction.hash, \"spend\", index),\n transactionNodeId(transaction.hash),\n \"left\",\n `spend #${index}`,\n \"spend\",\n ),\n ),\n ...transaction.referenceInputs.map((_input, index) =>\n port(\n transactionPortId(transaction.hash, \"read\", index),\n transactionNodeId(transaction.hash),\n \"left\",\n `read #${index}`,\n \"read\",\n ),\n ),\n ...transaction.collateralInputs.map((_input, index) =>\n port(\n transactionPortId(transaction.hash, \"collateral\", index),\n transactionNodeId(transaction.hash),\n \"left\",\n `collateral #${index}`,\n \"collateral\",\n ),\n ),\n ...transaction.outputs.map((_output, index) =>\n port(\n transactionPortId(transaction.hash, \"produce\", index),\n transactionNodeId(transaction.hash),\n \"right\",\n `output #${index}`,\n \"produce\",\n ),\n ),\n ...sortedPolicyIds(transaction.mintedAssets).map((policyId) => {\n const index = sortedPolicyIds(transaction.mint).indexOf(policyId);\n return port(\n transactionPortId(transaction.hash, \"mint\", index),\n transactionNodeId(transaction.hash),\n \"bottom\",\n `mint #${index}`,\n \"mint\",\n );\n }),\n ...sortedPolicyIds(transaction.burnedAssets).map((policyId) => {\n const index = sortedPolicyIds(transaction.mint).indexOf(policyId);\n return port(\n transactionPortId(transaction.hash, \"burn\", index),\n transactionNodeId(transaction.hash),\n \"bottom\",\n `burn #${index}`,\n \"burn\",\n );\n }),\n ...transaction.withdrawals.map((_withdrawal, index) =>\n port(\n transactionPortId(transaction.hash, \"withdraw\", index),\n transactionNodeId(transaction.hash),\n \"left\",\n `withdraw #${index}`,\n \"withdraw\",\n ),\n ),\n ...transaction.certificates.map((certificate) =>\n port(\n transactionPortId(transaction.hash, \"certify\", certificate.index),\n transactionNodeId(transaction.hash),\n \"right\",\n `cert #${certificate.index}`,\n \"certify\",\n ),\n ),\n ...transaction.requiredSigners.map((_signer, index) =>\n port(\n transactionPortId(transaction.hash, \"sign\", index),\n transactionNodeId(transaction.hash),\n \"left\",\n `signer #${index}`,\n \"sign\",\n ),\n ),\n ...(transaction.collateralReturn\n ? [\n port(\n transactionPortId(transaction.hash, \"collateralReturn\", 0),\n transactionNodeId(transaction.hash),\n \"right\",\n \"collateral return\",\n \"collateralReturn\",\n ),\n ]\n : []),\n];\n\nconst redeemerKeyFor = (\n transaction: TraceTransaction,\n tag: TraceRedeemer[\"tag\"],\n index: number,\n mappedRedeemers?: Set<string>,\n): RedeemerKey | undefined => {\n const redeemer = transaction.redeemers.find(\n (candidate) => candidate.tag === tag && candidate.index === String(index),\n );\n if (!redeemer) return undefined;\n mappedRedeemers?.add(redeemerMapKey(transaction.hash, redeemer));\n return {\n tag: redeemer.tag,\n index: redeemer.index,\n redeemerListIndex: redeemer.redeemerListIndex,\n };\n};\n\nconst applyAction = (\n trace: TxGraphTrace,\n edge: VisualEdge,\n describers: ReadonlyArray<RedeemerDescriber>,\n): VisualEdge => {\n const context = redeemerContext(trace, edge);\n if (!context) return edge;\n for (const describer of describers) {\n const action = describer(context);\n if (action) {\n return { ...edge, action, label: action.label };\n }\n }\n const fallback = genericAction(context.redeemer);\n return {\n ...edge,\n action: fallback,\n label: fallback.label,\n };\n};\n\nconst redeemerContext = (\n trace: TxGraphTrace,\n edge: VisualEdge,\n): RedeemerDescriberContext | undefined => {\n if (!edge.redeemerKey) return undefined;\n const transaction = trace.transactions.find(\n (candidate) => candidate.hash === edge.targetRef.txHash,\n );\n const redeemer = transaction?.redeemers.find(\n (candidate) =>\n candidate.tag === edge.redeemerKey?.tag &&\n candidate.index === edge.redeemerKey.index &&\n candidate.redeemerListIndex === edge.redeemerKey.redeemerListIndex,\n );\n return transaction && redeemer\n ? {\n trace,\n transaction,\n redeemer,\n target: edge.targetRef,\n edge,\n }\n : undefined;\n};\n\nconst genericAction = (redeemer: TraceRedeemer): VisualAction => ({\n label: `${redeemer.tag} #${redeemer.index}`,\n source: \"generic\",\n confidence: \"fallback\",\n});\n\nconst matchesRedeemer = (\n selector: RedeemerSelector,\n { transaction, redeemer, target }: RedeemerDescriberContext,\n): boolean =>\n redeemer.tag === selector.tag &&\n redeemer.index === String(selector.index) &&\n (!selector.txHash || transaction.hash === selector.txHash) &&\n (!selector.target || selector.target(target));\n\nconst constructorOf = (data: string): number | undefined => {\n try {\n const alternative = CML.PlutusData.from_cbor_hex(data)\n .as_constr_plutus_data()\n ?.alternative();\n if (alternative === undefined) return undefined;\n const value = Number(alternative);\n return Number.isSafeInteger(value) ? value : undefined;\n } catch {\n return undefined;\n }\n};\n\nconst visualDiagnostic = (\n warning: TraceWarning,\n index: number,\n): VisualDiagnostic => ({\n id: `diagnostic:${index}:${warning.code}`,\n severity: warning.code.includes(\"failed\") ? \"error\" : \"warning\",\n code: warning.code,\n message: warning.message,\n ...(warning.txHash ? { txHash: warning.txHash } : {}),\n ...(warning.outRef ? { outRef: warning.outRef } : {}),\n});\n\nconst unmappedRedeemerDiagnostics = (\n trace: TxGraphTrace,\n mappedRedeemers: ReadonlySet<string>,\n): VisualDiagnostic[] =>\n trace.transactions.flatMap((transaction) =>\n transaction.redeemers\n .filter(\n (redeemer) =>\n !mappedRedeemers.has(redeemerMapKey(transaction.hash, redeemer)),\n )\n .map((redeemer) => ({\n id: `diagnostic:${transaction.hash}:unmapped-redeemer:${redeemer.tag}:${redeemer.index}`,\n severity: \"warning\" as const,\n code: \"unmapped-redeemer\",\n message: `Redeemer ${redeemer.tag} #${redeemer.index} in transaction ${transaction.hash} has no matching semantic edge`,\n txHash: transaction.hash,\n redeemerKey: {\n tag: redeemer.tag,\n index: redeemer.index,\n redeemerListIndex: redeemer.redeemerListIndex,\n },\n })),\n );\n\nconst redeemerMapKey = (\n txHash: string,\n redeemer: Pick<TraceRedeemer, \"tag\" | \"index\" | \"redeemerListIndex\">,\n): string =>\n `${txHash}\\u0000${redeemer.tag}\\u0000${redeemer.index}\\u0000${redeemer.redeemerListIndex}`;\n\nconst assetsByPolicy = (\n assets: Record<string, string>,\n): Record<string, Record<string, string>> => {\n const result: Record<string, Record<string, string>> = {};\n for (const [unit, amount] of Object.entries(assets)) {\n const policyId = policyIdOfUnit(unit);\n result[policyId] = {\n ...(result[policyId] ?? {}),\n [unit]: amount,\n };\n }\n return result;\n};\n\nconst sortedPolicyIds = (assets: Record<string, string>): string[] =>\n [...new Set(Object.keys(assets).map(policyIdOfUnit))].sort();\n\nconst policyIdOfUnit = (unit: string): string =>\n unit === \"lovelace\" ? \"lovelace\" : unit.slice(0, 56);\n\nconst section = (\n id: string,\n title: string,\n rows: ReadonlyArray<VisualField>,\n): VisualSection => ({\n id,\n title,\n rows: [...rows],\n collapsed: rows.length === 0,\n});\n\nconst field = (\n id: string,\n label: string,\n value: string,\n mono = false,\n tone?: VisualTone,\n rawValue?: string,\n rawLabel?: string,\n): VisualField => ({\n id,\n label,\n ...(rawLabel ? { rawLabel } : {}),\n value,\n ...(rawValue ? { rawValue } : {}),\n ...(mono ? { mono } : {}),\n ...(tone ? { tone } : {}),\n});\n\nconst port = (\n id: string,\n nodeId: string,\n side: VisualPortSide,\n label: string,\n edgeKind?: VisualEdgeKind,\n): VisualPort => ({\n id,\n nodeId,\n side,\n label,\n ...(edgeKind ? { edgeKind } : {}),\n});\n\nconst statusTone = (status: TraceTransaction[\"status\"]): VisualTone => {\n switch (status) {\n case \"submitted\":\n case \"confirmed\":\n return \"success\";\n case \"failed\":\n return \"danger\";\n case \"built\":\n case \"signed\":\n return \"info\";\n }\n};\n\nconst assetSort = (left: string, right: string): number => {\n if (left === \"lovelace\") return -1;\n if (right === \"lovelace\") return 1;\n return left.localeCompare(right);\n};\n\nconst transactionNodeId = (txHash: string): string => `tx:${txHash}`;\nconst utxoNodeId = (outRef: TraceOutRef): string => `utxo:${outRefKey(outRef)}`;\nconst assetPolicyNodeId = (policyId: string): string =>\n `asset-policy:${policyId}`;\nconst signerNodeId = (keyHash: string): string => `signer:${keyHash}`;\nconst withdrawalNodeId = (rewardAddress: string): string =>\n `withdrawal:${rewardAddress}`;\nconst certificateNodeId = (txHash: string, index: number): string =>\n `certificate:${txHash}#${index}`;\nconst collateralReturnNodeId = (txHash: string): string =>\n `collateral-return:${txHash}`;\n\nconst transactionPortId = (\n txHash: string,\n kind: VisualEdgeKind,\n index: number,\n): string => `tx:${txHash}:port:${kind}:${index}`;\nconst utxoPortId = (key: string, direction: \"in\" | \"out\"): string =>\n `utxo:${key}:port:${direction}`;\nconst assetPolicyPortId = (policyId: string): string =>\n `asset-policy:${policyId}:port`;\nconst signerPortId = (keyHash: string): string => `signer:${keyHash}:port`;\nconst withdrawalPortId = (rewardAddress: string): string =>\n `withdrawal:${rewardAddress}:port`;\nconst certificatePortId = (txHash: string, index: number): string =>\n `certificate:${txHash}#${index}:port`;\nconst collateralReturnPortId = (txHash: string): string =>\n `collateral-return:${txHash}:port`;\n\nconst defaultLegend: VisualLegend = {\n nodes: [\n { kind: \"transaction\", label: \"Transaction\" },\n { kind: \"utxo\", label: \"UTxO\" },\n { kind: \"asset\", label: \"Asset policy\" },\n { kind: \"diagnostic\", label: \"Diagnostic\" },\n ],\n edges: [\n { kind: \"spend\", label: \"Spend input\" },\n { kind: \"read\", label: \"Reference input\" },\n { kind: \"collateral\", label: \"Collateral input\" },\n { kind: \"produce\", label: \"Produced output\" },\n { kind: \"mint\", label: \"Mint policy\" },\n { kind: \"burn\", label: \"Burn policy\" },\n { kind: \"withdraw\", label: \"Withdrawal\" },\n { kind: \"certify\", label: \"Certificate\" },\n { kind: \"sign\", label: \"Required signer\" },\n ],\n};\n","import type { TxGraphTrace } from \"../model.js\";\nimport { buildRenderGraph, edgeStyle, type RenderNode } from \"./common.js\";\nimport {\n resolveVisualRendererOptions,\n visualEdgeStyle,\n type ResolvedVisualRendererOptions,\n type VisualRendererOptions,\n} from \"./options.js\";\nimport {\n formatSemanticGraph,\n isGenesisNode,\n isScriptInteractionEdge,\n semanticChipLabels,\n semanticEdgeLabel,\n semanticFieldLabel,\n semanticFieldValue,\n semanticNodeTitle,\n semanticNodeSubtitle,\n visibleSemanticRows,\n visibleSemanticSections,\n} from \"./semantic-format.js\";\nimport {\n buildSemanticRenderGraph,\n type SemanticRenderOptions,\n type VisualNode,\n type VisualSection,\n} from \"./semantic.js\";\n\nexport type TraceToDotOptions = VisualRendererOptions &\n SemanticRenderOptions & {\n readonly graphName?: string;\n readonly legacy?: boolean;\n };\n\nexport const traceToDot = (\n trace: TxGraphTrace,\n options: TraceToDotOptions = {},\n): string => {\n if (options.legacy) return traceToLegacyDot(trace, options);\n\n const resolved = resolveVisualRendererOptions(options);\n const graph = formatSemanticGraph(\n buildSemanticRenderGraph(trace, {\n redeemers: options.redeemers,\n }),\n resolved,\n );\n const semanticNodes = new Map(\n graph.nodes.map((node) => [node.id, node] as const),\n );\n const nodeIds = new Map(\n graph.nodes.map((node, index) => [node.id, `n${index}`] as const),\n );\n const lines = [\n `digraph ${dotString(options.graphName ?? \"lucid-evolution-tx-graph\")} {`,\n \" rankdir=LR;\",\n \" splines=ortho;\",\n \" nodesep=0.45;\",\n \" ranksep=0.75;\",\n ' graph [fontname=\"Inter, Arial\", bgcolor=\"white\", pad=0.2];',\n ' node [fontname=\"Inter, Arial\", fontsize=10, shape=plain, margin=0];',\n ' edge [fontname=\"Inter, Arial\", fontsize=9, arrowsize=0.7];',\n ];\n\n for (const node of graph.nodes) {\n lines.push(\n ` ${dotString(nodeIds.get(node.id)!)} [${semanticNodeAttributes(\n node,\n resolved,\n )}];`,\n );\n }\n\n for (const edge of graph.edges) {\n const style = visualEdgeStyle(edge.kind);\n const scriptFocus =\n resolved.view === \"scriptInteraction\" &&\n isScriptInteractionEdge(edge, semanticNodes);\n lines.push(\n ` ${dotString(nodeIds.get(edge.from)!)} -> ${dotString(\n nodeIds.get(edge.to)!,\n )} [` +\n [\n `label=${dotString(semanticEdgeLabel(trace, edge, resolved))}`,\n `color=${dotString(style.color)}`,\n `fontcolor=${dotString(style.color)}`,\n `style=${dotString(style.style)}`,\n `penwidth=${scriptFocus ? \"2.8\" : edge.kind === \"spend\" || edge.kind === \"produce\" ? \"1.6\" : \"1.1\"}`,\n ].join(\", \") +\n \"];\",\n );\n }\n\n lines.push(\"}\");\n return `${lines.join(\"\\n\")}\\n`;\n};\n\nconst semanticNodeAttributes = (\n node: VisualNode,\n options: ResolvedVisualRendererOptions,\n): string =>\n [\n `label=<${semanticNodeLabel(node, options)}>`,\n `tooltip=${dotString(nodeTooltip(node, options))}`,\n ].join(\", \");\n\nconst semanticNodeLabel = (\n node: VisualNode,\n options: ResolvedVisualRendererOptions,\n): string => {\n const palette = nodePalette(node);\n const subtitle = semanticNodeSubtitle(node, options);\n const chips = semanticChipLabels(node, options);\n const sections = visibleSemanticSections(node, options);\n return [\n `<TABLE BORDER=\"1\" CELLBORDER=\"0\" CELLSPACING=\"0\" CELLPADDING=\"5\" COLOR=\"${palette.border}\">`,\n `<TR><TD COLSPAN=\"2\" BGCOLOR=\"${palette.header}\"><B>${htmlText(semanticNodeTitle(node, options))}</B>${subtitle ? `<BR/><FONT POINT-SIZE=\"9\">${htmlText(subtitle)}</FONT>` : \"\"}</TD></TR>`,\n ...(chips.length > 0\n ? [\n `<TR><TD COLSPAN=\"2\" BGCOLOR=\"${palette.chip}\"><FONT POINT-SIZE=\"9\">${htmlText(\n chips.join(\" | \"),\n )}</FONT></TD></TR>`,\n ]\n : []),\n ...sections.flatMap((section) => sectionRows(section, node, options)),\n \"</TABLE>\",\n ].join(\"\");\n};\n\nconst sectionRows = (\n section: VisualSection,\n node: VisualNode,\n options: ResolvedVisualRendererOptions,\n): string[] => {\n const rows = visibleSemanticRows(section, node, options);\n if (rows.length === 0) return [];\n return [\n `<TR><TD COLSPAN=\"2\" ALIGN=\"LEFT\" BGCOLOR=\"#f9fafb\"><B>${htmlText(\n section.title,\n )}</B></TD></TR>`,\n ...rows.map((row) => {\n const value = semanticFieldValue(row, options);\n const valueFace = row.mono ? ' FACE=\"monospace\"' : \"\";\n return `<TR><TD ALIGN=\"LEFT\"><FONT POINT-SIZE=\"9\">${htmlText(\n semanticFieldLabel(row, options),\n )}</FONT></TD><TD ALIGN=\"LEFT\"><FONT${valueFace}>${htmlText(\n value,\n )}</FONT></TD></TR>`;\n }),\n ];\n};\n\nconst nodeTooltip = (\n node: VisualNode,\n options: ResolvedVisualRendererOptions,\n): string =>\n [\n semanticNodeTitle(node, options),\n ...(semanticNodeSubtitle(node, options)\n ? [semanticNodeSubtitle(node, options)!]\n : []),\n ...node.sections.flatMap((section) =>\n section.rows.map(\n (row) =>\n `${section.title}.${semanticFieldLabel(row, options)}: ${semanticFieldValue(\n row,\n options,\n )}`,\n ),\n ),\n ].join(\"\\n\");\n\nconst nodePalette = (\n node: VisualNode,\n): {\n readonly header: string;\n readonly chip: string;\n readonly border: string;\n} => {\n if (node.severity === \"error\") {\n return { header: \"#fee2e2\", chip: \"#fef2f2\", border: \"#dc2626\" };\n }\n if (isGenesisNode(node)) {\n return { header: \"#fef3c7\", chip: \"#fffbeb\", border: \"#d97706\" };\n }\n if (node.rawRef.type === \"diagnostic\" && node.rawRef.code === \"collapsed\") {\n return { header: \"#f3f4f6\", chip: \"#f9fafb\", border: \"#6b7280\" };\n }\n switch (node.kind) {\n case \"transaction\":\n return { header: \"#eef2ff\", chip: \"#e0e7ff\", border: \"#6366f1\" };\n case \"utxo\":\n return { header: \"#ecfdf5\", chip: \"#d1fae5\", border: \"#10b981\" };\n case \"asset\":\n return { header: \"#f5f3ff\", chip: \"#ede9fe\", border: \"#7c3aed\" };\n case \"signer\":\n return { header: \"#f3f4f6\", chip: \"#f9fafb\", border: \"#6b7280\" };\n case \"withdrawal\":\n return { header: \"#ecfeff\", chip: \"#cffafe\", border: \"#0891b2\" };\n case \"certificate\":\n return { header: \"#eef2ff\", chip: \"#e0e7ff\", border: \"#4f46e5\" };\n case \"collateralReturn\":\n return { header: \"#fffbeb\", chip: \"#fef3c7\", border: \"#f59e0b\" };\n case \"diagnostic\":\n return { header: \"#fef2f2\", chip: \"#fee2e2\", border: \"#dc2626\" };\n }\n};\n\nconst htmlText = (value: string): string =>\n value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/\\\\n/g, \"<BR/>\")\n .replace(/\\n/g, \"<BR/>\");\n\nconst traceToLegacyDot = (\n trace: TxGraphTrace,\n options: TraceToDotOptions = {},\n): string => {\n const graph = buildRenderGraph(trace);\n const lines = [\n `digraph ${dotString(options.graphName ?? \"lucid-evolution-tx-graph\")} {`,\n \" rankdir=LR;\",\n ' graph [fontname=\"Inter, Arial\", bgcolor=\"white\"];',\n ' node [fontname=\"Inter, Arial\", fontsize=10, margin=\"0.08,0.06\"];',\n ' edge [fontname=\"Inter, Arial\", fontsize=9, arrowsize=0.7];',\n ];\n\n for (const node of graph.nodes) {\n lines.push(` ${dotString(node.id)} [${legacyNodeAttributes(node)}];`);\n }\n\n for (const edge of graph.edges) {\n const style = edgeStyle(edge.kind);\n lines.push(\n ` ${dotString(edge.from)} -> ${dotString(edge.to)} [` +\n [\n `label=${dotString(style.label)}`,\n `color=${dotString(style.color)}`,\n `fontcolor=${dotString(style.color)}`,\n `style=${dotString(style.style)}`,\n ].join(\", \") +\n \"];\",\n );\n }\n\n lines.push(\"}\");\n return `${lines.join(\"\\n\")}\\n`;\n};\n\nconst legacyNodeAttributes = (node: RenderNode): string => {\n const attrs = [\n `label=${dotString(node.label)}`,\n `shape=${dotString(legacyNodeShape(node))}`,\n `style=${dotString(legacyNodeStyle(node))}`,\n `fillcolor=${dotString(legacyNodeFill(node))}`,\n `color=${dotString(legacyNodeColor(node))}`,\n ];\n return attrs.join(\", \");\n};\n\nconst legacyNodeShape = (node: RenderNode): string => {\n switch (node.kind) {\n case \"transaction\":\n return \"box\";\n case \"utxo\":\n return \"box\";\n case \"asset\":\n return \"component\";\n case \"signer\":\n return \"octagon\";\n case \"withdrawal\":\n case \"certificate\":\n case \"collateralReturn\":\n case \"external\":\n return \"note\";\n }\n};\n\nconst legacyNodeStyle = (node: RenderNode): string =>\n node.kind === \"utxo\" ? \"rounded,filled\" : \"filled\";\n\nconst legacyNodeFill = (node: RenderNode): string => {\n if (node.unresolved) return \"#fee2e2\";\n if (node.genesis) return \"#fef3c7\";\n switch (node.kind) {\n case \"transaction\":\n return \"#eef2ff\";\n case \"utxo\":\n return \"#ecfdf5\";\n case \"asset\":\n return \"#f5f3ff\";\n case \"signer\":\n return \"#f3f4f6\";\n case \"withdrawal\":\n return \"#ecfeff\";\n case \"certificate\":\n return \"#eef2ff\";\n case \"collateralReturn\":\n return \"#fffbeb\";\n case \"external\":\n return \"#f9fafb\";\n }\n};\n\nconst legacyNodeColor = (node: RenderNode): string =>\n node.unresolved ? \"#dc2626\" : node.genesis ? \"#d97706\" : \"#9ca3af\";\n\nconst dotString = (value: string): string =>\n JSON.stringify(value.replace(/\\\\n/g, \"\\n\"));\n","import type { TxGraphTrace } from \"../model.js\";\nimport {\n semanticChipLabels,\n semanticEdgeLabel,\n visibleSemanticRows,\n visibleSemanticSections,\n type FormattedSemanticGraph,\n} from \"./semantic-format.js\";\nimport type { ResolvedVisualRendererOptions } from \"./options.js\";\nimport type { VisualEdge, VisualNode } from \"./semantic.js\";\n\nexport type Size = {\n readonly width: number;\n readonly height: number;\n};\n\nexport const MARGIN = 40;\nexport const TITLE_HEIGHT = 74;\nexport const LEGEND_HEIGHT = 132;\nexport const MIN_CANVAS_WIDTH = 940;\nexport const NODE_GAP_Y = 34;\nexport const RANK_GAP_X = 170;\nexport const LABEL_GAP = 8;\n\nexport const measureNode = (\n node: VisualNode,\n options: ResolvedVisualRendererOptions,\n): Size => {\n const width = nodeWidth(node);\n if (node.kind === \"transaction\") {\n return { width, height: measureTransactionNode(node, options) };\n }\n\n const sections = visibleSemanticSections(node, options);\n const rowCount = sections.reduce(\n (sum, section) => sum + visibleSemanticRows(section, node, options).length,\n 0,\n );\n const populatedSections = sections.filter(\n (section) => visibleSemanticRows(section, node, options).length > 0,\n ).length;\n const chips = semanticChipLabels(node, options);\n const chipRows = estimateChipRows(chips, width - 28);\n\n return {\n width,\n height: 58 + chipRows * 24 + populatedSections * 24 + rowCount * 23 + 22,\n };\n};\n\nexport const measureLabel = (label: string): Size => ({\n width: Math.min(260, Math.max(54, label.length * 6.4 + 18)),\n height: 22,\n});\n\nexport const visibleEdgeLabel = (\n trace: TxGraphTrace,\n edge: VisualEdge,\n options: ResolvedVisualRendererOptions,\n): string | undefined => {\n if (edge.action || edge.redeemerKey) {\n return edge.action?.label ?? semanticEdgeLabel(trace, edge, options);\n }\n if (edge.kind === \"diagnostic\")\n return semanticEdgeLabel(trace, edge, options);\n if (edge.kind === \"mint\" || edge.kind === \"burn\") {\n return options.mode === \"overview\" ? undefined : edge.label;\n }\n if (edge.kind === \"withdraw\" || edge.kind === \"certify\") return edge.label;\n if (edge.kind === \"collateral\" || edge.kind === \"collateralReturn\") {\n return options.mode === \"debug\" ? edge.label : undefined;\n }\n return undefined;\n};\n\nexport const graphNodeById = (\n graph: FormattedSemanticGraph,\n nodeId: string,\n): VisualNode | undefined => graph.nodes.find((node) => node.id === nodeId);\n\nconst nodeWidth = (node: VisualNode): number => {\n switch (node.kind) {\n case \"transaction\":\n return 330;\n case \"utxo\":\n return 306;\n case \"diagnostic\":\n return 286;\n case \"asset\":\n return 270;\n case \"withdrawal\":\n case \"certificate\":\n case \"collateralReturn\":\n return 270;\n case \"signer\":\n return 240;\n }\n};\n\nconst metricRowCount = (\n node: VisualNode,\n options: ResolvedVisualRendererOptions,\n): number => {\n const metricRows = visibleSemanticSections(node, options)\n .filter((section) =>\n [\"inputs\", \"assets\", \"authority\", \"redeemers\"].includes(section.id),\n )\n .flatMap((section) => visibleSemanticRows(section, node, options))\n .filter((row) => row.value !== \"0\").length;\n return metricRows === 0 ? 0 : Math.ceil(metricRows / 4);\n};\n\nconst measureTransactionNode = (\n node: VisualNode,\n options: ResolvedVisualRendererOptions,\n): number => {\n const metricRows = metricRowCount(node, options);\n const facts = rowsForSection(node, options, \"facts\").slice(0, 4);\n const redeemers = rowsForSection(node, options, \"redeemers\").slice(0, 1);\n const detailRows = facts.length + redeemers.length;\n const metricsHeight = metricRows === 0 ? 0 : metricRows * 34 + 8;\n const detailsHeight = detailRows === 0 ? 0 : 27 + detailRows * 21;\n return 64 + metricsHeight + detailsHeight + 12;\n};\n\nconst rowsForSection = (\n node: VisualNode,\n options: ResolvedVisualRendererOptions,\n sectionId: string,\n) =>\n visibleSemanticSections(node, options)\n .filter((section) => section.id === sectionId)\n .flatMap((section) => visibleSemanticRows(section, node, options))\n .filter((row) => row.value !== \"0\");\n\nconst estimateChipRows = (\n chips: ReadonlyArray<string>,\n availableWidth: number,\n): number => {\n if (chips.length === 0) return 0;\n let rows = 1;\n let cursor = 0;\n for (const chip of chips) {\n const width = Math.max(42, Math.min(18, chip.length) * 6 + 18) + 6;\n if (cursor > 0 && cursor + width > availableWidth) {\n rows += 1;\n cursor = 0;\n }\n cursor += width;\n }\n return rows;\n};\n","import type { TxGraphTrace } from \"../model.js\";\nimport { outRefKey } from \"../resolve.js\";\nimport type { ResolvedVisualRendererOptions } from \"./options.js\";\nimport type { FormattedSemanticGraph } from \"./semantic-format.js\";\nimport type {\n VisualEdge,\n VisualEdgeTargetRef,\n VisualNode,\n VisualPort,\n} from \"./semantic.js\";\nimport {\n LABEL_GAP,\n LEGEND_HEIGHT,\n MARGIN,\n MIN_CANVAS_WIDTH,\n NODE_GAP_Y,\n RANK_GAP_X,\n TITLE_HEIGHT,\n measureLabel,\n measureNode,\n visibleEdgeLabel,\n type Size,\n} from \"./measure.js\";\n\nexport type Box = {\n readonly x: number;\n readonly y: number;\n readonly width: number;\n readonly height: number;\n};\n\nexport type Point = {\n readonly x: number;\n readonly y: number;\n};\n\nexport type LayoutNode = Size & {\n readonly node: VisualNode;\n readonly x: number;\n readonly y: number;\n};\n\nexport type LayoutEdgeLabel = Box & {\n readonly edgeId: string;\n readonly text: string;\n};\n\nexport type LayoutGraph = {\n readonly nodes: Map<string, LayoutNode>;\n readonly portOffsets: Map<string, number>;\n readonly edgeLabels: Map<string, LayoutEdgeLabel>;\n readonly width: number;\n readonly height: number;\n readonly offsetX: number;\n readonly offsetY: number;\n};\n\n// Keep the SVG renderer synchronous to preserve the existing traceToSvg API.\n// This measured layered layout gives UTxO flows ELK-like ranks and explicit ports\n// without introducing an async layout dependency into the public renderer.\nexport const layoutGraph = (\n trace: TxGraphTrace,\n graph: FormattedSemanticGraph,\n options: ResolvedVisualRendererOptions,\n): LayoutGraph => {\n const sizes = new Map(\n graph.nodes.map((node) => [node.id, measureNode(node, options)] as const),\n );\n const ranks = rankNodes(trace, graph);\n const rankedNodes = new Map<number, VisualNode[]>();\n for (const node of graph.nodes) {\n const rank = ranks.get(node.id) ?? 0;\n rankedNodes.set(rank, [...(rankedNodes.get(rank) ?? []), node]);\n }\n\n const orderedRanks = [...rankedNodes.keys()].sort(\n (left, right) => left - right,\n );\n const rankWidths = new Map(\n orderedRanks.map((rank) => [\n rank,\n Math.max(\n ...rankedNodes.get(rank)!.map((node) => sizes.get(node.id)!.width),\n ),\n ]),\n );\n const rankHeights = new Map(\n orderedRanks.map((rank) => [\n rank,\n rankedNodes\n .get(rank)!\n .reduce((sum, node) => sum + sizes.get(node.id)!.height, 0) +\n Math.max(0, rankedNodes.get(rank)!.length - 1) * NODE_GAP_Y,\n ]),\n );\n const maxRankHeight = Math.max(0, ...rankHeights.values());\n\n let x = MARGIN;\n const rankX = new Map<number, number>();\n for (const rank of orderedRanks) {\n rankX.set(rank, x);\n x += (rankWidths.get(rank) ?? 0) + RANK_GAP_X;\n }\n\n const positioned = new Map<string, LayoutNode>();\n for (const rank of orderedRanks) {\n const nodes = [...rankedNodes.get(rank)!].sort((left, right) =>\n nodeSortKey(left, graph).localeCompare(nodeSortKey(right, graph)),\n );\n let y =\n MARGIN +\n TITLE_HEIGHT +\n 32 +\n Math.max(0, (maxRankHeight - (rankHeights.get(rank) ?? 0)) / 2);\n for (const node of nodes) {\n const size = sizes.get(node.id)!;\n positioned.set(node.id, {\n node,\n ...size,\n x:\n rankX.get(rank)! +\n ((rankWidths.get(rank) ?? size.width) - size.width) / 2,\n y,\n });\n y += size.height + NODE_GAP_Y;\n }\n }\n\n const ports = portOffsets(graph, positioned);\n const provisional: LayoutGraph = {\n nodes: positioned,\n portOffsets: ports,\n edgeLabels: new Map(),\n width: MIN_CANVAS_WIDTH,\n height: 260,\n offsetX: 0,\n offsetY: 0,\n };\n const edgeLabels = placeEdgeLabels(trace, graph, options, provisional);\n const boxes = [\n ...[...positioned.values()].map(nodeBox),\n ...edgeLabels.values(),\n ];\n\n const maxX = Math.max(0, ...boxes.map((box) => box.x + box.width));\n const maxY = Math.max(0, ...boxes.map((box) => box.y + box.height));\n\n return {\n nodes: positioned,\n portOffsets: ports,\n edgeLabels,\n width: Math.max(MIN_CANVAS_WIDTH, Math.ceil(maxX + MARGIN)),\n height: Math.ceil(maxY + MARGIN + LEGEND_HEIGHT),\n offsetX: 0,\n offsetY: 0,\n };\n};\n\nexport const nodeBox = (node: LayoutNode): Box => ({\n x: node.x,\n y: node.y,\n width: node.width,\n height: node.height,\n});\n\nexport const edgeAnchors = (\n edge: VisualEdge,\n graph: LayoutGraph,\n): { readonly start: Point; readonly end: Point } | undefined => {\n const from = graph.nodes.get(edge.from);\n const to = graph.nodes.get(edge.to);\n if (!from || !to) return undefined;\n return {\n start: anchor(edge, \"from\", from, to, graph),\n end: anchor(edge, \"to\", to, from, graph),\n };\n};\n\nexport const edgePath = (edge: VisualEdge, graph: LayoutGraph): string => {\n const anchors = edgeAnchors(edge, graph);\n if (!anchors) return \"\";\n const { start, end } = anchors;\n const dx = end.x - start.x;\n const dy = end.y - start.y;\n if (Math.abs(dx) < 80) {\n const curve = Math.max(50, Math.abs(dy) / 2);\n const direction = dy >= 0 ? 1 : -1;\n return `M ${start.x} ${start.y} C ${start.x} ${start.y + curve * direction}, ${end.x} ${end.y - curve * direction}, ${end.x} ${end.y}`;\n }\n const midX = start.x + dx / 2;\n return `M ${start.x} ${start.y} L ${midX} ${start.y} L ${midX} ${end.y} L ${end.x} ${end.y}`;\n};\n\nexport const edgeLabelPoint = (edge: VisualEdge, graph: LayoutGraph): Point => {\n const anchors = edgeAnchors(edge, graph);\n if (!anchors) return { x: 0, y: 0 };\n const { start, end } = anchors;\n return {\n x: (start.x + end.x) / 2,\n y: (start.y + end.y) / 2,\n };\n};\n\nconst rankNodes = (\n trace: TxGraphTrace,\n graph: FormattedSemanticGraph,\n): Map<string, number> => {\n const txIndex = new Map(\n trace.transactions.map(\n (transaction, index) => [transaction.hash, index] as const,\n ),\n );\n const edgeTxIndices = new Map<string, number[]>();\n for (const edge of graph.edges) {\n const txHash = edge.targetRef.txHash;\n if (!txHash) continue;\n const index = txIndex.get(txHash);\n if (index === undefined) continue;\n for (const nodeId of [edge.from, edge.to]) {\n edgeTxIndices.set(nodeId, [...(edgeTxIndices.get(nodeId) ?? []), index]);\n }\n }\n\n const ranks = new Map<string, number>();\n for (const node of graph.nodes) {\n const attachedTxs = edgeTxIndices.get(node.id) ?? [0];\n const attachedTx = Math.min(...attachedTxs);\n const latestAttachedTx = Math.max(...attachedTxs);\n switch (node.rawRef.type) {\n case \"transaction\": {\n ranks.set(\n node.id,\n (txIndex.get(node.rawRef.txHash) ?? attachedTx) * 2 + 1,\n );\n break;\n }\n case \"utxo\": {\n const producer = txIndex.get(node.rawRef.outRef.txHash);\n ranks.set(\n node.id,\n producer === undefined ? attachedTx * 2 : producer * 2 + 2,\n );\n break;\n }\n case \"assetPolicy\":\n ranks.set(node.id, latestAttachedTx * 2 + 2);\n break;\n case \"certificate\":\n case \"collateralReturn\":\n ranks.set(node.id, attachedTx * 2 + 2);\n break;\n case \"signer\":\n case \"withdrawal\":\n ranks.set(node.id, attachedTx * 2);\n break;\n case \"diagnostic\":\n ranks.set(node.id, attachedTx * 2 + 1);\n break;\n }\n }\n return ranks;\n};\n\nconst nodeSortKey = (\n node: VisualNode,\n graph: FormattedSemanticGraph,\n): string => {\n const attached = graph.edges\n .filter((edge) => edge.from === node.id || edge.to === node.id)\n .map((edge) => targetRefSortIndex(edge.targetRef));\n const attachedIndex = attached.length === 0 ? 0 : Math.min(...attached);\n return [\n String(kindPriority(node)).padStart(2, \"0\"),\n String(attachedIndex).padStart(4, \"0\"),\n rawRefSortKey(node),\n node.id,\n ].join(\":\");\n};\n\nconst targetRefSortIndex = (targetRef: VisualEdgeTargetRef): number => {\n switch (targetRef.type) {\n case \"input\":\n case \"output\":\n case \"withdrawal\":\n case \"certificate\":\n return targetRef.index;\n case \"assetPolicy\":\n return targetRef.policyIndex;\n case \"signer\":\n case \"collateralReturn\":\n return 0;\n case \"diagnostic\":\n return targetRef.count ?? 0;\n }\n};\n\nconst kindPriority = (node: VisualNode): number => {\n switch (node.kind) {\n case \"diagnostic\":\n return 0;\n case \"withdrawal\":\n return 1;\n case \"signer\":\n return 2;\n case \"transaction\":\n return 3;\n case \"utxo\":\n return 4;\n case \"asset\":\n return 5;\n case \"certificate\":\n return 6;\n case \"collateralReturn\":\n return 7;\n }\n};\n\nconst rawRefSortKey = (node: VisualNode): string => {\n switch (node.rawRef.type) {\n case \"utxo\":\n return outRefKey(node.rawRef.outRef);\n case \"transaction\":\n return node.rawRef.txHash;\n case \"assetPolicy\":\n return node.rawRef.policyId;\n case \"signer\":\n return node.rawRef.keyHash;\n case \"withdrawal\":\n return node.rawRef.rewardAddress;\n case \"certificate\":\n return `${node.rawRef.txHash}#${node.rawRef.index}`;\n case \"collateralReturn\":\n return node.rawRef.txHash;\n case \"diagnostic\":\n return node.rawRef.code;\n }\n};\n\nconst placeEdgeLabels = (\n trace: TxGraphTrace,\n formatted: FormattedSemanticGraph,\n options: ResolvedVisualRendererOptions,\n graph: LayoutGraph,\n): Map<string, LayoutEdgeLabel> => {\n const nodeBoxes = [...graph.nodes.values()].map((node) =>\n inflate(nodeBox(node), LABEL_GAP),\n );\n const placed: LayoutEdgeLabel[] = [];\n const result = new Map<string, LayoutEdgeLabel>();\n for (const edge of formatted.edges) {\n const text = visibleEdgeLabel(trace, edge, options);\n if (!text) continue;\n const labelText = fit(text, options.mode === \"debug\" ? 42 : 28);\n const size = measureLabel(labelText);\n const origin = edgeLabelPoint(edge, graph);\n const candidates = labelCandidates(origin, size);\n const box = candidates.find(\n (candidate) =>\n !nodeBoxes.some((node) => intersects(candidate, node)) &&\n !placed.some((label) =>\n intersects(candidate, inflate(label, LABEL_GAP)),\n ),\n );\n if (!box) continue;\n const label = { ...box, edgeId: edge.id, text: labelText };\n placed.push(label);\n result.set(edge.id, label);\n }\n return result;\n};\n\nconst labelCandidates = (origin: Point, size: Size): Box[] => {\n const x = origin.x - size.width / 2;\n const y = origin.y - size.height / 2;\n const offsets = [\n [0, -28],\n [0, 28],\n [0, -56],\n [0, 56],\n [-44, -28],\n [44, -28],\n [-44, 28],\n [44, 28],\n [0, -84],\n [0, 84],\n ];\n return offsets.map(([dx, dy]) => ({\n x: x + dx,\n y: y + dy,\n width: size.width,\n height: size.height,\n }));\n};\n\nconst portOffsets = (\n graph: FormattedSemanticGraph,\n nodes: ReadonlyMap<string, LayoutNode>,\n): Map<string, number> => {\n const edgeCountByPort = new Map<string, number>();\n for (const edge of graph.edges) {\n for (const portId of [edge.fromPort, edge.toPort]) {\n if (portId)\n edgeCountByPort.set(portId, (edgeCountByPort.get(portId) ?? 0) + 1);\n }\n }\n\n const offsets = new Map<string, number>();\n for (const layoutNode of nodes.values()) {\n const ports = layoutNode.node.ports\n .filter((port) => edgeCountByPort.has(port.id))\n .sort((left, right) =>\n portSortKey(left, layoutNode.node).localeCompare(\n portSortKey(right, layoutNode.node),\n ),\n );\n const bySide = groupPortsBySide(ports);\n for (const sidePorts of bySide.values()) {\n sidePorts.forEach((port, index) => {\n if (port.side === \"top\" || port.side === \"bottom\") {\n offsets.set(\n port.id,\n ((index + 1) * layoutNode.width) / (sidePorts.length + 1),\n );\n } else {\n offsets.set(\n port.id,\n 60 +\n ((index + 1) * Math.max(24, layoutNode.height - 92)) /\n (sidePorts.length + 1),\n );\n }\n });\n }\n }\n return offsets;\n};\n\nconst groupPortsBySide = (\n ports: ReadonlyArray<VisualPort>,\n): Map<string, VisualPort[]> => {\n const groups = new Map<string, VisualPort[]>();\n for (const port of ports) {\n groups.set(port.side, [...(groups.get(port.side) ?? []), port]);\n }\n return groups;\n};\n\nconst portSortKey = (port: VisualPort, node: VisualNode): string =>\n [\n String(portSidePriority(port.side)).padStart(2, \"0\"),\n String(edgeKindPriority(port.edgeKind)).padStart(2, \"0\"),\n port.id.replace(\n /:(\\d+)(?::|$)/g,\n (_match, index: string) => `:${index.padStart(4, \"0\")}:`,\n ),\n node.id,\n ].join(\":\");\n\nconst portSidePriority = (side: string): number => {\n switch (side) {\n case \"left\":\n return 0;\n case \"right\":\n return 1;\n case \"top\":\n return 2;\n case \"bottom\":\n return 3;\n default:\n return 4;\n }\n};\n\nconst edgeKindPriority = (kind: string | undefined): number => {\n switch (kind) {\n case \"spend\":\n return 0;\n case \"read\":\n return 1;\n case \"collateral\":\n return 2;\n case \"produce\":\n return 3;\n case \"mint\":\n return 4;\n case \"withdraw\":\n return 5;\n case \"certify\":\n return 6;\n case \"sign\":\n return 7;\n default:\n return 8;\n }\n};\n\nconst anchor = (\n edge: VisualEdge,\n endpoint: \"from\" | \"to\",\n node: LayoutNode,\n other: LayoutNode,\n graph: LayoutGraph,\n): Point => {\n const portId = endpoint === \"from\" ? edge.fromPort : edge.toPort;\n const port = portId\n ? node.node.ports.find((candidate) => candidate.id === portId)\n : undefined;\n const offset = portId ? graph.portOffsets.get(portId) : undefined;\n if (port?.side === \"top\") {\n return { x: node.x + (offset ?? node.width / 2), y: node.y };\n }\n if (port?.side === \"bottom\") {\n return { x: node.x + (offset ?? node.width / 2), y: node.y + node.height };\n }\n if (port?.side === \"left\") {\n return { x: node.x, y: node.y + (offset ?? node.height / 2) };\n }\n if (port?.side === \"right\") {\n return { x: node.x + node.width, y: node.y + (offset ?? node.height / 2) };\n }\n\n const nodeCenterX = node.x + node.width / 2;\n const otherCenterX = other.x + other.width / 2;\n return {\n x: otherCenterX >= nodeCenterX ? node.x + node.width : node.x,\n y: node.y + node.height / 2,\n };\n};\n\nconst inflate = (box: Box, padding: number): Box => ({\n x: box.x - padding,\n y: box.y - padding,\n width: box.width + padding * 2,\n height: box.height + padding * 2,\n});\n\nexport const intersects = (left: Box, right: Box): boolean =>\n left.x < right.x + right.width &&\n left.x + left.width > right.x &&\n left.y < right.y + right.height &&\n left.y + left.height > right.y;\n\nconst fit = (value: string, maxChars: number): string =>\n value.length <= maxChars ? value : `${value.slice(0, maxChars - 3)}...`;\n","import type { TxGraphTrace } from \"../model.js\";\nimport {\n visualEdgeStyle,\n type ResolvedVisualRendererOptions,\n} from \"./options.js\";\nimport {\n isScriptInteractionEdge,\n semanticEdgeLabel,\n type FormattedSemanticGraph,\n} from \"./semantic-format.js\";\nimport type { VisualEdge, VisualNode } from \"./semantic.js\";\nimport type { LayoutGraph } from \"./layout.js\";\nimport { edgePath } from \"./layout.js\";\n\nexport const renderEdge = (\n trace: TxGraphTrace,\n edge: VisualEdge,\n index: number,\n graph: LayoutGraph,\n options: ResolvedVisualRendererOptions,\n semanticNodes: ReadonlyMap<string, VisualNode>,\n semantic: FormattedSemanticGraph,\n): string => {\n if (!graph.nodes.has(edge.from) || !graph.nodes.has(edge.to)) return \"\";\n const path = edgePath(edge, graph);\n const style = visualEdgeStyle(edge.kind);\n const scriptFocus =\n options.view === \"scriptInteraction\" &&\n isScriptInteractionEdge(edge, semanticNodes);\n const label = graph.edgeLabels.get(edge.id);\n return [\n `<g data-txg-id=\"${opaqueId(semantic, edge.id)}\" data-txg-type=\"edge\" class=\"txg-edge txg-${edge.kind}\">`,\n `<title>${xmlText(semanticEdgeLabel(trace, edge, options))}</title>`,\n `<path class=\"txg-edge-hit\" d=\"${path}\" fill=\"none\" stroke=\"transparent\" stroke-width=\"12\" pointer-events=\"stroke\"/>`,\n `<path d=\"${path}\" fill=\"none\" stroke=\"${style.color}\" stroke-width=\"${strokeWidth(edge, scriptFocus)}\" marker-end=\"url(#txg-arrow)\"${dashArray(style.style)}/>`,\n label\n ? renderEdgeLabel(\n label.x,\n label.y,\n label.width,\n label.height,\n label.text,\n style.color,\n )\n : \"\",\n \"</g>\",\n ].join(\"\\n\");\n};\n\nconst renderEdgeLabel = (\n x: number,\n y: number,\n width: number,\n height: number,\n label: string,\n color: string,\n): string =>\n [\n `<rect class=\"txg-edge-label\" x=\"${x}\" y=\"${y}\" width=\"${width}\" height=\"${height}\" rx=\"5\" fill=\"#ffffff\" stroke=\"#cbd5e1\"/>`,\n `<text x=\"${x + width / 2}\" y=\"${y + 14}\" text-anchor=\"middle\" font-family=\"Inter, Arial\" font-size=\"10\" font-weight=\"700\" fill=\"${color}\">${xmlText(label)}</text>`,\n ].join(\"\\n\");\n\nconst strokeWidth = (edge: VisualEdge, scriptFocus: boolean): string => {\n if (scriptFocus) return \"2.8\";\n if (edge.kind === \"spend\") return \"2.2\";\n if (edge.kind === \"produce\") return \"1.9\";\n if (edge.kind === \"diagnostic\") return \"2\";\n return \"1.35\";\n};\n\nconst dashArray = (style: \"solid\" | \"dashed\" | \"dotted\"): string =>\n style === \"solid\"\n ? \"\"\n : style === \"dotted\"\n ? ' stroke-dasharray=\"2 4\"'\n : ' stroke-dasharray=\"6 5\"';\n\nconst opaqueId = (graph: FormattedSemanticGraph, id: string): string => {\n const nodeIndex = graph.nodes.findIndex((node) => node.id === id);\n if (nodeIndex >= 0) return `node:${nodeIndex}`;\n const edgeIndex = graph.edges.findIndex((edge) => edge.id === id);\n return edgeIndex >= 0 ? `edge:${edgeIndex}` : id;\n};\n\nconst xmlText = (value: string): string =>\n value.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n","import {\n isGenesisNode,\n semanticChipLabels,\n semanticFieldLabel,\n semanticFieldValue,\n semanticNodeSubtitle,\n semanticNodeTitle,\n visibleSemanticRows,\n visibleSemanticSections,\n type FormattedSemanticGraph,\n} from \"./semantic-format.js\";\nimport {\n visualEdgeStyle,\n type ResolvedVisualRendererOptions,\n} from \"./options.js\";\nimport type { VisualChip, VisualField, VisualNode } from \"./semantic.js\";\nimport type { LayoutGraph, LayoutNode } from \"./layout.js\";\nimport { LEGEND_HEIGHT } from \"./measure.js\";\n\nexport const renderNode = (\n layoutNode: LayoutNode,\n graph: LayoutGraph,\n options: ResolvedVisualRendererOptions,\n index: number,\n semantic: FormattedSemanticGraph,\n): string => {\n switch (layoutNode.node.kind) {\n case \"transaction\":\n return renderTransactionNode(layoutNode, graph, options, index, semantic);\n case \"utxo\":\n return renderUtxoNode(layoutNode, graph, options, index, semantic);\n default:\n return renderGenericNode(layoutNode, graph, options, index, semantic);\n }\n};\n\nexport const renderLegend = (\n graph: LayoutGraph,\n semantic: FormattedSemanticGraph,\n): string => {\n const y = graph.height - LEGEND_HEIGHT + 34;\n const itemWidth = 156;\n const items = edgeLegendItems(semantic);\n const perRow = Math.max(1, Math.floor((graph.width - 80) / itemWidth));\n return [\n `<g class=\"txg-legend\">`,\n `<text x=\"40\" y=\"${y}\" font-family=\"Inter, Arial\" font-size=\"12\" font-weight=\"700\" fill=\"#111827\">Legend</text>`,\n ...items.map(([label, title], index) => {\n const style = visualEdgeStyle(label);\n const x = 40 + (index % perRow) * itemWidth;\n const rowY = y + 24 + Math.floor(index / perRow) * 30;\n return [\n `<g>`,\n `<title>${xmlText(title)}</title>`,\n `<line x1=\"${x}\" y1=\"${rowY}\" x2=\"${x + 30}\" y2=\"${rowY}\" stroke=\"${style.color}\" stroke-width=\"2.2\"${dashArray(style.style)}/>`,\n `<text x=\"${x + 38}\" y=\"${rowY + 4}\" font-family=\"Inter, Arial\" font-size=\"11\" fill=\"#374151\">${label}</text>`,\n `</g>`,\n ].join(\"\\n\");\n }),\n \"</g>\",\n ].join(\"\\n\");\n};\n\nconst edgeLegendItems = (\n semantic: FormattedSemanticGraph,\n): ReadonlyArray<readonly [string, string]> => {\n const present = new Set<string>(semantic.edges.map((edge) => edge.kind));\n const ordered = [\n \"spend\",\n \"read\",\n \"collateral\",\n \"produce\",\n \"mint\",\n \"burn\",\n \"withdraw\",\n \"certify\",\n \"sign\",\n \"collateralReturn\",\n \"diagnostic\",\n \"summary\",\n ].filter((kind) => present.has(kind));\n return (ordered.length > 0 ? ordered : [\"spend\", \"produce\"]).map((kind) => [\n kind,\n edgeLegendTitle(kind),\n ]);\n};\n\nconst edgeLegendTitle = (kind: string): string => {\n switch (kind) {\n case \"spend\":\n return \"Consumes an input UTxO\";\n case \"read\":\n return \"Reads a reference input without consuming it\";\n case \"collateral\":\n return \"Uses collateral for script validation\";\n case \"produce\":\n return \"Creates an output UTxO\";\n case \"mint\":\n return \"Mints assets under a policy\";\n case \"burn\":\n return \"Burns assets under a policy\";\n case \"withdraw\":\n return \"Withdraws staking rewards\";\n case \"certify\":\n return \"Applies a certificate\";\n case \"sign\":\n return \"Requires a signer\";\n case \"collateralReturn\":\n return \"Returns collateral\";\n case \"diagnostic\":\n return \"Warning or error\";\n default:\n return kind;\n }\n};\n\nconst dashArray = (style: \"solid\" | \"dashed\" | \"dotted\"): string =>\n style === \"solid\"\n ? \"\"\n : style === \"dotted\"\n ? ' stroke-dasharray=\"2 4\"'\n : ' stroke-dasharray=\"6 5\"';\n\nconst renderTransactionNode = (\n layoutNode: LayoutNode,\n graph: LayoutGraph,\n options: ResolvedVisualRendererOptions,\n index: number,\n semantic: FormattedSemanticGraph,\n): string => {\n const { node, width, height } = layoutNode;\n const x = layoutNode.x + graph.offsetX;\n const y = layoutNode.y + graph.offsetY;\n const palette = nodePalette(node);\n const title = fit(semanticNodeTitle(node, options), 38);\n const subtitle = semanticNodeSubtitle(node, options);\n const status = node.chips[0]?.label ?? \"tx\";\n const metrics = transactionMetrics(node, options);\n const facts = sectionRows(node, options, \"facts\").slice(0, 4);\n const redeemers = sectionRows(node, options, \"redeemers\").slice(0, 1);\n let cursor = y + 64;\n\n const lines = baseNodeOpen(\n index,\n node,\n semantic,\n options,\n x,\n y,\n width,\n height,\n palette,\n );\n lines.push(\n `<rect x=\"${x}\" y=\"${y}\" width=\"${width}\" height=\"54\" rx=\"8\" fill=\"${palette.header}\"/>`,\n `<text x=\"${x + 14}\" y=\"${y + 21}\" font-family=\"Inter, Arial\" font-size=\"14\" font-weight=\"700\" fill=\"#0f172a\">${xmlText(title)}</text>`,\n `<text x=\"${x + 14}\" y=\"${y + 40}\" font-family=\"ui-monospace, SFMono-Regular, monospace\" font-size=\"10\" fill=\"#475569\">${xmlText(fit(subtitle ?? \"\", 36))}</text>`,\n `<rect x=\"${x + width - 88}\" y=\"${y + 13}\" width=\"72\" height=\"24\" rx=\"12\" fill=\"${statusFill(node)}\" stroke=\"${statusStroke(node)}\"/>`,\n `<text x=\"${x + width - 52}\" y=\"${y + 29}\" text-anchor=\"middle\" font-family=\"Inter, Arial\" font-size=\"10\" font-weight=\"700\" fill=\"${statusText(node)}\">${xmlText(status)}</text>`,\n );\n\n if (metrics.length > 0) {\n lines.push(`<g class=\"txg-metrics\">`);\n metrics.forEach((metric, metricIndex) => {\n const column = metricIndex % 4;\n const row = Math.floor(metricIndex / 4);\n const boxX = x + 14 + column * 74;\n const boxY = cursor + row * 34;\n lines.push(\n `<rect x=\"${boxX}\" y=\"${boxY}\" width=\"66\" height=\"27\" rx=\"6\" fill=\"#f8fafc\" stroke=\"#e5e7eb\"/>`,\n `<text x=\"${boxX + 8}\" y=\"${boxY + 11}\" font-family=\"Inter, Arial\" font-size=\"8\" font-weight=\"700\" fill=\"#64748b\">${xmlText(fit(metric.label, 8))}</text>`,\n `<text x=\"${boxX + 8}\" y=\"${boxY + 23}\" font-family=\"Inter, Arial\" font-size=\"12\" font-weight=\"700\" fill=\"#111827\">${xmlText(metric.value)}</text>`,\n );\n });\n lines.push(`</g>`);\n cursor += Math.ceil(metrics.length / 4) * 34 + 8;\n }\n\n renderRows(lines, x, cursor, width, \"Facts\", [...facts, ...redeemers]);\n lines.push(\"</g>\");\n return lines.join(\"\\n\");\n};\n\nconst renderUtxoNode = (\n layoutNode: LayoutNode,\n graph: LayoutGraph,\n options: ResolvedVisualRendererOptions,\n index: number,\n semantic: FormattedSemanticGraph,\n): string => {\n const { node, width, height } = layoutNode;\n const x = layoutNode.x + graph.offsetX;\n const y = layoutNode.y + graph.offsetY;\n const palette = nodePalette(node);\n const title = fit(semanticNodeTitle(node, options), 34);\n const subtitle = semanticNodeSubtitle(node, options);\n const chips = usefulChips(node, options);\n const assetRows = sectionRows(node, options, \"assets\");\n const stateRows = sectionRows(node, options, \"state\");\n const ownerRows = sectionRows(node, options, \"owner\");\n let cursor = y + 62;\n\n const lines = baseNodeOpen(\n index,\n node,\n semantic,\n options,\n x,\n y,\n width,\n height,\n palette,\n );\n lines.push(\n `<rect x=\"${x}\" y=\"${y}\" width=\"${width}\" height=\"52\" rx=\"8\" fill=\"${palette.header}\"/>`,\n `<text x=\"${x + 14}\" y=\"${y + 21}\" font-family=\"Inter, Arial\" font-size=\"13\" font-weight=\"700\" fill=\"#0f172a\">${xmlText(title)}</text>`,\n `<text x=\"${x + 14}\" y=\"${y + 39}\" font-family=\"ui-monospace, SFMono-Regular, monospace\" font-size=\"10\" fill=\"#475569\">${xmlText(fit(subtitle ?? \"\", 38))}</text>`,\n );\n\n if (chips.length > 0) {\n cursor = renderChips(lines, x + 14, cursor, chips, width - 28) + 8;\n }\n cursor = renderRows(lines, x, cursor, width, \"Value\", assetRows);\n if (stateRows.length > 0) {\n cursor = renderRows(lines, x, cursor + 2, width, \"State\", stateRows);\n }\n if (options.mode !== \"overview\" && ownerRows.length > 0) {\n cursor = renderRows(lines, x, cursor + 2, width, \"Owner\", ownerRows);\n }\n lines.push(\"</g>\");\n return lines.join(\"\\n\");\n};\n\nconst renderGenericNode = (\n layoutNode: LayoutNode,\n graph: LayoutGraph,\n options: ResolvedVisualRendererOptions,\n index: number,\n semantic: FormattedSemanticGraph,\n): string => {\n const { node, width, height } = layoutNode;\n const x = layoutNode.x + graph.offsetX;\n const y = layoutNode.y + graph.offsetY;\n const palette = nodePalette(node);\n const title = fit(semanticNodeTitle(node, options), 34);\n const subtitle = semanticNodeSubtitle(node, options);\n const chips = usefulChips(node, options);\n let cursor = y + 60;\n const lines = baseNodeOpen(\n index,\n node,\n semantic,\n options,\n x,\n y,\n width,\n height,\n palette,\n );\n lines.push(\n `<rect x=\"${x}\" y=\"${y}\" width=\"${width}\" height=\"50\" rx=\"8\" fill=\"${palette.header}\"/>`,\n `<text x=\"${x + 14}\" y=\"${y + 21}\" font-family=\"Inter, Arial\" font-size=\"13\" font-weight=\"700\" fill=\"#0f172a\">${xmlText(title)}</text>`,\n );\n if (subtitle) {\n lines.push(\n `<text x=\"${x + 14}\" y=\"${y + 38}\" font-family=\"ui-monospace, SFMono-Regular, monospace\" font-size=\"10\" fill=\"#475569\">${xmlText(fit(subtitle, 34))}</text>`,\n );\n }\n if (chips.length > 0) {\n cursor = renderChips(lines, x + 14, cursor, chips, width - 28) + 8;\n }\n for (const section of visibleSemanticSections(node, options)) {\n const rows = visibleSemanticRows(section, node, options).map((row) => ({\n ...row,\n label: semanticFieldLabel(row, options),\n value: semanticFieldValue(row, options),\n }));\n if (rows.length === 0) continue;\n cursor = renderRows(lines, x, cursor, width, section.title, rows);\n }\n lines.push(\"</g>\");\n return lines.join(\"\\n\");\n};\n\nconst baseNodeOpen = (\n index: number,\n node: VisualNode,\n semantic: FormattedSemanticGraph,\n options: ResolvedVisualRendererOptions,\n x: number,\n y: number,\n width: number,\n height: number,\n palette: ReturnType<typeof nodePalette>,\n): string[] => [\n `<g id=\"txg-node-${index}\" data-txg-id=\"${opaqueId(semantic, node.id)}\" data-txg-type=\"node\" class=\"txg-node txg-${node.kind}\">`,\n `<title>${xmlText(nodeTitle(node, options))}</title>`,\n `<rect x=\"${x}\" y=\"${y}\" width=\"${width}\" height=\"${height}\" rx=\"8\" fill=\"#ffffff\" stroke=\"${palette.border}\" stroke-width=\"${node.severity ? \"1.8\" : \"1.1\"}\"/>`,\n];\n\nconst renderRows = (\n lines: string[],\n x: number,\n y: number,\n width: number,\n title: string,\n rows: ReadonlyArray<VisualField>,\n): number => {\n if (rows.length === 0) return y;\n lines.push(\n `<line x1=\"${x + 12}\" y1=\"${y - 9}\" x2=\"${x + width - 12}\" y2=\"${y - 9}\" stroke=\"#e5e7eb\"/>`,\n `<text x=\"${x + 14}\" y=\"${y}\" font-family=\"Inter, Arial\" font-size=\"9\" font-weight=\"800\" fill=\"#475569\" letter-spacing=\"0\">${xmlText(title)}</text>`,\n );\n let cursor = y + 19;\n for (const row of rows) {\n const label = fit(row.label, 14);\n const value = fit(row.value, row.mono ? 26 : 24);\n lines.push(\n `<text x=\"${x + 16}\" y=\"${cursor}\" font-family=\"Inter, Arial\" font-size=\"10\" fill=\"#64748b\">${xmlText(label)}</text>`,\n `<text x=\"${x + 118}\" y=\"${cursor}\" font-family=\"${row.mono ? \"ui-monospace, SFMono-Regular, monospace\" : \"Inter, Arial\"}\" font-size=\"10\" fill=\"#111827\">${xmlText(value)}</text>`,\n );\n cursor += 21;\n }\n return cursor + 8;\n};\n\nconst renderChips = (\n lines: string[],\n x: number,\n y: number,\n chips: ReadonlyArray<VisualChip>,\n maxWidth: number,\n): number => {\n let cursorX = x;\n let cursorY = y;\n for (const chip of chips) {\n const label = fit(chip.label, 18);\n const width = Math.max(42, label.length * 6 + 18);\n if (cursorX + width > x + maxWidth) {\n cursorX = x;\n cursorY += 24;\n }\n const palette = chipPalette(chip);\n lines.push(\n `<rect x=\"${cursorX}\" y=\"${cursorY - 13}\" width=\"${width}\" height=\"19\" rx=\"9.5\" fill=\"${palette.fill}\" stroke=\"${palette.stroke}\"/>`,\n `<text x=\"${cursorX + width / 2}\" y=\"${cursorY}\" text-anchor=\"middle\" font-family=\"Inter, Arial\" font-size=\"9\" font-weight=\"700\" fill=\"${palette.text}\">${xmlText(label)}</text>`,\n );\n cursorX += width + 6;\n }\n return cursorY + 10;\n};\n\nconst transactionMetrics = (\n node: VisualNode,\n options: ResolvedVisualRendererOptions,\n): VisualField[] =>\n visibleSemanticSections(node, options)\n .filter((section) =>\n [\"inputs\", \"assets\", \"authority\", \"redeemers\"].includes(section.id),\n )\n .flatMap((section) =>\n visibleSemanticRows(section, node, options).map((row) => ({\n ...row,\n label: metricLabel(row.label),\n })),\n )\n .filter((row) => row.value !== \"0\");\n\nconst sectionRows = (\n node: VisualNode,\n options: ResolvedVisualRendererOptions,\n sectionId: string,\n): VisualField[] =>\n visibleSemanticSections(node, options)\n .find((section) => section.id === sectionId)\n ?.rows.map((row) => ({\n ...row,\n label: semanticFieldLabel(row, options),\n value: semanticFieldValue(row, options),\n })) ?? [];\n\nconst usefulChips = (\n node: VisualNode,\n options: ResolvedVisualRendererOptions,\n): VisualChip[] => {\n const labels = new Set(semanticChipLabels(node, options));\n const chips = node.chips.filter((chip) => {\n if (node.kind === \"utxo\" && chip.label === \"resolved\") return false;\n return labels.has(chip.label);\n });\n if (isGenesisNode(node) && !chips.some((chip) => chip.label === \"genesis\")) {\n return [{ label: \"genesis\", tone: \"warning\" }, ...chips];\n }\n return chips;\n};\n\nconst metricLabel = (label: string): string => {\n switch (label) {\n case \"Mint policies\":\n return \"Mints\";\n case \"Certificates\":\n return \"Certs\";\n case \"Withdrawals\":\n return \"Wdrls\";\n default:\n return label;\n }\n};\n\nconst nodeTitle = (\n node: VisualNode,\n options: ResolvedVisualRendererOptions,\n): string =>\n [\n semanticNodeTitle(node, options),\n semanticNodeSubtitle(node, options),\n ...usefulChips(node, options).map((chip) => chip.label),\n ]\n .filter(Boolean)\n .join(\"\\n\");\n\nconst opaqueId = (graph: FormattedSemanticGraph, id: string): string => {\n const nodeIndex = graph.nodes.findIndex((node) => node.id === id);\n if (nodeIndex >= 0) return `node:${nodeIndex}`;\n const edgeIndex = graph.edges.findIndex((edge) => edge.id === id);\n return edgeIndex >= 0 ? `edge:${edgeIndex}` : id;\n};\n\nconst nodePalette = (\n node: VisualNode,\n): {\n readonly header: string;\n readonly border: string;\n} => {\n if (node.severity === \"error\")\n return { header: \"#fee2e2\", border: \"#dc2626\" };\n if (isGenesisNode(node)) return { header: \"#fef3c7\", border: \"#d97706\" };\n switch (node.kind) {\n case \"transaction\":\n return { header: \"#eef2ff\", border: \"#6366f1\" };\n case \"utxo\":\n return { header: \"#ecfdf5\", border: \"#10b981\" };\n case \"asset\":\n return { header: \"#f5f3ff\", border: \"#7c3aed\" };\n case \"withdrawal\":\n return { header: \"#ecfeff\", border: \"#0891b2\" };\n case \"certificate\":\n return { header: \"#eef2ff\", border: \"#4f46e5\" };\n case \"collateralReturn\":\n return { header: \"#fffbeb\", border: \"#f59e0b\" };\n case \"signer\":\n return { header: \"#f8fafc\", border: \"#94a3b8\" };\n case \"diagnostic\":\n return { header: \"#fef2f2\", border: \"#dc2626\" };\n }\n};\n\nconst chipPalette = (\n chip: VisualChip,\n): {\n readonly fill: string;\n readonly stroke: string;\n readonly text: string;\n} => {\n switch (chip.tone) {\n case \"danger\":\n return { fill: \"#fee2e2\", stroke: \"#fca5a5\", text: \"#991b1b\" };\n case \"warning\":\n return { fill: \"#fef3c7\", stroke: \"#fbbf24\", text: \"#92400e\" };\n case \"success\":\n return { fill: \"#dcfce7\", stroke: \"#86efac\", text: \"#166534\" };\n case \"accent\":\n return { fill: \"#ede9fe\", stroke: \"#c4b5fd\", text: \"#5b21b6\" };\n case \"info\":\n return { fill: \"#dbeafe\", stroke: \"#93c5fd\", text: \"#1e40af\" };\n default:\n return { fill: \"#f8fafc\", stroke: \"#cbd5e1\", text: \"#334155\" };\n }\n};\n\nconst statusFill = (node: VisualNode): string =>\n node.severity === \"error\" ? \"#fee2e2\" : \"#ffffff\";\n\nconst statusStroke = (node: VisualNode): string =>\n node.severity === \"error\" ? \"#fca5a5\" : \"#c7d2fe\";\n\nconst statusText = (node: VisualNode): string =>\n node.severity === \"error\" ? \"#991b1b\" : \"#3730a3\";\n\nconst fit = (value: string, maxChars: number): string =>\n value.length <= maxChars ? value : `${value.slice(0, maxChars - 3)}...`;\n\nconst xmlText = (value: string): string =>\n value.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n","import type { TxGraphTrace } from \"../model.js\";\nimport {\n resolveVisualRendererOptions,\n type VisualRendererOptions,\n} from \"./options.js\";\nimport {\n formatSemanticGraph,\n type FormattedSemanticGraph,\n} from \"./semantic-format.js\";\nimport {\n buildSemanticRenderGraph,\n type SemanticRenderOptions,\n type VisualNode,\n} from \"./semantic.js\";\nimport { renderEdge } from \"./edge-renderer.js\";\nimport { layoutGraph } from \"./layout.js\";\nimport { renderLegend, renderNode } from \"./node-renderer.js\";\n\nexport type TraceToSvgOptions = VisualRendererOptions &\n SemanticRenderOptions & {\n readonly title?: string;\n };\n\nconst MARGIN = 40;\n\nexport const traceToSvg = (\n trace: TxGraphTrace,\n options: TraceToSvgOptions = {},\n): string => {\n const resolved = resolveVisualRendererOptions(options);\n const semantic = formatSemanticGraph(\n buildSemanticRenderGraph(trace, { redeemers: options.redeemers }),\n resolved,\n );\n const layout = layoutGraph(trace, semantic, resolved);\n const title = options.title ?? \"Lucid Evolution Transaction Graph\";\n const diagnostics = semantic.nodes.filter(\n (node) => node.kind === \"diagnostic\",\n );\n const semanticNodes = new Map(\n [...layout.nodes.entries()].map(([id, layoutNode]) => [\n id,\n layoutNode.node,\n ]),\n );\n\n return [\n `<svg xmlns=\"http://www.w3.org/2000/svg\" role=\"img\" width=\"${layout.width}\" height=\"${layout.height}\" viewBox=\"0 0 ${layout.width} ${layout.height}\">`,\n `<title>${xmlText(title)}</title>`,\n \"<defs>\",\n '<marker id=\"txg-arrow\" markerWidth=\"10\" markerHeight=\"10\" refX=\"9\" refY=\"3\" orient=\"auto\" markerUnits=\"strokeWidth\"><path d=\"M0,0 L0,6 L9,3 z\" fill=\"context-stroke\"/></marker>',\n \"</defs>\",\n `<rect width=\"100%\" height=\"100%\" fill=\"#ffffff\"/>`,\n renderTitle(title, trace, diagnostics.length),\n ...semantic.edges.map((edge, index) =>\n renderEdge(trace, edge, index, layout, resolved, semanticNodes, semantic),\n ),\n ...[...layout.nodes.values()]\n .sort((left, right) => left.node.id.localeCompare(right.node.id))\n .map((node, index) =>\n renderNode(node, layout, resolved, index, semantic),\n ),\n renderLegend(layout, semantic),\n \"</svg>\",\n ].join(\"\\n\");\n};\n\nexport const semanticSvgForTesting = (\n trace: TxGraphTrace,\n options: TraceToSvgOptions = {},\n): {\n readonly semantic: FormattedSemanticGraph;\n readonly nodes: VisualNode[];\n} => {\n const resolved = resolveVisualRendererOptions(options);\n const semantic = formatSemanticGraph(\n buildSemanticRenderGraph(trace, { redeemers: options.redeemers }),\n resolved,\n );\n return { semantic, nodes: semantic.nodes };\n};\n\nconst renderTitle = (\n title: string,\n trace: TxGraphTrace,\n diagnosticCount: number,\n): string =>\n [\n `<text x=\"${MARGIN}\" y=\"34\" font-family=\"Inter, Arial\" font-size=\"20\" font-weight=\"700\" fill=\"#111827\">${xmlText(title)}</text>`,\n `<text x=\"${MARGIN}\" y=\"58\" font-family=\"Inter, Arial\" font-size=\"12\" fill=\"#475569\">${trace.transactions.length} transaction${trace.transactions.length === 1 ? \"\" : \"s\"} · ${Object.keys(trace.utxos).length} UTxOs · ${diagnosticCount} diagnostic${diagnosticCount === 1 ? \"\" : \"s\"}</text>`,\n ].join(\"\\n\");\n\nconst xmlText = (value: string): string =>\n value.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n","import type { TxGraphTrace } from \"../model.js\";\nimport { traceToSvg, type TraceToSvgOptions } from \"./svg.js\";\nimport { resolveVisualRendererOptions, visualEdgeStyle } from \"./options.js\";\nimport {\n formatSemanticGraph,\n semanticChipLabels,\n semanticEdgeLabel,\n semanticFieldLabel,\n semanticFieldValue,\n semanticNodeSubtitle,\n semanticNodeTitle,\n visibleSemanticRows,\n visibleSemanticSections,\n} from \"./semantic-format.js\";\nimport {\n buildSemanticRenderGraph,\n type SemanticRenderOptions,\n type VisualEdge,\n type VisualNode,\n} from \"./semantic.js\";\n\nexport type TraceToHtmlOptions = TraceToSvgOptions &\n SemanticRenderOptions & {\n readonly title?: string;\n readonly includeRawMetadata?: boolean;\n };\n\nexport const traceToHtml = (\n trace: TxGraphTrace,\n options: TraceToHtmlOptions = {},\n): string => {\n const resolved = resolveVisualRendererOptions(options);\n const semantic = formatSemanticGraph(\n buildSemanticRenderGraph(trace, { redeemers: options.redeemers }),\n resolved,\n );\n const title = options.title ?? \"Lucid Evolution Transaction Graph\";\n const nodeIds = new Map(\n semantic.nodes.map((node, index) => [node.id, `node:${index}`] as const),\n );\n const metadata = {\n nodes: semantic.nodes.map((node, index) =>\n nodeMetadata(node, index, resolved, options.includeRawMetadata ?? false),\n ),\n edges: semantic.edges.map((edge, index) =>\n edgeMetadata(\n trace,\n edge,\n index,\n nodeIds,\n resolved,\n options.includeRawMetadata ?? false,\n ),\n ),\n };\n const filterKinds = [\n ...new Set(semantic.edges.map((edge) => edge.kind)),\n ].sort();\n\n return [\n \"<!doctype html>\",\n '<html lang=\"en\">',\n \"<head>\",\n '<meta charset=\"utf-8\"/>',\n '<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/>',\n `<title>${htmlText(title)}</title>`,\n `<style>${cssText()}</style>`,\n \"</head>\",\n \"<body>\",\n '<main class=\"txg-shell\">',\n '<aside class=\"txg-sidebar\">',\n `<h1>${htmlText(title)}</h1>`,\n '<input id=\"txg-search\" type=\"search\" placeholder=\"Search tx, UTxO, asset, action...\" autocomplete=\"off\"/>',\n '<div class=\"txg-filters\">',\n ...filterKinds.map(\n (kind) =>\n `<label><input type=\"checkbox\" data-kind=\"${kind}\" checked/> ${kind}</label>`,\n ),\n \"</div>\",\n `<div class=\"txg-sidebar-legend\"><h2>Legend</h2>${edgeLegendHtml(filterKinds)}</div>`,\n '<section id=\"txg-details\" class=\"txg-details\">Select a node or edge.</section>',\n \"</aside>\",\n '<section class=\"txg-canvas\">',\n '<div class=\"txg-toolbar\"><button id=\"txg-zoom-in\">+</button><button id=\"txg-zoom-out\">-</button><button id=\"txg-fit\">Fit</button><button id=\"txg-reset\">Reset</button><label>Inspector <select id=\"txg-detail-mode\"><option value=\"overview\">overview</option><option value=\"audit\" selected>audit</option><option value=\"debug\">debug</option></select></label><button id=\"txg-copy\">Copy JSON</button></div>',\n `<div id=\"txg-viewport\" class=\"txg-viewport\">${traceToSvg(trace, options)}</div>`,\n \"</section>\",\n \"</main>\",\n `<script type=\"application/json\" id=\"txg-data\">${scriptJson(metadata)}</script>`,\n `<script>${clientScript()}</script>`,\n \"</body>\",\n \"</html>\",\n ].join(\"\\n\");\n};\n\nconst nodeMetadata = (\n node: VisualNode,\n index: number,\n resolved: ReturnType<typeof resolveVisualRendererOptions>,\n includeRawMetadata: boolean,\n) => ({\n id: `node:${index}`,\n graphId: includeRawMetadata ? node.id : undefined,\n kind: node.kind,\n title: semanticNodeTitle(node, resolved),\n subtitle: semanticNodeSubtitle(node, resolved),\n chips: semanticChipLabels(node, resolved),\n sections: visibleSemanticSections(node, resolved).map((section) => ({\n title: section.title,\n rows: visibleSemanticRows(section, node, resolved).map((row) => ({\n label: semanticFieldLabel(row, resolved),\n value: semanticFieldValue(row, resolved),\n })),\n })),\n ...(includeRawMetadata ? { rawRef: node.rawRef } : {}),\n});\n\nconst edgeMetadata = (\n trace: TxGraphTrace,\n edge: VisualEdge,\n index: number,\n nodeIds: ReadonlyMap<string, string>,\n resolved: ReturnType<typeof resolveVisualRendererOptions>,\n includeRawMetadata: boolean,\n) => ({\n id: `edge:${index}`,\n graphId: includeRawMetadata ? edge.id : undefined,\n kind: edge.kind,\n title: semanticEdgeLabel(trace, edge, resolved),\n from: includeRawMetadata ? edge.from : nodeIds.get(edge.from),\n to: includeRawMetadata ? edge.to : nodeIds.get(edge.to),\n action: edge.action,\n redeemerKey: edge.redeemerKey,\n ...(includeRawMetadata\n ? { targetRef: edge.targetRef, rawRef: edge.rawRef }\n : {}),\n});\n\nconst edgeLegendHtml = (kinds: ReadonlyArray<string>): string =>\n kinds\n .map((kind) => {\n const style = visualEdgeStyle(kind);\n return [\n '<div class=\"txg-legend-row\">',\n `<svg width=\"42\" height=\"14\" viewBox=\"0 0 42 14\" aria-hidden=\"true\"><line x1=\"2\" y1=\"7\" x2=\"36\" y2=\"7\" stroke=\"${style.color}\" stroke-width=\"2.4\"${htmlDashArray(style.style)}/></svg>`,\n `<span>${htmlText(kind)}</span>`,\n \"</div>\",\n ].join(\"\");\n })\n .join(\"\");\n\nconst htmlDashArray = (style: \"solid\" | \"dashed\" | \"dotted\"): string =>\n style === \"solid\"\n ? \"\"\n : style === \"dotted\"\n ? ' stroke-dasharray=\"2 4\"'\n : ' stroke-dasharray=\"6 5\"';\n\nconst cssText = (): string => `\nhtml, body { height: 100%; }\nbody { margin: 0; overflow: hidden; font-family: Inter, Arial, sans-serif; color: #111827; background: #f8fafc; }\n.txg-shell { display: grid; grid-template-columns: 320px 1fr; height: 100vh; min-height: 0; }\n.txg-sidebar { position: sticky; top: 0; max-height: 100vh; border-right: 1px solid #d1d5db; background: #ffffff; padding: 16px; overflow: auto; }\n.txg-sidebar h1 { font-size: 16px; margin: 0 0 14px; }\n#txg-search { box-sizing: border-box; width: 100%; padding: 8px 10px; border: 1px solid #cbd5e1; border-radius: 6px; }\n.txg-filters { display: grid; grid-template-columns: 1fr 1fr; gap: 6px 10px; margin: 14px 0; font-size: 12px; }\n.txg-sidebar-legend { border-top: 1px solid #e5e7eb; padding-top: 12px; margin-bottom: 12px; }\n.txg-sidebar-legend h2 { font-size: 12px; margin: 0 0 8px; color: #111827; }\n.txg-legend-row { display: inline-flex; align-items: center; gap: 6px; min-width: 132px; margin: 0 6px 6px 0; font-size: 11px; color: #374151; }\n.txg-details { border-top: 1px solid #e5e7eb; padding-top: 12px; font-size: 12px; line-height: 1.45; }\n.txg-details h2 { font-size: 14px; margin: 0 0 8px; }\n.txg-details table { border-collapse: collapse; width: 100%; margin: 8px 0; }\n.txg-details td { border-top: 1px solid #e5e7eb; padding: 4px 0; vertical-align: top; }\n.txg-details td:first-child { color: #64748b; width: 38%; }\n.txg-canvas { display: grid; grid-template-rows: auto 1fr; min-width: 0; min-height: 0; overflow: hidden; }\n.txg-toolbar { display: flex; gap: 8px; padding: 10px; border-bottom: 1px solid #d1d5db; background: #ffffff; }\n.txg-toolbar button { border: 1px solid #cbd5e1; background: #ffffff; border-radius: 6px; padding: 6px 10px; }\n.txg-toolbar label { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: #475569; }\n.txg-toolbar select { border: 1px solid #cbd5e1; border-radius: 6px; padding: 5px 8px; background: #ffffff; }\n.txg-viewport { min-height: 0; overflow: auto; padding: 18px; transform-origin: top left; cursor: grab; }\n.txg-viewport.txg-panning { cursor: grabbing; user-select: none; }\n.txg-viewport svg { background: #ffffff; box-shadow: 0 1px 4px rgba(15, 23, 42, 0.12); }\n.txg-hidden { opacity: 0.08; pointer-events: none; }\n.txg-match rect:first-of-type { stroke-width: 3px; }\n.txg-selected rect:first-of-type { stroke-width: 3px; stroke: #0f172a; }\n.txg-connected path { stroke-width: 3px; }\n.txg-details pre { white-space: pre-wrap; word-break: break-word; background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 6px; padding: 8px; }\n@media (max-width: 800px) { body { overflow: auto; } .txg-shell { grid-template-columns: 1fr; height: auto; min-height: 100vh; } .txg-sidebar { position: static; max-height: none; border-right: 0; border-bottom: 1px solid #d1d5db; } .txg-canvas { min-height: 70vh; } }\n`;\n\nconst clientScript = (): string => `\nconst data = JSON.parse(document.getElementById(\"txg-data\").textContent);\nlet selected = null;\nlet zoom = 1;\nconst viewport = document.getElementById(\"txg-viewport\");\nconst svg = viewport.querySelector(\"svg\");\nconst details = document.getElementById(\"txg-details\");\nconst search = document.getElementById(\"txg-search\");\nconst detailMode = document.getElementById(\"txg-detail-mode\");\nconst checks = [...document.querySelectorAll(\"[data-kind]\")];\nconst byId = new Map([...data.nodes, ...data.edges].map((item) => [item.id, item]));\nconst itemElements = new Map([...document.querySelectorAll(\".txg-node,.txg-edge\")].map((el) => [el.dataset.txgId, el]));\n\nconst setZoom = (nextZoom) => {\n zoom = Math.max(0.25, Math.min(2.5, nextZoom));\n viewport.style.zoom = zoom;\n};\n\nconst itemBox = (item) => {\n const el = item ? itemElements.get(item.id) : null;\n if (!el || !el.getBBox) return null;\n try { return el.getBBox(); } catch (_error) { return null; }\n};\n\nconst centerBox = (box) => {\n if (!box) return;\n viewport.scrollLeft = Math.max(0, (box.x + box.width / 2) * zoom - viewport.clientWidth / 2);\n viewport.scrollTop = Math.max(0, (box.y + box.height / 2) * zoom - viewport.clientHeight / 2);\n};\n\nconst primaryTransaction = () =>\n data.nodes.find((node) => node.kind === \"transaction\" && node.chips?.includes(\"failed\")) ||\n [...data.nodes].reverse().find((node) => node.kind === \"transaction\") ||\n data.nodes[0];\n\nconst fitToView = (overview = false) => {\n if (!svg?.viewBox?.baseVal) return;\n const viewBox = svg.viewBox.baseVal;\n const widthZoom = (viewport.clientWidth - 36) / Math.max(1, viewBox.width);\n const readableFloor = viewport.clientWidth < 720 ? 0.55 : 0.72;\n setZoom(\n overview\n ? Math.min(1, Math.max(0.35, widthZoom))\n : Math.min(1, Math.max(readableFloor, widthZoom)),\n );\n requestAnimationFrame(() => centerBox(itemBox(primaryTransaction())));\n};\n\nconst renderDetails = (item) => {\n selected = item;\n if (!item) { details.textContent = \"Select a node or edge.\"; return; }\n const mode = detailMode.value;\n const summaryRows = [[\"kind\", item.kind], ...(item.subtitle ? [[\"subtitle\", item.subtitle]] : []), ...(item.chips?.length ? [[\"tags\", item.chips.join(\", \")]] : [])];\n const auditRows = item.sections ? item.sections.flatMap((section) => section.rows.map((row) => [section.title + \".\" + row.label, row.value])) : Object.entries(item).filter(([key]) => ![\"sections\"].includes(key)).map(([key, value]) => [key, typeof value === \"string\" ? value : JSON.stringify(value)]);\n if (mode === \"debug\") {\n details.innerHTML = \"<h2>\" + escapeHtml(item.title || item.id) + \"</h2><pre>\" + escapeHtml(JSON.stringify(item, null, 2)) + \"</pre>\";\n return;\n }\n const rows = mode === \"overview\" ? summaryRows : [...summaryRows, ...auditRows];\n details.innerHTML = \"<h2>\" + escapeHtml(item.title || item.id) + \"</h2>\" + \"<table>\" + rows.map(([key, value]) => \"<tr><td>\" + escapeHtml(String(key)) + \"</td><td>\" + escapeHtml(String(value)) + \"</td></tr>\").join(\"\") + \"</table>\";\n};\n\nconst textFor = (item) => JSON.stringify(item).toLowerCase();\nconst applyFilters = () => {\n const query = search.value.toLowerCase();\n const enabled = new Set(checks.filter((check) => check.checked).map((check) => check.dataset.kind));\n const visibleEdgeIds = new Set(data.edges.filter((edge) => enabled.has(edge.kind) && (!query || textFor(edge).includes(query))).map((edge) => edge.id));\n const matchingNodeIds = new Set(data.nodes.filter((node) => query && textFor(node).includes(query)).map((node) => node.id));\n document.querySelectorAll(\".txg-edge\").forEach((edge) => {\n edge.classList.toggle(\"txg-hidden\", !visibleEdgeIds.has(edge.dataset.txgId));\n });\n document.querySelectorAll(\".txg-node\").forEach((node) => {\n node.classList.toggle(\"txg-match\", matchingNodeIds.has(node.dataset.txgId));\n });\n};\n\ndocument.querySelectorAll(\".txg-node,.txg-edge\").forEach((el) => {\n el.addEventListener(\"click\", () => {\n const item = byId.get(el.dataset.txgId) || null;\n renderDetails(item);\n document.querySelectorAll(\".txg-selected,.txg-connected\").forEach((candidate) => candidate.classList.remove(\"txg-selected\", \"txg-connected\"));\n el.classList.add(\"txg-selected\");\n if (item?.from) itemElements.get(item.from)?.classList.add(\"txg-connected\");\n if (item?.to) itemElements.get(item.to)?.classList.add(\"txg-connected\");\n if (item?.id?.startsWith(\"node:\")) {\n data.edges.filter((edge) => edge.from === item.id || edge.to === item.id).forEach((edge) => itemElements.get(edge.id)?.classList.add(\"txg-connected\"));\n }\n });\n});\nsearch.addEventListener(\"input\", applyFilters);\nchecks.forEach((check) => check.addEventListener(\"change\", applyFilters));\ndetailMode.addEventListener(\"change\", () => renderDetails(selected));\ndocument.getElementById(\"txg-zoom-in\").addEventListener(\"click\", () => setZoom(zoom + 0.1));\ndocument.getElementById(\"txg-zoom-out\").addEventListener(\"click\", () => setZoom(zoom - 0.1));\ndocument.getElementById(\"txg-fit\").addEventListener(\"click\", () => fitToView(true));\ndocument.getElementById(\"txg-reset\").addEventListener(\"click\", () => { search.value = \"\"; checks.forEach((check) => check.checked = true); applyFilters(); fitToView(false); });\ndocument.getElementById(\"txg-copy\").addEventListener(\"click\", async () => { if (selected) await navigator.clipboard.writeText(JSON.stringify(selected, null, 2)); });\n\nlet panStart = null;\nviewport.addEventListener(\"pointerdown\", (event) => {\n if (event.target.closest(\".txg-node,.txg-edge\")) return;\n panStart = { x: event.clientX, y: event.clientY, left: viewport.scrollLeft, top: viewport.scrollTop };\n viewport.classList.add(\"txg-panning\");\n viewport.setPointerCapture(event.pointerId);\n});\nviewport.addEventListener(\"pointermove\", (event) => {\n if (!panStart) return;\n viewport.scrollLeft = panStart.left - (event.clientX - panStart.x);\n viewport.scrollTop = panStart.top - (event.clientY - panStart.y);\n});\nviewport.addEventListener(\"pointerup\", (event) => {\n panStart = null;\n viewport.classList.remove(\"txg-panning\");\n viewport.releasePointerCapture(event.pointerId);\n});\nwindow.addEventListener(\"resize\", () => fitToView(false));\nrequestAnimationFrame(() => fitToView(false));\n\nconst escapeHtml = (value) => value.replace(/[&<>\"]/g, (char) => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", \"\\\\\"\": \"&quot;\" }[char]));\n`;\n\nconst htmlText = (value: string): string =>\n value.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n\nconst scriptJson = (value: unknown): string =>\n JSON.stringify(value)\n .replace(/</g, \"\\\\u003c\")\n .replace(/>/g, \"\\\\u003e\")\n .replace(/&/g, \"\\\\u0026\")\n .replace(/\\u2028/g, \"\\\\u2028\")\n .replace(/\\u2029/g, \"\\\\u2029\");\n","import type { TxGraphTrace } from \"../model.js\";\nimport { buildRenderGraph, edgeStyle, type RenderNode } from \"./common.js\";\nimport {\n resolveVisualRendererOptions,\n visualEdgeStyle,\n type ResolvedVisualRendererOptions,\n type VisualRendererOptions,\n} from \"./options.js\";\nimport {\n formatSemanticGraph,\n isGenesisNode,\n isScriptInteractionEdge,\n semanticChipLabels,\n semanticEdgeLabel,\n semanticFieldLabel,\n semanticFieldValue,\n semanticNodeTitle,\n semanticNodeSubtitle,\n visibleSemanticRows,\n visibleSemanticSections,\n} from \"./semantic-format.js\";\nimport {\n buildSemanticRenderGraph,\n type SemanticRenderOptions,\n type VisualField,\n type VisualNode,\n type VisualSection,\n} from \"./semantic.js\";\n\nexport type TraceToMermaidOptions = VisualRendererOptions &\n SemanticRenderOptions & {\n readonly direction?: \"LR\" | \"TD\";\n readonly legacy?: boolean;\n };\n\nexport const traceToMermaid = (\n trace: TxGraphTrace,\n options: TraceToMermaidOptions = {},\n): string => {\n if (options.legacy) return traceToLegacyMermaid(trace, options);\n\n const resolved = resolveVisualRendererOptions(options);\n const graph = formatSemanticGraph(\n buildSemanticRenderGraph(trace, {\n redeemers: options.redeemers,\n }),\n resolved,\n );\n const nodeIds = new Map(\n graph.nodes.map((node, index) => [node.id, `n${index}`] as const),\n );\n const semanticNodes = new Map(\n graph.nodes.map((node) => [node.id, node] as const),\n );\n const lines = [\n `flowchart ${options.direction ?? \"LR\"}`,\n \" classDef tx fill:#eef2ff,stroke:#6366f1,color:#111827;\",\n \" classDef utxo fill:#ecfdf5,stroke:#10b981,color:#111827;\",\n \" classDef asset fill:#f5f3ff,stroke:#7c3aed,color:#111827;\",\n \" classDef authority fill:#f3f4f6,stroke:#6b7280,color:#111827;\",\n \" classDef governance fill:#eef2ff,stroke:#4f46e5,color:#111827;\",\n \" classDef collateral fill:#fffbeb,stroke:#f59e0b,color:#111827;\",\n \" classDef unresolved fill:#fee2e2,stroke:#dc2626,color:#111827;\",\n \" classDef genesis fill:#fef3c7,stroke:#d97706,color:#111827;\",\n ];\n const linkStyles: string[] = [];\n\n for (const node of graph.nodes) {\n const id = nodeIds.get(node.id)!;\n lines.push(` ${id}${semanticNodeShape(node, resolved)}`);\n lines.push(` class ${id} ${semanticNodeClass(node)};`);\n }\n\n for (const [index, edge] of graph.edges.entries()) {\n const style = visualEdgeStyle(edge.kind);\n const scriptFocus =\n resolved.view === \"scriptInteraction\" &&\n isScriptInteractionEdge(edge, semanticNodes);\n lines.push(\n ` ${nodeIds.get(edge.from)} -->|${mermaidText(\n semanticEdgeLabel(trace, edge, resolved),\n )}| ${nodeIds.get(edge.to)}`,\n );\n linkStyles.push(\n ` linkStyle ${index} stroke:${style.color},color:${style.color}${\n scriptFocus ? \",stroke-width:3px\" : \"\"\n }${style.style === \"solid\" ? \"\" : \",stroke-dasharray: 5 5\"};`,\n );\n }\n\n return `${[...lines, ...linkStyles].join(\"\\n\")}\\n`;\n};\n\nconst semanticNodeShape = (\n node: VisualNode,\n options: ResolvedVisualRendererOptions,\n): string => {\n const label = mermaidText(semanticNodeLabel(node, options));\n switch (node.kind) {\n case \"transaction\":\n return `[\"${label}\"]`;\n case \"utxo\":\n return node.severity === \"error\" ? `{{\"${label}\"}}` : `(\"${label}\")`;\n case \"asset\":\n return `([\"${label}\"])`;\n case \"signer\":\n return `{{\"${label}\"}}`;\n case \"withdrawal\":\n case \"certificate\":\n case \"collateralReturn\":\n case \"diagnostic\":\n return `[\"${label}\"]`;\n }\n};\n\nconst semanticNodeLabel = (\n node: VisualNode,\n options: ResolvedVisualRendererOptions,\n): string => {\n const subtitle = semanticNodeSubtitle(node, options);\n const chipLabels = semanticChipLabels(node, options);\n const chips = chipLabels.length > 0 ? chipLabels.join(\" | \") : undefined;\n return [\n semanticNodeTitle(node, options),\n ...(subtitle ? [subtitle] : []),\n ...(chips ? [chips] : []),\n ...visibleSemanticSections(node, options)\n .map((section) => mermaidSectionLine(section, node, options))\n .filter((line): line is string => Boolean(line)),\n ].join(\"<br/>\");\n};\n\nconst mermaidSectionLine = (\n section: VisualSection,\n node: VisualNode,\n options: ResolvedVisualRendererOptions,\n): string | undefined => {\n const rows = visibleSemanticRows(section, node, options);\n if (rows.length === 0) return undefined;\n return `${section.title}: ${rows\n .map((row) => mermaidRowText(section, row, options))\n .join(\", \")}`;\n};\n\nconst mermaidRowText = (\n section: VisualSection,\n row: VisualField,\n options: ResolvedVisualRendererOptions,\n): string => {\n const value = semanticFieldValue(row, options);\n return section.id === \"assets\" && row.id.startsWith(\"asset:\")\n ? `${value} ${semanticFieldLabel(row, options)}`\n : `${semanticFieldLabel(row, options)} ${value}`;\n};\n\nconst semanticNodeClass = (node: VisualNode): string => {\n if (node.severity === \"error\") return \"unresolved\";\n if (isGenesisNode(node)) return \"genesis\";\n if (node.rawRef.type === \"diagnostic\" && node.rawRef.code === \"collapsed\") {\n return \"authority\";\n }\n switch (node.kind) {\n case \"transaction\":\n return \"tx\";\n case \"utxo\":\n return \"utxo\";\n case \"asset\":\n return \"asset\";\n case \"withdrawal\":\n case \"signer\":\n return \"authority\";\n case \"certificate\":\n return \"governance\";\n case \"collateralReturn\":\n return \"collateral\";\n case \"diagnostic\":\n return \"unresolved\";\n }\n};\n\nconst traceToLegacyMermaid = (\n trace: TxGraphTrace,\n options: TraceToMermaidOptions = {},\n): string => {\n const graph = buildRenderGraph(trace);\n const nodeIds = new Map(\n graph.nodes.map((node, index) => [node.id, `n${index}`] as const),\n );\n const lines = [\n `flowchart ${options.direction ?? \"LR\"}`,\n \" classDef tx fill:#eef2ff,stroke:#6366f1,color:#111827;\",\n \" classDef utxo fill:#ecfdf5,stroke:#10b981,color:#111827;\",\n \" classDef unresolved fill:#fee2e2,stroke:#dc2626,color:#111827;\",\n \" classDef genesis fill:#fef3c7,stroke:#d97706,color:#111827;\",\n \" classDef external fill:#f9fafb,stroke:#9ca3af,color:#111827;\",\n ];\n\n for (const node of graph.nodes) {\n lines.push(` ${nodeIds.get(node.id)}${legacyNodeShape(node)}`);\n lines.push(\n ` class ${nodeIds.get(node.id)} ${\n node.unresolved\n ? \"unresolved\"\n : node.genesis\n ? \"genesis\"\n : legacyNodeClass(node)\n };`,\n );\n }\n\n for (const edge of graph.edges) {\n const style = edgeStyle(edge.kind);\n lines.push(\n ` ${nodeIds.get(edge.from)} -->|${mermaidText(style.label)}| ${nodeIds.get(\n edge.to,\n )}`,\n );\n }\n\n return `${lines.join(\"\\n\")}\\n`;\n};\n\nconst legacyNodeShape = (node: RenderNode): string => {\n const label = mermaidText(node.label);\n switch (node.kind) {\n case \"transaction\":\n return `[\"${label}\"]`;\n case \"utxo\":\n return node.unresolved ? `{{\"${label}\"}}` : `(\"${label}\")`;\n case \"asset\":\n return `([\"${label}\"])`;\n case \"signer\":\n return `{{\"${label}\"}}`;\n case \"withdrawal\":\n case \"certificate\":\n case \"collateralReturn\":\n case \"external\":\n return `[\"${label}\"]`;\n }\n};\n\nconst legacyNodeClass = (node: RenderNode): string =>\n node.kind === \"transaction\"\n ? \"tx\"\n : node.kind === \"utxo\"\n ? \"utxo\"\n : \"external\";\n\nconst mermaidText = (value: string): string =>\n value\n .replace(/\\\\n/g, \"<br/>\")\n .replace(/\\n/g, \"<br/>\")\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\"/g, \"'\")\n .replace(/\\|/g, \"/\");\n","import type {\n EvalRedeemer,\n Provider,\n Transaction,\n UTxO,\n} from \"@lucid-evolution/core-types\";\nimport type { TxGraph } from \"./graph.js\";\nimport type { TraceEvaluationRedeemer, TraceWarning } from \"./model.js\";\n\nexport type TxGraphProviderWrapperOptions = {\n readonly submitLabel?: string;\n readonly evaluateLabel?: string;\n readonly recordEvaluate?: boolean;\n};\n\nexport const wrapProvider = (\n provider: Provider,\n graph: TxGraph,\n options: TxGraphProviderWrapperOptions = {},\n): Provider => {\n graph.resolveWith((outRefs) => provider.getUtxosByOutRef(outRefs));\n\n return new Proxy(provider, {\n get(target, property, receiver) {\n if (property === \"submitTx\") {\n return (tx: Transaction) => submitTx(target, graph, tx, options);\n }\n if (property === \"evaluateTx\") {\n return (tx: Transaction, additionalUTxOs?: UTxO[]) =>\n evaluateTx(target, graph, tx, additionalUTxOs, options);\n }\n const value = Reflect.get(target, property, receiver);\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n};\n\nconst submitTx = async (\n provider: Provider,\n graph: TxGraph,\n tx: Transaction,\n options: TxGraphProviderWrapperOptions,\n): Promise<string> => {\n const parsed = await graph.record(tx, {\n label: options.submitLabel,\n status: \"signed\",\n });\n\n try {\n const txHash = await provider.submitTx(tx);\n await recordSubmitted(graph, tx, options.submitLabel, parsed.hash);\n if (txHash !== parsed.hash) {\n graph.addWarning({\n code: \"provider-tx-hash-mismatch\",\n message: `Provider returned transaction hash ${txHash}, but the submitted body hashes to ${parsed.hash}`,\n txHash: parsed.hash,\n });\n }\n return txHash;\n } catch (error) {\n await recordFailed(graph, tx, options.submitLabel, error);\n throw error;\n }\n};\n\nconst evaluateTx = async (\n provider: Provider,\n graph: TxGraph,\n tx: Transaction,\n additionalUTxOs: UTxO[] | undefined,\n options: TxGraphProviderWrapperOptions,\n): Promise<EvalRedeemer[]> => {\n if (options.recordEvaluate === false) {\n return provider.evaluateTx(tx, additionalUTxOs);\n }\n\n if (additionalUTxOs && additionalUTxOs.length > 0) {\n graph.addResolvedUtxos(additionalUTxOs);\n }\n await graph.record(tx, {\n label: options.evaluateLabel,\n status: \"built\",\n });\n\n try {\n const evaluation = await provider.evaluateTx(tx, additionalUTxOs);\n await recordEvaluation(graph, tx, options.evaluateLabel, evaluation);\n return evaluation;\n } catch (error) {\n await recordFailed(graph, tx, options.evaluateLabel, error);\n throw error;\n }\n};\n\nconst recordSubmitted = async (\n graph: TxGraph,\n tx: Transaction,\n label: string | undefined,\n txHash: string,\n): Promise<void> => {\n try {\n await graph.record(tx, { label, status: \"submitted\" });\n } catch (error) {\n graph.addWarning(\n traceRecordWarning(\"trace-submit-record-error\", txHash, error),\n );\n }\n};\n\nconst recordEvaluation = async (\n graph: TxGraph,\n tx: Transaction,\n label: string | undefined,\n evaluation: ReadonlyArray<EvalRedeemer>,\n): Promise<void> => {\n try {\n await graph.record(tx, {\n label,\n status: \"built\",\n evaluation: evaluation.map(traceEvaluationRedeemer),\n });\n } catch (error) {\n graph.addWarning(\n traceRecordWarning(\"trace-evaluate-record-error\", undefined, error),\n );\n }\n};\n\nconst recordFailed = async (\n graph: TxGraph,\n tx: Transaction,\n label: string | undefined,\n error: unknown,\n): Promise<void> => {\n try {\n await graph.record(tx, {\n label,\n status: \"failed\",\n failureMessage: errorMessage(error),\n });\n } catch {\n // Preserve the provider's original error.\n }\n};\n\nconst traceEvaluationRedeemer = (\n redeemer: EvalRedeemer,\n): TraceEvaluationRedeemer => ({\n tag: redeemer.redeemer_tag,\n redeemerIndex: redeemer.redeemer_index,\n exUnits: {\n mem: redeemer.ex_units.mem.toString(),\n steps: redeemer.ex_units.steps.toString(),\n },\n});\n\nconst traceRecordWarning = (\n code: string,\n txHash: string | undefined,\n error: unknown,\n): TraceWarning => ({\n code,\n message: errorMessage(error),\n ...(txHash ? { txHash } : {}),\n});\n\nconst errorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error);\n","import type { Provider, UTxO } from \"@lucid-evolution/core-types\";\nimport type { TxGraphTagger } from \"./labels.js\";\nimport type {\n TraceAliases,\n TraceEdge,\n TraceEdgeKind,\n TraceEvaluationRedeemer,\n TraceOutRef,\n TraceStatus,\n TraceTransaction,\n TraceUtxo,\n TraceWarning,\n TxGraphTrace,\n} from \"./model.js\";\nimport {\n parseTransaction,\n type ParseTransactionOptions,\n type TxGraphTransactionInput,\n} from \"./parse.js\";\nimport {\n createResolutionCache,\n outRefKey,\n type TxGraphResolutionProvider,\n type TxGraphUtxoResolver,\n} from \"./resolve.js\";\nimport { traceToDot, type TraceToDotOptions } from \"./render/dot.js\";\nimport { traceToHtml, type TraceToHtmlOptions } from \"./render/html.js\";\nimport {\n traceToMermaid,\n type TraceToMermaidOptions,\n} from \"./render/mermaid.js\";\nimport { traceToSvg, type TraceToSvgOptions } from \"./render/svg.js\";\nimport {\n buildSemanticRenderGraph,\n type SemanticRenderGraph,\n type SemanticRenderOptions,\n} from \"./render/semantic.js\";\nimport {\n wrapProvider as wrapTxGraphProvider,\n type TxGraphProviderWrapperOptions,\n} from \"./provider-wrapper.js\";\n\nexport type CreateTxGraphOptions = {\n readonly provider?: TxGraphResolutionProvider;\n readonly resolver?: TxGraphUtxoResolver;\n readonly labels?: ReadonlyArray<TxGraphTagger>;\n readonly assets?: Record<string, string>;\n readonly addresses?: Record<string, string>;\n readonly aliases?: Partial<TraceAliases>;\n readonly createdAt?: string;\n};\n\nexport type TxGraphRecordOptions = ParseTransactionOptions & {\n readonly status?: TraceStatus;\n readonly failureMessage?: string;\n readonly evaluation?: ReadonlyArray<TraceEvaluationRedeemer>;\n};\n\nexport type TxGraph = {\n record: (\n tx: TxGraphTransactionInput,\n options?: TxGraphRecordOptions,\n ) => Promise<TraceTransaction>;\n recordCbor: (\n cbor: string,\n options?: TxGraphRecordOptions,\n ) => Promise<TraceTransaction>;\n addResolvedUtxos: (utxos: ReadonlyArray<UTxO | TraceUtxo>) => void;\n resolveWith: (resolver: TxGraphUtxoResolver) => void;\n addWarning: (warning: TraceWarning) => void;\n wrapProvider: (\n provider: Provider,\n options?: TxGraphProviderWrapperOptions,\n ) => Provider;\n toJSON: () => TxGraphTrace;\n toSemantic: (options?: SemanticRenderOptions) => SemanticRenderGraph;\n toDot: (options?: TraceToDotOptions) => string;\n toHtml: (options?: TraceToHtmlOptions) => string;\n toMermaid: (options?: TraceToMermaidOptions) => string;\n toSvg: (options?: TraceToSvgOptions) => string;\n};\n\nexport const createTxGraph = (options: CreateTxGraphOptions = {}): TxGraph => {\n const transactions: TraceTransaction[] = [];\n const preloadedUtxos: Array<UTxO | TraceUtxo> = [];\n let utxos = new Map<string, TraceUtxo>();\n let edges: TraceEdge[] = [];\n let warnings: TraceWarning[] = [];\n let spentBy = new Map<string, string>();\n let resolutionCache = createResolutionCache();\n const externalWarnings: TraceWarning[] = [];\n const resolvers: TxGraphUtxoResolver[] = options.resolver\n ? [options.resolver]\n : [];\n const aliases: TraceAliases = {\n assets: sortRecord({\n ...(options.aliases?.assets ?? {}),\n ...(options.assets ?? {}),\n }),\n addresses: sortRecord({\n ...(options.aliases?.addresses ?? {}),\n ...(options.addresses ?? {}),\n }),\n };\n const taggers = [...(options.labels ?? [])];\n\n const graph: TxGraph = {\n record: async (input, recordOptions = {}) => {\n const parsed = parseTransaction(input, recordOptions);\n const nextTransaction = withFailureMessage(parsed, recordOptions);\n const existingIndex = transactions.findIndex(\n (transaction) => transaction.hash === nextTransaction.hash,\n );\n const transaction =\n existingIndex >= 0\n ? mergeRecordedTransaction(\n transactions[existingIndex],\n nextTransaction,\n )\n : nextTransaction;\n\n if (existingIndex >= 0) {\n transactions[existingIndex] = transaction;\n await rebuildTrace();\n } else {\n transactions.push(transaction);\n await appendTransactionToTrace(transaction);\n }\n return jsonClone(transaction);\n },\n recordCbor: async (cbor, recordOptions = {}) =>\n graph.record(cbor, recordOptions),\n addResolvedUtxos: (resolvedUtxos) => {\n preloadedUtxos.push(...resolvedUtxos);\n resolutionCache.addResolvedUtxos(resolvedUtxos);\n },\n resolveWith: (resolver) => {\n resolvers.push(resolver);\n },\n addWarning: (warning) => {\n externalWarnings.push(jsonClone(warning));\n },\n wrapProvider: (provider, wrapperOptions = {}) =>\n wrapTxGraphProvider(provider, graph, wrapperOptions),\n toJSON: () => {\n const trace: TxGraphTrace = {\n version: 1,\n ...(options.createdAt ? { createdAt: options.createdAt } : {}),\n transactions: transactions.map(jsonClone),\n utxos: sortedUtxoRecord(utxos),\n edges: sortedEdges(edges),\n warnings: [...warnings, ...externalWarnings].map(jsonClone),\n aliases,\n };\n return jsonClone(trace);\n },\n toSemantic: (renderOptions = {}) =>\n buildSemanticRenderGraph(graph.toJSON(), renderOptions),\n toDot: (renderOptions = {}) => traceToDot(graph.toJSON(), renderOptions),\n toHtml: (renderOptions = {}) => traceToHtml(graph.toJSON(), renderOptions),\n toMermaid: (renderOptions = {}) =>\n traceToMermaid(graph.toJSON(), renderOptions),\n toSvg: (renderOptions = {}) => traceToSvg(graph.toJSON(), renderOptions),\n };\n\n const rebuildTrace = async (): Promise<void> => {\n utxos = new Map<string, TraceUtxo>();\n edges = [];\n warnings = [];\n spentBy = new Map<string, string>();\n resolutionCache = createResolutionCache();\n resolutionCache.addResolvedUtxos(preloadedUtxos);\n\n for (const transaction of transactions) {\n await appendTransactionToTrace(transaction);\n }\n };\n\n const appendTransactionToTrace = async (\n transaction: TraceTransaction,\n ): Promise<void> => {\n await resolveTransactionInputs(transaction);\n recordDoubleSpends(transaction);\n addProducedOutputs(transaction);\n addEdges(transaction);\n if (transaction.status === \"failed\") {\n warnings.push({\n code: \"failed-transaction\",\n message:\n transaction.failureMessage ??\n `Transaction ${transaction.hash} was recorded as failed`,\n txHash: transaction.hash,\n });\n }\n };\n\n const resolveTransactionInputs = async (\n transaction: TraceTransaction,\n ): Promise<void> => {\n const allInputs = [\n ...transaction.inputs,\n ...transaction.referenceInputs,\n ...transaction.collateralInputs,\n ];\n if (allInputs.length === 0) return;\n\n const resolution = await resolutionCache.resolveOutRefs(allInputs, {\n provider: options.provider,\n resolver: resolvers.length > 0 ? resolveWithUserResolvers : undefined,\n });\n for (const warning of resolution.warnings) {\n warnings.push({ ...warning, txHash: transaction.hash });\n }\n for (const utxo of resolution.utxos) {\n setInputUtxo(tagUtxo(utxo, \"input\", transaction));\n }\n\n const resolvedByKey = new Map(\n resolution.utxos.map((utxo) => [outRefKey(utxo), utxo] as const),\n );\n warnUnresolvedInputs(\n transaction,\n \"spend\",\n transaction.inputs,\n resolvedByKey,\n );\n warnUnresolvedInputs(\n transaction,\n \"reference\",\n transaction.referenceInputs,\n resolvedByKey,\n );\n warnUnresolvedInputs(\n transaction,\n \"collateral\",\n transaction.collateralInputs,\n resolvedByKey,\n );\n };\n\n const resolveWithUserResolvers: TxGraphUtxoResolver = async (outRefs) => {\n const resolved: Array<UTxO | TraceUtxo> = [];\n let missing = [...outRefs];\n for (const resolver of resolvers) {\n if (missing.length === 0) break;\n const resolverUtxos = await resolver(missing);\n resolved.push(...resolverUtxos);\n const resolvedKeys = new Set(resolverUtxos.map(outRefKey));\n missing = missing.filter(\n (outRef) => !resolvedKeys.has(outRefKey(outRef)),\n );\n }\n return resolved;\n };\n\n const addProducedOutputs = (transaction: TraceTransaction): void => {\n const outputs = transaction.outputs.map((utxo) =>\n tagUtxo(utxo, \"output\", transaction),\n );\n for (const utxo of outputs) {\n utxos.set(outRefKey(utxo), jsonClone(utxo));\n }\n if (transaction.status !== \"failed\") {\n resolutionCache.addTransactionOutputs({ outputs });\n }\n updateStoredTransactionOutputs(transaction.hash, outputs);\n };\n\n const recordDoubleSpends = (transaction: TraceTransaction): void => {\n if (transaction.status === \"failed\") return;\n const seenInTx = new Set<string>();\n for (const input of transaction.inputs) {\n const key = outRefKey(input);\n const previousTxHash = seenInTx.has(key)\n ? transaction.hash\n : spentBy.get(key);\n if (previousTxHash) {\n warnings.push({\n code: \"duplicate-spend\",\n message:\n previousTxHash === transaction.hash\n ? `Transaction ${transaction.hash} spends ${key} more than once`\n : `Transaction ${transaction.hash} spends ${key}, already spent by ${previousTxHash}`,\n txHash: transaction.hash,\n outRef: input,\n });\n }\n seenInTx.add(key);\n if (!spentBy.has(key)) spentBy.set(key, transaction.hash);\n }\n };\n\n const setInputUtxo = (utxo: TraceUtxo): void => {\n const key = outRefKey(utxo);\n const existing = utxos.get(key);\n if (\n existing?.resolution === \"resolved\" &&\n utxo.resolution === \"unresolved\"\n ) {\n return;\n }\n utxos.set(key, jsonClone(utxo));\n };\n\n const warnUnresolvedInputs = (\n transaction: TraceTransaction,\n kind: \"spend\" | \"reference\" | \"collateral\",\n inputs: ReadonlyArray<TraceOutRef>,\n resolvedByKey: ReadonlyMap<string, TraceUtxo>,\n ): void => {\n for (const input of inputs) {\n const resolved = resolvedByKey.get(outRefKey(input));\n if (resolved?.resolution !== \"unresolved\") continue;\n warnings.push({\n code: `unresolved-${kind}-input`,\n message: `Transaction ${transaction.hash} has unresolved ${kind} input ${outRefKey(input)} (${resolved.unresolvedReason ?? \"unresolved\"})`,\n txHash: transaction.hash,\n outRef: input,\n });\n }\n };\n\n const addEdges = (transaction: TraceTransaction): void => {\n addInputEdges(\"spends\", transaction.inputs, transaction);\n addInputEdges(\"reads\", transaction.referenceInputs, transaction);\n addInputEdges(\"collateral\", transaction.collateralInputs, transaction);\n for (const output of transaction.outputs) {\n edges.push({\n kind: \"produces\",\n from: txNodeId(transaction.hash),\n to: utxoNodeId(output),\n });\n }\n if (transaction.collateralReturn) {\n edges.push({\n kind: \"collateralReturn\",\n from: txNodeId(transaction.hash),\n to: collateralReturnNodeId(transaction.hash),\n });\n }\n addAssetEdges(\"mints\", transaction.hash, transaction.mintedAssets);\n addAssetEdges(\"burns\", transaction.hash, transaction.burnedAssets);\n for (const withdrawal of transaction.withdrawals) {\n edges.push({\n kind: \"withdraws\",\n from: withdrawalNodeId(withdrawal.rewardAddress),\n to: txNodeId(transaction.hash),\n });\n }\n for (const certificate of transaction.certificates) {\n edges.push({\n kind: \"certifies\",\n from: txNodeId(transaction.hash),\n to: certificateNodeId(transaction.hash, certificate.index),\n });\n }\n for (const signer of transaction.requiredSigners) {\n edges.push({\n kind: \"requiresSigner\",\n from: signerNodeId(signer),\n to: txNodeId(transaction.hash),\n });\n }\n };\n\n const addInputEdges = (\n kind: Extract<TraceEdgeKind, \"spends\" | \"reads\" | \"collateral\">,\n inputs: ReadonlyArray<TraceOutRef>,\n transaction: TraceTransaction,\n ): void => {\n for (const input of inputs) {\n edges.push({\n kind,\n from: utxoNodeId(input),\n to: txNodeId(transaction.hash),\n });\n }\n };\n\n const addAssetEdges = (\n kind: Extract<TraceEdgeKind, \"mints\" | \"burns\">,\n txHash: string,\n assets: Record<string, string>,\n ): void => {\n for (const unit of Object.keys(assets).sort()) {\n edges.push(\n kind === \"mints\"\n ? {\n kind,\n from: txNodeId(txHash),\n to: assetNodeId(unit),\n }\n : {\n kind,\n from: assetNodeId(unit),\n to: txNodeId(txHash),\n },\n );\n }\n };\n\n const tagUtxo = (\n utxo: TraceUtxo,\n direction: \"input\" | \"output\",\n transaction: TraceTransaction,\n ): TraceUtxo => {\n if (taggers.length === 0) return utxo;\n const tags = new Set(utxo.tags);\n for (const tagger of taggers) {\n const nextTags = tagger({\n utxo,\n direction,\n transaction,\n graph: currentTrace(),\n });\n for (const tag of normalizeTags(nextTags)) {\n tags.add(tag);\n }\n }\n return {\n ...utxo,\n tags: [...tags].sort(),\n };\n };\n\n const updateStoredTransactionOutputs = (\n txHash: string,\n outputs: TraceUtxo[],\n ): void => {\n const index = transactions.findIndex(\n (transaction) => transaction.hash === txHash,\n );\n if (index >= 0) {\n transactions[index] = {\n ...transactions[index],\n outputs: outputs.map(jsonClone),\n };\n }\n };\n\n const currentTrace = (): TxGraphTrace => ({\n version: 1,\n ...(options.createdAt ? { createdAt: options.createdAt } : {}),\n transactions: transactions.map(jsonClone),\n utxos: sortedUtxoRecord(utxos),\n edges: sortedEdges(edges),\n warnings: [...warnings, ...externalWarnings].map(jsonClone),\n aliases,\n });\n\n return graph;\n};\n\nconst withFailureMessage = (\n transaction: TraceTransaction,\n options: TxGraphRecordOptions,\n): TraceTransaction => ({\n ...transaction,\n ...(options.failureMessage ? { failureMessage: options.failureMessage } : {}),\n ...(options.evaluation ? { evaluation: [...options.evaluation] } : {}),\n});\n\nconst mergeRecordedTransaction = (\n existing: TraceTransaction,\n next: TraceTransaction,\n): TraceTransaction => {\n const failureMessage =\n next.status === \"failed\"\n ? (next.failureMessage ?? existing.failureMessage)\n : undefined;\n const evaluation =\n next.evaluation ??\n (next.status === \"failed\" ? undefined : existing.evaluation);\n return {\n ...next,\n label: next.label ?? existing.label,\n ...(failureMessage !== undefined ? { failureMessage } : {}),\n ...(evaluation !== undefined ? { evaluation } : {}),\n };\n};\n\nconst sortedUtxoRecord = (\n utxos: ReadonlyMap<string, TraceUtxo>,\n): Record<string, TraceUtxo> => {\n const result: Record<string, TraceUtxo> = {};\n for (const key of [...utxos.keys()].sort()) {\n const utxo = utxos.get(key);\n if (utxo) result[key] = jsonClone(utxo);\n }\n return result;\n};\n\nconst sortedEdges = (edges: ReadonlyArray<TraceEdge>): TraceEdge[] =>\n [...edges].sort((left, right) => {\n const leftKey = edgeSortKey(left);\n const rightKey = edgeSortKey(right);\n return leftKey.localeCompare(rightKey);\n });\n\nconst edgeSortKey = (edge: TraceEdge): string =>\n `${edge.from}\\u0000${edge.kind}\\u0000${edge.to}`;\n\nconst sortRecord = (record: Record<string, string>): Record<string, string> => {\n const result: Record<string, string> = {};\n for (const key of Object.keys(record).sort()) {\n result[key] = record[key];\n }\n return result;\n};\n\nconst normalizeTags = (\n tags: string | ReadonlyArray<string> | undefined,\n): string[] => {\n if (!tags) return [];\n const values = Array.isArray(tags) ? tags : [tags];\n return values.map((tag) => tag.trim()).filter((tag) => tag.length > 0);\n};\n\nconst jsonClone = <T>(value: T): T => JSON.parse(JSON.stringify(value)) as T;\n\nconst txNodeId = (txHash: string): string => `tx:${txHash}`;\nconst utxoNodeId = (outRef: TraceOutRef): string => `utxo:${outRefKey(outRef)}`;\nconst assetNodeId = (unit: string): string => `asset:${unit}`;\nconst withdrawalNodeId = (rewardAddress: string): string =>\n `withdrawal:${rewardAddress}`;\nconst certificateNodeId = (txHash: string, index: number): string =>\n `certificate:${txHash}#${index}`;\nconst signerNodeId = (keyHash: string): string => `signer:${keyHash}`;\nconst collateralReturnNodeId = (txHash: string): string =>\n `collateral-return:${txHash}`;\n","import type {\n Credential,\n DatumHash,\n ScriptType,\n Unit,\n UTxO,\n} from \"@lucid-evolution/core-types\";\nimport type { TraceTransaction, TraceUtxo, TxGraphTrace } from \"./model.js\";\nimport { outRefKey } from \"./resolve.js\";\n\nexport type TxGraphTaggerContext = {\n readonly utxo: TraceUtxo;\n readonly direction: \"input\" | \"output\";\n readonly transaction: TraceTransaction;\n readonly graph: TxGraphTrace;\n};\n\nexport type TxGraphTagger = (\n context: TxGraphTaggerContext,\n) => string | ReadonlyArray<string> | undefined;\n\nexport const tagByAddress =\n (label: string, address: string): TxGraphTagger =>\n ({ utxo }) =>\n utxo.address === address ? label : undefined;\n\nexport const tagByCredential =\n (label: string, credential: Credential): TxGraphTagger =>\n ({ utxo }) =>\n credentialEquals(utxo.paymentCredential, credential) ||\n credentialEquals(utxo.stakeCredential, credential)\n ? label\n : undefined;\n\nexport const tagByUnit =\n (label: string, unit: Unit | \"lovelace\"): TxGraphTagger =>\n ({ utxo }) =>\n Object.hasOwn(utxo.assets, unit) ? label : undefined;\n\nexport const tagByPolicyId =\n (label: string, policyId: string): TxGraphTagger =>\n ({ utxo }) =>\n Object.keys(utxo.assets).some(\n (unit) => unit !== \"lovelace\" && unit.startsWith(policyId),\n )\n ? label\n : undefined;\n\nexport const tagByDatumHash =\n (label: string, datumHash: DatumHash): TxGraphTagger =>\n ({ utxo }) =>\n utxo.datumHash === datumHash ? label : undefined;\n\nexport const tagByDatum =\n (\n label: string,\n predicate: (datum: string, context: TxGraphTaggerContext) => boolean,\n ): TxGraphTagger =>\n (context) =>\n context.utxo.datum && predicate(context.utxo.datum, context)\n ? label\n : undefined;\n\nexport type TagByScriptRefOptions = {\n readonly type?: ScriptType;\n readonly hash?: string;\n};\n\nexport const tagByScriptRef =\n (label: string, options: TagByScriptRefOptions = {}): TxGraphTagger =>\n ({ utxo }) => {\n if (!utxo.scriptRef) return undefined;\n if (options.type && utxo.scriptRef.type !== options.type) {\n return undefined;\n }\n if (options.hash && utxo.scriptRef.hash !== options.hash) {\n return undefined;\n }\n return label;\n };\n\nexport type TagChangeOptions = {\n readonly changeAddress?: string;\n readonly walletAddress?: string;\n readonly knownWalletUtxos?: ReadonlyArray<UTxO>;\n};\n\nexport const tagChange = (\n label: string,\n options: TagChangeOptions,\n): TxGraphTagger => {\n const addresses = new Set(\n [options.changeAddress, options.walletAddress].filter(\n (address): address is string => typeof address === \"string\",\n ),\n );\n for (const utxo of options.knownWalletUtxos ?? []) {\n addresses.add(utxo.address);\n }\n const knownOutRefs = new Set(\n (options.knownWalletUtxos ?? []).map((utxo) => outRefKey(utxo)),\n );\n\n return ({ direction, utxo }) => {\n if (direction === \"output\" && addresses.has(utxo.address)) return label;\n if (direction === \"input\" && knownOutRefs.has(outRefKey(utxo))) {\n return label;\n }\n return undefined;\n };\n};\n\nconst credentialEquals = (\n left: Credential | undefined,\n right: Credential,\n): boolean => left?.type === right.type && left.hash === right.hash;\n","import type { TxGraphTrace } from \"../model.js\";\nimport { sortedEdges } from \"./common.js\";\n\nexport const traceToJSON = (trace: TxGraphTrace): TxGraphTrace => ({\n version: 1,\n ...(trace.createdAt ? { createdAt: trace.createdAt } : {}),\n transactions: trace.transactions.map(jsonClone),\n utxos: Object.fromEntries(\n Object.entries(trace.utxos)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, utxo]) => [key, jsonClone(utxo)]),\n ),\n edges: sortedEdges(trace.edges),\n warnings: trace.warnings.map(jsonClone),\n aliases: {\n assets: sortRecord(trace.aliases.assets),\n addresses: sortRecord(trace.aliases.addresses),\n },\n});\n\nconst sortRecord = (record: Record<string, string>): Record<string, string> =>\n Object.fromEntries(\n Object.entries(record).sort(([left], [right]) => left.localeCompare(right)),\n );\n\nconst jsonClone = <T>(value: T): T => JSON.parse(JSON.stringify(value)) as T;\n"],"mappings":"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","names":["assetName","getAddressDetails","credentialsOf","traceAssets","traceScriptRef","getAddressDetails","scriptHash","lines","section","utxoNodeId","section","section","section","section","label","port","xmlText","dashArray","nodePalette","fit","sectionRows","section","opaqueId","MARGIN","xmlText","htmlText","section","semanticNodeLabel","section","legacyNodeShape","errorMessage","transaction","sortedEdges","addInputEdges","txNodeId","utxoNodeId","collateralReturnNodeId","withdrawalNodeId","certificateNodeId","signerNodeId","edgeSortKey","jsonClone","sortRecord"]}