import { LabeledMetadata, RawAuxiliaryData, RawMetadata, RawNativeScript, TxMetadataLabel } from "./cddlTypes"; import { NativeScript, parseNativeScript } from "./nativeScript"; import { PlutusV1Script, PlutusV2Script, PlutusV3Script } from "./plutus"; import {cborBackend} from "cbor-rpc"; export type AuxiliaryData = { metadata?: Map; nativeScripts?: NativeScript[]; plutusV1Scripts?: PlutusV1Script[]; plutusV2Scripts?: PlutusV2Script[]; plutusV3Scripts?: PlutusV3Script[]; }; export type AuxDataSet = { transactionIndex: number; auxiliaryData: any; }; function parseTxMetaDatum(txMetaDatum: LabeledMetadata| { value: () => LabeledMetadata}): LabeledMetadata { if (cborBackend.tagClass && txMetaDatum instanceof cborBackend.tagClass) { return (txMetaDatum as { value: () => LabeledMetadata }).value(); } return txMetaDatum as LabeledMetadata } function parseMetadataAlonzoAndBeyond(auxData: RawAuxiliaryData): AuxiliaryData { const metaData = auxData.get(0); const nativeScirpts = auxData.get(1) const plutusV1Scirpt = auxData.get(2); const plutusV2Scirpt = auxData.get(3); const plutusV3Scirpt = auxData.get(4); return { metadata: metaData, nativeScripts: nativeScirpts && parseNativeScript(nativeScirpts), plutusV1Scripts: plutusV1Scirpt, plutusV2Scripts: plutusV2Scirpt, plutusV3Scripts: plutusV3Scirpt, }; } /** * * * ; auxiliary_data supports three serialization formats: ; 1. metadata (raw) - Supported since Shelley ; 2. auxiliary_data_array - Array format, introduced in Allegra ; 3. auxiliary_data_map - Tagged map format, introduced in Alonzo ; Conway adds plutus_v3_script support at index 4 auxiliary_data = metadata/ auxiliary_data_array/ auxiliary_data_map metadata = {* metadatum_label => metadatum} metadatum_label = uint .size 8 metadatum = {* metadatum => metadatum} / [* metadatum] / int / bytes .size (0 .. 64) / text .size (0 .. 64) auxiliary_data_array = [transaction_metadata : metadata, auxiliary_scripts : auxiliary_scripts] auxiliary_scripts = [* native_script] auxiliary_data_map = #6.259( { ? 0 : metadata , ? 1 : [* native_script] , ? 2 : [* plutus_v1_script] , ? 3 : [* plutus_v2_script] , ? 4 : [* plutus_v3_script] } ) */ export function parseAuxData(auxData: RawAuxiliaryData | [LabeledMetadata,RawNativeScript[]] | null ): AuxiliaryData | undefined { if (Array.isArray(auxData)) { return { metadata: parseTxMetaDatum(auxData[0]), nativeScripts: parseNativeScript(auxData[1]), }; }else if (auxData instanceof Map) { // when auxData is instance of Map, It's is a direct metadata map. return { metadata: auxData as Map, }; } else if (cborBackend.tagClass && auxData instanceof cborBackend.tagClass) { return parseMetadataAlonzoAndBeyond((auxData as any).value); } return undefined; }