{"version":3,"sources":["../src/index.ts","../src/core.ts","../src/lucid-evolution/utils.ts","../src/lucid-evolution/LucidEvolution.ts","../src/tx-builder/TxBuilder.ts","../src/tx-builder/internal/Collect.ts","../src/Errors.ts","../src/tx-builder/internal/TxUtils.ts","../src/tx-builder/internal/Service.ts","../src/tx-builder/internal/Read.ts","../src/tx-builder/internal/Attach.ts","../src/tx-builder/internal/Pay.ts","../src/tx-builder/internal/Mint.ts","../src/tx-builder/internal/Interval.ts","../src/tx-builder/internal/Signer.ts","../src/tx-builder/internal/Stake.ts","../src/tx-builder/internal/Pool.ts","../src/tx-builder/internal/Governance.ts","../src/tx-builder/internal/GovernanceAction.ts","../src/tx-builder/internal/Metadata.ts","../src/tx-builder/internal/Treasury.ts","../src/tx-builder/internal/CompleteTxBuilder.ts","../src/tx-sign-builder/TxSignBuilder.ts","../src/tx-sign-builder/internal/CompleteTxSigner.ts","../src/tx-submit/TxSubmit.ts","../src/tx-sign-builder/internal/Sign.ts","../src/script-context/Schema.ts","../src/script-context/ScriptContext.ts","../src/tx-builder/internal/RedeemerContext.ts","../src/tx-builder/TxConfig.ts","../src/lucid-evolution/slotConfig.ts","../src/lucid-evolution/providerCapabilities.ts"],"sourcesContent":["export * from \"./lucid-evolution/index.js\";\nexport * from \"./tx-builder/index.js\";\nexport * from \"./tx-sign-builder/index.js\";\nexport * from \"./script-context/index.js\";\nexport * from \"./tx-submit/TxSubmit.js\";\nexport * from \"./Errors.js\";\nexport * from \"./core.js\";\nexport * from \"@lucid-evolution/core-types\";\nexport * from \"@lucid-evolution/core-utils\";\nexport * from \"@lucid-evolution/plutus\";\nexport * from \"@lucid-evolution/provider\";\nexport * from \"@lucid-evolution/sign_data\";\nexport * from \"@lucid-evolution/tx-graph\";\nexport * from \"@lucid-evolution/utils\";\nexport * from \"@lucid-evolution/wallet\";\n","import { Effect } from \"effect\";\n\nexport * as CML from \"@anastasia-labs/cardano-multiplatform-lib-nodejs\";\n\nexport const makeReturn = <A, E>(program: Effect.Effect<A, E>) => {\n  return {\n    unsafeRun: () => Effect.runPromise(program),\n    safeRun: () => Effect.runPromise(Effect.either(program)),\n    program: () => program,\n  };\n};\n","import { Json, Provider, UTxO, Unit } from \"@lucid-evolution/core-types\";\nimport { fromUnit, toUnit } from \"@lucid-evolution/utils\";\nimport { Constr, Data } from \"@lucid-evolution/plutus\";\n\nexport const datumOf = async <T = Data>(\n  provider: Provider,\n  utxo: UTxO,\n  type?: T,\n): Promise<T> => {\n  if (!utxo.datum) {\n    if (!utxo.datumHash) {\n      throw new Error(\"This UTxO does not have a datum hash.\");\n    }\n    utxo.datum = await provider.getDatum(utxo.datumHash);\n  }\n  return Data.from<T>(utxo.datum, type);\n};\n\n/** Query CIP-0068 metadata for a specifc asset. */\nexport const metadataOf = async <T = Json>(\n  provider: Provider,\n  unit: Unit,\n): Promise<T> => {\n  const { policyId, name, label } = fromUnit(unit);\n  switch (label) {\n    case 222:\n    case 333:\n    case 444: {\n      const utxo = await provider.getUtxoByUnit(toUnit(policyId, name, 100));\n      const metadata = (await datumOf(provider, utxo)) as Constr<Data>;\n      return Data.toJson(metadata.fields[0]);\n    }\n    default:\n      throw new Error(\"No variant matched.\");\n  }\n};\n","import {\n  AwaitTransactionOptions,\n  Credential,\n  Delegation,\n  EvaluatorAdapter,\n  Network,\n  OutRef,\n  PolicyId,\n  PrivateKey,\n  ProtocolParameters,\n  Provider,\n  RewardAccountState,\n  Slot,\n  SlotConfig,\n  Transaction,\n  TransactionConfirmation,\n  TransactionStatus,\n  TransactionStatusOptions,\n  TxHash,\n  Unit,\n  UnixTime,\n  UTxO,\n  Wallet,\n  WalletApi,\n} from \"@lucid-evolution/core-types\";\nimport { CML } from \"../core.js\";\nimport { datumOf, metadataOf } from \"./utils.js\";\nimport {\n  createCostModels,\n  PROTOCOL_PARAMETERS_DEFAULT,\n} from \"@lucid-evolution/utils\";\nimport * as TxBuilder from \"../tx-builder/TxBuilder.js\";\nimport * as TxConfig from \"../tx-builder/TxConfig.js\";\nimport * as TxSignBuilder from \"../tx-sign-builder/TxSignBuilder.js\";\nimport {\n  Data,\n  slotToBeginUnixTime,\n  unixTimeToEnclosingSlot,\n} from \"@lucid-evolution/plutus\";\nimport {\n  makeWalletFromAddress,\n  makeWalletFromAPI,\n  makeWalletFromPrivateKey,\n  makeWalletFromSeed,\n} from \"@lucid-evolution/wallet\";\nimport { isEmulatorProvider } from \"@lucid-evolution/provider\";\nimport { resolveSlotConfig } from \"./slotConfig.js\";\nimport { Effect, pipe } from \"effect\";\nimport { NullableError } from \"../Errors.js\";\nimport {\n  awaitTransactionConfirmation,\n  getRewardAccount,\n  getTransactionStatus,\n  getUtxosWithPolicy,\n} from \"./providerCapabilities.js\";\n\nexport type LucidEvolution = {\n  config: () => Partial<LucidConfig>;\n  wallet: () => Wallet;\n  overrideUTxOs: (utxos: UTxO[]) => void;\n  clearUTxOOverride: () => void;\n  switchProvider: (provider: Provider) => Promise<void>;\n  newTx: () => TxBuilder.TxBuilder;\n  fromTx: (tx: Transaction) => TxSignBuilder.TxSignBuilder;\n  selectWallet: {\n    fromSeed: (\n      seed: string,\n      options?: {\n        addressType?: \"Base\" | \"Enterprise\";\n        accountIndex?: number;\n        password?: string;\n      },\n    ) => void;\n    fromPrivateKey: (privateKey: PrivateKey) => void;\n    fromAPI: (walletAPI: WalletApi) => void;\n    fromAddress: (address: string, utxos: UTxO[]) => void;\n  };\n  currentSlot: () => number;\n  unixTimeToSlot: (unixTime: UnixTime) => number;\n  slotToUnixTime: (slot: Slot) => UnixTime;\n  utxosAt: (addressOrCredential: string | Credential) => Promise<UTxO[]>;\n  utxosAtWithUnit: (\n    addressOrCredential: string | Credential,\n    unit: string,\n  ) => Promise<UTxO[]>;\n  utxosAtWithPolicy: (\n    addressOrCredential: string | Credential,\n    policyId: PolicyId,\n  ) => Promise<UTxO[]>;\n  utxoByUnit: (unit: string) => Promise<UTxO>;\n  utxosByOutRef: (outRefs: OutRef[]) => Promise<UTxO[]>;\n  delegationAt: (rewardAddress: string) => Promise<Delegation>;\n  rewardAccountAt: (rewardAddress: string) => Promise<RewardAccountState>;\n  transactionStatus: (\n    txHash: TxHash,\n    options?: TransactionStatusOptions,\n  ) => Promise<TransactionStatus>;\n  awaitTx: (\n    txHash: string,\n    checkInterval?: number | undefined,\n  ) => Promise<boolean>;\n  awaitTxConfirmation: (\n    txHash: TxHash,\n    options?: AwaitTransactionOptions,\n  ) => Promise<TransactionConfirmation>;\n  datumOf: <T extends Data>(utxo: UTxO, type?: T | undefined) => Promise<T>;\n  metadataOf: <T = any>(unit: string) => Promise<T>;\n};\n\nexport type LucidConfig = {\n  provider: Provider;\n  network: Network;\n  wallet: Wallet | undefined;\n  txbuilderconfig: CML.TransactionBuilderConfig;\n  costModels: CML.CostModels;\n  protocolParameters: ProtocolParameters;\n  evaluator?: EvaluatorAdapter;\n  /**\n   * Per-instance slot-to-time mapping. Low-level callers that omit it retain\n   * the legacy network-table snapshot when constructing a transaction builder.\n   */\n  slotConfig?: SlotConfig;\n};\n\nexport type LucidOptions = {\n  /**\n   * Predefined protocol parameters to use instead of retrieving them from the provider.\n   * If not specified, it will fetch the latest protocol parameters from the provider.\n   */\n  presetProtocolParameters?: ProtocolParameters;\n  /**\n   * Local phase-two evaluator to use when local UPLC evaluation is enabled.\n   * Defaults to the built-in Aiken/WASM-backed evaluator.\n   */\n  evaluator?: EvaluatorAdapter;\n  /** Per-instance slot-to-time mapping. Required for uninitialized Custom networks. */\n  slotConfig?: SlotConfig;\n};\n\n//TODO: turn this to Effect\nexport const Lucid = async (\n  provider?: Provider | undefined,\n  network?: Network,\n  options: LucidOptions = {},\n): Promise<LucidEvolution> => {\n  const slotConfig = resolveSlotConfig(provider, network, options.slotConfig);\n  const protocolParameters: ProtocolParameters | undefined =\n    options.presetProtocolParameters ||\n    (await provider?.getProtocolParameters());\n\n  const costModels = protocolParameters\n    ? createCostModels(protocolParameters.costModels)\n    : undefined;\n  const config: Partial<LucidConfig> = {\n    provider: provider,\n    network: network,\n    wallet: undefined,\n    costModels: costModels,\n    txbuilderconfig:\n      protocolParameters && costModels\n        ? TxConfig.makeTxConfig(protocolParameters, costModels)\n        : undefined,\n    protocolParameters,\n    evaluator: options.evaluator,\n    slotConfig,\n  };\n  const configuredProvider = (): Provider => {\n    if (!config.provider) {\n      throw new NullableError({\n        message: \"Provider is not set in Lucid instance\",\n      });\n    }\n    return config.provider;\n  };\n  return {\n    config: () => config,\n    wallet: () => config.wallet as Wallet,\n    overrideUTxOs: (utxos: UTxO[]) => config.wallet?.overrideUTxOs(utxos),\n    clearUTxOOverride: () => config.wallet?.clearUTxOOverride?.(),\n    switchProvider: async (provider: Provider) => {\n      const protocolParam = await provider.getProtocolParameters();\n      const costModels = createCostModels(protocolParam.costModels);\n      config.provider = provider;\n      config.costModels = costModels;\n      config.txbuilderconfig = TxConfig.makeTxConfig(protocolParam, costModels);\n      config.protocolParameters = protocolParam;\n    },\n    newTx: (): TxBuilder.TxBuilder =>\n      Effect.gen(function* () {\n        const provider = yield* Effect.fromNullable(config.provider);\n        const network = yield* Effect.fromNullable(config.network);\n        const costModels = yield* validateNotNullable(\n          config.costModels,\n          \"CostModels are not set in Lucid instance\",\n        );\n        const txbuilderconfig = yield* validateNotNullable(\n          config.txbuilderconfig,\n          \"txbuilderconfig is not set in Lucid instance\",\n        );\n        const protocolParameters = yield* validateNotNullable(\n          config.protocolParameters,\n          \"protocolParameters are not set in Lucid instance\",\n        );\n        const slotConfig = yield* validateNotNullable(\n          config.slotConfig,\n          \"slotConfig is not set in Lucid instance\",\n        );\n        return TxBuilder.makeTxBuilder({\n          provider,\n          network,\n          wallet: config.wallet,\n          costModels,\n          txbuilderconfig,\n          protocolParameters,\n          evaluator: config.evaluator,\n          slotConfig,\n        });\n      }).pipe(Effect.runSync),\n    fromTx: (tx: Transaction) =>\n      TxSignBuilder.makeTxSignBuilder(\n        config.wallet,\n        CML.Transaction.from_cbor_hex(tx),\n        {\n          slotConfig: config.slotConfig,\n        },\n      ),\n    selectWallet: {\n      fromSeed: (\n        seed: string,\n        options?: {\n          addressType?: \"Base\" | \"Enterprise\";\n          accountIndex?: number;\n          password?: string;\n        },\n      ) =>\n        Effect.gen(function* () {\n          config.wallet = makeWalletFromSeed(\n            yield* validateNotNullableProvider(config.provider),\n            yield* validateNotNullableNetwork(network),\n            seed,\n            options,\n          );\n        }).pipe(Effect.runSync),\n      fromPrivateKey: (privateKey: PrivateKey) =>\n        Effect.gen(function* () {\n          config.wallet = makeWalletFromPrivateKey(\n            yield* validateNotNullableProvider(config.provider),\n            yield* validateNotNullableNetwork(network),\n            privateKey,\n          );\n        }).pipe(Effect.runSync),\n      fromAPI: (walletAPI: WalletApi) =>\n        Effect.gen(function* () {\n          config.wallet = makeWalletFromAPI(\n            yield* validateNotNullableProvider(config.provider),\n            walletAPI,\n          );\n        }).pipe(Effect.runSync),\n      fromAddress: (address: string, utxos: UTxO[]) =>\n        Effect.gen(function* () {\n          config.wallet = makeWalletFromAddress(\n            yield* validateNotNullableProvider(config.provider),\n            yield* validateNotNullableNetwork(network),\n            address,\n            utxos,\n          );\n        }).pipe(Effect.runSync),\n    },\n    currentSlot: () => {\n      if (isEmulatorProvider(config.provider)) return config.provider.slot;\n      return pipe(\n        validateNotNullable(config.slotConfig, \"slotConfig is not set\"),\n        Effect.map((slotConfig) =>\n          unixTimeToEnclosingSlot(Date.now(), slotConfig),\n        ),\n        Effect.runSync,\n      );\n    },\n    unixTimeToSlot: (unixTime: UnixTime) =>\n      pipe(\n        validateNotNullable(config.slotConfig, \"slotConfig is not set\"),\n        Effect.map((slotConfig) =>\n          unixTimeToEnclosingSlot(unixTime, slotConfig),\n        ),\n        Effect.runSync,\n      ),\n    slotToUnixTime: (slot: Slot) =>\n      pipe(\n        validateNotNullable(config.slotConfig, \"slotConfig is not set\"),\n        Effect.map((slotConfig) => slotToBeginUnixTime(slot, slotConfig)),\n        Effect.runSync,\n      ),\n    utxosAt: (addressOrCredential: string | Credential) =>\n      pipe(\n        validateNotNullableProvider(config.provider),\n        Effect.flatMap((provider) =>\n          Effect.promise(() => provider.getUtxos(addressOrCredential)),\n        ),\n        Effect.runPromise,\n      ),\n    utxosAtWithUnit: (addressOrCredential: string | Credential, unit: Unit) =>\n      pipe(\n        validateNotNullableProvider(config.provider),\n        Effect.flatMap((provider) =>\n          Effect.promise(() =>\n            provider.getUtxosWithUnit(addressOrCredential, unit),\n          ),\n        ),\n        Effect.runPromise,\n      ),\n    utxosAtWithPolicy: (\n      addressOrCredential: string | Credential,\n      policyId: PolicyId,\n    ) =>\n      getUtxosWithPolicy(configuredProvider(), addressOrCredential, policyId),\n    utxoByUnit: (unit: Unit) =>\n      pipe(\n        validateNotNullableProvider(config.provider),\n        Effect.flatMap((provider) =>\n          Effect.promise(() => provider.getUtxoByUnit(unit)),\n        ),\n        Effect.runPromise,\n      ),\n    utxosByOutRef: (outRefs: OutRef[]) =>\n      pipe(\n        validateNotNullableProvider(config.provider),\n        Effect.flatMap((provider) =>\n          Effect.promise(() => provider.getUtxosByOutRef(outRefs)),\n        ),\n        Effect.runPromise,\n      ),\n    delegationAt: (rewardAddress: string) =>\n      pipe(\n        validateNotNullableProvider(config.provider),\n        Effect.flatMap((provider) =>\n          Effect.promise(() => provider.getDelegation(rewardAddress)),\n        ),\n        Effect.runPromise,\n      ),\n    rewardAccountAt: (rewardAddress: string) =>\n      getRewardAccount(configuredProvider(), rewardAddress),\n    transactionStatus: (txHash: TxHash, options?: TransactionStatusOptions) =>\n      getTransactionStatus(configuredProvider(), txHash, options),\n    awaitTx: (txHash: TxHash, checkInterval?: number) =>\n      pipe(\n        validateNotNullableProvider(config.provider),\n        Effect.flatMap((provider) =>\n          Effect.promise(() => provider.awaitTx(txHash, checkInterval)),\n        ),\n        Effect.runPromise,\n      ),\n    awaitTxConfirmation: (txHash: TxHash, options?: AwaitTransactionOptions) =>\n      awaitTransactionConfirmation(configuredProvider(), txHash, options),\n    datumOf: <T extends Data>(utxo: UTxO, type?: T | undefined) =>\n      pipe(\n        validateNotNullableProvider(config.provider),\n        Effect.flatMap((provider) =>\n          Effect.promise(() => datumOf(provider, utxo, type)),\n        ),\n        Effect.runPromise,\n      ),\n    metadataOf: (unit: string) =>\n      pipe(\n        validateNotNullableProvider(config.provider),\n        Effect.flatMap((provider) =>\n          Effect.promise(() => metadataOf(provider, unit)),\n        ),\n        Effect.runPromise,\n      ),\n  };\n};\n\nconst validateNotNullable = <T>(value: T | undefined, message: string) =>\n  pipe(\n    Effect.fromNullable(value),\n    Effect.orElseFail(() => new NullableError({ message })),\n  );\n\nconst validateNotNullableNetwork = (network: Network | undefined) =>\n  validateNotNullable(network, \"Network is not set in Lucid instance\");\nconst validateNotNullableProvider = (provider: Provider | undefined) =>\n  validateNotNullable(provider, \"Provider is not set in Lucid instance\");\n","import { CML, makeReturn } from \"../core.js\";\nimport { LucidConfig } from \"../lucid-evolution/LucidEvolution.js\";\nimport { OutputDatum } from \"./types.js\";\nimport {\n  Address,\n  Anchor,\n  Assets,\n  BuildTxWithRedeemer,\n  DRep,\n  GovernanceActionId,\n  GovernanceProposal,\n  GovernanceVote,\n  GovernanceVoter,\n  Label,\n  Lovelace,\n  PaymentKeyHash,\n  PolicyId,\n  PoolId,\n  PoolParams,\n  Redeemer,\n  RedeemerBuilder,\n  RewardAddress,\n  Script,\n  ScriptType,\n  SlotConfig,\n  StakeKeyHash,\n  TxOutput,\n  UTxO,\n} from \"@lucid-evolution/core-types\";\nimport { Data, SLOT_CONFIG_NETWORK } from \"@lucid-evolution/plutus\";\nimport * as Collect from \"./internal/Collect.js\";\nimport * as Read from \"./internal/Read.js\";\nimport * as Attach from \"./internal/Attach.js\";\nimport * as Pay from \"./internal/Pay.js\";\nimport * as Mint from \"./internal/Mint.js\";\nimport * as Interval from \"./internal/Interval.js\";\nimport * as Signer from \"./internal/Signer.js\";\nimport * as Stake from \"./internal/Stake.js\";\nimport * as Pool from \"./internal/Pool.js\";\nimport * as Governance from \"./internal/Governance.js\";\nimport * as GovernanceAction from \"./internal/GovernanceAction.js\";\nimport * as Metadata from \"./internal/Metadata.js\";\nimport * as Treasury from \"./internal/Treasury.js\";\nimport * as CompleteTxBuilder from \"./internal/CompleteTxBuilder.js\";\nimport * as TxSignBuilder from \"../tx-sign-builder/TxSignBuilder.js\";\nimport { TransactionError } from \"../Errors.js\";\nimport { Either } from \"effect/Either\";\nimport { Effect, Layer, pipe } from \"effect\";\nimport {\n  handleRedeemerBuilder,\n  validateAddressDetails,\n} from \"./internal/TxUtils.js\";\nimport { addAssets, paymentCredentialOf } from \"@lucid-evolution/utils\";\nimport { TxConfig } from \"./internal/Service.js\";\nimport {\n  BuildTxRedeemer,\n  cloneAssets,\n  cloneRedeemerInput,\n  cloneUTxO,\n  cloneUTxOs,\n  isBuildTxWithRedeemer,\n  isDelayedRedeemer,\n  isRedeemerBuilder,\n  PendingRedeemer,\n  registerPendingRedeemer,\n} from \"./internal/RedeemerContext.js\";\nimport { TxBuilderError } from \"../Errors.js\";\n\nexport type TxAction = {\n  readonly id: number;\n  readonly kind: string;\n  readonly pendingIds: readonly number[];\n  readonly hasDelayedRedeemer: boolean;\n  readonly replay: (\n    currentRedeemers: ReadonlyMap<number, Redeemer>,\n  ) => Effect.Effect<void, TransactionError, TxConfig>;\n  readonly cloneWithIds: (id: number, pendingIds: number[]) => TxAction;\n};\n\ntype CertificateRedeemer = Redeemer | BuildTxWithRedeemer;\ntype GovernanceRedeemer = Redeemer | BuildTxWithRedeemer;\n\nexport type TxBuilderConfig = {\n  readonly lucidConfig: LucidConfig & { readonly slotConfig: SlotConfig };\n  readonly txBuilder: CML.TransactionBuilder;\n  walletInputs: UTxO[];\n  collectedInputs: UTxO[];\n  readInputs: UTxO[];\n  consumedInputs: UTxO[];\n  totalOutputAssets: Assets;\n  payToOutputs: TxOutput[];\n  mintedAssets: Assets;\n  scripts: Map<string, { type: ScriptType; script: string }>;\n  programs: Effect.Effect<void, TransactionError, TxConfig>[];\n  partialPrograms: Map<\n    RedeemerBuilder,\n    (redeemer?: string) => Effect.Effect<void, TransactionError, TxConfig>\n  >;\n  actions: TxAction[];\n  nextActionId: number;\n  pendingRedeemers: PendingRedeemer[];\n  witnessRegistry: Set<string>;\n  /** Accumulates one result because CML replaces voter maps across results. */\n  governanceVoteBuilder?: CML.VoteBuilder;\n  governanceVoteWitnessKeys: string[];\n  governanceProposalWitnessIndices: bigint[];\n  governanceProposalCount: bigint;\n  certificateIndex: bigint;\n  treasuryDonation: Treasury.TreasuryDonation | undefined;\n  minFee: bigint | undefined;\n};\n\nconst txActionError = (cause: unknown) =>\n  new TxBuilderError({ cause: `{ TxAction: ${cause} }` });\n\nconst makeAction = (\n  id: number,\n  kind: string,\n  pendingIds: number[],\n  hasDelayedRedeemer: boolean,\n  makeReplay: (id: number, pendingIds: number[]) => TxAction[\"replay\"],\n): TxAction => ({\n  id,\n  kind,\n  pendingIds,\n  hasDelayedRedeemer,\n  replay: makeReplay(id, pendingIds),\n  cloneWithIds: (nextId, nextPendingIds) =>\n    makeAction(nextId, kind, nextPendingIds, hasDelayedRedeemer, makeReplay),\n});\n\nconst recordAction = (\n  config: TxBuilderConfig,\n  pendingCount: number,\n  make: (id: number, pendingIds: number[]) => TxAction,\n) => {\n  const id = config.nextActionId++;\n  const pendingIds = Array.from({ length: pendingCount }, () => {\n    const pendingId = config.nextActionId;\n    config.nextActionId++;\n    return pendingId;\n  });\n  config.actions.push(make(id, pendingIds));\n};\n\nconst replayAction = (\n  action: TxAction,\n  currentRedeemers: ReadonlyMap<number, Redeemer>,\n) => action.replay(currentRedeemers);\n\nexport const replayTxActions = (\n  actions: ReadonlyArray<TxAction>,\n  currentRedeemers: ReadonlyMap<number, Redeemer> = new Map(),\n) =>\n  Effect.gen(function* () {\n    for (const action of actions) {\n      yield* replayAction(action, currentRedeemers);\n    }\n    yield* GovernanceAction.finalizeVotes();\n  });\n\nexport const hasDelayedActions = (config: TxBuilderConfig): boolean =>\n  config.actions.some((action) => action.hasDelayedRedeemer);\n\nexport const makeTxBuilderConfig = (\n  lucidConfig: LucidConfig,\n  source?: TxBuilderConfig,\n): TxBuilderConfig => ({\n  lucidConfig: {\n    ...lucidConfig,\n    // Snapshot the legacy table only at this low-level compatibility boundary.\n    // Lucid instances always pass their own already-validated mapping.\n    slotConfig: Object.freeze({\n      ...(lucidConfig.slotConfig ?? SLOT_CONFIG_NETWORK[lucidConfig.network]),\n    }),\n  },\n  txBuilder: CML.TransactionBuilder.new(lucidConfig.txbuilderconfig),\n  walletInputs: [],\n  collectedInputs: [],\n  readInputs: [],\n  consumedInputs: [],\n  totalOutputAssets: {},\n  payToOutputs: [],\n  mintedAssets: source ? cloneAssets(source.mintedAssets) : {},\n  scripts: source ? new Map(source.scripts) : new Map(),\n  programs: [],\n  partialPrograms: new Map(),\n  actions: [],\n  nextActionId: source?.nextActionId ?? 0,\n  pendingRedeemers: [],\n  witnessRegistry: new Set(),\n  governanceVoteBuilder: undefined,\n  governanceVoteWitnessKeys: [],\n  governanceProposalWitnessIndices: [],\n  governanceProposalCount: 0n,\n  certificateIndex: 0n,\n  treasuryDonation: undefined,\n  minFee: source?.minFee,\n});\n\nexport const makeReplayConfig = (source: TxBuilderConfig): TxBuilderConfig =>\n  makeTxBuilderConfig(source.lucidConfig, source);\n\nconst redeemerFor = (\n  currentRedeemers: ReadonlyMap<number, Redeemer>,\n  pendingId: number,\n): Redeemer => currentRedeemers.get(pendingId) ?? Data.void();\n\nconst isPlutusScriptType = (scriptType: ScriptType | undefined): boolean =>\n  scriptType !== undefined && scriptType !== \"Native\";\n\nconst spendScriptType = (\n  config: TxBuilderConfig,\n  utxo: UTxO,\n): ScriptType | undefined => {\n  const credential = paymentCredentialOf(utxo.address);\n  if (credential.type !== \"Script\") return undefined;\n  return config.scripts.get(credential.hash)?.type;\n};\n\nconst hasMissingSpendScript = (\n  config: TxBuilderConfig,\n  utxo: UTxO,\n): boolean => {\n  const credential = paymentCredentialOf(utxo.address);\n  return credential.type === \"Script\" && !config.scripts.has(credential.hash);\n};\n\nconst replayCollectWithDelayedRedeemer = (\n  actionId: number,\n  pendingIds: readonly number[],\n  utxos: UTxO[],\n  redeemer: RedeemerBuilder | BuildTxWithRedeemer,\n  currentRedeemers: ReadonlyMap<number, Redeemer>,\n) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    let plutusWitnessCount = 0;\n\n    if (isRedeemerBuilder(redeemer) && redeemer.kind === \"selected\") {\n      const pendingId = pendingIds[0];\n      const delayedRedeemer = redeemerFor(currentRedeemers, pendingId);\n      for (const utxo of utxos) {\n        if (isPlutusScriptType(spendScriptType(config, utxo))) {\n          plutusWitnessCount++;\n          yield* registerPendingRedeemer(config, {\n            id: pendingId,\n            actionId,\n            source: redeemer,\n            purposeKey: {\n              tag: \"spend\",\n              input: { txHash: utxo.txHash, outputIndex: utxo.outputIndex },\n            },\n          });\n        }\n      }\n      if (plutusWitnessCount === 0) {\n        if (utxos.some((utxo) => hasMissingSpendScript(config, utxo))) {\n          yield* Collect.collectFromUTxO(cloneUTxOs(utxos))(delayedRedeemer);\n          return;\n        }\n        yield* txActionError(\n          \"Delayed collectFrom redeemer requires at least one Plutus spend witness\",\n        );\n      }\n      yield* Collect.collectFromUTxO(cloneUTxOs(utxos))(delayedRedeemer);\n      return;\n    }\n\n    for (let index = 0; index < utxos.length; index++) {\n      const utxo = utxos[index];\n      const hasPlutusWitness = isPlutusScriptType(\n        spendScriptType(config, utxo),\n      );\n      if (!hasPlutusWitness) {\n        yield* Collect.collectFromUTxO([cloneUTxO(utxo)])();\n        continue;\n      }\n\n      plutusWitnessCount++;\n      const pendingId = pendingIds[index];\n      yield* registerPendingRedeemer(config, {\n        id: pendingId,\n        actionId,\n        source: redeemer,\n        purposeKey: {\n          tag: \"spend\",\n          input: { txHash: utxo.txHash, outputIndex: utxo.outputIndex },\n        },\n      });\n      yield* Collect.collectFromUTxO([cloneUTxO(utxo)])(\n        redeemerFor(currentRedeemers, pendingId),\n      );\n    }\n\n    if (plutusWitnessCount === 0) {\n      yield* txActionError(\n        \"Delayed collectFrom redeemer requires at least one Plutus spend witness\",\n      );\n    }\n  });\n\nconst mintPolicyId = (assets: Assets): PolicyId => {\n  const unit = Object.keys(assets)[0];\n  return unit === \"lovelace\" ? \"\" : unit.slice(0, 56);\n};\n\nconst cloneOutputDatum = (\n  outputDatum: OutputDatum | undefined,\n): OutputDatum | undefined => (outputDatum ? { ...outputDatum } : undefined);\n\nconst clonePoolParams = (poolParams: PoolParams): PoolParams => ({\n  ...poolParams,\n  owners: [...poolParams.owners],\n  relays: poolParams.relays.map((relay) => ({ ...relay })),\n});\n\nconst preserveSelfRedeemerBuilderInputs = (\n  redeemer: BuildTxRedeemer | undefined,\n  inputs: UTxO[],\n) => {\n  if (isRedeemerBuilder(redeemer) && redeemer.kind === \"self\") {\n    redeemer.inputs = cloneUTxOs(inputs);\n  }\n};\n\nconst replayMintWithDelayedRedeemer = (\n  actionId: number,\n  pendingIds: readonly number[],\n  assets: Assets,\n  redeemer: RedeemerBuilder | BuildTxWithRedeemer,\n  currentRedeemers: ReadonlyMap<number, Redeemer>,\n) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    if (isRedeemerBuilder(redeemer) && redeemer.kind === \"self\") {\n      yield* txActionError(\n        \"RedeemerBuilder self is only valid for collectFrom\",\n      );\n    }\n    const policyId = mintPolicyId(assets);\n    const script = config.scripts.get(policyId);\n    if (!script) {\n      yield* Mint.mintAssets(cloneAssets(assets))();\n      return;\n    }\n    if (!isPlutusScriptType(script.type)) {\n      yield* txActionError(\n        \"Delayed mintAssets redeemer requires a Plutus mint witness\",\n      );\n    }\n    const pendingId = pendingIds[0];\n    yield* registerPendingRedeemer(config, {\n      id: pendingId,\n      actionId,\n      source: redeemer,\n      purposeKey: { tag: \"mint\", policyId },\n    });\n    yield* Mint.mintAssets(cloneAssets(assets))(\n      redeemerFor(currentRedeemers, pendingId),\n    );\n  });\n\nconst replayWithdrawWithDelayedRedeemer = (\n  actionId: number,\n  pendingIds: readonly number[],\n  rewardAddress: RewardAddress,\n  amount: Lovelace,\n  redeemer: RedeemerBuilder | BuildTxWithRedeemer,\n  currentRedeemers: ReadonlyMap<number, Redeemer>,\n) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    if (isRedeemerBuilder(redeemer) && redeemer.kind === \"self\") {\n      yield* txActionError(\n        \"RedeemerBuilder self is only valid for collectFrom\",\n      );\n    }\n    const addressDetails = yield* validateAddressDetails(\n      rewardAddress,\n      config.lucidConfig,\n    );\n    const stakeCredential = addressDetails.stakeCredential;\n    if (!stakeCredential || stakeCredential.type !== \"Script\") {\n      yield* txActionError(\n        \"Delayed withdraw redeemer requires a Plutus withdrawal witness\",\n      );\n      return;\n    }\n    const script = config.scripts.get(stakeCredential.hash);\n    if (!script) {\n      yield* Stake.withdraw(\n        rewardAddress,\n        amount,\n      )(redeemerFor(currentRedeemers, pendingIds[0]));\n      return;\n    }\n    if (!isPlutusScriptType(script.type)) {\n      yield* txActionError(\n        \"Delayed withdraw redeemer requires a Plutus withdrawal witness\",\n      );\n    }\n    const pendingId = pendingIds[0];\n    yield* registerPendingRedeemer(config, {\n      id: pendingId,\n      actionId,\n      source: redeemer,\n      purposeKey: { tag: \"withdraw\", rewardAddress },\n    });\n    yield* Stake.withdraw(\n      rewardAddress,\n      amount,\n    )(redeemerFor(currentRedeemers, pendingId));\n  });\n\nconst withCertificateIndex = (\n  program: Effect.Effect<void, TransactionError, TxConfig>,\n) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    yield* program;\n    config.certificateIndex += 1n;\n  });\n\nconst replayCertificateWithDelayedRedeemer = (\n  actionId: number,\n  pendingIds: readonly number[],\n  witnessRewardAddress: RewardAddress,\n  redeemer: BuildTxWithRedeemer,\n  makeProgram: (\n    redeemer?: Redeemer,\n  ) => Effect.Effect<void, TransactionError, TxConfig>,\n  currentRedeemers: ReadonlyMap<number, Redeemer>,\n) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    const addressDetails = yield* validateAddressDetails(\n      witnessRewardAddress,\n      config.lucidConfig,\n    );\n    const stakeCredential = addressDetails.stakeCredential;\n    if (!stakeCredential || stakeCredential.type !== \"Script\") {\n      yield* txActionError(\n        \"Delayed certificate redeemer requires a Plutus certificate witness\",\n      );\n      return;\n    }\n    const script = config.scripts.get(stakeCredential.hash);\n    const pendingId = pendingIds[0];\n    const delayedRedeemer = redeemerFor(currentRedeemers, pendingId);\n    if (!script) {\n      yield* makeProgram(delayedRedeemer);\n      return;\n    }\n    if (!isPlutusScriptType(script.type)) {\n      yield* txActionError(\n        \"Delayed certificate redeemer requires a Plutus certificate witness\",\n      );\n    }\n    yield* registerPendingRedeemer(config, {\n      id: pendingId,\n      actionId,\n      source: redeemer,\n      purposeKey: { tag: \"publish\", index: config.certificateIndex },\n    });\n    yield* withCertificateIndex(makeProgram(delayedRedeemer));\n  });\n\nconst recordCertificateAction = (\n  config: TxBuilderConfig,\n  kind: string,\n  makeProgram: (\n    redeemer?: Redeemer,\n  ) => Effect.Effect<void, TransactionError, TxConfig>,\n  redeemer?: CertificateRedeemer,\n  witnessRewardAddress?: RewardAddress,\n) => {\n  const redeemerSnapshot = cloneRedeemerInput(redeemer);\n  const isDelayed = isBuildTxWithRedeemer(redeemerSnapshot);\n  recordAction(config, isDelayed ? 1 : 0, (id, pendingIds) =>\n    makeAction(\n      id,\n      kind,\n      pendingIds,\n      isDelayed,\n      (actionId, actionPendingIds) => (currentRedeemers) =>\n        isDelayed\n          ? replayCertificateWithDelayedRedeemer(\n              actionId,\n              actionPendingIds,\n              witnessRewardAddress!,\n              redeemerSnapshot,\n              makeProgram,\n              currentRedeemers,\n            )\n          : withCertificateIndex(\n              makeProgram(redeemerSnapshot as Redeemer | undefined),\n            ),\n    ),\n  );\n  if (!isDelayed) {\n    config.programs.push(\n      withCertificateIndex(\n        makeProgram(redeemerSnapshot as Redeemer | undefined),\n      ),\n    );\n  }\n};\n\nconst replayVoteWithDelayedRedeemer = (\n  actionId: number,\n  pendingIds: readonly number[],\n  voter: GovernanceVoter,\n  redeemer: BuildTxWithRedeemer,\n  makeProgram: (\n    redeemer?: Redeemer,\n  ) => Effect.Effect<void, TransactionError, TxConfig>,\n  currentRedeemers: ReadonlyMap<number, Redeemer>,\n) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    if (voter.type === \"StakePool\" || voter.credential.type !== \"Script\") {\n      yield* txActionError(\n        \"Delayed vote redeemer requires a Plutus vote witness\",\n      );\n      return;\n    }\n\n    const script = config.scripts.get(voter.credential.hash);\n    const pendingId = pendingIds[0];\n    const delayedRedeemer = redeemerFor(currentRedeemers, pendingId);\n    if (!script) {\n      yield* makeProgram(delayedRedeemer);\n      return;\n    }\n    if (script.type === \"Native\") {\n      yield* makeProgram(undefined);\n      return;\n    }\n    yield* registerPendingRedeemer(config, {\n      id: pendingId,\n      actionId,\n      source: redeemer,\n      purposeKey: {\n        tag: \"vote\",\n        voterKey: GovernanceAction.governanceVoterKey(voter),\n      },\n    });\n    yield* makeProgram(delayedRedeemer);\n  });\n\nconst recordVoteAction = (\n  config: TxBuilderConfig,\n  voter: GovernanceVoter,\n  actionId: GovernanceActionId,\n  voteChoice: GovernanceVote,\n  anchor?: Anchor,\n  redeemer?: GovernanceRedeemer,\n) => {\n  const voterSnapshot = GovernanceAction.cloneGovernanceVoter(voter);\n  const actionIdSnapshot = {\n    txHash: actionId.txHash,\n    index: actionId.index,\n  };\n  const anchorSnapshot = anchor ? { ...anchor } : undefined;\n  const redeemerSnapshot = cloneRedeemerInput(redeemer);\n  const isDelayed = isBuildTxWithRedeemer(redeemerSnapshot);\n  const makeProgram = (resolvedRedeemer?: Redeemer) =>\n    GovernanceAction.vote(\n      voterSnapshot,\n      actionIdSnapshot,\n      voteChoice,\n      anchorSnapshot,\n      resolvedRedeemer,\n    );\n\n  recordAction(config, isDelayed ? 1 : 0, (id, pendingIds) =>\n    makeAction(\n      id,\n      \"vote\",\n      pendingIds,\n      isDelayed,\n      (replayActionId, actionPendingIds) => (currentRedeemers) =>\n        isDelayed\n          ? replayVoteWithDelayedRedeemer(\n              replayActionId,\n              actionPendingIds,\n              voterSnapshot,\n              redeemerSnapshot,\n              makeProgram,\n              currentRedeemers,\n            )\n          : makeProgram(redeemerSnapshot as Redeemer | undefined),\n    ),\n  );\n\n  if (!isDelayed) {\n    config.programs.push(makeProgram(redeemerSnapshot as Redeemer | undefined));\n  }\n};\n\nconst replayProposalWithDelayedRedeemer = (\n  actionId: number,\n  pendingIds: readonly number[],\n  proposal: GovernanceProposal,\n  redeemer: BuildTxWithRedeemer,\n  makeProgram: (\n    redeemer?: Redeemer,\n  ) => Effect.Effect<void, TransactionError, TxConfig>,\n  currentRedeemers: ReadonlyMap<number, Redeemer>,\n) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    const govAction = yield* GovernanceAction.toCMLGovernanceAction(\n      proposal.action,\n      config,\n    );\n    const scriptHash = govAction.script_hash()?.to_hex();\n    if (!scriptHash) {\n      yield* txActionError(\n        \"Delayed proposal redeemer requires a Plutus proposal witness\",\n      );\n      return;\n    }\n\n    const script = config.scripts.get(scriptHash);\n    const pendingId = pendingIds[0];\n    const delayedRedeemer = redeemerFor(currentRedeemers, pendingId);\n    if (!script) {\n      yield* makeProgram(delayedRedeemer);\n      return;\n    }\n    if (script.type === \"Native\") {\n      yield* makeProgram(undefined);\n      return;\n    }\n    yield* registerPendingRedeemer(config, {\n      id: pendingId,\n      actionId,\n      source: redeemer,\n      purposeKey: {\n        tag: \"propose\",\n        proposalKey: yield* GovernanceAction.governanceProposalKey(\n          proposal,\n          config,\n        ),\n      },\n    });\n    yield* makeProgram(delayedRedeemer);\n  });\n\nconst recordProposalAction = (\n  config: TxBuilderConfig,\n  proposal: GovernanceProposal,\n  redeemer?: GovernanceRedeemer,\n) => {\n  const proposalSnapshot = GovernanceAction.cloneGovernanceProposal(proposal);\n  const redeemerSnapshot = cloneRedeemerInput(redeemer);\n  const isDelayed = isBuildTxWithRedeemer(redeemerSnapshot);\n  const makeProgram = (resolvedRedeemer?: Redeemer) =>\n    GovernanceAction.propose(proposalSnapshot, resolvedRedeemer);\n\n  recordAction(config, isDelayed ? 1 : 0, (id, pendingIds) =>\n    makeAction(\n      id,\n      \"propose\",\n      pendingIds,\n      isDelayed,\n      (replayActionId, actionPendingIds) => (currentRedeemers) =>\n        isDelayed\n          ? replayProposalWithDelayedRedeemer(\n              replayActionId,\n              actionPendingIds,\n              proposalSnapshot,\n              redeemerSnapshot,\n              makeProgram,\n              currentRedeemers,\n            )\n          : makeProgram(redeemerSnapshot as Redeemer | undefined),\n    ),\n  );\n\n  if (!isDelayed) {\n    config.programs.push(makeProgram(redeemerSnapshot as Redeemer | undefined));\n  }\n};\n\nexport type TxBuilder = {\n  readFrom: (utxos: UTxO[]) => TxBuilder;\n  collectFrom: (\n    utxos: UTxO[],\n    redeemer?: Redeemer | RedeemerBuilder | BuildTxWithRedeemer,\n  ) => TxBuilder;\n  pay: {\n    ToAddress: (address: string, assets: Assets) => TxBuilder;\n    /**\n     * Creates an output that lock funds to a target address, with optional parameters for attaching a datum, assets, and a reference script.\n     *\n     * **Warning:** When working with Plutus V1 or V2 contracts, omitting the `outputDatum` can result in a permanently locked UTXO.\n     *\n     * @example\n     * ```ts\n     * const refScript: Script = {\n     *   type: \"PlutusV3\",\n     *   script: \"450100002499\",\n     *  };\n     *\n     * const signBuilder = await user\n     *   .newTx()\n     *   .pay.ToAddressWithData(\n     *     \"addr1q98wl3hnya9l94rt58ky533deyqe9t8zz5n9su26k8e5g23yar4q0adtaax9q9g0kphpv2ws7vxqwu6ln6pqx7j29nfqsfy9mg\",\n     *     {\n     *       kind: \"inline\",\n     *       value: \"d8799f44deadbeefff\",\n     *     },\n     *     { lovelace: 10_000_000n },\n     *     refScript\n     *   )\n     *   .complete();\n     * ```\n     */\n    ToAddressWithData: (\n      address: string,\n      outputDatum?: OutputDatum,\n      assets?: Assets | undefined,\n      scriptRef?: Script | undefined,\n    ) => TxBuilder;\n    /**\n     * Creates an output that lock funds to a target address, with optional parameters for attaching a datum, assets, and a reference script.\n     *\n     * **Warning:** When working with Plutus V1 or V2 contracts, omitting the `outputDatum` can result in a permanently locked UTXO.\n     *\n     * @example\n     * ```ts\n     * const refScript: Script = {\n     *   type: \"PlutusV3\",\n     *   script: \"450100002499\",\n     *  };\n     *\n     * const signBuilder = await user\n     *   .newTx()\n     *   .pay.ToContract(\n     *     \"addr1q98wl3hnya9l94rt58ky533deyqe9t8zz5n9su26k8e5g23yar4q0adtaax9q9g0kphpv2ws7vxqwu6ln6pqx7j29nfqsfy9mg\",\n     *     {\n     *       kind: \"inline\",\n     *       value: \"d8799f44deadbeefff\",\n     *     },\n     *     { lovelace: 10_000_000n },\n     *     refScript\n     *   )\n     *   .complete();\n     * ```\n     */\n    ToContract: (\n      address: string,\n      outputDatum?: OutputDatum,\n      assets?: Assets | undefined,\n      scriptRef?: Script | undefined,\n    ) => TxBuilder;\n  };\n  addSigner: (address: Address | RewardAddress) => TxBuilder;\n  addSignerKey: (keyHash: PaymentKeyHash | StakeKeyHash) => TxBuilder;\n  /**\n   * NOTE: Deprecate in future version\n   */\n  registerStake: (\n    rewardAddress: RewardAddress,\n    redeemer?: CertificateRedeemer,\n  ) => TxBuilder;\n  /**\n   * NOTE: Deprecate in future version\n   */\n  deRegisterStake: (\n    rewardAddress: RewardAddress,\n    redeemer?: CertificateRedeemer,\n  ) => TxBuilder;\n  withdraw: (\n    rewardAddress: RewardAddress,\n    amount: Lovelace,\n    redeemer?: Redeemer | RedeemerBuilder | BuildTxWithRedeemer,\n  ) => TxBuilder;\n  register: {\n    Stake: (\n      rewardAddress: RewardAddress,\n      redeemer?: CertificateRedeemer,\n    ) => TxBuilder;\n    DRep: (\n      rewardAddress: RewardAddress,\n      anchor?: Anchor,\n      redeemer?: CertificateRedeemer,\n    ) => TxBuilder;\n    Pool: (poolParams: PoolParams) => TxBuilder;\n  };\n  deregister: {\n    Stake: (\n      rewardAddress: RewardAddress,\n      redeemer?: CertificateRedeemer,\n    ) => TxBuilder;\n    DRep: (\n      rewardAddress: RewardAddress,\n      redeemer?: CertificateRedeemer,\n    ) => TxBuilder;\n  };\n  retire: {\n    Pool: (poolId: PoolId, epoch: number | bigint) => TxBuilder;\n  };\n  mintAssets: (\n    assets: Assets,\n    redeemer?: Redeemer | RedeemerBuilder | BuildTxWithRedeemer,\n  ) => TxBuilder;\n  donateToTreasury: (\n    donation: Lovelace,\n    currentTreasuryValue?: Lovelace,\n  ) => TxBuilder;\n  validFrom: (unixTime: number) => TxBuilder;\n  validTo: (unixTime: number) => TxBuilder;\n  /**\n   * NOTE: Deprecate in future version\n   */\n  delegateTo: (\n    rewardAddress: RewardAddress,\n    poolId: PoolId,\n    redeemer?: CertificateRedeemer,\n  ) => TxBuilder;\n  delegate: {\n    ToPool: (\n      rewardAddress: RewardAddress,\n      poolId: PoolId,\n      redeemer?: CertificateRedeemer,\n    ) => TxBuilder;\n    VoteToDRep: (\n      rewardAddress: RewardAddress,\n      drep: DRep,\n      redeemer?: CertificateRedeemer,\n    ) => TxBuilder;\n    VoteToPoolAndDRep: (\n      rewardAddress: RewardAddress,\n      poolId: PoolId,\n      drep: DRep,\n      redeemer?: CertificateRedeemer,\n    ) => TxBuilder;\n  };\n  registerAndDelegate: {\n    ToPool: (\n      rewardAddress: RewardAddress,\n      poolId: PoolId,\n      redeemer?: CertificateRedeemer,\n    ) => TxBuilder;\n    ToDRep: (\n      rewardAddress: RewardAddress,\n      drep: DRep,\n      redeemer?: CertificateRedeemer,\n    ) => TxBuilder;\n    ToPoolAndDRep: (\n      rewardAddress: RewardAddress,\n      poolId: PoolId,\n      drep: DRep,\n      redeemer?: CertificateRedeemer,\n    ) => TxBuilder;\n  };\n  updateDRep: (\n    rewardAddress: RewardAddress,\n    anchor?: Anchor,\n    redeemer?: CertificateRedeemer,\n  ) => TxBuilder;\n  vote: (\n    voter: GovernanceVoter,\n    actionId: GovernanceActionId,\n    vote: GovernanceVote,\n    anchor?: Anchor,\n    redeemer?: GovernanceRedeemer,\n  ) => TxBuilder;\n  propose: (\n    proposal: GovernanceProposal,\n    redeemer?: GovernanceRedeemer,\n  ) => TxBuilder;\n  authCommitteeHot: (\n    coldAddress: RewardAddress,\n    hotAddress: RewardAddress,\n    redeemer?: CertificateRedeemer,\n  ) => TxBuilder;\n  resignCommitteeHot: (\n    coldAddress: RewardAddress,\n    anchor?: Anchor,\n    redeemer?: CertificateRedeemer,\n  ) => TxBuilder;\n  attachMetadata: (\n    label: Label,\n    metadata: Metadata.TransactionMetadata,\n  ) => TxBuilder;\n  attach: {\n    Script: (script: Script) => TxBuilder;\n    SpendingValidator: (spendingValidator: Script) => TxBuilder;\n    MintingPolicy: (mintingPolicy: Script) => TxBuilder;\n    CertificateValidator: (certValidator: Script) => TxBuilder;\n    WithdrawalValidator: (withdrawalValidator: Script) => TxBuilder;\n    VoteValidator: (voteValidator: Script) => TxBuilder;\n    ProposeValidator: (proposeValidator: Script) => TxBuilder;\n  };\n  compose: (tx: TxBuilder | null) => TxBuilder;\n  setMinFee: (fee: bigint) => TxBuilder;\n  complete: (\n    options?: CompleteTxBuilder.CompleteOptions,\n  ) => Promise<TxSignBuilder.TxSignBuilder>;\n  completeProgram: (\n    options?: CompleteTxBuilder.CompleteOptions,\n  ) => Effect.Effect<TxSignBuilder.TxSignBuilder, TransactionError>;\n  completeSafe: (\n    options?: CompleteTxBuilder.CompleteOptions,\n  ) => Promise<Either<TxSignBuilder.TxSignBuilder, TransactionError>>;\n  chainProgram: (\n    options?: CompleteTxBuilder.CompleteOptions,\n  ) => Effect.Effect<\n    [UTxO[], UTxO[], TxSignBuilder.TxSignBuilder],\n    TransactionError,\n    never\n  >;\n  chain: (\n    options?: CompleteTxBuilder.CompleteOptions,\n  ) => Promise<[UTxO[], UTxO[], TxSignBuilder.TxSignBuilder]>;\n  chainSafe: (\n    options?: CompleteTxBuilder.CompleteOptions,\n  ) => Promise<\n    Either<[UTxO[], UTxO[], TxSignBuilder.TxSignBuilder], TransactionError>\n  >;\n  /**\n   * **Warning:** This method executes all programs and mutates the TxBuilder state.\n   *\n   * Calling `.complete()` after executing this function will lead to unexpected behavior.\n   *\n   * It is recommended to call `.config()` only for debugging purposes\n   */\n  config: () => Promise<TxBuilderConfig>;\n  /**\n   * Returns the raw TxBuilderConfig\n   */\n  rawConfig: () => TxBuilderConfig;\n  /**\n   * Returns the current lucid instance configuration\n   */\n  lucidConfig: () => LucidConfig;\n  /**\n   * Returns the current txbuilder programs\n   */\n  getPrograms: () => Effect.Effect<void, TransactionError, TxConfig>[];\n};\n\nexport function makeTxBuilder(lucidConfig: LucidConfig): TxBuilder {\n  const config = makeTxBuilderConfig(lucidConfig);\n  const configLayer = Layer.succeed(TxConfig, { config });\n  const txBuilder: TxBuilder = {\n    readFrom: (utxos: UTxO[]) => {\n      const snapshot = cloneUTxOs(utxos);\n      snapshot.map((utxo) => {\n        if (utxo.scriptRef) {\n          const scriptKeyValue = Attach.attachScript(utxo.scriptRef);\n          config.scripts.set(scriptKeyValue.key, scriptKeyValue.value);\n        }\n      });\n      recordAction(config, 0, (id, pendingIds) =>\n        makeAction(\n          id,\n          \"readFrom\",\n          pendingIds,\n          false,\n          () => () => Read.readFrom(cloneUTxOs(snapshot)),\n        ),\n      );\n      const program = Read.readFrom(cloneUTxOs(snapshot));\n      config.programs.push(program);\n      return txBuilder;\n    },\n    collectFrom: (utxos: UTxO[], redeemer?: BuildTxRedeemer) => {\n      const snapshot = cloneUTxOs(utxos);\n      const redeemerSnapshot = cloneRedeemerInput(redeemer, snapshot);\n      preserveSelfRedeemerBuilderInputs(redeemer, snapshot);\n      const isDelayed = isDelayedRedeemer(redeemerSnapshot);\n      const pendingCount = isDelayed\n        ? isBuildTxWithRedeemer(redeemerSnapshot) ||\n          (isRedeemerBuilder(redeemerSnapshot) &&\n            redeemerSnapshot.kind === \"self\")\n          ? snapshot.length\n          : 1\n        : 0;\n      recordAction(config, pendingCount, (id, pendingIds) =>\n        makeAction(\n          id,\n          \"collectFrom\",\n          pendingIds,\n          isDelayed,\n          (actionId, actionPendingIds) => (currentRedeemers) =>\n            isDelayed\n              ? replayCollectWithDelayedRedeemer(\n                  actionId,\n                  actionPendingIds,\n                  snapshot,\n                  redeemerSnapshot,\n                  currentRedeemers,\n                )\n              : Collect.collectFromUTxO(cloneUTxOs(snapshot))(\n                  redeemerSnapshot as Redeemer | undefined,\n                ),\n        ),\n      );\n      const program = isRedeemerBuilder(redeemerSnapshot)\n        ? Collect.collectFromUTxOPartial(snapshot, redeemerSnapshot)\n        : isBuildTxWithRedeemer(redeemerSnapshot)\n          ? undefined\n          : Collect.collectFromUTxO(cloneUTxOs(snapshot))(redeemerSnapshot);\n      if (program) config.programs.push(program);\n      return txBuilder;\n    },\n    pay: {\n      ToAddress: (address: string, assets: Assets) => {\n        const snapshot = cloneAssets(assets);\n        recordAction(config, 0, (id, pendingIds) =>\n          makeAction(\n            id,\n            \"pay.ToAddress\",\n            pendingIds,\n            false,\n            () => () => Pay.payToAddress(address, cloneAssets(snapshot)),\n          ),\n        );\n        const program = Pay.payToAddress(address, cloneAssets(snapshot));\n        config.programs.push(program);\n        return txBuilder;\n      },\n      ToAddressWithData: (\n        address: string,\n        outputDatum?: OutputDatum,\n        assets?: Assets,\n        scriptRef?: Script | undefined,\n      ) => {\n        const assetsSnapshot = assets ? cloneAssets(assets) : undefined;\n        const scriptRefSnapshot = scriptRef ? { ...scriptRef } : undefined;\n        const outputDatumSnapshot = cloneOutputDatum(outputDatum);\n        const program = Pay.ToAddressWithData(\n          address,\n          outputDatumSnapshot,\n          assetsSnapshot,\n          scriptRefSnapshot,\n        );\n        recordAction(config, 0, (id, pendingIds) =>\n          makeAction(\n            id,\n            \"pay.ToAddressWithData\",\n            pendingIds,\n            false,\n            () => () =>\n              Pay.ToAddressWithData(\n                address,\n                cloneOutputDatum(outputDatumSnapshot),\n                assetsSnapshot ? cloneAssets(assetsSnapshot) : undefined,\n                scriptRefSnapshot ? { ...scriptRefSnapshot } : undefined,\n              ),\n          ),\n        );\n        config.programs.push(program);\n        return txBuilder;\n      },\n      ToContract: (\n        address: string,\n        outputDatum?: OutputDatum,\n        assets?: Assets,\n        scriptRef?: Script | undefined,\n      ) => {\n        const assetsSnapshot = assets ? cloneAssets(assets) : undefined;\n        const scriptRefSnapshot = scriptRef ? { ...scriptRef } : undefined;\n        const outputDatumSnapshot = cloneOutputDatum(outputDatum);\n        recordAction(config, 0, (id, pendingIds) =>\n          makeAction(\n            id,\n            \"pay.ToContract\",\n            pendingIds,\n            false,\n            () => () =>\n              Pay.ToContract(\n                address,\n                cloneOutputDatum(outputDatumSnapshot),\n                assetsSnapshot ? cloneAssets(assetsSnapshot) : undefined,\n                scriptRefSnapshot ? { ...scriptRefSnapshot } : undefined,\n              ),\n          ),\n        );\n        const program = Pay.ToContract(\n          address,\n          outputDatumSnapshot,\n          assetsSnapshot,\n          scriptRefSnapshot,\n        );\n        config.programs.push(program);\n        return txBuilder;\n      },\n    },\n    addSigner: (address: Address | RewardAddress) => {\n      recordAction(config, 0, (id, pendingIds) =>\n        makeAction(\n          id,\n          \"addSigner\",\n          pendingIds,\n          false,\n          () => () => Signer.addSigner(address),\n        ),\n      );\n      const program = Signer.addSigner(address);\n      config.programs.push(program);\n      return txBuilder;\n    },\n    addSignerKey: (keyHash: PaymentKeyHash | StakeKeyHash) => {\n      recordAction(config, 0, (id, pendingIds) =>\n        makeAction(\n          id,\n          \"addSignerKey\",\n          pendingIds,\n          false,\n          () => () => Signer.addSignerKey(keyHash),\n        ),\n      );\n      const program = Signer.addSignerKey(keyHash);\n      config.programs.push(program);\n      return txBuilder;\n    },\n    registerStake: (\n      rewardAddress: RewardAddress,\n      redeemer?: CertificateRedeemer,\n    ) => {\n      recordCertificateAction(\n        config,\n        \"registerStake\",\n        (resolvedRedeemer) =>\n          Stake.registerStake(rewardAddress, resolvedRedeemer),\n        redeemer,\n        rewardAddress,\n      );\n      return txBuilder;\n    },\n    register: {\n      Stake: (rewardAddress: RewardAddress, redeemer?: CertificateRedeemer) => {\n        recordCertificateAction(\n          config,\n          \"register.Stake\",\n          (resolvedRedeemer) =>\n            Stake.registerStake(rewardAddress, resolvedRedeemer),\n          redeemer,\n          rewardAddress,\n        );\n        return txBuilder;\n      },\n      DRep: (\n        rewardAddress: RewardAddress,\n        anchor?: Anchor,\n        redeemer?: CertificateRedeemer,\n      ) => {\n        recordCertificateAction(\n          config,\n          \"register.DRep\",\n          (resolvedRedeemer) =>\n            Governance.registerDRep(rewardAddress, anchor, resolvedRedeemer),\n          redeemer,\n          rewardAddress,\n        );\n        return txBuilder;\n      },\n      Pool: (poolParams: PoolParams) => {\n        const snapshot = clonePoolParams(poolParams);\n        recordAction(config, 0, (id, pendingIds) =>\n          makeAction(\n            id,\n            \"register.Pool\",\n            pendingIds,\n            false,\n            () => () =>\n              withCertificateIndex(\n                Pool.registerPool(clonePoolParams(snapshot)),\n              ),\n          ),\n        );\n        config.programs.push(\n          withCertificateIndex(Pool.registerPool(clonePoolParams(snapshot))),\n        );\n        return txBuilder;\n      },\n    },\n    deRegisterStake: (\n      rewardAddress: RewardAddress,\n      redeemer?: CertificateRedeemer,\n    ) => {\n      recordCertificateAction(\n        config,\n        \"deRegisterStake\",\n        (resolvedRedeemer) =>\n          Stake.deRegisterStake(rewardAddress, resolvedRedeemer),\n        redeemer,\n        rewardAddress,\n      );\n      return txBuilder;\n    },\n    deregister: {\n      Stake: (rewardAddress: RewardAddress, redeemer?: CertificateRedeemer) => {\n        recordCertificateAction(\n          config,\n          \"deregister.Stake\",\n          (resolvedRedeemer) =>\n            Stake.deRegisterStake(rewardAddress, resolvedRedeemer),\n          redeemer,\n          rewardAddress,\n        );\n        return txBuilder;\n      },\n      DRep: (rewardAddress: RewardAddress, redeemer?: CertificateRedeemer) => {\n        recordCertificateAction(\n          config,\n          \"deregister.DRep\",\n          (resolvedRedeemer) =>\n            Governance.deregisterDRep(rewardAddress, resolvedRedeemer),\n          redeemer,\n          rewardAddress,\n        );\n        return txBuilder;\n      },\n    },\n    retire: {\n      Pool: (poolId: PoolId, epoch: number | bigint) => {\n        const epochSnapshot = BigInt(epoch);\n        recordAction(config, 0, (id, pendingIds) =>\n          makeAction(\n            id,\n            \"retire.Pool\",\n            pendingIds,\n            false,\n            () => () =>\n              withCertificateIndex(Pool.retirePool(poolId, epochSnapshot)),\n          ),\n        );\n        config.programs.push(\n          withCertificateIndex(Pool.retirePool(poolId, epochSnapshot)),\n        );\n        return txBuilder;\n      },\n    },\n    withdraw: (\n      rewardAddress: RewardAddress,\n      amount: Lovelace,\n      redeemer?: BuildTxRedeemer,\n    ) => {\n      const redeemerSnapshot = cloneRedeemerInput(redeemer);\n      const isDelayed = isDelayedRedeemer(redeemerSnapshot);\n      recordAction(config, isDelayed ? 1 : 0, (id, pendingIds) =>\n        makeAction(\n          id,\n          \"withdraw\",\n          pendingIds,\n          isDelayed,\n          (actionId, actionPendingIds) => (currentRedeemers) =>\n            isDelayed\n              ? replayWithdrawWithDelayedRedeemer(\n                  actionId,\n                  actionPendingIds,\n                  rewardAddress,\n                  amount,\n                  redeemerSnapshot,\n                  currentRedeemers,\n                )\n              : Stake.withdraw(\n                  rewardAddress,\n                  amount,\n                )(redeemerSnapshot as Redeemer | undefined),\n        ),\n      );\n      const partialProgram = Stake.withdraw(rewardAddress, amount);\n      //TODO: improve function workflow\n      if (isBuildTxWithRedeemer(redeemerSnapshot)) {\n        return txBuilder;\n      }\n      handleRedeemerBuilder(config, partialProgram, redeemerSnapshot);\n      return txBuilder;\n    },\n    mintAssets: (assets: Assets, redeemer?: BuildTxRedeemer) => {\n      const assetsSnapshot = cloneAssets(assets);\n      const redeemerSnapshot = cloneRedeemerInput(redeemer);\n      const isDelayed = isDelayedRedeemer(redeemerSnapshot);\n      config.mintedAssets = addAssets(config.mintedAssets, assetsSnapshot);\n      recordAction(config, isDelayed ? 1 : 0, (id, pendingIds) =>\n        makeAction(\n          id,\n          \"mintAssets\",\n          pendingIds,\n          isDelayed,\n          (actionId, actionPendingIds) => (currentRedeemers) =>\n            isDelayed\n              ? replayMintWithDelayedRedeemer(\n                  actionId,\n                  actionPendingIds,\n                  assetsSnapshot,\n                  redeemerSnapshot,\n                  currentRedeemers,\n                )\n              : Mint.mintAssets(cloneAssets(assetsSnapshot))(\n                  redeemerSnapshot as Redeemer | undefined,\n                ),\n        ),\n      );\n      const partialProgram = Mint.mintAssets(cloneAssets(assetsSnapshot));\n      //TODO: improve function workflow\n      if (isBuildTxWithRedeemer(redeemerSnapshot)) {\n        return txBuilder;\n      }\n      handleRedeemerBuilder(config, partialProgram, redeemerSnapshot);\n      return txBuilder;\n    },\n    donateToTreasury: (donation: Lovelace, currentTreasuryValue?: Lovelace) => {\n      const donationSnapshot = BigInt(donation);\n      const currentTreasuryValueSnapshot =\n        currentTreasuryValue === undefined\n          ? undefined\n          : BigInt(currentTreasuryValue);\n      recordAction(config, 0, (id, pendingIds) =>\n        makeAction(\n          id,\n          \"donateToTreasury\",\n          pendingIds,\n          false,\n          () => () =>\n            Treasury.donateToTreasury(\n              donationSnapshot,\n              currentTreasuryValueSnapshot,\n            ),\n        ),\n      );\n      config.programs.push(\n        Treasury.donateToTreasury(\n          donationSnapshot,\n          currentTreasuryValueSnapshot,\n        ),\n      );\n      return txBuilder;\n    },\n    validFrom: (unixTime: number) => {\n      recordAction(config, 0, (id, pendingIds) =>\n        makeAction(\n          id,\n          \"validFrom\",\n          pendingIds,\n          false,\n          () => () => Interval.validFrom(unixTime),\n        ),\n      );\n      const program = Interval.validFrom(unixTime);\n      config.programs.push(program);\n      return txBuilder;\n    },\n    validTo: (unixTime: number) => {\n      recordAction(config, 0, (id, pendingIds) =>\n        makeAction(\n          id,\n          \"validTo\",\n          pendingIds,\n          false,\n          () => () => Interval.validTo(unixTime),\n        ),\n      );\n      const program = Interval.validTo(unixTime);\n      config.programs.push(program);\n      return txBuilder;\n    },\n    delegateTo: (\n      rewardAddress: RewardAddress,\n      poolId: PoolId,\n      redeemer?: CertificateRedeemer,\n    ) => {\n      recordCertificateAction(\n        config,\n        \"delegateTo\",\n        (resolvedRedeemer) =>\n          Pool.delegateTo(rewardAddress, poolId, resolvedRedeemer),\n        redeemer,\n        rewardAddress,\n      );\n      return txBuilder;\n    },\n    delegate: {\n      ToPool: (\n        rewardAddress: RewardAddress,\n        poolId: PoolId,\n        redeemer?: CertificateRedeemer,\n      ) => {\n        recordCertificateAction(\n          config,\n          \"delegate.ToPool\",\n          (resolvedRedeemer) =>\n            Pool.delegateTo(rewardAddress, poolId, resolvedRedeemer),\n          redeemer,\n          rewardAddress,\n        );\n        return txBuilder;\n      },\n\n      VoteToDRep: (\n        rewardAddress: RewardAddress,\n        drep: DRep,\n        redeemer?: CertificateRedeemer,\n      ) => {\n        recordCertificateAction(\n          config,\n          \"delegate.VoteToDRep\",\n          (resolvedRedeemer) =>\n            Governance.delegateVoteToDRep(\n              rewardAddress,\n              drep,\n              resolvedRedeemer,\n            ),\n          redeemer,\n          rewardAddress,\n        );\n        return txBuilder;\n      },\n\n      VoteToPoolAndDRep: (\n        rewardAddress: RewardAddress,\n        poolId: PoolId,\n        drep: DRep,\n        redeemer?: CertificateRedeemer,\n      ) => {\n        recordCertificateAction(\n          config,\n          \"delegate.VoteToPoolAndDRep\",\n          (resolvedRedeemer) =>\n            Governance.delegateVoteToPoolAndDRep(\n              rewardAddress,\n              poolId,\n              drep,\n              resolvedRedeemer,\n            ),\n          redeemer,\n          rewardAddress,\n        );\n        return txBuilder;\n      },\n    },\n    registerAndDelegate: {\n      ToPool: (\n        rewardAddress: RewardAddress,\n        poolId: PoolId,\n        redeemer?: CertificateRedeemer,\n      ) => {\n        recordCertificateAction(\n          config,\n          \"registerAndDelegate.ToPool\",\n          (resolvedRedeemer) =>\n            Governance.registerAndDelegateToPool(\n              rewardAddress,\n              poolId,\n              resolvedRedeemer,\n            ),\n          redeemer,\n          rewardAddress,\n        );\n        return txBuilder;\n      },\n      ToDRep: (\n        rewardAddress: RewardAddress,\n        drep: DRep,\n        redeemer?: CertificateRedeemer,\n      ) => {\n        recordCertificateAction(\n          config,\n          \"registerAndDelegate.ToDRep\",\n          (resolvedRedeemer) =>\n            Governance.registerAndDelegateToDRep(\n              rewardAddress,\n              drep,\n              resolvedRedeemer,\n            ),\n          redeemer,\n          rewardAddress,\n        );\n        return txBuilder;\n      },\n      ToPoolAndDRep: (\n        rewardAddress: RewardAddress,\n        poolId: PoolId,\n        drep: DRep,\n        redeemer?: CertificateRedeemer,\n      ) => {\n        recordCertificateAction(\n          config,\n          \"registerAndDelegate.ToPoolAndDRep\",\n          (resolvedRedeemer) =>\n            Governance.registerAndDelegateToPoolAndDRep(\n              rewardAddress,\n              poolId,\n              drep,\n              resolvedRedeemer,\n            ),\n          redeemer,\n          rewardAddress,\n        );\n        return txBuilder;\n      },\n    },\n    updateDRep: (\n      rewardAddress: RewardAddress,\n      anchor?: Anchor,\n      redeemer?: CertificateRedeemer,\n    ) => {\n      recordCertificateAction(\n        config,\n        \"updateDRep\",\n        (resolvedRedeemer) =>\n          Governance.updateDRep(rewardAddress, anchor, resolvedRedeemer),\n        redeemer,\n        rewardAddress,\n      );\n      return txBuilder;\n    },\n    vote: (\n      voter: GovernanceVoter,\n      actionId: GovernanceActionId,\n      vote: GovernanceVote,\n      anchor?: Anchor,\n      redeemer?: GovernanceRedeemer,\n    ) => {\n      recordVoteAction(config, voter, actionId, vote, anchor, redeemer);\n      return txBuilder;\n    },\n    propose: (proposal: GovernanceProposal, redeemer?: GovernanceRedeemer) => {\n      recordProposalAction(config, proposal, redeemer);\n      return txBuilder;\n    },\n    authCommitteeHot: (\n      coldAddress: RewardAddress,\n      hotAddress: RewardAddress,\n      redeemer?: CertificateRedeemer,\n    ) => {\n      recordCertificateAction(\n        config,\n        \"authCommitteeHot\",\n        (resolvedRedeemer) =>\n          Governance.authCommitteeHot(\n            coldAddress,\n            hotAddress,\n            resolvedRedeemer,\n          ),\n        redeemer,\n        coldAddress,\n      );\n      return txBuilder;\n    },\n    resignCommitteeHot: (\n      coldAddress: RewardAddress,\n      anchor?: Anchor,\n      redeemer?: CertificateRedeemer,\n    ) => {\n      recordCertificateAction(\n        config,\n        \"resignCommitteeHot\",\n        (resolvedRedeemer) =>\n          Governance.resignCommitteeHot(coldAddress, anchor, resolvedRedeemer),\n        redeemer,\n        coldAddress,\n      );\n      return txBuilder;\n    },\n    attachMetadata: (label: Label, metadata: Metadata.TransactionMetadata) => {\n      const metadataSnapshot = Metadata.cloneTransactionMetadata(metadata);\n      recordAction(config, 0, (id, pendingIds) =>\n        makeAction(\n          id,\n          \"attachMetadata\",\n          pendingIds,\n          false,\n          () => () =>\n            Metadata.attachMetadata(\n              label,\n              Metadata.cloneTransactionMetadata(metadataSnapshot),\n            ),\n        ),\n      );\n      const program = Metadata.attachMetadata(\n        label,\n        Metadata.cloneTransactionMetadata(metadataSnapshot),\n      );\n      config.programs.push(program);\n      return txBuilder;\n    },\n    attach: {\n      Script: (script: Script) => {\n        const scriptKeyValue = Attach.attachScript(script);\n        config.scripts.set(scriptKeyValue.key, scriptKeyValue.value);\n        return txBuilder;\n      },\n      SpendingValidator: (spendingValidator: Script) => {\n        const scriptKeyValue =\n          Attach.attachSpendingValidator(spendingValidator);\n        config.scripts.set(scriptKeyValue.key, scriptKeyValue.value);\n        return txBuilder;\n      },\n      MintingPolicy: (mintingPolicy: Script) => {\n        const scriptKeyValue = Attach.attachMintingPolicy(mintingPolicy);\n        config.scripts.set(scriptKeyValue.key, scriptKeyValue.value);\n        return txBuilder;\n      },\n      CertificateValidator: (certValidator: Script) => {\n        const scriptKeyValue = Attach.attachCertificateValidator(certValidator);\n        config.scripts.set(scriptKeyValue.key, scriptKeyValue.value);\n        return txBuilder;\n      },\n      WithdrawalValidator: (withdrawalValidator: Script) => {\n        const scriptKeyValue =\n          Attach.attachWithdrawalValidator(withdrawalValidator);\n        config.scripts.set(scriptKeyValue.key, scriptKeyValue.value);\n        return txBuilder;\n      },\n      VoteValidator: (voteValidator: Script) => {\n        const scriptKeyValue = Attach.attachVoteValidator(voteValidator);\n        config.scripts.set(scriptKeyValue.key, scriptKeyValue.value);\n        return txBuilder;\n      },\n      ProposeValidator: (proposeValidator: Script) => {\n        const scriptKeyValue = Attach.attachProposeValidator(proposeValidator);\n        config.scripts.set(scriptKeyValue.key, scriptKeyValue.value);\n        return txBuilder;\n      },\n    },\n    compose: (tx: TxBuilder | null) => {\n      if (tx) {\n        const rawConfig = tx.rawConfig();\n        config.scripts = new Map([...config.scripts, ...rawConfig.scripts]);\n        for (const childAction of rawConfig.actions) {\n          recordAction(\n            config,\n            childAction.pendingIds.length,\n            (id, pendingIds) => childAction.cloneWithIds(id, pendingIds),\n          );\n        }\n        config.mintedAssets = addAssets(\n          config.mintedAssets,\n          rawConfig.mintedAssets,\n        );\n      }\n      return txBuilder;\n    },\n    setMinFee: (fee: bigint) => {\n      config.minFee = fee;\n      return txBuilder;\n    },\n    complete: (options?: CompleteTxBuilder.CompleteOptions) =>\n      makeReturn(\n        pipe(\n          CompleteTxBuilder.complete(options),\n          Effect.provide(configLayer),\n          Effect.map((result) => result[2]),\n        ),\n      ).unsafeRun(),\n    completeProgram: (options?: CompleteTxBuilder.CompleteOptions) =>\n      pipe(\n        CompleteTxBuilder.complete(options),\n        Effect.provide(configLayer),\n        Effect.map((result) => result[2]),\n      ),\n    completeSafe: (options?: CompleteTxBuilder.CompleteOptions) =>\n      makeReturn(\n        pipe(\n          CompleteTxBuilder.complete(options),\n          Effect.provide(configLayer),\n          Effect.map((result) => result[2]),\n        ),\n      ).safeRun(),\n    chainProgram: (options?: CompleteTxBuilder.CompleteOptions) =>\n      pipe(CompleteTxBuilder.complete(options), Effect.provide(configLayer)),\n    chain: (options?: CompleteTxBuilder.CompleteOptions) =>\n      makeReturn(\n        pipe(CompleteTxBuilder.complete(options), Effect.provide(configLayer)),\n      ).unsafeRun(),\n    chainSafe: (options?: CompleteTxBuilder.CompleteOptions) =>\n      makeReturn(\n        pipe(CompleteTxBuilder.complete(options), Effect.provide(configLayer)),\n      ).safeRun(),\n    rawConfig: () => config,\n    config: () => {\n      const replayConfig = makeReplayConfig(config);\n      return pipe(\n        Effect.gen(function* () {\n          if (hasDelayedActions(config)) {\n            yield* txActionError(\n              \".config() cannot replay RedeemerBuilder or BuildTxWithRedeemer actions; use complete()/chain() instead\",\n            );\n          }\n          yield* replayTxActions(config.actions);\n          return replayConfig;\n        }),\n        Effect.provide(Layer.succeed(TxConfig, { config: replayConfig })),\n        Effect.runPromise,\n      );\n    },\n    lucidConfig: () => config.lucidConfig,\n    getPrograms: () => config.programs,\n  };\n  return txBuilder;\n}\n","import { Effect, pipe } from \"effect\";\nimport { Data } from \"@lucid-evolution/plutus\";\nimport { utxoToCore } from \"@lucid-evolution/utils\";\nimport { withCMLScope } from \"@lucid-evolution/core-utils\";\nimport type { TxBuilderConfig } from \"../TxBuilder.js\";\nimport { Redeemer, RedeemerBuilder, UTxO } from \"@lucid-evolution/core-types\";\nimport { ERROR_MESSAGE, TxBuilderError } from \"../../Errors.js\";\nimport * as CML from \"@anastasia-labs/cardano-multiplatform-lib-nodejs\";\nimport { resolveDatum, toPartial, toV1, toV2, toV3 } from \"./TxUtils.js\";\nimport { paymentCredentialOf } from \"@lucid-evolution/utils\";\nimport { datumOf } from \"../../lucid-evolution/utils.js\";\nimport { TxConfig } from \"./Service.js\";\n\nexport const collectError = (cause: unknown) =>\n  new TxBuilderError({ cause: `{ Collect: ${cause} }` });\n\nexport const collectFromUTxO =\n  (utxos: UTxO[], collectInputs: Boolean = true) =>\n  (redeemer?: Redeemer) =>\n    Effect.gen(function* () {\n      const { config } = yield* TxConfig;\n      if (utxos.length === 0) yield* collectError(ERROR_MESSAGE.EMPTY_UTXO);\n      for (const utxo of utxos) {\n        // fetch the datum when the datumHash is present\n        const resolvedDatum = yield* resolveDatum(\n          utxo.datumHash,\n          utxo.datum,\n          config.lucidConfig.provider,\n        );\n        utxo.datum = resolvedDatum;\n        // Skip adding UTxO to collectedInputs when building redeemers to prevent duplicate inputs\n        // Store inputs for later use in the txBuilder\n        if (collectInputs) config.collectedInputs.push(utxo);\n        //TODO: Add config.collectedAssets\n        const input = withCMLScope((own) =>\n          CML.SingleInputBuilder.from_transaction_unspent_output(\n            own(utxoToCore({ ...utxo, datum: resolvedDatum })),\n          ),\n        );\n        yield* addCollectedInput(config, input, utxo, redeemer).pipe(\n          Effect.ensuring(Effect.sync(() => input.free())),\n        );\n      }\n    });\n\nconst missingRedeemer = (redeemer?: Redeemer) =>\n  pipe(\n    Effect.fromNullable(redeemer),\n    Effect.orElseFail(() => collectError(ERROR_MESSAGE.MISSING_REDEEMER)),\n  );\n\nconst addPlutusInput = (\n  config: TxBuilderConfig,\n  input: CML.SingleInputBuilder,\n  utxo: UTxO,\n  script: CML.PlutusScript,\n  redeemer: Redeemer,\n): void =>\n  withCMLScope((own) => {\n    own(script);\n    const partial = own(toPartial(script, redeemer));\n    const requiredSigners = own(CML.Ed25519KeyHashList.new());\n    config.txBuilder.add_input(\n      own(\n        utxo.datum && utxo.datumHash\n          ? input.plutus_script(\n              partial,\n              requiredSigners,\n              own(CML.PlutusData.from_cbor_hex(utxo.datum)),\n            )\n          : input.plutus_script_inline_datum(partial, requiredSigners),\n      ),\n    );\n  });\n\nconst addCollectedInput = (\n  config: TxBuilderConfig,\n  input: CML.SingleInputBuilder,\n  utxo: UTxO,\n  redeemer?: Redeemer,\n): Effect.Effect<void, TxBuilderError> =>\n  Effect.gen(function* () {\n    const credential = paymentCredentialOf(utxo.address);\n    if (credential.type != \"Script\") {\n      withCMLScope((own) =>\n        config.txBuilder.add_input(own(input.payment_key())),\n      );\n      return;\n    }\n    const script = yield* pipe(\n      Effect.fromNullable(config.scripts.get(credential.hash)),\n      Effect.orElseFail(() =>\n        collectError(\n          collectError(ERROR_MESSAGE.MISSING_SCRIPT(credential.hash)),\n        ),\n      ),\n    );\n    switch (script.type) {\n      case \"Native\":\n        withCMLScope((own) =>\n          config.txBuilder.add_input(\n            own(\n              input.native_script(\n                own(CML.NativeScript.from_cbor_hex(script.script)),\n                own(CML.NativeScriptWitnessInfo.assume_signature_count()),\n              ),\n            ),\n          ),\n        );\n        break;\n      case \"PlutusV1\": {\n        const red = yield* missingRedeemer(redeemer);\n        withCMLScope((own) => {\n          const partial = own(toPartial(own(toV1(script.script)), red));\n          config.txBuilder.add_input(\n            own(\n              input.plutus_script(\n                partial,\n                own(CML.Ed25519KeyHashList.new()),\n                own(CML.PlutusData.from_cbor_hex(utxo.datum!)),\n              ),\n            ),\n          );\n        });\n        break;\n      }\n      case \"PlutusV2\": {\n        const red = yield* missingRedeemer(redeemer);\n        addPlutusInput(config, input, utxo, toV2(script.script), red);\n        break;\n      }\n      case \"PlutusV3\": {\n        const red = yield* missingRedeemer(redeemer);\n        addPlutusInput(config, input, utxo, toV3(script.script), red);\n        break;\n      }\n    }\n  });\n\n/* \"collectFrom\" for RedeemerBuilder needs similar utxo validations as done for Redeemer.\n  These should happen before coin selection; so the effect this function returns is added\n  to the \"programs\".\n*/\nexport const collectFromUTxOPartial = (\n  utxos: UTxO[],\n  redeemerBuilder: RedeemerBuilder,\n) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    if (utxos.length === 0) yield* collectError(ERROR_MESSAGE.EMPTY_UTXO);\n    if (redeemerBuilder.kind === \"self\") redeemerBuilder.inputs = utxos;\n    for (const utxo of utxos) {\n      if (utxo.datumHash && !utxo.datum) {\n        const data = yield* Effect.tryPromise({\n          try: () => datumOf(config.lucidConfig.provider, utxo),\n          catch: (cause) => collectError({ cause }),\n        });\n        utxo.datum = Data.to(data);\n      }\n      // An array of unspent transaction outputs to be used as inputs when running uplc eval.\n      config.collectedInputs.push(utxo);\n      //TODO: Add config.collectedAssets\n    }\n    // NOTE: If RedeemerBuilder is of kind \"self\" the partial program will be incorrect\n    // however it won't matter as it won't be used if that's the case. But we still need\n    // that RedeemerBuilder in partialPrograms to construct it later during \"complete\"\n    const partialProgram = collectFromUTxO(utxos, false);\n    config.partialPrograms.set(redeemerBuilder, partialProgram);\n  });\n","import { Network } from \"@lucid-evolution/core-types\";\nimport { Data } from \"effect\";\n\nexport const ERROR_MESSAGE = {\n  MULTIPLE_POLICIES:\n    \"MULTIPLE_POLICIES: Only one policy id allowed. You can chain multiple mintAssets functions together if you need to mint assets with different policy ids. \",\n  EMPTY_UTXO:\n    \"EMPTY_UTXO: UTxO array is empty. If a Tx has been recently submitted, consider waiting for chain sync\",\n  MISSING_WALLET:\n    \"MISSING_WALLET: please ensure that your wallet has been properly configured and initialized\",\n  MISSING_REDEEMER: \"MISSING_REDEEMER: redeemer can not be undefined\",\n  DATUM_NOT_SET:\n    \"DATUM_NOT_SET: Script inputs becomes unspendable without datum.\",\n  EMPTY_ASSETS:\n    \"EMPTY_ASSETS: Attempting to pay to an address with an empty assets object\",\n  MISSING_REWARD_TYPE: \"MISSING_REWARD_TYPE: Address type must be Reward type.\",\n  MISSING_STAKE_CREDENTIAL:\n    \"MISSING_STAKE_CREDENTIAL: Address does not contain stake credential\",\n  MISSING_PAYMENT_CREDENTIAL:\n    \"MISSING_PAYMENT_CREDENTIAL: Address does not contain payment credential\",\n  INVALID_METADATA: \"INVALID_METADATA: metadata is invalid\",\n  SCRIPT_CREDENTIAL_NOT_ALLOWED:\n    \"SCRIPT_CREDENTIAL_NOT_ALLOWED: Only verification key credential is allowed\",\n  INVALID_SCRIPT: \"INVALID_SCRIPT: Script is invalid\",\n  EXPECTED_KEY_HASH: \"EXPECTED_KEY_HASH\",\n  INVALID_NETWORK: (\n    address: string,\n    actualNetworkId: number,\n    network: Network,\n  ) =>\n    `Invalid address: ${address}, Expected address with network id ${actualNetworkId}, current network ${network}`,\n  MISSING_SCRIPT: (hash: string) =>\n    `MISSING_SCRIPT: Script not found when building transaction, consider using attach modules. script_hash: ${hash}`,\n  MISSING_POLICY: (policyId: string) =>\n    `MISSING_POLICY: No policy found, policy_id: ${policyId}`,\n} as const;\n\nexport class NullableError extends Data.TaggedError(\"NullableError\")<{\n  readonly message: string;\n}> {}\n\nexport class ProviderCapabilityError extends Error {\n  readonly _tag = \"ProviderCapabilityError\";\n  readonly capability: string;\n\n  constructor(capability: string) {\n    super(\n      `The configured provider does not implement the optional ${capability} capability.`,\n    );\n    this.name = \"ProviderCapabilityError\";\n    this.capability = capability;\n  }\n}\n\nexport class UnauthorizedNetwork extends Data.TaggedError(\n  \"UnauthorizedNetwork\",\n)<{\n  readonly message: string;\n}> {}\n\nexport class TxBuilderError extends Data.TaggedError(\"TxBuilderError\")<{\n  readonly cause: unknown;\n}> {\n  get message() {\n    return `${this.cause}`;\n  }\n}\n\nexport class EvaluatorError extends Data.TaggedError(\"EvaluatorError\")<{\n  readonly evaluator?: string;\n  readonly message: string;\n  readonly cause?: unknown;\n}> {}\n\nexport type TransactionError = RunTimeError | TxBuilderError | EvaluatorError;\n\nexport class TxSignerError extends Data.TaggedError(\"TxSignerError\")<{\n  readonly cause: unknown;\n}> {\n  get message() {\n    return `${this.cause}`;\n  }\n}\n\nexport type TransactionSignError = RunTimeError | TxSignerError;\n\nexport class TxSubmitError extends Data.TaggedError(\"TxSubmitError\")<{\n  readonly cause: unknown;\n}> {\n  get message() {\n    return `${this.cause}`;\n  }\n}\n\n//NOTE: RunTimeError is used to catch all unexpected errors primarly from CML library\nexport class RunTimeError extends Data.TaggedError(\"RunTimeError\")<{\n  cause: unknown;\n}> {\n  get message() {\n    return `${this.cause}`;\n  }\n}\n","import * as CML from \"@anastasia-labs/cardano-multiplatform-lib-nodejs\";\nimport { CBORHex } from \"../types.js\";\nimport { Effect, pipe } from \"effect\";\nimport { networkToId, getAddressDetails } from \"@lucid-evolution/utils\";\nimport { withCMLScope } from \"@lucid-evolution/core-utils\";\nimport {\n  Address,\n  AddressDetails,\n  Redeemer,\n  RedeemerBuilder,\n  RewardAddress,\n  Credential,\n  UTxO,\n  Provider,\n} from \"@lucid-evolution/core-types\";\nimport { ERROR_MESSAGE, TxBuilderError } from \"../../Errors.js\";\nimport { LucidConfig } from \"../../lucid-evolution/LucidEvolution.js\";\nimport { TxBuilderConfig } from \"../TxBuilder.js\";\n\nimport * as TxBuilder from \"../TxBuilder.js\";\nimport { TxConfig } from \"./Service.js\";\nimport { Data } from \"@lucid-evolution/plutus\";\n\nexport const txBuilderError = (cause: unknown) =>\n  new TxBuilderError({ cause: `{ TxBuilderError : ${cause} }` });\n\n//TODO: improve error message, utils is used in different modules\nexport const toCMLAddress = (\n  address: Address | RewardAddress,\n  lucidConfig: LucidConfig,\n): Effect.Effect<CML.Address, TxBuilderError, never> =>\n  Effect.gen(function* ($) {\n    const { type } = yield* validateAddressDetails(address, lucidConfig);\n    return type === \"Byron\"\n      ? withCMLScope((own) =>\n          own(CML.ByronAddress.from_base58(address)).to_address(),\n        )\n      : CML.Address.from_bech32(address);\n  });\n\nexport const toV1 = (script: string) =>\n  withCMLScope((own) =>\n    CML.PlutusScript.from_v1(own(CML.PlutusV1Script.from_cbor_hex(script))),\n  );\n\nexport const toV2 = (script: string) =>\n  withCMLScope((own) =>\n    CML.PlutusScript.from_v2(own(CML.PlutusV2Script.from_cbor_hex(script))),\n  );\n\nexport const toV3 = (script: string) =>\n  withCMLScope((own) =>\n    CML.PlutusScript.from_v3(own(CML.PlutusV3Script.from_cbor_hex(script))),\n  );\n\nexport const toPartial = (script: CML.PlutusScript, redeemer: CBORHex) =>\n  withCMLScope((own) =>\n    CML.PartialPlutusWitness.new(\n      own(CML.PlutusScriptWitness.new_script(script)),\n      own(CML.PlutusData.from_cbor_hex(redeemer)),\n    ),\n  );\n\nexport const handleRedeemerBuilder = (\n  config: TxBuilderConfig,\n  partialProgram: (\n    redeemer?: string | undefined,\n  ) => Effect.Effect<void, TxBuilderError, TxConfig>,\n  redeemer?: string | RedeemerBuilder,\n) => {\n  if (typeof redeemer === \"object\") {\n    config.partialPrograms.set(redeemer, partialProgram);\n  } else {\n    const program = partialProgram(redeemer);\n    config.programs.push(program);\n  }\n};\n\n//NOTE: deprecated\n// export function toCMLTransactionHash(body: CML.TransactionBody) {\n//   const TransactionHash = C.hash_transaction(\n//     C.TransactionBody.from_bytes(fromHex(body.to_cbor_hex())),\n//   );\n//   return CML.TransactionHash.from_hex(TransactionHash.to_hex());\n// }\n\nexport function isEqual(arr1: Uint8Array, arr2: Uint8Array): boolean {\n  if (arr1.length !== arr2.length) {\n    return false;\n  }\n  return arr1.every((value, index) => value === arr2[index]);\n}\n\nexport const validateAddressDetails = (\n  address: Address | RewardAddress,\n  lucidConfig: LucidConfig,\n): Effect.Effect<AddressDetails, TxBuilderError, never> =>\n  Effect.gen(function* ($) {\n    const addressDetails = yield* $(\n      Effect.try({\n        try: () => getAddressDetails(address),\n        catch: (cause) =>\n          new TxBuilderError({\n            cause,\n          }),\n      }),\n    );\n    const actualNetworkId = networkToId(lucidConfig.network);\n    if (addressDetails.networkId !== actualNetworkId)\n      yield* new TxBuilderError({\n        cause: ERROR_MESSAGE.INVALID_NETWORK(\n          address,\n          actualNetworkId,\n          lucidConfig.network,\n        ),\n      });\n\n    return addressDetails;\n  });\n\nexport const processCertificate = (\n  stakeCredential: Credential,\n  config: TxBuilder.TxBuilderConfig,\n  buildCert: (credential: CML.Credential) => CML.SingleCertificateBuilder,\n  redeemer?: Redeemer,\n): Effect.Effect<void, TxBuilderError> =>\n  Effect.gen(function* () {\n    switch (stakeCredential.type) {\n      case \"Key\": {\n        const credential = CML.Credential.new_pub_key(\n          CML.Ed25519KeyHash.from_hex(stakeCredential.hash),\n        );\n        const certBuilder = buildCert(credential);\n        config.txBuilder.add_cert(certBuilder.payment_key());\n        break;\n      }\n\n      case \"Script\": {\n        const credential = CML.Credential.new_script(\n          CML.ScriptHash.from_hex(stakeCredential.hash),\n        );\n        const certBuilder = buildCert(credential);\n\n        const script = yield* pipe(\n          Effect.fromNullable(config.scripts.get(stakeCredential.hash)),\n          Effect.orElseFail(() =>\n            txBuilderError(ERROR_MESSAGE.MISSING_SCRIPT(stakeCredential.hash)),\n          ),\n        );\n\n        const addPlutusCertificate = (\n          scriptVersion: CML.PlutusScript,\n        ): Effect.Effect<void, TxBuilderError> => {\n          return Effect.gen(function* () {\n            const red = yield* pipe(\n              Effect.fromNullable(redeemer),\n              Effect.orElseFail(() =>\n                txBuilderError(ERROR_MESSAGE.MISSING_REDEEMER),\n              ),\n            );\n            config.txBuilder.add_cert(\n              certBuilder.plutus_script(\n                toPartial(scriptVersion, red),\n                CML.Ed25519KeyHashList.new(),\n              ),\n            );\n          });\n        };\n\n        switch (script.type) {\n          case \"PlutusV1\":\n            yield* addPlutusCertificate(toV1(script.script));\n            break;\n\n          case \"PlutusV2\":\n            yield* addPlutusCertificate(toV2(script.script));\n            break;\n          case \"PlutusV3\":\n            yield* addPlutusCertificate(toV3(script.script));\n            break;\n\n          case \"Native\":\n            config.txBuilder.add_cert(\n              certBuilder.native_script(\n                CML.NativeScript.from_cbor_hex(script.script),\n                CML.NativeScriptWitnessInfo.assume_signature_count(),\n              ),\n            );\n            break;\n        }\n        break;\n      }\n    }\n  });\n\nexport const validateAndGetStakeCredential = (\n  rewardAddress: RewardAddress,\n  config: TxBuilder.TxBuilderConfig,\n): Effect.Effect<Credential, TxBuilderError> =>\n  Effect.gen(function* () {\n    const addressDetails = yield* pipe(\n      validateAddressDetails(rewardAddress, config.lucidConfig),\n      Effect.andThen((address) =>\n        address.type !== \"Reward\"\n          ? txBuilderError(ERROR_MESSAGE.MISSING_REWARD_TYPE)\n          : Effect.succeed(address),\n      ),\n    );\n\n    const stakeCredential = yield* pipe(\n      Effect.fromNullable(addressDetails.stakeCredential),\n      Effect.orElseFail(() =>\n        txBuilderError(ERROR_MESSAGE.MISSING_STAKE_CREDENTIAL),\n      ),\n    );\n\n    return stakeCredential;\n  });\n\nexport const resolveDatum = (\n  datumHash: UTxO[\"datumHash\"],\n  datum: UTxO[\"datum\"],\n  provider: Provider,\n) =>\n  Effect.gen(function* () {\n    // Only fetch the datum if the datumHash is present and the datum is not present.\n    if (!datumHash || datum) return datum;\n    return yield* Effect.tryPromise({\n      try: () => provider.getDatum(datumHash),\n      catch: txBuilderError,\n    });\n  });\n","import { Context, Effect } from \"effect\";\nimport { TxBuilderConfig } from \"../TxBuilder.js\";\n\nexport class TxConfig extends Context.Tag(\"TxConfig\")<\n  TxConfig,\n  {\n    readonly config: TxBuilderConfig;\n  }\n>() {}\n","import { Effect } from \"effect\";\nimport { utxoToCore } from \"@lucid-evolution/utils\";\nimport { withCMLScope } from \"@lucid-evolution/core-utils\";\nimport { UTxO } from \"@lucid-evolution/core-types\";\nimport { ERROR_MESSAGE, TxBuilderError } from \"../../Errors.js\";\nimport { resolveDatum } from \"./TxUtils.js\";\nimport { TxConfig } from \"./Service.js\";\n\nexport const readError = (cause: unknown) =>\n  new TxBuilderError({ cause: `{ Read : ${cause} }` });\n\nexport const readFrom = (utxos: UTxO[]) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    if (utxos.length === 0) yield* readError(ERROR_MESSAGE.EMPTY_UTXO);\n    for (const utxo of utxos) {\n      // fetch the datum when the datumHash is present\n      const resolvedDatum = yield* resolveDatum(\n        utxo.datumHash,\n        utxo.datum,\n        config.lucidConfig.provider,\n      );\n\n      const exists = config.readInputs.some(\n        (input) =>\n          input.txHash === utxo.txHash &&\n          input.outputIndex === utxo.outputIndex,\n      );\n\n      if (!exists) {\n        withCMLScope((own) =>\n          config.txBuilder.add_reference_input(\n            own(utxoToCore({ ...utxo, datum: resolvedDatum })),\n          ),\n        );\n        // Store inputs for later use in the txBuilder\n        config.readInputs.push(utxo);\n      }\n    }\n  });\n","import { applyDoubleCborEncoding } from \"@lucid-evolution/utils\";\nimport {\n  CertificateValidator,\n  MintingPolicy,\n  ProposeValidator,\n  SpendingValidator,\n  Validator,\n  VoteValidator,\n  WithdrawalValidator,\n} from \"@lucid-evolution/core-types\";\nimport { CML } from \"../../core.js\";\nimport { withCMLScope } from \"@lucid-evolution/core-utils\";\n\nconst scriptHashHex = (script: {\n  hash(): CML.ScriptHash;\n  free(): void;\n}): string => withCMLScope((own) => own(own(script).hash()).to_hex());\n\nexport const attachScript = ({ type, script }: Validator) => {\n  //TODO: script should be a branded type\n  switch (type) {\n    case \"Native\":\n      return {\n        key: scriptHashHex(CML.NativeScript.from_cbor_hex(script)),\n        value: { type, script },\n      };\n    case \"PlutusV1\":\n      return {\n        key: scriptHashHex(\n          CML.PlutusV1Script.from_cbor_hex(applyDoubleCborEncoding(script)),\n        ),\n        value: { type, script: applyDoubleCborEncoding(script) },\n      };\n    case \"PlutusV2\":\n      return {\n        key: scriptHashHex(\n          CML.PlutusV2Script.from_cbor_hex(applyDoubleCborEncoding(script)),\n        ),\n        value: { type, script: applyDoubleCborEncoding(script) },\n      };\n    case \"PlutusV3\":\n      return {\n        key: scriptHashHex(\n          CML.PlutusV3Script.from_cbor_hex(applyDoubleCborEncoding(script)),\n        ),\n        value: { type, script: applyDoubleCborEncoding(script) },\n      };\n    default:\n      throw new Error(`Exhaustive check failed: Unhandled case ${type}`);\n  }\n};\nexport const attachSpendingValidator = (spendingValidator: SpendingValidator) =>\n  attachScript(spendingValidator);\n\nexport const attachMintingPolicy = (mintingPolicy: MintingPolicy) =>\n  attachScript(mintingPolicy);\n\nexport const attachCertificateValidator = (\n  certValidator: CertificateValidator,\n) => attachScript(certValidator);\n\nexport const attachWithdrawalValidator = (\n  withdrawalValidator: WithdrawalValidator,\n) => attachScript(withdrawalValidator);\n\nexport const attachVoteValidator = (voteValidator: VoteValidator) =>\n  attachScript(voteValidator);\n\nexport const attachProposeValidator = (proposeValidator: ProposeValidator) =>\n  attachScript(proposeValidator);\n","import { Effect, Scope } from \"effect\";\nimport {\n  addAssets,\n  assetsToValue,\n  coreToTxOutput,\n  toScriptRef,\n  valueToAssets,\n} from \"@lucid-evolution/utils\";\nimport { Address, Assets, Script } from \"@lucid-evolution/core-types\";\nimport { OutputDatum } from \"../types.js\";\nimport * as TxBuilder from \"../TxBuilder.js\";\nimport { CML } from \"../../core.js\";\nimport { withCMLScope } from \"@lucid-evolution/core-utils\";\nimport { toCMLAddress } from \"./TxUtils.js\";\nimport { ERROR_MESSAGE, TxBuilderError } from \"../../Errors.js\";\nimport { TxConfig } from \"./Service.js\";\n\nexport const payError = (cause: unknown) =>\n  new TxBuilderError({ cause: `{ Pay: ${cause} }` });\n\n/** Pay to a public key or native script address. */\nexport const payToAddress = (\n  // config: TxBuilder.TxBuilderConfig,\n  address: Address,\n  assets: Assets,\n) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    const cmlAddress = yield* toCMLAddress(address, config.lucidConfig);\n    const outputBuilder = withCMLScope((own) =>\n      own(\n        own(CML.TransactionOutputBuilder.new()).with_address(own(cmlAddress)),\n      ).next(),\n    );\n\n    if (Object.keys(assets).length == 0) {\n      outputBuilder.free();\n      yield* payError(ERROR_MESSAGE.EMPTY_ASSETS);\n    }\n\n    addOutput(config, outputBuilder, assets);\n  });\n\n/** Builds the output, records it, and frees the builder. */\nconst addOutput = (\n  config: TxBuilder.TxBuilderConfig,\n  outputBuilder: CML.TransactionOutputAmountBuilder,\n  assets: Assets,\n): void =>\n  withCMLScope((own) => {\n    own(outputBuilder);\n    const value = own(assetsToValue(assets));\n    let outputResult = own(\n      own(\n        outputBuilder.with_asset_and_min_required_coin(\n          own(value.multi_asset()),\n          config.lucidConfig.protocolParameters.coinsPerUtxoByte,\n        ),\n      ).build(),\n    );\n\n    const setLovelaces = assets[\"lovelace\"];\n    if (setLovelaces) {\n      const minLovelace = own(own(outputResult.output()).amount()).coin();\n      if (setLovelaces > minLovelace) {\n        outputResult = own(own(outputBuilder.with_value(value)).build());\n      }\n    }\n    const output = own(outputResult.output());\n    // Keep track of actual total output value\n    config.totalOutputAssets = addAssets(\n      config.totalOutputAssets,\n      valueToAssets(own(output.amount())),\n    );\n    config.payToOutputs = [...config.payToOutputs, coreToTxOutput(output)];\n    config.txBuilder.add_output(outputResult);\n  });\n\n/** Pay to a public key or native script address with datum or scriptRef. */\nexport const ToAddressWithData = (\n  address: Address,\n  outputDatum?: OutputDatum,\n  assets?: Assets,\n  scriptRef?: Script,\n) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    //TODO: Test with datumhash\n    const outputBuilder = buildBaseOutput(address, outputDatum, scriptRef);\n\n    assets ??= {};\n    addOutput(config, outputBuilder, assets);\n  });\n\n/** Pay to a plutus script address with datum or scriptRef. */\nexport const ToContract = (\n  address: Address,\n  outputDatum?: OutputDatum,\n  assets?: Assets,\n  scriptRef?: Script,\n) => ToAddressWithData(address, outputDatum, assets, scriptRef);\n\n/** The returned amount builder belongs to the caller. */\nexport const buildBaseOutput = (\n  address: Address,\n  outputDatum?: OutputDatum,\n  scriptRef?: Script,\n): CML.TransactionOutputAmountBuilder =>\n  withCMLScope((own) => {\n    let baseBuilder: CML.TransactionOutputBuilder;\n    const addressBuilder = own(\n      own(CML.TransactionOutputBuilder.new()).with_address(\n        own(CML.Address.from_bech32(address)),\n      ),\n    );\n    if (outputDatum) {\n      if (outputDatum.value.trim() === \"\") {\n        throw new Error(\n          \"datum value is missing. Please provide a non-empty cbor hex data.\",\n        );\n      }\n      switch (outputDatum.kind) {\n        case \"hash\": {\n          const datumOption = own(\n            CML.DatumOption.new_hash(\n              own(CML.DatumHash.from_hex(outputDatum.value)),\n            ),\n          );\n          baseBuilder = own(addressBuilder.with_data(datumOption));\n          break;\n        }\n        case \"asHash\": {\n          const plutusData = own(\n            CML.PlutusData.from_cbor_hex(outputDatum.value),\n          );\n          baseBuilder = own(addressBuilder.with_communication_data(plutusData));\n          break;\n        }\n        case \"inline\": {\n          const plutusData = own(\n            CML.PlutusData.from_cbor_hex(outputDatum.value),\n          );\n          const datumOption = own(CML.DatumOption.new_datum(plutusData));\n          baseBuilder = own(addressBuilder.with_data(datumOption));\n          break;\n        }\n        default:\n          throw new Error(`Unknown outputDatum: ${outputDatum}`);\n      }\n    } else {\n      baseBuilder = addressBuilder;\n    }\n\n    return scriptRef\n      ? own(\n          baseBuilder.with_reference_script(own(toScriptRef(scriptRef))),\n        ).next()\n      : baseBuilder.next();\n  });\n","import { Effect, pipe } from \"effect\";\nimport { withCMLScope } from \"@lucid-evolution/core-utils\";\nimport { Assets, Redeemer } from \"@lucid-evolution/core-types\";\nimport * as CML from \"@anastasia-labs/cardano-multiplatform-lib-nodejs\";\nimport { toPartial, toV1, toV2, toV3 } from \"./TxUtils.js\";\nimport { ERROR_MESSAGE, TxBuilderError } from \"../../Errors.js\";\nimport * as TxBuilder from \"../TxBuilder.js\";\nimport { addAssets } from \"@lucid-evolution/utils\";\nimport { TxConfig } from \"./Service.js\";\n\nexport const mintError = (cause: unknown) =>\n  new TxBuilderError({ cause: `{ Mint: ${cause} }` });\n\n/**\n * All assets should be of the same policy id.\n * You can chain mintAssets functions together if you need to mint assets with different policy ids.\n * If the plutus script doesn't need a redeemer, you still need to specifiy the void redeemer.\n */\nexport const mintAssets = (assets: Assets) => (redeemer?: Redeemer) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    const units = Object.keys(assets);\n    const policyId = units[0].slice(0, 56);\n    for (const unit of units) {\n      if (unit.slice(0, 56) !== policyId) {\n        yield* mintError(ERROR_MESSAGE.MULTIPLE_POLICIES);\n      }\n    }\n    const policy = yield* pipe(\n      Effect.fromNullable(config.scripts.get(policyId)),\n      Effect.orElseFail(() =>\n        mintError(ERROR_MESSAGE.MISSING_POLICY(policyId)),\n      ),\n    );\n    const red =\n      policy.type === \"Native\"\n        ? undefined\n        : yield* pipe(\n            Effect.fromNullable(redeemer),\n            Effect.orElseFail(() => mintError(ERROR_MESSAGE.MISSING_REDEEMER)),\n          );\n    withCMLScope((own) => {\n      const mintAssets = own(CML.MapAssetNameToNonZeroInt64.new());\n      for (const unit of units) {\n        mintAssets.insert(\n          own(CML.AssetName.from_hex(unit.slice(56))),\n          assets[unit],\n        );\n      }\n      // `native_script` and `plutus_script` consume the mint builder itself;\n      // their arguments and the result are ours to free.\n      const mintBuilder = CML.SingleMintBuilder.new(mintAssets);\n      const result = own(\n        policy.type === \"Native\"\n          ? mintBuilder.native_script(\n              own(CML.NativeScript.from_cbor_hex(policy.script)),\n              own(CML.NativeScriptWitnessInfo.assume_signature_count()),\n            )\n          : mintBuilder.plutus_script(\n              own(\n                toPartial(\n                  own(\n                    policy.type === \"PlutusV1\"\n                      ? toV1(policy.script)\n                      : policy.type === \"PlutusV2\"\n                        ? toV2(policy.script)\n                        : toV3(policy.script),\n                  ),\n                  red!,\n                ),\n              ),\n              own(CML.Ed25519KeyHashList.new()),\n            ),\n      );\n      config.txBuilder.add_mint(result);\n    });\n  });\n","import { Effect } from \"effect\";\nimport { UnixTime } from \"@lucid-evolution/core-types\";\nimport * as TxBuilder from \"../TxBuilder.js\";\nimport { unixTimeToEnclosingSlot } from \"@lucid-evolution/plutus\";\nimport { TxConfig } from \"./Service.js\";\n\nexport const validFrom = (unixTime: UnixTime) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    const slot = unixTimeToEnclosingSlot(\n      unixTime,\n      config.lucidConfig.slotConfig,\n    );\n    config.txBuilder.set_validity_start_interval(BigInt(slot));\n  });\nexport const validTo = (unixTime: UnixTime) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    const slot = unixTimeToEnclosingSlot(\n      unixTime,\n      config.lucidConfig.slotConfig,\n    );\n    config.txBuilder.set_ttl(BigInt(slot));\n  });\n","import {\n  Address,\n  PaymentKeyHash,\n  RewardAddress,\n  StakeKeyHash,\n} from \"@lucid-evolution/core-types\";\nimport * as TxBuilder from \"../TxBuilder.js\";\nimport { Effect, pipe } from \"effect\";\nimport * as CML from \"@anastasia-labs/cardano-multiplatform-lib-nodejs\";\nimport { ERROR_MESSAGE, TxBuilderError } from \"../../Errors.js\";\nimport { validateAddressDetails } from \"./TxUtils.js\";\nimport { TxConfig } from \"./Service.js\";\nimport { withCMLScope } from \"@lucid-evolution/core-utils\";\n\nexport const addSignerError = (cause: unknown) =>\n  new TxBuilderError({ cause: `{ Signer: ${cause} }` });\n\nexport const addSigner = (address: Address | RewardAddress) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    const addressDetails = yield* validateAddressDetails(\n      address,\n      config.lucidConfig,\n    );\n\n    const credential =\n      addressDetails.type === \"Reward\"\n        ? yield* pipe(\n            Effect.fromNullable(addressDetails.stakeCredential),\n            Effect.orElseFail(() =>\n              addSignerError(ERROR_MESSAGE.MISSING_STAKE_CREDENTIAL),\n            ),\n          )\n        : yield* pipe(\n            Effect.fromNullable(addressDetails.paymentCredential),\n            Effect.orElseFail(() =>\n              addSignerError(ERROR_MESSAGE.MISSING_PAYMENT_CREDENTIAL),\n            ),\n          );\n\n    if (credential.type === \"Script\")\n      yield* addSignerError(ERROR_MESSAGE.SCRIPT_CREDENTIAL_NOT_ALLOWED);\n\n    return credential.hash;\n  }).pipe(Effect.flatMap((keyHash) => addSignerKey(keyHash)));\n\n/** Add a payment or stake key hash as a required signer of the transaction. */\nexport const addSignerKey = (keyHash: PaymentKeyHash | StakeKeyHash) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    withCMLScope((own) =>\n      config.txBuilder.add_required_signer(\n        own(CML.Ed25519KeyHash.from_hex(keyHash)),\n      ),\n    );\n  });\n","import { Lovelace, Redeemer, RewardAddress } from \"@lucid-evolution/core-types\";\nimport * as TxBuilder from \"../TxBuilder.js\";\nimport { Effect, pipe } from \"effect\";\nimport { ERROR_MESSAGE, TxBuilderError } from \"../../Errors.js\";\nimport * as CML from \"@anastasia-labs/cardano-multiplatform-lib-nodejs\";\nimport {\n  processCertificate,\n  toPartial,\n  toV1,\n  toV2,\n  toV3,\n  validateAddressDetails,\n} from \"./TxUtils.js\";\nimport { TxConfig } from \"./Service.js\";\n\nexport const stakeError = (cause: unknown) =>\n  new TxBuilderError({ cause: `{ Stake: ${cause} }` });\n\nexport const registerStake = (\n  rewardAddress: RewardAddress,\n  redeemer?: Redeemer,\n) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    const addressDetails = yield* pipe(\n      validateAddressDetails(rewardAddress, config.lucidConfig),\n      Effect.andThen((address) =>\n        address.type !== \"Reward\"\n          ? stakeError(ERROR_MESSAGE.MISSING_REWARD_TYPE)\n          : Effect.succeed(address),\n      ),\n    );\n\n    const stakeCredential = yield* pipe(\n      Effect.fromNullable(addressDetails.stakeCredential),\n      Effect.orElseFail(() =>\n        stakeError(ERROR_MESSAGE.MISSING_STAKE_CREDENTIAL),\n      ),\n    );\n\n    const credential =\n      stakeCredential.type === \"Key\"\n        ? CML.Credential.new_pub_key(\n            CML.Ed25519KeyHash.from_hex(stakeCredential.hash),\n          )\n        : CML.Credential.new_script(\n            CML.ScriptHash.from_hex(stakeCredential.hash),\n          );\n\n    if (redeemer !== undefined) {\n      const buildCert = (credential: CML.Credential) =>\n        CML.SingleCertificateBuilder.new(\n          CML.Certificate.new_reg_cert(\n            credential,\n            config.lucidConfig.protocolParameters.keyDeposit,\n          ),\n        );\n      yield* processCertificate(stakeCredential, config, buildCert, redeemer);\n      return;\n    }\n\n    const certBuilder = CML.SingleCertificateBuilder.new(\n      CML.Certificate.new_stake_registration(credential),\n    );\n    config.txBuilder.add_cert(certBuilder.skip_witness());\n  });\n\nexport const deRegisterStake = (\n  rewardAddress: RewardAddress,\n  redeemer?: Redeemer,\n) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    const addressDetails = yield* pipe(\n      validateAddressDetails(rewardAddress, config.lucidConfig),\n      Effect.andThen((address) =>\n        address.type !== \"Reward\"\n          ? stakeError(ERROR_MESSAGE.MISSING_REWARD_TYPE)\n          : Effect.succeed(address),\n      ),\n    );\n\n    const stakeCredential = yield* pipe(\n      Effect.fromNullable(addressDetails.stakeCredential),\n      Effect.orElseFail(() =>\n        stakeError(ERROR_MESSAGE.MISSING_STAKE_CREDENTIAL),\n      ),\n    );\n\n    const createCertBuilder = (\n      credential: CML.Credential,\n      config: TxBuilder.TxBuilderConfig,\n    ): CML.SingleCertificateBuilder => {\n      return CML.SingleCertificateBuilder.new(\n        CML.Certificate.new_unreg_cert(\n          credential,\n          config.lucidConfig.protocolParameters.keyDeposit,\n        ),\n      );\n    };\n\n    switch (stakeCredential.type) {\n      case \"Key\": {\n        const credential = CML.Credential.new_pub_key(\n          CML.Ed25519KeyHash.from_hex(stakeCredential.hash),\n        );\n        const certBuilder = createCertBuilder(credential, config);\n        config.txBuilder.add_cert(certBuilder.payment_key());\n        break;\n      }\n\n      case \"Script\": {\n        const credential = CML.Credential.new_script(\n          CML.ScriptHash.from_hex(stakeCredential.hash),\n        );\n        const certBuilder = createCertBuilder(credential, config);\n        const script = yield* pipe(\n          Effect.fromNullable(config.scripts.get(stakeCredential.hash)),\n          Effect.orElseFail(() =>\n            stakeError(ERROR_MESSAGE.MISSING_SCRIPT(stakeCredential.hash)),\n          ),\n        );\n        const handleRedeemer = () =>\n          pipe(\n            Effect.fromNullable(redeemer),\n            Effect.orElseFail(() => stakeError(ERROR_MESSAGE.MISSING_REDEEMER)),\n          );\n        switch (script.type) {\n          case \"PlutusV1\": {\n            const red = yield* handleRedeemer();\n            config.txBuilder.add_cert(\n              certBuilder.plutus_script(\n                toPartial(toV1(script.script), red),\n                CML.Ed25519KeyHashList.new(),\n              ),\n            );\n            break;\n          }\n\n          case \"PlutusV2\": {\n            const red = yield* handleRedeemer();\n            config.txBuilder.add_cert(\n              certBuilder.plutus_script(\n                toPartial(toV2(script.script), red),\n                CML.Ed25519KeyHashList.new(),\n              ),\n            );\n            break;\n          }\n          case \"PlutusV3\": {\n            const red = yield* handleRedeemer();\n            config.txBuilder.add_cert(\n              certBuilder.plutus_script(\n                toPartial(toV3(script.script), red),\n                CML.Ed25519KeyHashList.new(),\n              ),\n            );\n            break;\n          }\n          case \"Native\": {\n            config.txBuilder.add_cert(\n              certBuilder.native_script(\n                CML.NativeScript.from_cbor_hex(script.script),\n                CML.NativeScriptWitnessInfo.assume_signature_count(),\n              ),\n            );\n            break;\n          }\n        }\n      }\n    }\n  });\n\nexport const withdraw =\n  (rewardAddress: RewardAddress, amount: Lovelace) => (redeemer?: Redeemer) =>\n    Effect.gen(function* () {\n      const { config } = yield* TxConfig;\n      const addressDetails = yield* pipe(\n        validateAddressDetails(rewardAddress, config.lucidConfig),\n        Effect.andThen((address) =>\n          address.type !== \"Reward\"\n            ? stakeError(ERROR_MESSAGE.MISSING_REWARD_TYPE)\n            : Effect.succeed(address),\n        ),\n      );\n\n      const withdrawBuilder = yield* pipe(\n        Effect.fromNullable(\n          CML.RewardAddress.from_address(\n            CML.Address.from_bech32(rewardAddress),\n          ),\n        ),\n        Effect.orElseFail(() =>\n          stakeError(ERROR_MESSAGE.MISSING_STAKE_CREDENTIAL),\n        ),\n        Effect.andThen((address) =>\n          CML.SingleWithdrawalBuilder.new(address, amount),\n        ),\n      );\n\n      const stakeCredential = yield* pipe(\n        Effect.fromNullable(addressDetails.stakeCredential),\n        Effect.orElseFail(() =>\n          stakeError(ERROR_MESSAGE.MISSING_STAKE_CREDENTIAL),\n        ),\n      );\n\n      const handleRedeemer = () =>\n        pipe(\n          Effect.fromNullable(redeemer),\n          Effect.orElseFail(() => stakeError(ERROR_MESSAGE.MISSING_REDEEMER)),\n        );\n\n      switch (stakeCredential.type) {\n        case \"Key\": {\n          config.txBuilder.add_withdrawal(withdrawBuilder.payment_key());\n          break;\n        }\n\n        case \"Script\": {\n          const script = yield* pipe(\n            Effect.fromNullable(config.scripts.get(stakeCredential.hash)),\n            Effect.orElseFail(() =>\n              stakeError(ERROR_MESSAGE.MISSING_SCRIPT(stakeCredential.hash)),\n            ),\n          );\n\n          switch (script.type) {\n            case \"PlutusV1\": {\n              const red = yield* handleRedeemer();\n              config.txBuilder.add_withdrawal(\n                withdrawBuilder.plutus_script(\n                  toPartial(toV1(script.script), red),\n                  CML.Ed25519KeyHashList.new(),\n                ),\n              );\n              break;\n            }\n\n            case \"PlutusV2\": {\n              const red = yield* handleRedeemer();\n              config.txBuilder.add_withdrawal(\n                withdrawBuilder.plutus_script(\n                  toPartial(toV2(script.script), red),\n                  CML.Ed25519KeyHashList.new(),\n                ),\n              );\n              break;\n            }\n\n            case \"PlutusV3\": {\n              const red = yield* handleRedeemer();\n              config.txBuilder.add_withdrawal(\n                withdrawBuilder.plutus_script(\n                  toPartial(toV3(script.script), red),\n                  CML.Ed25519KeyHashList.new(),\n                ),\n              );\n              break;\n            }\n            case \"Native\": {\n              config.txBuilder.add_withdrawal(\n                withdrawBuilder.native_script(\n                  CML.NativeScript.from_cbor_hex(script.script),\n                  CML.NativeScriptWitnessInfo.assume_signature_count(),\n                ),\n              );\n              break;\n            }\n          }\n        }\n      }\n    });\n","import {\n  PoolId,\n  PoolParams,\n  Redeemer,\n  RewardAddress,\n} from \"@lucid-evolution/core-types\";\nimport { ERROR_MESSAGE, TxBuilderError } from \"../../Errors.js\";\nimport * as TxBuilder from \"../TxBuilder.js\";\nimport { Effect, pipe } from \"effect\";\nimport {\n  toCMLAddress,\n  toPartial,\n  toV1,\n  toV2,\n  toV3,\n  validateAddressDetails,\n} from \"./TxUtils.js\";\nimport * as CML from \"@anastasia-labs/cardano-multiplatform-lib-nodejs\";\nimport { LucidConfig } from \"../../lucid-evolution/LucidEvolution.js\";\nimport { fromText } from \"@lucid-evolution/core-utils\";\nimport { TxConfig } from \"./Service.js\";\n\nexport const poolError = (cause: unknown) =>\n  new TxBuilderError({ cause: `{ Pool : ${cause} }` });\n\nexport const delegateTo = (\n  rewardAddress: RewardAddress,\n  poolId: PoolId,\n  redeemer?: Redeemer,\n) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    const addressDetails = yield* pipe(\n      validateAddressDetails(rewardAddress, config.lucidConfig),\n      Effect.andThen((address) =>\n        address.type !== \"Reward\"\n          ? poolError(ERROR_MESSAGE.MISSING_REWARD_TYPE)\n          : Effect.succeed(address),\n      ),\n    );\n\n    const stakeCredential = yield* pipe(\n      Effect.fromNullable(addressDetails.stakeCredential),\n      Effect.orElseFail(() =>\n        poolError(ERROR_MESSAGE.MISSING_STAKE_CREDENTIAL),\n      ),\n    );\n\n    switch (stakeCredential.type) {\n      case \"Key\": {\n        const credential = CML.Credential.new_pub_key(\n          CML.Ed25519KeyHash.from_hex(stakeCredential.hash),\n        );\n        const certBuilder = CML.SingleCertificateBuilder.new(\n          CML.Certificate.new_stake_delegation(\n            credential,\n            CML.Ed25519KeyHash.from_bech32(poolId),\n          ),\n        );\n        config.txBuilder.add_cert(certBuilder.payment_key());\n        break;\n      }\n\n      case \"Script\": {\n        const credential = CML.Credential.new_script(\n          CML.ScriptHash.from_hex(stakeCredential.hash),\n        );\n        const certBuilder = CML.SingleCertificateBuilder.new(\n          CML.Certificate.new_stake_delegation(\n            credential,\n            CML.Ed25519KeyHash.from_bech32(poolId),\n          ),\n        );\n        const script = yield* pipe(\n          Effect.fromNullable(config.scripts.get(stakeCredential.hash)),\n          Effect.orElseFail(() =>\n            poolError(ERROR_MESSAGE.MISSING_SCRIPT(stakeCredential.hash)),\n          ),\n        );\n        const handleRedeemer = () =>\n          pipe(\n            Effect.fromNullable(redeemer),\n            Effect.orElseFail(() => poolError(ERROR_MESSAGE.MISSING_REDEEMER)),\n          );\n        switch (script.type) {\n          case \"PlutusV1\": {\n            const red = yield* handleRedeemer();\n            config.txBuilder.add_cert(\n              certBuilder.plutus_script(\n                toPartial(toV1(script.script), red),\n                CML.Ed25519KeyHashList.new(),\n              ),\n            );\n            break;\n          }\n\n          case \"PlutusV2\": {\n            const red = yield* handleRedeemer();\n            config.txBuilder.add_cert(\n              certBuilder.plutus_script(\n                toPartial(toV2(script.script), red),\n                CML.Ed25519KeyHashList.new(),\n              ),\n            );\n            break;\n          }\n\n          case \"PlutusV3\": {\n            const red = yield* handleRedeemer();\n            config.txBuilder.add_cert(\n              certBuilder.plutus_script(\n                toPartial(toV3(script.script), red),\n                CML.Ed25519KeyHashList.new(),\n              ),\n            );\n            break;\n          }\n          case \"Native\": {\n            config.txBuilder.add_cert(\n              certBuilder.native_script(\n                CML.NativeScript.from_cbor_hex(script.script),\n                CML.NativeScriptWitnessInfo.assume_signature_count(),\n              ),\n            );\n            break;\n          }\n        }\n      }\n    }\n  });\n\n/** Register a stake pool. A pool deposit is required. The metadataUrl needs to be hosted already before making the registration. */\nexport const registerPool = (poolParams: PoolParams) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    const poolRegistration = yield* createPoolRegistration(\n      poolParams,\n      config.lucidConfig,\n    );\n    const certBuilder = CML.SingleCertificateBuilder.new(\n      CML.Certificate.new_pool_registration(poolRegistration.pool_params()),\n    );\n\n    config.txBuilder.add_cert(certBuilder.skip_witness());\n  });\n\nexport const retirePool = (poolId: PoolId, epoch: bigint) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    const certBuilder = CML.SingleCertificateBuilder.new(\n      CML.Certificate.new_pool_retirement(\n        CML.Ed25519KeyHash.from_bech32(poolId),\n        epoch,\n      ),\n    );\n\n    config.txBuilder.add_cert(certBuilder.skip_witness());\n  });\n\nconst createPoolRegistration = (poolParams: PoolParams, lucid: LucidConfig) =>\n  Effect.gen(function* () {\n    const poolOwners = CML.Ed25519KeyHashList.new();\n    for (const owner of poolParams.owners) {\n      const addressDetails = yield* validateAddressDetails(owner, lucid);\n      const stakeCredential = yield* pipe(\n        Effect.fromNullable(addressDetails.stakeCredential),\n        Effect.orElseFail(() =>\n          poolError(ERROR_MESSAGE.MISSING_STAKE_CREDENTIAL),\n        ),\n      );\n      stakeCredential.type === \"Key\"\n        ? poolOwners.add(CML.Ed25519KeyHash.from_hex(stakeCredential.hash))\n        : poolError(ERROR_MESSAGE.SCRIPT_CREDENTIAL_NOT_ALLOWED);\n    }\n    const metadataHash = yield* getMetadataHash(poolParams.metadataUrl);\n    const relays = CML.RelayList.new();\n    for (const relay of poolParams.relays) {\n      switch (relay.type) {\n        case \"SingleHostIp\": {\n          //TODO: missing test\n          const ipV4 = relay.ipV4\n            ? CML.Ipv4.from_cbor_bytes(\n                new Uint8Array(relay.ipV4.split(\".\").map((b) => parseInt(b))),\n              )\n            : undefined;\n          //TODO: missing test\n          const ipV6 = relay.ipV6\n            ? CML.Ipv6.from_cbor_hex(relay.ipV6.replaceAll(\":\", \"\"))\n            : undefined;\n          relays.add(CML.Relay.new_single_host_addr(relay.port, ipV4, ipV6));\n          break;\n        }\n        //TODO: missing test\n        case \"SingleHostDomainName\": {\n          relays.add(\n            CML.Relay.new_single_host_name(\n              relay.port,\n              CML.DNSName.from_cbor_hex(fromText(relay.domainName!)),\n            ),\n          );\n          break;\n        }\n        case \"MultiHost\": {\n          relays.add(\n            CML.Relay.new_multi_host_name(\n              CML.DNSName.from_cbor_hex(fromText(relay.domainName!)),\n            ),\n          );\n          break;\n        }\n      }\n    }\n    return CML.PoolRegistration.new(\n      CML.PoolParams.new(\n        CML.Ed25519KeyHash.from_bech32(poolParams.poolId),\n        CML.VRFKeyHash.from_hex(poolParams.vrfKeyHash),\n        poolParams.pledge,\n        poolParams.cost,\n        CML.UnitInterval.new(\n          BigInt(poolParams.margin),\n          BigInt(poolParams.margin),\n        ),\n        CML.RewardAddress.from_address(\n          yield* toCMLAddress(poolParams.rewardAddress, lucid),\n        )!,\n        poolOwners,\n        relays,\n        metadataHash\n          ? CML.PoolMetadata.new(\n              CML.Url.from_cbor_hex(fromText(poolParams.metadataUrl!)),\n              metadataHash,\n            )\n          : undefined,\n      ),\n    );\n  });\n\nconst getMetadataHash = (metadataUrl?: string) =>\n  Effect.gen(function* () {\n    if (metadataUrl) {\n      const metadata = yield* pipe(\n        Effect.tryPromise({\n          try: () => fetch(metadataUrl),\n          catch: (cause) => poolError(cause),\n        }),\n        Effect.andThen((resp) => Effect.promise(() => resp.arrayBuffer())),\n      );\n      const metadataHash = CML.PoolMetadataHash.from_raw_bytes(\n        new Uint8Array(metadata),\n      );\n      return metadataHash;\n    } else {\n      return null;\n    }\n  });\n","import {\n  Anchor,\n  DRep,\n  PoolId,\n  Redeemer,\n  RewardAddress,\n  Credential,\n  AlwaysAbstain,\n  AlwaysNoConfidence,\n} from \"@lucid-evolution/core-types\";\nimport * as CML from \"@anastasia-labs/cardano-multiplatform-lib-nodejs\";\nimport { TxBuilderError } from \"../../Errors.js\";\nimport { Effect } from \"effect\";\nimport {\n  processCertificate,\n  validateAndGetStakeCredential,\n} from \"./TxUtils.js\";\nimport { TxConfig } from \"./Service.js\";\n\nexport const isDRepCredential = (deleg: DRep): deleg is Credential =>\n  !(\"__typename\" in deleg);\n\nexport const isDRepAlwaysAbstain = (deleg: DRep): deleg is AlwaysAbstain =>\n  !isDRepCredential(deleg) && deleg.__typename === \"AlwaysAbstain\";\n\nexport const isDRepAlwaysNoConfidence = (\n  deleg: DRep,\n): deleg is AlwaysNoConfidence =>\n  !isDRepCredential(deleg) && deleg.__typename === \"AlwaysNoConfidence\";\n\nexport const toCMLDRep = (drep: DRep): CML.DRep => {\n  if (isDRepAlwaysAbstain(drep)) {\n    return CML.DRep.new_always_abstain();\n  } else if (isDRepAlwaysNoConfidence(drep)) {\n    return CML.DRep.new_always_no_confidence();\n  } else if (isDRepCredential(drep)) {\n    switch (drep.type) {\n      case \"Key\":\n        return CML.DRep.new_key(CML.Ed25519KeyHash.from_hex(drep.hash));\n      case \"Script\":\n        return CML.DRep.new_script(CML.ScriptHash.from_hex(drep.hash));\n      default:\n        throw new Error(`Unsupported DRep type: ${drep.type}`);\n    }\n  }\n  throw new Error(`Unexpected DRep type: ${drep}`);\n};\n\nexport const governanceError = (cause: unknown) =>\n  new TxBuilderError({ cause: `{ Governance: ${cause} }` });\n\nexport const delegateVoteToDRep = (\n  rewardAddress: RewardAddress,\n  drep: DRep,\n  redeemer?: Redeemer,\n) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    const stakeCredential = yield* validateAndGetStakeCredential(\n      rewardAddress,\n      config,\n    );\n    const cmlDRep: CML.DRep = toCMLDRep(drep);\n    const buildCert = (credential: CML.Credential) =>\n      CML.SingleCertificateBuilder.new(\n        CML.Certificate.new_vote_deleg_cert(credential, cmlDRep),\n      );\n\n    yield* processCertificate(stakeCredential, config, buildCert, redeemer);\n  });\n\nexport const delegateVoteToPoolAndDRep = (\n  rewardAddress: RewardAddress,\n  poolId: PoolId,\n  drep: DRep,\n  redeemer?: Redeemer,\n) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    const stakeCredential = yield* validateAndGetStakeCredential(\n      rewardAddress,\n      config,\n    );\n    const cmlDRep = toCMLDRep(drep);\n    const buildCert = (credential: CML.Credential) =>\n      CML.SingleCertificateBuilder.new(\n        CML.Certificate.new_stake_vote_deleg_cert(\n          credential,\n          CML.Ed25519KeyHash.from_bech32(poolId),\n          cmlDRep,\n        ),\n      );\n\n    yield* processCertificate(stakeCredential, config, buildCert, redeemer);\n  });\n\nexport const registerAndDelegateToPool = (\n  rewardAddress: RewardAddress,\n  poolId: PoolId,\n  redeemer?: Redeemer,\n) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    const stakeCredential = yield* validateAndGetStakeCredential(\n      rewardAddress,\n      config,\n    );\n\n    const buildCert = (credential: CML.Credential) =>\n      CML.SingleCertificateBuilder.new(\n        CML.Certificate.new_stake_reg_deleg_cert(\n          credential,\n          CML.Ed25519KeyHash.from_bech32(poolId),\n          config.lucidConfig.protocolParameters.keyDeposit,\n        ),\n      );\n\n    yield* processCertificate(stakeCredential, config, buildCert, redeemer);\n  });\n\nexport const registerAndDelegateToDRep = (\n  rewardAddress: RewardAddress,\n  drep: DRep,\n  redeemer?: Redeemer,\n) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    const stakeCredential = yield* validateAndGetStakeCredential(\n      rewardAddress,\n      config,\n    );\n    const cmlDRep = toCMLDRep(drep);\n    const buildCert = (credential: CML.Credential) =>\n      CML.SingleCertificateBuilder.new(\n        CML.Certificate.new_vote_reg_deleg_cert(\n          credential,\n          cmlDRep,\n          config.lucidConfig.protocolParameters.keyDeposit,\n        ),\n      );\n\n    yield* processCertificate(stakeCredential, config, buildCert, redeemer);\n  });\n\nexport const registerAndDelegateToPoolAndDRep = (\n  rewardAddress: RewardAddress,\n  poolId: PoolId,\n  drep: DRep,\n  redeemer?: Redeemer,\n) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    const stakeCredential = yield* validateAndGetStakeCredential(\n      rewardAddress,\n      config,\n    );\n    const cmlDRep = toCMLDRep(drep);\n    const buildCert = (credential: CML.Credential) =>\n      CML.SingleCertificateBuilder.new(\n        CML.Certificate.new_stake_vote_reg_deleg_cert(\n          credential,\n          CML.Ed25519KeyHash.from_bech32(poolId),\n          cmlDRep,\n          config.lucidConfig.protocolParameters.keyDeposit,\n        ),\n      );\n\n    yield* processCertificate(stakeCredential, config, buildCert, redeemer);\n  });\n\nexport const registerDRep = (\n  rewardAddress: RewardAddress,\n  anchor?: Anchor,\n  redeemer?: Redeemer,\n) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    const stakeCredential = yield* validateAndGetStakeCredential(\n      rewardAddress,\n      config,\n    );\n    const cmlAnchor = anchor\n      ? CML.Anchor.new(\n          CML.Url.from_json(anchor.url),\n          CML.AnchorDocHash.from_hex(anchor.dataHash),\n        )\n      : undefined;\n\n    const buildCert = (credential: CML.Credential) =>\n      CML.SingleCertificateBuilder.new(\n        CML.Certificate.new_reg_drep_cert(\n          credential,\n          config.lucidConfig.protocolParameters.drepDeposit,\n          cmlAnchor,\n        ),\n      );\n    yield* processCertificate(stakeCredential, config, buildCert, redeemer);\n  });\n\nexport const deregisterDRep = (\n  rewardAddress: RewardAddress,\n  redeemer?: Redeemer,\n) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    const stakeCredential = yield* validateAndGetStakeCredential(\n      rewardAddress,\n      config,\n    );\n\n    const buildCert = (credential: CML.Credential) =>\n      CML.SingleCertificateBuilder.new(\n        CML.Certificate.new_unreg_drep_cert(\n          credential,\n          config.lucidConfig.protocolParameters.drepDeposit,\n        ),\n      );\n\n    yield* processCertificate(stakeCredential, config, buildCert, redeemer);\n  });\n\nexport const updateDRep = (\n  rewardAddress: RewardAddress,\n  anchor?: Anchor,\n  redeemer?: Redeemer,\n) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    const stakeCredential = yield* validateAndGetStakeCredential(\n      rewardAddress,\n      config,\n    );\n    const cmlAnchor = anchor\n      ? CML.Anchor.new(\n          CML.Url.from_json(anchor.url),\n          CML.AnchorDocHash.from_hex(anchor.dataHash),\n        )\n      : undefined;\n    const buildCert = (credential: CML.Credential) =>\n      CML.SingleCertificateBuilder.new(\n        CML.Certificate.new_update_drep_cert(credential, cmlAnchor),\n      );\n    yield* processCertificate(stakeCredential, config, buildCert, redeemer);\n  });\n\nexport const authCommitteeHot = (\n  coldAddress: RewardAddress,\n  hotAddress: RewardAddress,\n  redeemer?: Redeemer,\n) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    const coldCred = yield* validateAndGetStakeCredential(coldAddress, config);\n    const hotCred = yield* validateAndGetStakeCredential(hotAddress, config);\n    const hotCredential: CML.Credential =\n      hotCred.type === \"Key\"\n        ? CML.Credential.new_pub_key(CML.Ed25519KeyHash.from_hex(hotCred.hash))\n        : CML.Credential.new_script(CML.ScriptHash.from_hex(hotCred.hash));\n    const buildCert = (credential: CML.Credential) =>\n      CML.SingleCertificateBuilder.new(\n        CML.Certificate.new_auth_committee_hot_cert(credential, hotCredential),\n      );\n\n    yield* processCertificate(coldCred, config, buildCert, redeemer);\n  });\n\nexport const resignCommitteeHot = (\n  coldAddress: RewardAddress,\n  anchor?: Anchor,\n  redeemer?: Redeemer,\n) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    const coldCred = yield* validateAndGetStakeCredential(coldAddress, config);\n    const cmlAnchor = anchor\n      ? CML.Anchor.new(\n          CML.Url.from_json(anchor.url),\n          CML.AnchorDocHash.from_hex(anchor.dataHash),\n        )\n      : undefined;\n\n    const buildCert = (credential: CML.Credential) =>\n      CML.SingleCertificateBuilder.new(\n        CML.Certificate.new_resign_committee_cold_cert(credential, cmlAnchor),\n      );\n\n    yield* processCertificate(coldCred, config, buildCert, redeemer);\n  });\n","import {\n  Anchor,\n  Credential,\n  GovernanceAction,\n  GovernanceActionId,\n  GovernanceProposal,\n  GovernanceVoter,\n  GovernanceVote,\n  Redeemer,\n} from \"@lucid-evolution/core-types\";\nimport * as CML from \"@anastasia-labs/cardano-multiplatform-lib-nodejs\";\nimport { Effect, pipe } from \"effect\";\nimport {\n  ERROR_MESSAGE,\n  TxBuilderError,\n  TransactionError,\n} from \"../../Errors.js\";\nimport { TxConfig } from \"./Service.js\";\nimport { toPartial, toV3, validateAddressDetails } from \"./TxUtils.js\";\nimport type { TxBuilderConfig } from \"../TxBuilder.js\";\n\nexport const governanceActionError = (cause: unknown) =>\n  new TxBuilderError({ cause: `{ GovernanceAction: ${cause} }` });\n\nconst toBigInt = (value: number | bigint): bigint => BigInt(value);\n\nconst cloneAnchor = (anchor: Anchor): Anchor => ({ ...anchor });\n\nconst cloneCredential = (credential: Credential): Credential => ({\n  ...credential,\n});\n\nconst cloneGovernanceActionId = (\n  actionId: GovernanceActionId | null | undefined,\n): GovernanceActionId | null | undefined =>\n  actionId === undefined || actionId === null\n    ? actionId\n    : { txHash: actionId.txHash, index: actionId.index };\n\nexport const cloneGovernanceVoter = (\n  voter: GovernanceVoter,\n): GovernanceVoter => {\n  switch (voter.type) {\n    case \"DRep\":\n    case \"ConstitutionalCommittee\":\n      return {\n        type: voter.type,\n        credential: cloneCredential(voter.credential),\n      };\n    case \"StakePool\":\n      return \"poolId\" in voter\n        ? { type: \"StakePool\", poolId: voter.poolId }\n        : { type: \"StakePool\", hash: voter.hash };\n  }\n};\n\nexport const cloneGovernanceAction = (\n  action: GovernanceAction,\n): GovernanceAction => {\n  switch (action.type) {\n    case \"ParameterChange\":\n      return {\n        type: \"ParameterChange\",\n        actionId: cloneGovernanceActionId(action.actionId),\n        protocolParamUpdate:\n          typeof action.protocolParamUpdate === \"string\"\n            ? action.protocolParamUpdate\n            : action.protocolParamUpdate.to_cbor_hex(),\n        policyHash: action.policyHash,\n      };\n    case \"HardForkInitiation\":\n      return {\n        type: \"HardForkInitiation\",\n        actionId: cloneGovernanceActionId(action.actionId),\n        protocolVersion: { ...action.protocolVersion },\n      };\n    case \"TreasuryWithdrawals\":\n      return {\n        type: \"TreasuryWithdrawals\",\n        withdrawals: action.withdrawals.map((withdrawal) => ({\n          ...withdrawal,\n        })),\n        policyHash: action.policyHash,\n      };\n    case \"NoConfidence\":\n      return {\n        type: \"NoConfidence\",\n        actionId: cloneGovernanceActionId(action.actionId),\n      };\n    case \"UpdateCommittee\":\n      return {\n        type: \"UpdateCommittee\",\n        actionId: cloneGovernanceActionId(action.actionId),\n        remove: action.remove.map(cloneCredential),\n        add: action.add.map((member) => ({\n          credential: cloneCredential(member.credential),\n          epoch: member.epoch,\n        })),\n        threshold: { ...action.threshold },\n      };\n    case \"NewConstitution\":\n      return {\n        type: \"NewConstitution\",\n        actionId: cloneGovernanceActionId(action.actionId),\n        constitution: {\n          anchor: cloneAnchor(action.constitution.anchor),\n          scriptHash: action.constitution.scriptHash,\n        },\n      };\n    case \"InfoAction\":\n      return { type: \"InfoAction\" };\n    case \"Cbor\":\n      return { type: \"Cbor\", cbor: action.cbor };\n    case \"CML\":\n      return { type: \"Cbor\", cbor: action.action.to_cbor_hex() };\n  }\n};\n\nexport const cloneGovernanceProposal = (\n  proposal: GovernanceProposal,\n): GovernanceProposal => ({\n  action: cloneGovernanceAction(proposal.action),\n  returnAddress: proposal.returnAddress,\n  anchor: cloneAnchor(proposal.anchor),\n  deposit: proposal.deposit,\n});\n\nexport const toCMLAnchor = (anchor: Anchor): CML.Anchor =>\n  CML.Anchor.new(\n    CML.Url.from_json(JSON.stringify(anchor.url)),\n    CML.AnchorDocHash.from_hex(anchor.dataHash),\n  );\n\nconst toCMLCredential = (credential: Credential): CML.Credential => {\n  switch (credential.type) {\n    case \"Key\":\n      return CML.Credential.new_pub_key(\n        CML.Ed25519KeyHash.from_hex(credential.hash),\n      );\n    case \"Script\":\n      return CML.Credential.new_script(\n        CML.ScriptHash.from_hex(credential.hash),\n      );\n  }\n};\n\nconst toCMLScriptHash = (\n  scriptHash: string | null | undefined,\n): CML.ScriptHash | undefined =>\n  scriptHash === undefined || scriptHash === null\n    ? undefined\n    : CML.ScriptHash.from_hex(scriptHash);\n\nconst toCMLGovernanceActionId = (\n  actionId: GovernanceActionId | null | undefined,\n): CML.GovActionId | undefined =>\n  actionId === undefined || actionId === null\n    ? undefined\n    : CML.GovActionId.new(\n        CML.TransactionHash.from_hex(actionId.txHash),\n        toBigInt(actionId.index),\n      );\n\nconst toCMLProtocolParamUpdate = (\n  update: CML.ProtocolParamUpdate | string,\n): CML.ProtocolParamUpdate =>\n  typeof update === \"string\"\n    ? CML.ProtocolParamUpdate.from_cbor_hex(update)\n    : update;\n\nconst toCMLRewardAddress = (\n  rewardAddress: string,\n  config: TxBuilderConfig,\n): Effect.Effect<CML.RewardAddress, TxBuilderError> =>\n  Effect.gen(function* () {\n    const addressDetails = yield* pipe(\n      validateAddressDetails(rewardAddress, config.lucidConfig),\n      Effect.andThen((details) =>\n        details.type !== \"Reward\"\n          ? governanceActionError(ERROR_MESSAGE.MISSING_REWARD_TYPE)\n          : Effect.succeed(details),\n      ),\n    );\n    const cmlRewardAddress = CML.RewardAddress.from_address(\n      CML.Address.from_bech32(addressDetails.address.bech32),\n    );\n    if (!cmlRewardAddress) {\n      yield* governanceActionError(ERROR_MESSAGE.MISSING_REWARD_TYPE);\n    }\n    return cmlRewardAddress!;\n  });\n\nexport const toCMLGovernanceAction = (\n  action: GovernanceAction,\n  config: TxBuilderConfig,\n): Effect.Effect<CML.GovAction, TxBuilderError> =>\n  Effect.gen(function* () {\n    switch (action.type) {\n      case \"ParameterChange\":\n        return CML.GovAction.new_parameter_change_action(\n          toCMLGovernanceActionId(action.actionId),\n          toCMLProtocolParamUpdate(action.protocolParamUpdate),\n          toCMLScriptHash(action.policyHash),\n        );\n      case \"HardForkInitiation\":\n        return CML.GovAction.new_hard_fork_initiation_action(\n          toCMLGovernanceActionId(action.actionId),\n          CML.ProtocolVersion.new(\n            toBigInt(action.protocolVersion.major),\n            toBigInt(action.protocolVersion.minor),\n          ),\n        );\n      case \"TreasuryWithdrawals\": {\n        const withdrawals = CML.MapRewardAccountToCoin.new();\n        const seen = new Set<string>();\n        for (const withdrawal of action.withdrawals) {\n          const rewardAddress = yield* toCMLRewardAddress(\n            withdrawal.rewardAddress,\n            config,\n          );\n          const rewardAddressKey = rewardAddress\n            .to_address()\n            .to_bech32(undefined);\n          if (seen.has(rewardAddressKey)) {\n            yield* governanceActionError(\n              `Duplicate treasury withdrawal address: ${withdrawal.rewardAddress}`,\n            );\n          }\n          seen.add(rewardAddressKey);\n          withdrawals.insert(rewardAddress, withdrawal.amount);\n        }\n        return CML.GovAction.new_treasury_withdrawals_action(\n          withdrawals,\n          toCMLScriptHash(action.policyHash),\n        );\n      }\n      case \"NoConfidence\":\n        return CML.GovAction.new_no_confidence(\n          toCMLGovernanceActionId(action.actionId),\n        );\n      case \"UpdateCommittee\": {\n        const remove = CML.CommitteeColdCredentialList.new();\n        for (const credential of action.remove) {\n          remove.add(toCMLCredential(credential));\n        }\n        const add = CML.MapCommitteeColdCredentialToEpoch.new();\n        for (const member of action.add) {\n          add.insert(\n            toCMLCredential(member.credential),\n            toBigInt(member.epoch),\n          );\n        }\n        return CML.GovAction.new_update_committee(\n          toCMLGovernanceActionId(action.actionId),\n          remove,\n          add,\n          CML.UnitInterval.new(\n            toBigInt(action.threshold.numerator),\n            toBigInt(action.threshold.denominator),\n          ),\n        );\n      }\n      case \"NewConstitution\":\n        return CML.GovAction.new_new_constitution(\n          toCMLGovernanceActionId(action.actionId),\n          CML.Constitution.new(\n            toCMLAnchor(action.constitution.anchor),\n            toCMLScriptHash(action.constitution.scriptHash),\n          ),\n        );\n      case \"InfoAction\":\n        return CML.GovAction.new_info_action();\n      case \"Cbor\":\n        return CML.GovAction.from_cbor_hex(action.cbor);\n      case \"CML\":\n        return action.action;\n    }\n  });\n\nexport const toCMLVoter = (voter: GovernanceVoter): CML.Voter => {\n  switch (voter.type) {\n    case \"DRep\":\n      return voter.credential.type === \"Key\"\n        ? CML.Voter.new_d_rep_key_hash(\n            CML.Ed25519KeyHash.from_hex(voter.credential.hash),\n          )\n        : CML.Voter.new_d_rep_script_hash(\n            CML.ScriptHash.from_hex(voter.credential.hash),\n          );\n    case \"ConstitutionalCommittee\":\n      return voter.credential.type === \"Key\"\n        ? CML.Voter.new_constitutional_committee_hot_key_hash(\n            CML.Ed25519KeyHash.from_hex(voter.credential.hash),\n          )\n        : CML.Voter.new_constitutional_committee_hot_script_hash(\n            CML.ScriptHash.from_hex(voter.credential.hash),\n          );\n    case \"StakePool\":\n      return CML.Voter.new_staking_pool_key_hash(\n        \"poolId\" in voter\n          ? CML.Ed25519KeyHash.from_bech32(voter.poolId)\n          : CML.Ed25519KeyHash.from_hex(voter.hash),\n      );\n  }\n};\n\nexport const governanceVoterKey = (voter: GovernanceVoter): string =>\n  toCMLVoter(voter).to_canonical_cbor_hex();\n\nexport const toCMLProposalProcedure = (\n  proposal: GovernanceProposal,\n  config: TxBuilderConfig,\n): Effect.Effect<CML.ProposalProcedure, TxBuilderError> =>\n  Effect.gen(function* () {\n    return CML.ProposalProcedure.new(\n      proposal.deposit ??\n        config.lucidConfig.protocolParameters.govActionDeposit,\n      yield* toCMLRewardAddress(proposal.returnAddress, config),\n      yield* toCMLGovernanceAction(proposal.action, config),\n      toCMLAnchor(proposal.anchor),\n    );\n  });\n\nexport const governanceProposalKey = (\n  proposal: GovernanceProposal,\n  config: TxBuilderConfig,\n): Effect.Effect<string, TxBuilderError> =>\n  Effect.gen(function* () {\n    const proposalProcedure = yield* toCMLProposalProcedure(proposal, config);\n    return proposalProcedure.to_canonical_cbor_hex();\n  });\n\nconst toCMLVote = (vote: GovernanceVote): CML.Vote => {\n  switch (vote) {\n    case \"No\":\n      return CML.Vote.No;\n    case \"Yes\":\n      return CML.Vote.Yes;\n    case \"Abstain\":\n      return CML.Vote.Abstain;\n  }\n};\n\nconst voterCredential = (voter: GovernanceVoter): Credential | undefined =>\n  voter.type === \"StakePool\" ? undefined : voter.credential;\n\nexport const vote = (\n  voter: GovernanceVoter,\n  actionId: GovernanceActionId,\n  voteChoice: GovernanceVote,\n  anchor?: Anchor,\n  redeemer?: Redeemer,\n): Effect.Effect<void, TransactionError, TxConfig> =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    const cmlVoter = toCMLVoter(voter);\n    const cmlActionId = toCMLGovernanceActionId(actionId)!;\n    const procedure = CML.VotingProcedure.new(\n      toCMLVote(voteChoice),\n      anchor ? toCMLAnchor(anchor) : undefined,\n    );\n    let builder = config.governanceVoteBuilder ?? CML.VoteBuilder.new();\n    const credential = voterCredential(voter);\n\n    if (!credential || credential.type === \"Key\") {\n      builder = yield* Effect.try({\n        try: () => builder.with_vote(cmlVoter, cmlActionId, procedure),\n        catch: governanceActionError,\n      });\n    } else {\n      const script = yield* pipe(\n        Effect.fromNullable(config.scripts.get(credential.hash)),\n        Effect.orElseFail(() =>\n          governanceActionError(ERROR_MESSAGE.MISSING_SCRIPT(credential.hash)),\n        ),\n      );\n\n      if (script.type === \"Native\") {\n        builder = yield* Effect.try({\n          try: () =>\n            builder.with_native_script_vote(\n              cmlVoter,\n              cmlActionId,\n              procedure,\n              CML.NativeScript.from_cbor_hex(script.script),\n              CML.NativeScriptWitnessInfo.assume_signature_count(),\n            ),\n          catch: governanceActionError,\n        });\n      } else {\n        if (script.type !== \"PlutusV3\") {\n          yield* governanceActionError(\n            \"Governance voting scripts must use PlutusV3\",\n          );\n        }\n        const voterKey = cmlVoter.to_canonical_cbor_hex();\n        if (config.governanceVoteWitnessKeys.includes(voterKey)) {\n          yield* governanceActionError(\n            \"Multiple Plutus voting procedures for the same voter are not supported in one transaction\",\n          );\n        }\n        const red = yield* pipe(\n          Effect.fromNullable(redeemer),\n          Effect.orElseFail(() =>\n            governanceActionError(ERROR_MESSAGE.MISSING_REDEEMER),\n          ),\n        );\n        const partial = toPartial(toV3(script.script), red);\n        builder = yield* Effect.try({\n          try: () =>\n            builder.with_plutus_vote(\n              cmlVoter,\n              cmlActionId,\n              procedure,\n              partial,\n              CML.Ed25519KeyHashList.new(),\n              CML.PlutusData.from_cbor_hex(red),\n            ),\n          catch: governanceActionError,\n        });\n      }\n    }\n\n    config.governanceVoteBuilder = builder;\n    if (credential?.type === \"Script\") {\n      config.governanceVoteWitnessKeys.push(cmlVoter.to_canonical_cbor_hex());\n    }\n  });\n\nexport const finalizeVotes = (): Effect.Effect<\n  void,\n  TransactionError,\n  TxConfig\n> =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    const builder = config.governanceVoteBuilder;\n    if (!builder) return;\n\n    yield* Effect.try({\n      try: () => config.txBuilder.add_vote(builder.build()),\n      catch: governanceActionError,\n    });\n    config.governanceVoteBuilder = undefined;\n  });\n\nexport const propose = (\n  proposal: GovernanceProposal,\n  redeemer?: Redeemer,\n): Effect.Effect<void, TransactionError, TxConfig> =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    const proposalProcedure = yield* toCMLProposalProcedure(proposal, config);\n    const proposalIndex = config.governanceProposalCount;\n    const govAction = proposalProcedure.gov_action();\n    let builder = CML.ProposalBuilder.new();\n    const scriptHash = govAction.script_hash()?.to_hex();\n\n    if (!scriptHash) {\n      builder = builder.with_proposal(proposalProcedure);\n    } else {\n      const script = yield* pipe(\n        Effect.fromNullable(config.scripts.get(scriptHash)),\n        Effect.orElseFail(() =>\n          governanceActionError(ERROR_MESSAGE.MISSING_SCRIPT(scriptHash)),\n        ),\n      );\n\n      if (script.type === \"Native\") {\n        builder = builder.with_native_script_proposal(\n          proposalProcedure,\n          CML.NativeScript.from_cbor_hex(script.script),\n          CML.NativeScriptWitnessInfo.assume_signature_count(),\n        );\n      } else {\n        if (script.type !== \"PlutusV3\") {\n          yield* governanceActionError(\n            \"Governance proposal scripts must use PlutusV3\",\n          );\n        }\n        const red = yield* pipe(\n          Effect.fromNullable(redeemer),\n          Effect.orElseFail(() =>\n            governanceActionError(ERROR_MESSAGE.MISSING_REDEEMER),\n          ),\n        );\n        const partial = toPartial(toV3(script.script), red);\n        builder = builder.with_plutus_proposal(\n          proposalProcedure,\n          partial,\n          CML.Ed25519KeyHashList.new(),\n          CML.PlutusData.from_cbor_hex(red),\n        );\n      }\n    }\n\n    yield* Effect.try({\n      try: () => config.txBuilder.add_proposal(builder.build()),\n      catch: governanceActionError,\n    });\n    config.governanceProposalCount += 1n;\n    if (scriptHash) {\n      config.governanceProposalWitnessIndices.push(proposalIndex);\n    }\n  });\n","import { Label } from \"@lucid-evolution/core-types\";\nimport { Effect } from \"effect\";\nimport { CML } from \"../../core.js\";\nimport * as S from \"@effect/schema/Schema\";\nimport { toHex } from \"@lucid-evolution/core-utils\";\nimport { TxConfig } from \"./Service.js\";\n\nexport const attachMetadata = (label: Label, metadata: TransactionMetadata) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    const auxiliaryData = CML.AuxiliaryData.new();\n    const meta = CML.Metadata.new();\n    meta.set(\n      BigInt(label),\n      CML.TransactionMetadatum.from_json(\n        JSON.stringify(toCardanoMetadata(metadata)),\n      ),\n    );\n    auxiliaryData.add_metadata(meta);\n    config.txBuilder.add_auxiliary_data(auxiliaryData);\n    auxiliaryData.free();\n    meta.free();\n  });\n\n//CDDL conformance\n//   transaction_metadatum =\n//   { * transaction_metadatum => transaction_metadatum }\n// / [ * transaction_metadatum ]\n// / int\n// / bytes .size (0..64)\n// / text .size (0..64)\n\nexport type CardanoMetadata =\n  | {\n      string: string;\n    }\n  | {\n      int: number;\n    }\n  | {\n      bytes: string;\n    }\n  | {\n      list: ReadonlyArray<CardanoMetadata>;\n    }\n  | {\n      map: ReadonlyArray<{\n        k: CardanoMetadata;\n        v: CardanoMetadata;\n      }>;\n    };\n\nexport type TransactionMetadata =\n  | string\n  | number\n  | Uint8Array\n  | ReadonlyArray<TransactionMetadata>\n  | { [key: string]: TransactionMetadata };\n\nconst TextSchema = S.String.pipe(S.maxLength(64));\n\nconst TransactionMetadataSchema: S.Schema<TransactionMetadata> = S.Union(\n  TextSchema,\n  S.Number,\n  S.Uint8ArrayFromSelf,\n  S.Array(S.suspend(() => TransactionMetadataSchema)),\n  S.Record(\n    S.String,\n    S.suspend(() => TransactionMetadataSchema),\n  ),\n);\n\nexport const toCardanoMetadata = (\n  json: TransactionMetadata,\n): CardanoMetadata => {\n  const d = S.asserts(TransactionMetadataSchema)(json);\n  if (S.is(TextSchema)(json)) {\n    return { string: json };\n  }\n  if (typeof json === \"number\") {\n    return { int: json };\n  }\n  if (json instanceof Uint8Array) {\n    return { bytes: toHex(json) };\n  }\n  if (Array.isArray(json)) {\n    return { list: json.map((value) => toCardanoMetadata(value)) };\n  }\n  if (typeof json === \"object\" && json !== null) {\n    const mapEntries = Object.entries(json).map(([k, v]) => ({\n      k: toCardanoMetadata(k),\n      v: toCardanoMetadata(v),\n    }));\n    return { map: mapEntries };\n  }\n  throw new Error(\"Unsupported type\");\n};\n\nexport const cloneTransactionMetadata = (\n  metadata: TransactionMetadata,\n): TransactionMetadata => {\n  if (metadata instanceof Uint8Array) return new Uint8Array(metadata);\n  if (Array.isArray(metadata)) return metadata.map(cloneTransactionMetadata);\n  if (typeof metadata === \"object\" && metadata !== null) {\n    return Object.fromEntries(\n      Object.entries(metadata).map(([key, value]) => [\n        key,\n        cloneTransactionMetadata(value),\n      ]),\n    );\n  }\n  return metadata;\n};\n","import { Lovelace } from \"@lucid-evolution/core-types\";\nimport { Effect } from \"effect\";\nimport { TxBuilderError } from \"../../Errors.js\";\nimport { TxConfig } from \"./Service.js\";\n\nexport type TreasuryDonation = {\n  readonly donation: Lovelace;\n  readonly currentTreasuryValue: Lovelace;\n};\n\nconst treasuryError = (cause: unknown) =>\n  new TxBuilderError({ cause: `{ Treasury: ${cause} }` });\n\nconst resolveCurrentTreasuryValue = (currentTreasuryValue?: Lovelace) =>\n  Effect.gen(function* () {\n    if (currentTreasuryValue !== undefined) return currentTreasuryValue;\n\n    const { config } = yield* TxConfig;\n    const getTreasury = config.lucidConfig.provider.getTreasury;\n    if (!getTreasury) {\n      yield* treasuryError(\n        \"Provider does not support querying the current treasury value. Pass currentTreasuryValue explicitly to donateToTreasury.\",\n      );\n    }\n\n    return yield* Effect.tryPromise({\n      try: () => getTreasury!.call(config.lucidConfig.provider),\n      catch: treasuryError,\n    });\n  });\n\nexport const donateToTreasury = (\n  donation: Lovelace,\n  currentTreasuryValue?: Lovelace,\n) =>\n  Effect.gen(function* () {\n    if (donation <= 0n) {\n      yield* treasuryError(\n        \"Treasury donation must be greater than 0 lovelace.\",\n      );\n    }\n\n    const resolvedCurrentTreasuryValue =\n      yield* resolveCurrentTreasuryValue(currentTreasuryValue);\n    if (resolvedCurrentTreasuryValue < 0n) {\n      yield* treasuryError(\n        \"Current treasury value cannot be negative lovelace.\",\n      );\n    }\n\n    const { config } = yield* TxConfig;\n    if (\n      config.treasuryDonation &&\n      config.treasuryDonation.currentTreasuryValue !==\n        resolvedCurrentTreasuryValue\n    ) {\n      yield* treasuryError(\n        \"Cannot compose treasury donations with different current treasury values.\",\n      );\n    }\n\n    config.treasuryDonation = {\n      currentTreasuryValue: resolvedCurrentTreasuryValue,\n      donation: (config.treasuryDonation?.donation ?? 0n) + donation,\n    };\n  });\n","import {\n  Effect,\n  pipe,\n  Record,\n  Array as _Array,\n  BigInt as _BigInt,\n  Tuple,\n  Option,\n  Layer,\n  Either,\n} from \"effect\";\nimport {\n  Address,\n  Assets,\n  EvalRedeemer,\n  EvaluationContext,\n  EvaluatorAdapter,\n  Provider,\n  RedeemerPurpose,\n  RedeemerTag,\n  ScriptType,\n  UTxO,\n  Wallet,\n} from \"@lucid-evolution/core-types\";\nimport {\n  ERROR_MESSAGE,\n  EvaluatorError,\n  RunTimeError,\n  TxBuilderError,\n} from \"../../Errors.js\";\nimport { CML } from \"../../core.js\";\nimport { freeCML, withCMLScope } from \"@lucid-evolution/core-utils\";\nimport * as UPLC from \"@lucid-evolution/uplc\";\nimport * as TxBuilder from \"../TxBuilder.js\";\nimport * as TxSignBuilder from \"../../tx-sign-builder/TxSignBuilder.js\";\nimport {\n  assetsToValue,\n  coreToTxOutput,\n  isEqualUTxO,\n  selectUTxOs,\n  sortUTxOs,\n  stringify,\n  utxoToCore,\n  fromCMLRedeemerTag,\n  getAddressDetails,\n  utxoToTransactionInput,\n  utxoToTransactionOutput,\n  toCMLRedeemerTag,\n} from \"@lucid-evolution/utils\";\nimport { collectFromUTxO } from \"./Collect.js\";\nimport { TxConfig } from \"./Service.js\";\nimport * as GovernanceAction from \"./GovernanceAction.js\";\nimport { isError } from \"effect/Predicate\";\nimport {\n  hasDelayedActions,\n  makeReplayConfig,\n  replayTxActions,\n} from \"../TxBuilder.js\";\nimport {\n  buildCanonicalRedeemerInfo,\n  buildRedeemersFromCanonicalContext,\n  canonicalRedeemerEntries,\n  freeCanonicalRedeemerEntries,\n  CanonicalRedeemerInfo,\n  cloneUTxOs,\n  normalizeEvalUTxO,\n  normalizeGovernanceRedeemerIndices,\n  purposeToWitnessKey,\n  proposalProcedureForRedeemerIndex,\n  RedeemerBuilderCache,\n  redeemerMapsEqual,\n  resolveCanonicalInputs,\n  resolveCanonicalReferenceInputs,\n  transactionFixedPointFingerprint,\n  voterForRedeemerIndex,\n  witnessPurposeKey,\n  type BuilderRedeemerKey,\n} from \"./RedeemerContext.js\";\n\nconst MAX_EVALUATION_ATTEMPTS = 8;\n\nexport type CompleteOptions = {\n  /**\n   * Enable coin selection algorithm\n   * @default true\n   */\n  coinSelection?: boolean;\n\n  /**\n   * Address to send change to\n   * @default wallet.address()\n   */\n  changeAddress?: Address;\n\n  /**\n   * Enable local UPLC evaluation\n   * @default true\n   */\n  localUPLCEval?: boolean;\n\n  /**\n   * Local phase-two evaluator to use when local UPLC evaluation is enabled.\n   * `localUPLCEval: false` forces provider evaluation and bypasses this option.\n   * @default built-in Aiken/WASM-backed evaluator\n   */\n  evaluator?: EvaluatorAdapter;\n\n  /**\n   * Amount to set as collateral\n   * @default 5_000_000n\n   */\n  setCollateral?: bigint;\n\n  /**\n   * Use canonical ordering\n   * @default false\n   */\n  canonical?: boolean;\n\n  /**\n   * Include leftover lovelace in the transaction fee if there are no additional inputs available to cover the change output address.\n   * @default false\n   */\n  includeLeftoverLovelaceAsFee?: boolean;\n\n  /**\n   * Preset UTXOs from the wallet to include in coin selection.\n   * If not provided, wallet UTXOs will be fetched by the provider.\n   *\n   * Note:\n   * UTXOs already specified in `collectFrom` will not cause duplication\n   * @default []\n   */\n  presetWalletInputs?: UTxO[];\n};\n\ntype CoinSelectionResult = {\n  selected: UTxO[];\n  burnable: Assets;\n};\n\nexport const completeTxError = (cause: unknown) =>\n  new TxBuilderError({ cause: `{ Complete: ${cause} }` });\n\ntype InternalCompleteOptions = {\n  bootstrapExUnits?: boolean;\n  forceCanonical?: boolean;\n  walletInputs?: UTxO[];\n  knownRedeemerExUnits?: KnownRedeemerExUnits;\n  redeemerInputFingerprint?: string;\n};\n\ntype KnownRedeemerExUnits = Map<\n  string,\n  Readonly<{ mem: number; steps: number }>\n>;\n\nclass RedeemerInputRefreshRequired extends TxBuilderError {\n  constructor(readonly candidate: CML.Transaction) {\n    super({\n      cause:\n        \"Coin selection changed canonical inputs after the delayed redeemers were built\",\n    });\n  }\n}\n\ntype ExUnitSetter = Pick<CML.TransactionBuilder, \"set_exunits\">;\n\nconst treasuryDonationAmount = (config: TxBuilder.TxBuilderConfig): bigint =>\n  config.treasuryDonation?.donation ?? 0n;\n\nconst applyTreasuryDonationToBuilder = (\n  config: TxBuilder.TxBuilderConfig,\n): Effect.Effect<void, TxBuilderError> =>\n  Effect.try({\n    try: () => {\n      const treasuryDonation = config.treasuryDonation;\n      if (!treasuryDonation) return;\n      config.txBuilder.set_current_treasury_value(\n        treasuryDonation.currentTreasuryValue,\n      );\n      config.txBuilder.set_donation(treasuryDonation.donation);\n    },\n    catch: (error) => completeTxError(error),\n  });\n\nconst splitBootstrapBudget = (\n  total: bigint,\n  redeemerCount: number,\n  index: number,\n): bigint =>\n  total / BigInt(redeemerCount) +\n  (BigInt(index) < total % BigInt(redeemerCount) ? 1n : 0n);\n\nexport const bootstrapRedeemerExUnits = (\n  redeemerCount: number,\n  maxTxExMem: bigint,\n  maxTxExSteps: bigint,\n): CML.ExUnits[] =>\n  Array.from({ length: redeemerCount }, (_, index) =>\n    CML.ExUnits.new(\n      splitBootstrapBudget(maxTxExMem, redeemerCount, index),\n      splitBootstrapBudget(maxTxExSteps, redeemerCount, index),\n    ),\n  );\n\nconst completeCurrentConfig = (\n  options: CompleteOptions = {},\n  internalOptions: InternalCompleteOptions = {},\n) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    const wallet: Wallet = yield* pipe(\n      Effect.fromNullable(config.lucidConfig.wallet),\n      Effect.orElseFail(() => completeTxError(ERROR_MESSAGE.MISSING_WALLET)),\n    );\n    const walletAddress: string = yield* Effect.promise(() => wallet.address());\n\n    // Extract and set default options for the transaction configuration\n    const {\n      coinSelection = true,\n      changeAddress = walletAddress,\n      localUPLCEval = true,\n      evaluator,\n      setCollateral = 5_000_000n,\n      canonical = false,\n      includeLeftoverLovelaceAsFee = false,\n      presetWalletInputs = [],\n    } = options;\n\n    const walletInputs: UTxO[] = internalOptions.walletInputs\n      ? cloneUTxOs(internalOptions.walletInputs)\n      : presetWalletInputs.length === 0\n        ? yield* Effect.tryPromise({\n            try: () => wallet.getUtxos(),\n            catch: (error) => completeTxError(error),\n          })\n        : presetWalletInputs;\n    config.walletInputs = walletInputs;\n\n    // Execute programs sequentially\n    yield* Effect.all(config.programs);\n    yield* GovernanceAction.finalizeVotes();\n    yield* applyTreasuryDonationToBuilder(config);\n    const hasPlutusScriptExecutions: boolean = Array.from(\n      config.scripts.values(),\n    ).some((value) => value.type !== \"Native\");\n\n    // First round of coin selection and UPLC evaluation. The fee estimation is lacking\n    // the script execution costs as they aren't available yet.\n    let evaluatedScriptBody = yield* selectionAndEvaluation(\n      walletInputs,\n      changeAddress,\n      coinSelection,\n      localUPLCEval,\n      evaluator,\n      includeLeftoverLovelaceAsFee,\n      false,\n      internalOptions.bootstrapExUnits === true,\n      internalOptions.knownRedeemerExUnits,\n      internalOptions.redeemerInputFingerprint,\n    );\n    // Second round of coin selection by including script execution costs in fee estimation.\n    // UPLC evaluation need to be performed again if new inputs are selected during coin selection.\n    // Because increasing the inputs can increase the script execution budgets.\n    // Set collateral input if there are script executions\n    if (hasPlutusScriptExecutions) {\n      const estimatedFee = yield* estimateFee(config, true);\n\n      const totalCollateral = BigInt(\n        Math.ceil(\n          Math.max(\n            (config.lucidConfig.protocolParameters.collateralPercentage *\n              Number(estimatedFee)) /\n              100,\n            Number(setCollateral),\n          ),\n        ),\n      );\n      const collateralInput = yield* findCollateral(\n        config.lucidConfig.protocolParameters.coinsPerUtxoByte,\n        totalCollateral,\n        walletInputs,\n      );\n      yield* applyCollateral(totalCollateral, collateralInput, changeAddress);\n      evaluatedScriptBody =\n        (yield* selectionAndEvaluation(\n          walletInputs,\n          changeAddress,\n          coinSelection,\n          localUPLCEval,\n          evaluator,\n          includeLeftoverLovelaceAsFee,\n          true,\n          internalOptions.bootstrapExUnits === true,\n          internalOptions.knownRedeemerExUnits,\n          internalOptions.redeemerInputFingerprint,\n        )) || evaluatedScriptBody;\n    }\n    yield* applyEffectiveFee(config, true, evaluatedScriptBody);\n    withCMLScope((own) =>\n      config.txBuilder.add_change_if_needed(\n        own(CML.Address.from_bech32(changeAddress)),\n        true,\n      ),\n    );\n    const builtTransaction = yield* Effect.try({\n      try: () =>\n        withCMLScope((own) =>\n          own(\n            config.txBuilder.build(\n              CML.ChangeSelectionAlgo.Default,\n              own(CML.Address.from_bech32(changeAddress)),\n            ),\n          ).build_unchecked(),\n        ),\n      catch: (error) => completeTxError(error),\n    });\n    const shouldCanonicalize = canonical || internalOptions.forceCanonical;\n    const transactionBeforeScriptDataHash = shouldCanonicalize\n      ? CML.Transaction.from_cbor_bytes(\n          builtTransaction.to_canonical_cbor_bytes(),\n        )\n      : builtTransaction;\n    const normalizedTransaction = yield* Effect.try({\n      try: () =>\n        normalizeGovernanceRedeemerIndices(\n          transactionBeforeScriptDataHash,\n          config.governanceVoteWitnessKeys,\n          config.governanceProposalWitnessIndices,\n        ).transaction,\n      catch: (error) => completeTxError(error),\n    });\n    freeCML(builtTransaction, transactionBeforeScriptDataHash);\n    const transaction = yield* refreshScriptDataHash(\n      normalizedTransaction,\n      config,\n    );\n    if (transaction !== normalizedTransaction) normalizedTransaction.free();\n\n    const derivedInputs = deriveInputsFromTransaction(transaction);\n\n    const derivedWalletInputs = derivedInputs.filter(\n      (utxo) => utxo.address === walletAddress,\n    );\n    const updatedWalletInputs = pipe(\n      _Array.differenceWith(isEqualUTxO)(walletInputs, config.consumedInputs),\n      (availableWalletInputs) => [\n        ...derivedWalletInputs,\n        ...availableWalletInputs,\n      ],\n    );\n    return Tuple.make(\n      updatedWalletInputs,\n      derivedInputs,\n      TxSignBuilder.makeTxSignBuilder(config.lucidConfig.wallet, transaction, {\n        resolvedInputs: [\n          ...config.walletInputs,\n          ...config.consumedInputs,\n          ...config.collectedInputs,\n          ...config.readInputs,\n        ],\n        slotConfig: config.lucidConfig.slotConfig,\n      }),\n    );\n  }).pipe(Effect.catchAllDefect((cause) => new RunTimeError({ cause })));\n\nconst completeStaticFromActions = (\n  sourceConfig: TxBuilder.TxBuilderConfig,\n  options: CompleteOptions,\n) => {\n  const replayConfig = makeReplayConfig(sourceConfig);\n  return pipe(\n    Effect.gen(function* () {\n      yield* replayTxActions(sourceConfig.actions);\n      return yield* completeCurrentConfig(options);\n    }),\n    Effect.provide(Layer.succeed(TxConfig, { config: replayConfig })),\n    // The completed transaction is copied out of the builder; nothing keeps\n    // the replay's builder alive.\n    Effect.ensuring(Effect.sync(() => replayConfig.txBuilder.free())),\n  );\n};\n\nconst completeDelayedFromActions = (\n  sourceConfig: TxBuilder.TxBuilderConfig,\n  options: CompleteOptions,\n) =>\n  Effect.gen(function* () {\n    const wallet: Wallet = yield* pipe(\n      Effect.fromNullable(sourceConfig.lucidConfig.wallet),\n      Effect.orElseFail(() => completeTxError(ERROR_MESSAGE.MISSING_WALLET)),\n    );\n    const presetWalletInputs = options.presetWalletInputs ?? [];\n    const fixedWalletInputs =\n      presetWalletInputs.length === 0\n        ? yield* Effect.tryPromise({\n            try: () => wallet.getUtxos(),\n            catch: (error) => completeTxError(error),\n          })\n        : presetWalletInputs;\n\n    let currentRedeemers = new Map<number, string>();\n    const redeemerBuilderCache: RedeemerBuilderCache = new Map();\n    let previousFingerprint: string | undefined;\n    let redeemerInputFingerprint: string | undefined;\n    let knownRedeemerExUnits: KnownRedeemerExUnits | undefined;\n\n    // A delayed redeemer is derived from one candidate's canonical inputs, but\n    // the following replay may choose a different wallet-input set when real\n    // ex-units replace the maximum bootstrap budget. Evaluating that replay\n    // with the previous candidate's redeemer can fail before the outer fixed\n    // point gets a chance to rebuild it. Preserve the bootstrap shape for one\n    // real evaluation, carry those real ex-units into subsequent replays, and\n    // interrupt evaluation whenever coin selection changes canonical inputs so\n    // the redeemer can first be rebuilt from that unevaluated candidate.\n\n    // Bootstrap inputs are pinned for exactly one replay so the first real\n    // evaluation uses the same input indices as the bootstrap-built redeemers.\n    // Once real ex-units are known, later replays select from scratch again.\n    let bootstrapWalletInputs: UTxO[] = [];\n\n    for (let attempt = 0; attempt < MAX_EVALUATION_ATTEMPTS; attempt++) {\n      const replayConfig = makeReplayConfig(sourceConfig);\n      let usedBootstrapExUnits = false;\n      const completion = yield* pipe(\n        Effect.gen(function* () {\n          yield* replayTxActions(sourceConfig.actions, currentRedeemers);\n          yield* addWalletInputs(replayConfig, bootstrapWalletInputs);\n          const missingRedeemers = replayConfig.pendingRedeemers.some(\n            (pending) => !currentRedeemers.has(pending.id),\n          );\n          usedBootstrapExUnits = missingRedeemers;\n          return yield* completeCurrentConfig(\n            { ...options, canonical: true },\n            {\n              forceCanonical: true,\n              bootstrapExUnits: missingRedeemers,\n              walletInputs: fixedWalletInputs,\n              knownRedeemerExUnits,\n              redeemerInputFingerprint,\n            },\n          );\n        }),\n        Effect.provide(Layer.succeed(TxConfig, { config: replayConfig })),\n        Effect.either,\n      );\n      // Each attempt builds in its own TransactionBuilder; free it once the\n      // attempt's transaction has been copied out or the attempt is discarded.\n      const discardReplay = () => replayConfig.txBuilder.free();\n\n      if (Either.isLeft(completion)) {\n        if (!(completion.left instanceof RedeemerInputRefreshRequired)) {\n          discardReplay();\n          return yield* Effect.fail(completion.left);\n        }\n\n        const tx = completion.left.candidate;\n        const nextRedeemers = yield* buildDelayedRedeemers(\n          tx,\n          replayConfig,\n          redeemerBuilderCache,\n        );\n        currentRedeemers = nextRedeemers;\n        redeemerInputFingerprint = canonicalInputFingerprint(tx);\n        tx.free();\n        discardReplay();\n        previousFingerprint = undefined;\n        bootstrapWalletInputs = [];\n        continue;\n      }\n\n      const result = completion.right;\n      const tx = result[2].toTransaction();\n      if (usedBootstrapExUnits) {\n        bootstrapWalletInputs = replayConfig.collectedInputs.filter((utxo) =>\n          fixedWalletInputs.some((walletInput) =>\n            isEqualUTxO(walletInput, utxo),\n          ),\n        );\n      } else {\n        bootstrapWalletInputs = [];\n        knownRedeemerExUnits = yield* collectKnownRedeemerExUnits(\n          tx,\n          replayConfig,\n        );\n      }\n\n      const nextRedeemers = yield* buildDelayedRedeemers(\n        tx,\n        replayConfig,\n        redeemerBuilderCache,\n      );\n      redeemerInputFingerprint = canonicalInputFingerprint(tx);\n      discardReplay();\n\n      if (!redeemerMapsEqual(currentRedeemers, nextRedeemers)) {\n        currentRedeemers = nextRedeemers;\n        previousFingerprint = undefined;\n        continue;\n      }\n\n      const fingerprint = transactionFixedPointFingerprint(tx);\n      if (fingerprint === previousFingerprint) return result;\n      previousFingerprint = fingerprint;\n    }\n\n    return yield* completeTxError(\n      `Context-dependent redeemers did not converge after ${MAX_EVALUATION_ATTEMPTS} attempts. Check for circular redeemer dependencies on the final transaction body, fees, or ex-units.`,\n    );\n  });\n\nconst buildDelayedRedeemers = (\n  tx: CML.Transaction,\n  replayConfig: TxBuilder.TxBuilderConfig,\n  redeemerBuilderCache: RedeemerBuilderCache,\n) =>\n  Effect.gen(function* () {\n    const allResolvedInputs = [\n      ...replayConfig.walletInputs,\n      ...replayConfig.collectedInputs,\n      ...replayConfig.readInputs,\n    ];\n    const redeemerInfo = yield* buildCanonicalRedeemerInfo(\n      tx,\n      allResolvedInputs,\n    );\n    // The redeemer builders run to completion inside this call, so the\n    // context's transaction body is not needed once it returns.\n    const nextRedeemers = yield* buildRedeemersFromCanonicalContext(\n      redeemerInfo,\n      replayConfig.pendingRedeemers,\n      redeemerBuilderCache,\n    ).pipe(Effect.ensuring(Effect.sync(() => redeemerInfo.txBody.free())));\n    return nextRedeemers;\n  });\n\nconst canonicalInputFingerprint = (tx: CML.Transaction): string =>\n  withCMLScope((own) => {\n    const canonical = own(\n      CML.Transaction.from_cbor_bytes(tx.to_canonical_cbor_bytes()),\n    );\n    const inputs = own(own(canonical.body()).inputs());\n    return Array.from({ length: inputs.len() }, (_, index) =>\n      own(inputs.get(index)).to_canonical_cbor_hex(),\n    ).join(\",\");\n  });\n\nconst addWalletInputs = (\n  config: TxBuilder.TxBuilderConfig,\n  inputs: ReadonlyArray<UTxO>,\n): Effect.Effect<void, TxBuilderError> =>\n  Effect.try({\n    try: () => {\n      for (const utxo of inputs) {\n        if (config.collectedInputs.some((input) => isEqualUTxO(input, utxo))) {\n          continue;\n        }\n        withCMLScope((own) => {\n          const core = own(utxoToCore(utxo));\n          const builder = own(\n            CML.SingleInputBuilder.from_transaction_unspent_output(core),\n          );\n          config.txBuilder.add_input(own(builder.payment_key()));\n        });\n        config.collectedInputs = [...config.collectedInputs, utxo];\n      }\n    },\n    catch: (error) => completeTxError(error),\n  });\n\nconst collectKnownRedeemerExUnits = (\n  tx: CML.Transaction,\n  config: TxBuilder.TxBuilderConfig,\n): Effect.Effect<KnownRedeemerExUnits, TxBuilderError> =>\n  Effect.gen(function* () {\n    const allResolvedInputs = [\n      ...config.walletInputs,\n      ...config.collectedInputs,\n      ...config.readInputs,\n    ];\n    const info = yield* buildCanonicalRedeemerInfo(tx, allResolvedInputs);\n    const entries = withCMLScope((own) => {\n      const redeemers = own(own(tx.witness_set()).redeemers());\n      return redeemers ? canonicalRedeemerEntries(redeemers) : [];\n    });\n    const known: KnownRedeemerExUnits = new Map();\n    for (let index = 0; index < info.redeemers.length; index++) {\n      const purpose = info.redeemers[index];\n      const entry = entries[index];\n      if (!entry) continue;\n      known.set(witnessPurposeKey(purposeToWitnessKey(purpose)), {\n        mem: Number(entry.exUnits.mem()),\n        steps: Number(entry.exUnits.steps()),\n      });\n    }\n    freeCanonicalRedeemerEntries(entries);\n    info.txBody.free();\n    return known;\n  });\n\nexport const complete = (options: CompleteOptions = {}) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    if (config.actions.length === 0)\n      return yield* completeCurrentConfig(options);\n    if (hasDelayedActions(config)) {\n      return yield* completeDelayedFromActions(config, options);\n    }\n    return yield* completeStaticFromActions(config, options);\n  });\n\nexport const selectionAndEvaluation = (\n  walletInputs: UTxO[],\n  changeAddress: string,\n  coinSelection: boolean,\n  localUPLCEval: boolean,\n  evaluator: EvaluatorAdapter | undefined,\n  includeLeftoverLovelaceAsFee: boolean,\n  script_calculation: boolean,\n  bootstrapExUnits: boolean = false,\n  knownRedeemerExUnits?: KnownRedeemerExUnits,\n  redeemerInputFingerprint?: string,\n) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    const refScriptInputs = config.readInputs.filter(\n      (input) => input.scriptRef,\n    );\n    const availableInputs = _Array.differenceWith(isEqualUTxO)(walletInputs, [\n      ...config.collectedInputs,\n      ...refScriptInputs,\n    ]);\n\n    const { selected: inputsToAdd, burnable } =\n      coinSelection !== false\n        ? yield* doCoinSelection(\n            config,\n            availableInputs,\n            script_calculation,\n            includeLeftoverLovelaceAsFee,\n          )\n        : { selected: [], burnable: { lovelace: 0n } };\n\n    let estimatedFee = yield* estimateFee(config, script_calculation);\n    if (_Array.isEmptyArray(inputsToAdd)) {\n      estimatedFee += burnable.lovelace;\n    }\n    if (_Array.isNonEmptyArray(inputsToAdd)) {\n      yield* addWalletInputs(config, inputsToAdd);\n      estimatedFee = yield* estimateFee(config, script_calculation);\n    }\n\n    const appliedKnownExUnits =\n      knownRedeemerExUnits !== undefined && knownRedeemerExUnits.size > 0\n        ? yield* applyKnownRedeemerExUnits(\n            config,\n            changeAddress,\n            knownRedeemerExUnits,\n          )\n        : false;\n\n    if (appliedKnownExUnits && script_calculation && coinSelection !== false) {\n      const remainingInputs = _Array.differenceWith(isEqualUTxO)(walletInputs, [\n        ...config.collectedInputs,\n        ...refScriptInputs,\n      ]);\n      const { selected: additionalInputs } = yield* doCoinSelection(\n        config,\n        remainingInputs,\n        true,\n        includeLeftoverLovelaceAsFee,\n      );\n      if (_Array.isNonEmptyArray(additionalInputs)) {\n        yield* addWalletInputs(config, additionalInputs);\n        estimatedFee = yield* estimateFee(config, true);\n      }\n    }\n\n    //NOTE: We need to keep track of all consumed inputs\n    //this is just a patch, and we should find a better way to do this\n    config.consumedInputs = [...config.collectedInputs];\n\n    // Complete partial programs if present by building their redeemers and running them\n    if (config.partialPrograms.size > 0) {\n      // NOTE: Cannot build the redeemers twice as it would lead to duplicate addition of\n      // inputs for \"SPEND\" redeemers. As CML currently does not allow updating redeemer of\n      // an existing input.\n      if (script_calculation) {\n        yield* completeTxError(\n          `RedeemerBuilder: Coin selection had to be updated after building redeemers, possibly leading to incorrect indices. Try setting a minimum fee of ${estimatedFee} lovelaces.`,\n        );\n      } else yield* completePartialPrograms();\n    }\n\n    // The first pass normally exists to discover ex-units. When ex-units were\n    // carried from the preceding delayed-redeemer attempt, preserve them and\n    // let the script-aware second selection pass form the evaluation shape.\n    if (appliedKnownExUnits && !script_calculation) return true;\n\n    return yield* evaluateUntilStable(\n      config,\n      walletInputs,\n      changeAddress,\n      script_calculation,\n      localUPLCEval,\n      evaluator,\n      bootstrapExUnits,\n      redeemerInputFingerprint,\n    );\n  }).pipe(Effect.catchAllDefect((cause) => new RunTimeError({ cause })));\n\n//TODO: This should\nexport const completePartialPrograms = () =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    const sortedInputs = sortUTxOs(config.collectedInputs, \"Canonical\");\n    const indicesMap: Map<string, bigint> = new Map();\n    sortedInputs.forEach((value, index) => {\n      indicesMap.set(value.txHash + value.outputIndex, BigInt(index));\n    });\n    const newPrograms = [];\n\n    // Iterate over all the RedeemerBuilders to construct redeemers\n    // and collect obtained programs\n    for (const [\n      redeemerBuilder,\n      partialProgram,\n    ] of config.partialPrograms.entries()) {\n      if (redeemerBuilder.kind === \"selected\") {\n        const inputIndices = redeemerBuilder.inputs.flatMap((value) => {\n          const index = indicesMap.get(value.txHash + value.outputIndex);\n          if (index !== undefined) return index;\n          else return [];\n        });\n\n        if (\n          _Array.isEmptyArray(inputIndices) ||\n          inputIndices.length !== redeemerBuilder.inputs.length\n        )\n          yield* completeTxError(\n            `RedeemerBuilder: Missing indices for inputs: ${stringify(redeemerBuilder.inputs)}`,\n          );\n\n        const redeemer = redeemerBuilder.makeRedeemer(inputIndices);\n        const program = partialProgram(redeemer);\n        newPrograms.push(program);\n      } else {\n        // For RedeemerBuilder of kind \"self\", construct a unique redeemer\n        // for every UTxO and collect it's program\n        const inputs: UTxO[] = yield* pipe(\n          Effect.fromNullable(redeemerBuilder.inputs),\n          Effect.orElseFail(() =>\n            completeTxError(\n              `RedeemerBuilder: Inputs for redeemer builder not founds: ${stringify(redeemerBuilder)}`,\n            ),\n          ),\n        );\n\n        for (const input of inputs) {\n          const index = yield* pipe(\n            Effect.fromNullable(\n              indicesMap.get(input.txHash + input.outputIndex),\n            ),\n            Effect.orElseFail(() =>\n              completeTxError(`Index not found for input: ${input}`),\n            ),\n          );\n\n          const redeemer = redeemerBuilder.makeRedeemer(index);\n          const program = collectFromUTxO([input], false)(redeemer);\n          newPrograms.push(program);\n        }\n      }\n    }\n    yield* Effect.all(newPrograms);\n  });\n\nconst lucidRedeemerTags: ReadonlySet<string> = new Set([\n  \"spend\",\n  \"mint\",\n  \"publish\",\n  \"withdraw\",\n  \"vote\",\n  \"propose\",\n]);\n\nconst isLucidRedeemerTag = (tag: string): tag is RedeemerTag =>\n  lucidRedeemerTags.has(tag);\n\nconst evaluatorError = (message: string, evaluator?: string, cause?: unknown) =>\n  new EvaluatorError({\n    evaluator,\n    message,\n    cause,\n  });\n\nconst evaluatorName = (evaluator: EvaluatorAdapter): string =>\n  evaluator.name ?? \"custom\";\n\nexport const decodeLegacyRedeemers = (\n  uplcEval: Uint8Array[],\n): EvalRedeemer[] => {\n  const evalRedeemers: EvalRedeemer[] = [];\n  for (const bytes of uplcEval) {\n    withCMLScope((own) => {\n      const redeemer = own(CML.LegacyRedeemer.from_cbor_bytes(bytes));\n      const exUnits = own(redeemer.ex_units());\n      evalRedeemers.push({\n        ex_units: {\n          mem: Number(exUnits.mem()),\n          steps: Number(exUnits.steps()),\n        },\n        redeemer_index: Number(redeemer.index()),\n        redeemer_tag: fromCMLRedeemerTag(redeemer.tag()),\n      });\n    });\n  }\n  return evalRedeemers;\n};\n\nconst evalRedeemerKey = (evalRedeemer: EvalRedeemer): string =>\n  `${evalRedeemer.redeemer_tag}:${evalRedeemer.redeemer_index}`;\n\nexport const expectedRedeemerKeySet = (\n  redeemers: CML.Redeemers,\n): Set<string> => {\n  const keys = redeemerWitnessKeys(redeemers);\n  try {\n    return new Set(\n      keys.map(\n        ({ tag, index }) => `${fromCMLRedeemerTag(tag)}:${index.toString()}`,\n      ),\n    );\n  } finally {\n    for (const { key } of keys) key.free();\n  }\n};\n\nconst validateEvalRedeemer = (\n  evalRedeemer: EvalRedeemer,\n  evaluator?: string,\n): void => {\n  if (!isLucidRedeemerTag(evalRedeemer.redeemer_tag)) {\n    throw evaluatorError(\n      `Evaluator returned unknown redeemer tag \"${evalRedeemer.redeemer_tag}\"`,\n      evaluator,\n    );\n  }\n  if (\n    !Number.isSafeInteger(evalRedeemer.redeemer_index) ||\n    evalRedeemer.redeemer_index < 0\n  ) {\n    throw evaluatorError(\n      `Evaluator returned invalid redeemer index ${evalRedeemer.redeemer_index}`,\n      evaluator,\n    );\n  }\n  if (\n    !evalRedeemer.ex_units ||\n    !Number.isSafeInteger(evalRedeemer.ex_units.mem) ||\n    evalRedeemer.ex_units.mem < 0 ||\n    !Number.isSafeInteger(evalRedeemer.ex_units.steps) ||\n    evalRedeemer.ex_units.steps < 0\n  ) {\n    throw evaluatorError(\n      `Evaluator returned invalid execution units for ${evalRedeemerKey(evalRedeemer)}`,\n      evaluator,\n    );\n  }\n};\n\nexport const applyEvaluationResult = (\n  evalRedeemerList: EvalRedeemer[],\n  txbuilder: CML.TransactionBuilder,\n  expectedKeys: Set<string>,\n  evaluator?: string,\n  builderKeyByLedgerKey: ReadonlyMap<string, BuilderRedeemerKey> = new Map(),\n): void => {\n  if (expectedKeys.size > 0 && evalRedeemerList.length === 0) {\n    throw evaluatorError(\n      `Evaluator returned zero results for ${expectedKeys.size} redeemer(s)`,\n      evaluator,\n    );\n  }\n\n  const seen = new Set<string>();\n  const updates: Array<{\n    key: CML.RedeemerWitnessKey;\n    exUnits: CML.ExUnits;\n  }> = [];\n  const release = () => {\n    for (const { key, exUnits } of updates) {\n      exUnits.free();\n      key.free();\n    }\n  };\n\n  for (const evalRedeemer of evalRedeemerList) {\n    validateEvalRedeemer(evalRedeemer, evaluator);\n    const key = evalRedeemerKey(evalRedeemer);\n    if (seen.has(key)) {\n      release();\n      throw evaluatorError(\n        `Evaluator returned duplicate result for redeemer ${key}`,\n        evaluator,\n      );\n    }\n    seen.add(key);\n    if (!expectedKeys.has(key)) {\n      release();\n      throw evaluatorError(\n        `Evaluator returned result for unexpected redeemer ${key}`,\n        evaluator,\n      );\n    }\n    const exUnits = CML.ExUnits.new(\n      BigInt(evalRedeemer.ex_units.mem),\n      BigInt(evalRedeemer.ex_units.steps),\n    );\n    const builderKey = builderKeyByLedgerKey.get(key);\n    updates.push({\n      key: builderKey\n        ? CML.RedeemerWitnessKey.new(builderKey.tag, builderKey.index)\n        : CML.RedeemerWitnessKey.new(\n            toCMLRedeemerTag(evalRedeemer.redeemer_tag),\n            BigInt(evalRedeemer.redeemer_index),\n          ),\n      exUnits,\n    });\n  }\n\n  for (const expectedKey of expectedKeys) {\n    if (!seen.has(expectedKey)) {\n      release();\n      throw evaluatorError(\n        `Evaluator did not return a result for redeemer ${expectedKey}`,\n        evaluator,\n      );\n    }\n  }\n\n  for (const { key, exUnits } of updates) {\n    txbuilder.set_exunits(key, exUnits);\n  }\n  release();\n};\n\n/**\n * The returned `key` objects belong to the caller, which frees them once the\n * builder has consumed them.\n */\nexport const redeemerWitnessKeys = (redeemers: CML.Redeemers) =>\n  withCMLScope((own) => {\n    const keys: Array<{\n      key: CML.RedeemerWitnessKey;\n      tag: CML.RedeemerTag;\n      index: bigint;\n    }> = [];\n    const arrLegacyRedeemer = own(redeemers.as_arr_legacy_redeemer());\n    if (arrLegacyRedeemer) {\n      for (let i = 0; i < arrLegacyRedeemer.len(); i++) {\n        const redeemer = own(arrLegacyRedeemer.get(i));\n        keys.push({\n          key: CML.RedeemerWitnessKey.from_redeemer(redeemer),\n          tag: redeemer.tag(),\n          index: redeemer.index(),\n        });\n      }\n    }\n\n    const mapRedeemerKeyToRedeemerVal = own(\n      redeemers.as_map_redeemer_key_to_redeemer_val(),\n    );\n    if (mapRedeemerKeyToRedeemerVal) {\n      const mapKeys = own(mapRedeemerKeyToRedeemerVal.keys());\n      for (let i = 0; i < mapKeys.len(); i++) {\n        const key = own(mapKeys.get(i));\n        keys.push({\n          key: CML.RedeemerWitnessKey.new(key.tag(), key.index()),\n          tag: key.tag(),\n          index: key.index(),\n        });\n      }\n    }\n    return keys;\n  });\n\nexport const applyBootstrapRedeemerExUnits = (\n  redeemers: CML.Redeemers,\n  txbuilder: ExUnitSetter,\n  maxTxExMem: bigint,\n  maxTxExSteps: bigint,\n): void => {\n  const keys = redeemerWitnessKeys(redeemers);\n  const budgets = bootstrapRedeemerExUnits(\n    keys.length,\n    maxTxExMem,\n    maxTxExSteps,\n  );\n  try {\n    for (const [index, { key }] of keys.entries()) {\n      const exUnits = budgets[index];\n      txbuilder.set_exunits(key, exUnits);\n    }\n  } finally {\n    for (const { key } of keys) key.free();\n    freeCML(...budgets);\n  }\n};\n\nconst scriptHashFromCredential = (\n  credential: CML.Credential | undefined,\n): string | undefined => credential?.as_script()?.to_hex();\n\nconst scriptHashFromCertificate = (\n  certificate: CML.Certificate,\n): string | undefined =>\n  scriptHashFromCredential(\n    certificate.as_stake_registration()?.stake_credential() ??\n      certificate.as_stake_deregistration()?.stake_credential() ??\n      certificate.as_stake_delegation()?.stake_credential() ??\n      certificate.as_reg_cert()?.stake_credential() ??\n      certificate.as_unreg_cert()?.stake_credential() ??\n      certificate.as_vote_deleg_cert()?.stake_credential() ??\n      certificate.as_stake_vote_deleg_cert()?.stake_credential() ??\n      certificate.as_stake_reg_deleg_cert()?.stake_credential() ??\n      certificate.as_vote_reg_deleg_cert()?.stake_credential() ??\n      certificate.as_stake_vote_reg_deleg_cert()?.stake_credential() ??\n      certificate.as_auth_committee_hot_cert()?.committee_cold_credential() ??\n      certificate\n        .as_resign_committee_cold_cert()\n        ?.committee_cold_credential() ??\n      certificate.as_reg_drep_cert()?.drep_credential() ??\n      certificate.as_unreg_drep_cert()?.drep_credential() ??\n      certificate.as_update_drep_cert()?.drep_credential(),\n  );\n\nconst voterByKey = (\n  body: CML.TransactionBody,\n  voterKey: string | undefined,\n): CML.Voter | undefined => {\n  if (!voterKey) return undefined;\n  const voters = body.voting_procedures()?.keys();\n  if (!voters) return undefined;\n  for (let i = 0; i < voters.len(); i++) {\n    const voter = voters.get(i);\n    if (voter.to_canonical_cbor_hex() === voterKey) return voter;\n  }\n  return undefined;\n};\n\nconst proposalByKey = (\n  body: CML.TransactionBody,\n  proposalKey: string | undefined,\n): CML.ProposalProcedure | undefined => {\n  if (!proposalKey) return undefined;\n  const proposals = body.proposal_procedures();\n  if (!proposals) return undefined;\n  for (let i = 0; i < proposals.len(); i++) {\n    const proposal = proposals.get(i);\n    if (proposal.to_canonical_cbor_hex() === proposalKey) return proposal;\n  }\n  return undefined;\n};\n\nconst scriptTypeToLanguage = (\n  scriptType: ScriptType,\n): CML.Language | undefined => {\n  switch (scriptType) {\n    case \"PlutusV1\":\n      return CML.Language.PlutusV1;\n    case \"PlutusV2\":\n      return CML.Language.PlutusV2;\n    case \"PlutusV3\":\n      return CML.Language.PlutusV3;\n    case \"Native\":\n      return undefined;\n  }\n};\n\nconst languageSortOrder = (language: CML.Language): number => {\n  switch (language) {\n    case CML.Language.PlutusV1:\n      return 0;\n    case CML.Language.PlutusV2:\n      return 1;\n    case CML.Language.PlutusV3:\n      return 2;\n  }\n};\n\nconst scriptHashForPurpose = (\n  purpose: RedeemerPurpose,\n  tx: CML.Transaction,\n  info: CanonicalRedeemerInfo,\n): string | undefined => {\n  switch (purpose.tag) {\n    case \"spend\": {\n      const input = info.inputs.find(\n        (candidate) =>\n          candidate.txHash === purpose.input.txHash &&\n          candidate.outputIndex === purpose.input.outputIndex,\n      );\n      return input\n        ? getAddressDetails(input.address).paymentCredential?.hash\n        : undefined;\n    }\n    case \"mint\":\n      return purpose.policyId;\n    case \"withdraw\":\n      return getAddressDetails(purpose.rewardAddress).stakeCredential?.hash;\n    case \"publish\":\n      return withCMLScope((own) => {\n        const certificate = own(\n          own(info.txBody.certs())?.get(Number(purpose.index)),\n        );\n        return certificate ? scriptHashFromCertificate(certificate) : undefined;\n      });\n    case \"vote\":\n      return withCMLScope((own) => {\n        const voter = own(\n          voterByKey(info.txBody, purpose.voterKey) ??\n            voterForRedeemerIndex(tx, purpose.index),\n        );\n        return own(voter?.script_hash())?.to_hex();\n      });\n    case \"propose\":\n      return withCMLScope((own) => {\n        const proposal = own(\n          proposalByKey(info.txBody, purpose.proposalKey) ??\n            proposalProcedureForRedeemerIndex(tx, purpose.index),\n        );\n        return own(own(proposal?.gov_action())?.script_hash())?.to_hex();\n      });\n  }\n};\n\nconst usedPlutusLanguages = (\n  tx: CML.Transaction,\n  config: TxBuilder.TxBuilderConfig,\n): Effect.Effect<CML.LanguageList, TxBuilderError> =>\n  Effect.gen(function* () {\n    const languages = withCMLScope((own) => {\n      const witnessLanguages = own(own(tx.witness_set()).languages());\n      const found = new Set<CML.Language>();\n      for (let i = 0; i < witnessLanguages.len(); i++) {\n        found.add(witnessLanguages.get(i));\n      }\n      return found;\n    });\n\n    const resolvedInputs = [\n      ...config.walletInputs,\n      ...config.collectedInputs,\n      ...config.readInputs,\n    ];\n    const redeemerInfo = yield* buildCanonicalRedeemerInfo(tx, resolvedInputs);\n\n    for (const purpose of redeemerInfo.redeemers) {\n      const scriptHash = scriptHashForPurpose(purpose, tx, redeemerInfo);\n      if (!scriptHash) {\n        redeemerInfo.txBody.free();\n        yield* completeTxError(\n          `Unable to resolve script hash for ${purpose.tag}:${purpose.index} redeemer`,\n        );\n        continue;\n      }\n      const script = config.scripts.get(scriptHash);\n      if (!script) {\n        redeemerInfo.txBody.free();\n        yield* completeTxError(\n          `Unable to resolve script for ${purpose.tag} redeemer ${scriptHash}`,\n        );\n        continue;\n      }\n      const language = scriptTypeToLanguage(script.type);\n      if (language !== undefined) languages.add(language);\n    }\n    redeemerInfo.txBody.free();\n\n    const result = CML.LanguageList.new();\n    [...languages]\n      .sort((left, right) => languageSortOrder(left) - languageSortOrder(right))\n      .forEach((language) => result.add(language));\n    return result;\n  });\n\nconst refreshScriptDataHash = (\n  tx: CML.Transaction,\n  config: TxBuilder.TxBuilderConfig,\n): Effect.Effect<CML.Transaction, TxBuilderError> =>\n  Effect.gen(function* () {\n    const witnessSet = tx.witness_set();\n    const redeemers = witnessSet.redeemers();\n    if (!redeemers) {\n      witnessSet.free();\n      return tx;\n    }\n\n    const datums = witnessSet.plutus_datums() ?? CML.PlutusDataList.new();\n    const usedLangs = yield* usedPlutusLanguages(tx, config).pipe(\n      Effect.tapError(() =>\n        Effect.sync(() => freeCML(witnessSet, redeemers, datums)),\n      ),\n    );\n    const scriptDataHash = yield* Effect.try({\n      try: () => {\n        try {\n          return CML.calc_script_data_hash(\n            redeemers,\n            datums,\n            config.lucidConfig.costModels,\n            usedLangs,\n          );\n        } finally {\n          freeCML(redeemers, datums, usedLangs);\n        }\n      },\n      catch: (error) => {\n        witnessSet.free();\n        return completeTxError(error);\n      },\n    });\n    const resolvedScriptDataHash = yield* pipe(\n      Effect.fromNullable(scriptDataHash),\n      Effect.orElseFail(() => {\n        witnessSet.free();\n        return completeTxError(\"Unable to calculate script data hash\");\n      }),\n    );\n    return withCMLScope((own) => {\n      own(witnessSet);\n      const body = own(tx.body());\n      body.set_script_data_hash(own(resolvedScriptDataHash));\n      // `Transaction.new` takes ownership of the auxiliary data.\n      return CML.Transaction.new(\n        body,\n        witnessSet,\n        tx.is_valid(),\n        tx.auxiliary_data(),\n      );\n    });\n  });\n\n/**\n * Returns `tx` itself when it carries no redeemers, otherwise a new\n * transaction the caller owns.\n */\nexport const setRedeemerstoZero = (tx: CML.Transaction): CML.Transaction =>\n  withCMLScope((own) => {\n    const witnessSet = own(tx.witness_set());\n    const redeemers = own(witnessSet.redeemers());\n    if (!redeemers) return tx;\n    const zeroExUnits = () => own(CML.ExUnits.new(0n, 0n));\n    const arrLegacyRedeemer = own(redeemers.as_arr_legacy_redeemer());\n    if (arrLegacyRedeemer) {\n      const redeemerList = own(CML.LegacyRedeemerList.new());\n      for (let i = 0; i < arrLegacyRedeemer.len(); i++) {\n        const redeemer = own(arrLegacyRedeemer.get(i));\n        const dummyRedeemer = own(\n          CML.LegacyRedeemer.new(\n            redeemer.tag(),\n            redeemer.index(),\n            own(redeemer.data()),\n            zeroExUnits(),\n          ),\n        );\n        redeemerList.add(dummyRedeemer);\n      }\n      witnessSet.set_redeemers(\n        own(CML.Redeemers.new_arr_legacy_redeemer(redeemerList)),\n      );\n      // `Transaction.new` takes ownership of the auxiliary data.\n      return CML.Transaction.new(\n        own(tx.body()),\n        witnessSet,\n        true,\n        tx.auxiliary_data(),\n      );\n    }\n    const mapRedeemerKeyToRedeemerVal = own(\n      redeemers.as_map_redeemer_key_to_redeemer_val(),\n    );\n    if (mapRedeemerKeyToRedeemerVal) {\n      const dummyRedeemerMap = own(CML.MapRedeemerKeyToRedeemerVal.new());\n      const keys = own(mapRedeemerKeyToRedeemerVal.keys());\n      for (let i = 0; i < keys.len(); i++) {\n        const key = own(keys.get(i));\n        const value = own(mapRedeemerKeyToRedeemerVal.get(key)!);\n        dummyRedeemerMap.insert(\n          key,\n          own(CML.RedeemerVal.new(own(value.data()), zeroExUnits())),\n        );\n      }\n      witnessSet.set_redeemers(\n        own(\n          CML.Redeemers.new_map_redeemer_key_to_redeemer_val(dummyRedeemerMap),\n        ),\n      );\n      // `Transaction.new` takes ownership of the auxiliary data.\n      return CML.Transaction.new(\n        own(tx.body()),\n        witnessSet,\n        true,\n        tx.auxiliary_data(),\n      );\n    }\n    return tx;\n  });\n\nconst applyCollateral = (\n  setCollateral: bigint,\n  collateralInputs: UTxO[],\n  changeAddress: string,\n) =>\n  Effect.gen(function* () {\n    const { config } = yield* TxConfig;\n    for (const utxo of collateralInputs) {\n      withCMLScope((own) => {\n        const core = own(utxoToCore(utxo));\n        const builder = own(\n          CML.SingleInputBuilder.from_transaction_unspent_output(core),\n        );\n        config.txBuilder.add_collateral(own(builder.payment_key()));\n      });\n    }\n    const returnassets = pipe(\n      sumAssetsFromInputs(collateralInputs),\n      Record.union({ lovelace: -setCollateral }, _BigInt.sum),\n    );\n\n    withCMLScope((own) => {\n      const collateralOutputBuilder = own(\n        own(CML.TransactionOutputBuilder.new()).with_address(\n          own(CML.Address.from_bech32(changeAddress)),\n        ),\n      );\n      const result = own(\n        own(\n          own(collateralOutputBuilder.next()).with_value(\n            own(assetsToValue(returnassets)),\n          ),\n        ).build(),\n      );\n      config.txBuilder.set_collateral_return(own(result.output()));\n    });\n  });\n\nconst findCollateral = (\n  coinsPerUtxoByte: bigint,\n  setCollateral: bigint,\n  inputs: UTxO[],\n): Effect.Effect<UTxO[], TxBuilderError, never> =>\n  Effect.gen(function* () {\n    // NOTE: While the required collateral is 5 ADA, there may be instances where the UTXOs encountered do not contain enough ADA to be returned to the collateral return address.\n    // For example:\n    // A UTXO with 5.5 ADA will result in an error message such as `BabbageOutputTooSmallUTxO`, since only 0.5 ADA would be returned to the collateral return address.\n    const collateralLovelace: Assets = { lovelace: setCollateral };\n    const error = completeTxError(\n      `Your wallet does not have enough funds to cover the required ${setCollateral} Lovelace collateral. Or it contains UTxOs with reference scripts; which\n      are excluded from collateral selection.`,\n    );\n    const { selected } = yield* recursive(\n      sortUTxOs(inputs),\n      collateralLovelace,\n      coinsPerUtxoByte,\n      undefined,\n      false,\n      error,\n    );\n    if (selected.length > 3)\n      yield* completeTxError(\n        `Selected ${selected.length} inputs as collateral, but max collateral inputs is 3 to cover the ${setCollateral} Lovelace collateral ${stringify(selected)}`,\n      );\n    return selected;\n  });\n\nconst doCoinSelection = (\n  config: TxBuilder.TxBuilderConfig,\n  availableInputs: UTxO[],\n  script_calculation: boolean,\n  includeLeftoverLovelaceAsFee: boolean,\n): Effect.Effect<{ selected: UTxO[]; burnable: Assets }, TxBuilderError> =>\n  Effect.gen(function* () {\n    // NOTE: This is a fee estimation. If the amount is not enough, it may require increasing the fee.\n    const estimatedFee: Assets = {\n      lovelace:\n        (yield* estimateFee(config, script_calculation)) +\n        treasuryDonationAmount(config),\n    };\n\n    const negatedMintedAssets = negateAssets(config.mintedAssets);\n    const negatedCollectedAssets = negateAssets(\n      sumAssetsFromInputs(config.collectedInputs),\n    );\n\n    // Calculate the net change in assets (delta)\n    const assetsDelta: Assets = pipe(\n      config.totalOutputAssets,\n      Record.union(estimatedFee, _BigInt.sum),\n      Record.union(negatedCollectedAssets, _BigInt.sum),\n      Record.union(negatedMintedAssets, _BigInt.sum),\n    );\n    // Filter and obtain only the required assets (those with a positive amount)\n    let requiredAssets = pipe(\n      assetsDelta,\n      Record.filter((amount) => amount > 0n),\n    );\n    // Filter and obtain assets that are present in the inputs and mints but are not required by the outputs\n    // Negate these assets to get their positive amounts\n    const notRequiredAssets = pipe(\n      assetsDelta,\n      Record.filter((amount) => amount < 0n),\n      negateAssets,\n    );\n\n    // Note: We are not done with coin selection even if \"requiredAssets\" is empty.\n    // Because \"notRequiredAssets\" may not contain enough ADA to cover for minimum Ada requirement\n    // when they need to be sent as change output. Hence, we allow for \"recursive\" to be invoked.\n    return yield* recursive(\n      sortUTxOs(availableInputs),\n      requiredAssets,\n      config.lucidConfig.protocolParameters.coinsPerUtxoByte,\n      notRequiredAssets,\n      includeLeftoverLovelaceAsFee,\n    );\n  });\n\n/**\n * Estimate total transaction fee without mutating the CML.TransactionBuilder.\n */\nconst estimateFee = (\n  config: TxBuilder.TxBuilderConfig,\n  script_calculation: boolean,\n): Effect.Effect<bigint, TxBuilderError, never> =>\n  Effect.gen(function* () {\n    const minFee = config.txBuilder.min_fee(script_calculation);\n    const customMinFee = config.minFee;\n    return customMinFee !== undefined && customMinFee > minFee\n      ? customMinFee\n      : minFee;\n  });\n\nconst applyEffectiveFee = (\n  config: TxBuilder.TxBuilderConfig,\n  script_calculation: boolean,\n  forceExplicitFee: boolean = false,\n): Effect.Effect<bigint, TxBuilderError, never> =>\n  Effect.gen(function* () {\n    const effectiveFee = yield* estimateFee(config, script_calculation);\n    // Keep ordinary transactions on CML's computed-fee path. When setMinFee is\n    // active or scripts were evaluated, overwrite the explicit fee every pass\n    // so the fee floor never gets stale.\n    if (forceExplicitFee || config.minFee !== undefined)\n      config.txBuilder.set_fee(effectiveFee);\n    return effectiveFee;\n  });\n\nconst buildEvaluationDraft = (\n  config: TxBuilder.TxBuilderConfig,\n  changeAddress: string,\n): Effect.Effect<CML.Transaction, TxBuilderError> =>\n  Effect.try({\n    try: () =>\n      withCMLScope((own) =>\n        own(\n          config.txBuilder.build_for_evaluation(\n            0,\n            own(CML.Address.from_bech32(changeAddress)),\n          ),\n        ).draft_tx(),\n      ),\n    catch: (error) => completeTxError(error),\n  });\n\nconst buildEvaluationCandidate = (\n  config: TxBuilder.TxBuilderConfig,\n  changeAddress: string,\n  script_calculation: boolean,\n  forceExplicitFee: boolean,\n): Effect.Effect<CML.Transaction, TxBuilderError> =>\n  Effect.gen(function* () {\n    yield* applyEffectiveFee(config, script_calculation, forceExplicitFee);\n    const candidate = yield* buildEvaluationDraft(config, changeAddress);\n    const hasRedeemers = withCMLScope(\n      (own) => own(own(candidate.witness_set()).redeemers()) !== undefined,\n    );\n    if (forceExplicitFee || !hasRedeemers) {\n      return candidate;\n    }\n    candidate.free();\n    yield* applyEffectiveFee(config, script_calculation, true);\n    return yield* buildEvaluationDraft(config, changeAddress);\n  });\n\nconst prepareRedeemerContextCandidate = (\n  candidate: CML.Transaction,\n  config: TxBuilder.TxBuilderConfig,\n): Effect.Effect<CML.Transaction, TxBuilderError> =>\n  Effect.gen(function* () {\n    const canonical = CML.Transaction.from_cbor_bytes(\n      candidate.to_canonical_cbor_bytes(),\n    );\n    const normalized = yield* Effect.try({\n      try: () =>\n        normalizeGovernanceRedeemerIndices(\n          canonical,\n          config.governanceVoteWitnessKeys,\n          config.governanceProposalWitnessIndices,\n        ).transaction,\n      catch: (error) => completeTxError(error),\n    });\n    canonical.free();\n    const refreshed = yield* refreshScriptDataHash(normalized, config);\n    if (refreshed !== normalized) normalized.free();\n    return refreshed;\n  });\n\nconst applyKnownRedeemerExUnits = (\n  config: TxBuilder.TxBuilderConfig,\n  changeAddress: string,\n  known: KnownRedeemerExUnits,\n): Effect.Effect<boolean, TxBuilderError> =>\n  Effect.gen(function* () {\n    const candidate = yield* buildEvaluationCandidate(\n      config,\n      changeAddress,\n      false,\n      true,\n    );\n    const normalization = yield* Effect.try({\n      try: () =>\n        normalizeGovernanceRedeemerIndices(\n          candidate,\n          config.governanceVoteWitnessKeys,\n          config.governanceProposalWitnessIndices,\n        ),\n      catch: (error) => completeTxError(error),\n    });\n    candidate.free();\n    const transaction = normalization.transaction;\n    const expectedKeys = withCMLScope((own) => {\n      const redeemers = own(own(transaction.witness_set()).redeemers());\n      return redeemers ? expectedRedeemerKeySet(redeemers) : undefined;\n    });\n    if (!expectedKeys) {\n      transaction.free();\n      return false;\n    }\n\n    const resolvedInputs = [\n      ...config.walletInputs,\n      ...config.collectedInputs,\n      ...config.readInputs,\n    ];\n    const info = yield* buildCanonicalRedeemerInfo(\n      transaction,\n      resolvedInputs,\n    ).pipe(Effect.ensuring(Effect.sync(() => transaction.free())));\n    info.txBody.free();\n    const evalRedeemers: EvalRedeemer[] = [];\n    for (const purpose of info.redeemers) {\n      const exUnits = known.get(\n        witnessPurposeKey(purposeToWitnessKey(purpose)),\n      );\n      if (!exUnits) return false;\n      evalRedeemers.push({\n        redeemer_tag: purpose.tag,\n        redeemer_index: Number(purpose.index),\n        ex_units: exUnits,\n      });\n    }\n\n    yield* Effect.try({\n      try: () =>\n        applyEvaluationResult(\n          evalRedeemers,\n          config.txBuilder,\n          expectedKeys,\n          \"delayed-redeemer fixed point\",\n          normalization.builderKeyByLedgerKey,\n        ),\n      catch: (error) => completeTxError(error),\n    });\n    return true;\n  });\n\nconst evaluationFixedPointFingerprint = (tx: CML.Transaction): string => {\n  const zeroed = setRedeemerstoZero(tx);\n  try {\n    return transactionFixedPointFingerprint(zeroed);\n  } finally {\n    if (zeroed !== tx) zeroed.free();\n  }\n};\n\nconst evaluateUntilStable = (\n  config: TxBuilder.TxBuilderConfig,\n  walletInputs: UTxO[],\n  changeAddress: string,\n  script_calculation: boolean,\n  localUPLCEval: boolean,\n  evaluator: EvaluatorAdapter | undefined,\n  bootstrapExUnits: boolean,\n  redeemerInputFingerprint?: string,\n): Effect.Effect<\n  boolean,\n  TxBuilderError | EvaluatorError | RedeemerInputRefreshRequired\n> =>\n  Effect.gen(function* () {\n    let previousFingerprint: string | undefined;\n    let forceExplicitFee = config.minFee !== undefined;\n\n    for (let attempt = 0; attempt < MAX_EVALUATION_ATTEMPTS; attempt++) {\n      const candidate = yield* buildEvaluationCandidate(\n        config,\n        changeAddress,\n        script_calculation,\n        forceExplicitFee,\n      );\n      const redeemers = withCMLScope((own) =>\n        own(candidate.witness_set()).redeemers(),\n      );\n      if (!redeemers) {\n        candidate.free();\n        return false;\n      }\n      forceExplicitFee = true;\n\n      if (bootstrapExUnits) {\n        // Unresolved delayed redeemers prevent phase-two evaluation of the\n        // draft, but fee and collateral selection still need script costs.\n        applyBootstrapRedeemerExUnits(\n          redeemers,\n          config.txBuilder,\n          config.lucidConfig.protocolParameters.maxTxExMem,\n          config.lucidConfig.protocolParameters.maxTxExSteps,\n        );\n        freeCML(redeemers, candidate);\n        return true;\n      }\n      redeemers.free();\n\n      if (\n        redeemerInputFingerprint !== undefined &&\n        canonicalInputFingerprint(candidate) !== redeemerInputFingerprint\n      ) {\n        const contextCandidate = yield* prepareRedeemerContextCandidate(\n          candidate,\n          config,\n        ).pipe(Effect.ensuring(Effect.sync(() => candidate.free())));\n        return yield* Effect.fail(\n          new RedeemerInputRefreshRequired(contextCandidate),\n        );\n      }\n\n      // Re-evaluate only when the zero-exunit candidate changes in a way that\n      // scripts can observe, such as fee or change-output drift after ex-units.\n      const fingerprint = evaluationFixedPointFingerprint(candidate);\n      if (fingerprint === previousFingerprint) {\n        candidate.free();\n        return true;\n      }\n      previousFingerprint = fingerprint;\n\n      yield* evaluateTransaction(\n        config,\n        candidate,\n        walletInputs,\n        localUPLCEval,\n        evaluator,\n      ).pipe(Effect.ensuring(Effect.sync(() => candidate.free())));\n    }\n\n    return yield* completeTxError(\n      `Phase-two evaluation did not converge after ${MAX_EVALUATION_ATTEMPTS} attempts. Check for scripts that depend on transaction fees, change outputs, or execution-unit-driven transaction shape.`,\n    );\n  });\n\nconst resolveEvaluationUTxOs = (\n  tx: CML.Transaction,\n  walletInputs: UTxO[],\n  config: TxBuilder.TxBuilderConfig,\n): Effect.Effect<UTxO[], TxBuilderError> =>\n  Effect.gen(function* () {\n    const candidates = [\n      ...walletInputs,\n      ...config.collectedInputs,\n      ...config.readInputs,\n    ];\n    const inputs = yield* resolveCanonicalInputs(tx, candidates);\n    const referenceInputs = yield* resolveCanonicalReferenceInputs(\n      tx,\n      candidates,\n    );\n    return [...inputs, ...referenceInputs].map(normalizeEvalUTxO);\n  });\n\nconst makeProviderEvaluator = (provider: Provider): EvaluatorAdapter => ({\n  name: \"provider\",\n  evaluate: ({ tx, additionalUTxOs }) =>\n    provider.evaluateTx(tx, additionalUTxOs),\n});\n\nconst makeDefaultAikenEvaluator = (): EvaluatorAdapter => ({\n  name: \"aiken\",\n  evaluate: async ({ tx, additionalUTxOs, context }) => {\n    const { txBytes, inputBytes, outputBytes } = withCMLScope((own) => ({\n      txBytes: own(CML.Transaction.from_cbor_hex(tx)).to_cbor_bytes(),\n      inputBytes: additionalUTxOs.map((utxo) =>\n        own(utxoToTransactionInput(utxo)).to_cbor_bytes(),\n      ),\n      outputBytes: additionalUTxOs.map((utxo) =>\n        own(utxoToTransactionOutput(utxo)).to_cbor_bytes(),\n      ),\n    }));\n    const uplcEval = UPLC.eval_phase_two_raw(\n      txBytes,\n      inputBytes,\n      outputBytes,\n      context.costModels.to_cbor_bytes(),\n      context.protocolParameters.maxTxExSteps,\n      context.protocolParameters.maxTxExMem,\n      BigInt(context.slotConfig.zeroTime),\n      BigInt(context.slotConfig.zeroSlot),\n      context.slotConfig.slotLength,\n    );\n    return decodeLegacyRedeemers(uplcEval);\n  },\n});\n\nconst resolveEvaluatorAdapter = (\n  config: TxBuilder.TxBuilderConfig,\n  localUPLCEval: boolean,\n  evaluator: EvaluatorAdapter | undefined,\n): EvaluatorAdapter =>\n  localUPLCEval === false\n    ? makeProviderEvaluator(config.lucidConfig.provider)\n    : (evaluator ??\n      config.lucidConfig.evaluator ??\n      makeDefaultAikenEvaluator());\n\nconst makeEvaluationContext = (\n  config: TxBuilder.TxBuilderConfig,\n): EvaluationContext => ({\n  network: config.lucidConfig.network,\n  slotConfig: config.lucidConfig.slotConfig,\n  protocolParameters: config.lucidConfig.protocolParameters,\n  costModels: config.lucidConfig.costModels,\n});\n\nconst evaluatorCauseMessage = (error: unknown): string => {\n  if (isError(error)) return error.message;\n  const serialized = JSON.stringify(error);\n  return typeof serialized === \"string\"\n    ? serialized.replace(/\\\\n\\s*/g, \" \").trim()\n    : String(error);\n};\n\nconst wrapEvaluatorCause = (\n  error: unknown,\n  evaluator: string,\n): EvaluatorError =>\n  error instanceof EvaluatorError\n    ? error\n    : evaluatorError(\n        evaluatorCauseMessage(error) || \"Evaluator failed\",\n        evaluator,\n        error,\n      );\n\nconst evaluateTransaction = (\n  config: TxBuilder.TxBuilderConfig,\n  tx: CML.Transaction,\n  walletInputs: UTxO[],\n  localUPLCEval: boolean,\n  evaluator: EvaluatorAdapter | undefined,\n): Effect.Effect<void, TxBuilderError | EvaluatorError> =>\n  Effect.gen(function* () {\n    const adapter = resolveEvaluatorAdapter(config, localUPLCEval, evaluator);\n    const name = evaluatorName(adapter);\n    const normalization = yield* Effect.try({\n      try: () =>\n        normalizeGovernanceRedeemerIndices(\n          tx,\n          config.governanceVoteWitnessKeys,\n          config.governanceProposalWitnessIndices,\n        ),\n      catch: (error) => wrapEvaluatorCause(error, name),\n    });\n    const normalized = normalization.transaction;\n    const zeroed = setRedeemerstoZero(normalized);\n    const txEvaluation = yield* refreshScriptDataHash(zeroed, config).pipe(\n      Effect.tapError(() => Effect.sync(() => freeCML(normalized, zeroed))),\n    );\n    // Any of the three may be the same object; freeCML frees each one once.\n    const release = () => freeCML(normalized, zeroed, txEvaluation);\n    const expectedKeys = withCMLScope((own) => {\n      const redeemers = own(own(txEvaluation.witness_set()).redeemers());\n      return redeemers ? expectedRedeemerKeySet(redeemers) : undefined;\n    });\n    if (!expectedKeys) {\n      release();\n      return;\n    }\n    const txUtxos = yield* resolveEvaluationUTxOs(\n      txEvaluation,\n      walletInputs,\n      config,\n    ).pipe(Effect.tapError(() => Effect.sync(release)));\n    const txHex = txEvaluation.to_cbor_hex();\n    release();\n    const evalRedeemers = yield* Effect.tryPromise({\n      try: () =>\n        adapter.evaluate({\n          tx: txHex,\n          additionalUTxOs: txUtxos,\n          context: makeEvaluationContext(config),\n        }),\n      catch: (error) => wrapEvaluatorCause(error, name),\n    });\n\n    yield* Effect.try({\n      try: () =>\n        applyEvaluationResult(\n          evalRedeemers,\n          config.txBuilder,\n          expectedKeys,\n          name,\n          normalization.builderKeyByLedgerKey,\n        ),\n      catch: (error) => wrapEvaluatorCause(error, name),\n    });\n  });\n\nconst calculateMinLovelace = (\n  coinsPerUtxoByte: bigint,\n  multiAssets?: Assets,\n  changeAddress?: string,\n): bigint => {\n  const dummyAddress =\n    \"addr_test1qrngfyc452vy4twdrepdjc50d4kvqutgt0hs9w6j2qhcdjfx0gpv7rsrjtxv97rplyz3ymyaqdwqa635zrcdena94ljs0xy950\";\n  return withCMLScope((own) => {\n    const address = own(\n      CML.Address.from_bech32(changeAddress ? changeAddress : dummyAddress),\n    );\n    const multiAsset = multiAssets\n      ? own(own(assetsToValue(multiAssets)).multi_asset())\n      : own(CML.MultiAsset.new());\n    const amountBuilder = own(\n      own(own(CML.TransactionOutputBuilder.new()).with_address(address)).next(),\n    );\n    const result = own(\n      own(\n        amountBuilder.with_asset_and_min_required_coin(\n          multiAsset,\n          coinsPerUtxoByte,\n        ),\n      ).build(),\n    );\n    return own(own(result.output()).amount()).coin();\n  });\n};\n\nconst deriveInputsFromTransaction = (tx: CML.Transaction): UTxO[] =>\n  withCMLScope((own) => {\n    const body = own(tx.body());\n    const outputs = own(body.outputs());\n    const txHash = own(CML.hash_transaction(body)).to_hex();\n    const utxos: UTxO[] = [];\n    for (let index = 0; index < outputs.len(); index++) {\n      const output = own(outputs.get(index));\n      const utxo: UTxO = {\n        txHash: txHash,\n        outputIndex: index,\n        ...coreToTxOutput(output),\n      };\n      utxos.push(utxo);\n    }\n    return utxos;\n  });\n\n/**\n * Returns a new `Assets`\n *\n * Negates the amounts of all assets in the given record.\n */\nconst negateAssets = (assets: Assets): Assets =>\n  Record.map(assets, (amount) => -amount);\n\n/**\n * Returns a new Assets\n *\n * Sums the assets from an array of UTxO inputs.\n */\nconst sumAssetsFromInputs = (inputs: UTxO[]) =>\n  _Array.isEmptyArray(inputs)\n    ? {}\n    : inputs\n        .map((utxo) => utxo.assets)\n        .reduce((acc, cur) => Record.union(acc, cur, _BigInt.sum));\n\nconst calculateExtraLovelace = (\n  leftoverAssets: Assets,\n  coinsPerUtxoByte: bigint,\n): Option.Option<Assets> => {\n  return pipe(leftoverAssets, (assets) => {\n    const minLovelace = calculateMinLovelace(coinsPerUtxoByte, assets);\n    const currentLovelace = assets[\"lovelace\"] || 0n;\n    return currentLovelace >= minLovelace\n      ? Option.none()\n      : Option.some({ lovelace: minLovelace - currentLovelace });\n  });\n};\n\n/**\n * Performs coin selection to obtain the \"requiredAssets\" and then carries out\n * recursive coin selection to ensure that leftover assets (selectedAssets + externalAssets - requiredAssets)\n * have enough ADA to satisfy minimum ADA requirement for them to be sent as change output.\n * If \"requiredAssets\" is empty, it still checks for minimum ADA requirement of \"externalAssets\"\n * and does coin selection if required.\n * @param inputs\n * @param requiredAssets\n * @param coinsPerUtxoByte\n * @param externalAssets\n * @param error\n * @returns\n */\nexport const recursive = (\n  inputs: UTxO[],\n  requiredAssets: Assets,\n  coinsPerUtxoByte: bigint,\n  externalAssets: Assets = {},\n  includeLeftoverLovelaceAsFee?: boolean,\n  error?: TxBuilderError,\n): Effect.Effect<CoinSelectionResult, TxBuilderError> =>\n  Effect.gen(function* () {\n    let selected: UTxO[] = [];\n    error ??= completeTxError(\n      `Your wallet does not have enough funds to cover the required assets: ${stringify(requiredAssets)}\n      Or it contains UTxOs with reference scripts; which are excluded from coin selection.`,\n    );\n    if (!Record.isEmptyRecord(requiredAssets)) {\n      selected = selectUTxOs(inputs, requiredAssets, true);\n      if (_Array.isEmptyArray(selected)) yield* error;\n    }\n\n    const selectedAssets: Assets = sumAssetsFromInputs(selected);\n    let availableAssets: Assets = pipe(\n      selectedAssets,\n      Record.union(requiredAssets, (self, that) => self - that),\n      Record.union(externalAssets, _BigInt.sum),\n    );\n\n    let extraLovelace: Assets | undefined = pipe(\n      calculateExtraLovelace(availableAssets, coinsPerUtxoByte),\n      Option.getOrUndefined,\n    );\n    let remainingInputs = inputs;\n\n    while (extraLovelace) {\n      remainingInputs = _Array.differenceWith(isEqualUTxO)(\n        remainingInputs,\n        selected,\n      );\n\n      const extraSelected = selectUTxOs(remainingInputs, extraLovelace, true);\n      if (_Array.isEmptyArray(extraSelected)) {\n        if (includeLeftoverLovelaceAsFee)\n          return { selected: [...selected], burnable: extraLovelace };\n        yield* completeTxError(\n          `Your wallet does not have enough funds to cover required minimum ADA for change output: ${stringify(extraLovelace)}\n          Or it contains UTxOs with reference scripts; which are excluded from coin selection.`,\n        );\n      }\n      const extraSelectedAssets: Assets = sumAssetsFromInputs(extraSelected);\n      selected = [...selected, ...extraSelected];\n      availableAssets = Record.union(\n        availableAssets,\n        extraSelectedAssets,\n        _BigInt.sum,\n      );\n\n      extraLovelace = pipe(\n        calculateExtraLovelace(availableAssets, coinsPerUtxoByte),\n        Option.getOrUndefined,\n      );\n    }\n    return { selected, burnable: { lovelace: 0n } };\n  });\n","import { CML, makeReturn } from \"../core.js\";\nimport { withCMLScope } from \"@lucid-evolution/core-utils\";\nimport { LucidConfig } from \"../lucid-evolution/LucidEvolution.js\";\nimport { Effect } from \"effect\";\nimport * as S from \"@effect/schema/Schema\";\n//TODO: move to commont utils\nimport {\n  PrivateKey,\n  SlotConfig,\n  TransactionWitnesses,\n  UTxO,\n  Wallet,\n} from \"@lucid-evolution/core-types\";\nimport { TransactionSignError } from \"../Errors.js\";\nimport { TxSigned } from \"../tx-submit/TxSubmit.js\";\nimport * as CompleteTxSigner from \"./internal/CompleteTxSigner.js\";\nimport { Either } from \"effect/Either\";\nimport * as Sign from \"./internal/Sign.js\";\nimport { CBORHex, Hash } from \"../tx-builder/types.js\";\nimport {\n  makeScriptContext,\n  makeScriptContexts,\n  ScriptContextData,\n  ScriptContextOptions,\n  ScriptPurposeData,\n} from \"../script-context/index.js\";\n\nexport interface TxSignBuilderConfig {\n  txComplete: CML.Transaction;\n  witnessSetBuilder: CML.TransactionWitnessSetBuilder;\n  programs: Effect.Effect<void, TransactionSignError, never>[];\n  wallet: Wallet | undefined;\n  fee: number;\n  exUnits: { cpu: number; mem: number } | null;\n  resolvedInputs: ReadonlyArray<UTxO>;\n  slotConfig: SlotConfig | undefined;\n}\n\nexport interface TxSignBuilder {\n  sign: {\n    /** Signs the transaction with a wallet. */\n    withWallet: () => TxSignBuilder;\n    /** Signs the transaction with a private key. */\n    withPrivateKey: (privateKey: PrivateKey) => TxSignBuilder;\n  };\n  partialSign: {\n    /** Partially signs the transaction with a wallet. */\n    withWallet: () => Promise<TransactionWitnesses>;\n    /** Partially signs the transaction with a wallet and returns an effect. */\n    withWalletEffect: () => Effect.Effect<\n      TransactionWitnesses,\n      TransactionSignError\n    >;\n    /** Safely partially signs the transaction with a wallet. */\n    withWalletSafe: () => Promise<\n      Either<TransactionWitnesses, TransactionSignError>\n    >;\n    /** Partially signs the transaction with a private key. */\n    withPrivateKey: (privateKey: PrivateKey) => Promise<TransactionWitnesses>;\n    /** Partially signs the transaction with a private key and returns an effect. */\n    withPrivateKeyEffect: (\n      privateKey: PrivateKey,\n    ) => Effect.Effect<TransactionWitnesses, TransactionSignError>;\n    /** Safely partially signs the transaction with a private key. */\n    withPrivateKeySafe: (\n      privateKey: PrivateKey,\n    ) => Promise<Either<TransactionWitnesses, TransactionSignError>>;\n  };\n  /** Assembles the transaction with the given witnesses.  */\n  assemble: (witnesses: TransactionWitnesses[]) => TxSignBuilder;\n  /**\n   * Converts the transaction to CBOR (Concise Binary Object Representation) format.\n   *\n   * Supports both canonical and non-canonical formats.\n   *\n   * Canonical format follows [RFC 7049 Section 3.9](https://datatracker.ietf.org/doc/html/rfc7049#section-3.9) rules\n   *\n   * Non-canonical format example:\n   * ```typescript\n   * .toCBOR();\n   * ```\n   * Canonical format example:\n   * ```typescript\n   * .toCBOR({ canonical: true });\n   * ```\n   */\n  toCBOR: (options?: { canonical: boolean }) => CBORHex;\n  toTransaction: () => CML.Transaction;\n  /** Builds the Plutus V3 ScriptContext for one script purpose in this transaction. */\n  toScriptContext: (\n    purpose: ScriptPurposeData,\n    options?: ScriptContextOptions,\n  ) => ScriptContextData;\n  /** Builds Plutus V3 ScriptContexts for every redeemer-bearing script purpose. */\n  toScriptContexts: (options?: ScriptContextOptions) => ScriptContextData[];\n  /** Converts the transaction body to JSON format. */\n  toJSON: () => object;\n  /** Computes the hash of the transaction body. */\n  toHash: () => Hash;\n  complete: () => Promise<TxSigned>;\n  /** Completes the transaction and returns an effect. */\n  completeProgram: () => Effect.Effect<TxSigned, TransactionSignError, never>;\n  /** Safely completes the transaction. */\n  completeSafe: () => Promise<Either<TxSigned, TransactionSignError>>;\n}\n\nexport const makeTxSignBuilder = (\n  wallet: Wallet | undefined,\n  tx: CML.Transaction,\n  options: {\n    resolvedInputs?: ReadonlyArray<UTxO>;\n    slotConfig?: SlotConfig;\n  } = {},\n): TxSignBuilder => {\n  const exUnits = withCMLScope((own) => {\n    const totals = { cpu: 0, mem: 0 };\n    const add = (units: CML.ExUnits) => {\n      own(units);\n      totals.cpu += parseInt(units.steps().toString());\n      totals.mem += parseInt(units.mem().toString());\n    };\n    const redeemers = own(own(tx.witness_set()).redeemers());\n    if (redeemers) {\n      const arrLegacyRedeemer = own(redeemers.as_arr_legacy_redeemer());\n      if (arrLegacyRedeemer) {\n        for (let i = 0; i < arrLegacyRedeemer.len(); i++) {\n          add(own(arrLegacyRedeemer.get(i)).ex_units());\n        }\n      }\n      const mapRedeemerKeyToRedeemerVal = own(\n        redeemers.as_map_redeemer_key_to_redeemer_val(),\n      );\n      if (mapRedeemerKeyToRedeemerVal) {\n        const keys = own(mapRedeemerKeyToRedeemerVal.keys());\n        for (let i = 0; i < (keys.len() || 0); i++) {\n          const key = own(keys.get(i));\n          const value = own(mapRedeemerKeyToRedeemerVal.get(key));\n          add(value!.ex_units());\n        }\n      }\n    }\n    return totals;\n  });\n  const config: TxSignBuilderConfig = {\n    txComplete: tx,\n    witnessSetBuilder: CML.TransactionWitnessSetBuilder.new(),\n    programs: [],\n    wallet: wallet,\n    fee: withCMLScope((own) => parseInt(own(tx.body()).fee().toString())),\n    exUnits: exUnits,\n    resolvedInputs: options.resolvedInputs ?? [],\n    slotConfig: options.slotConfig,\n  };\n\n  const scriptContextOptions = (\n    overrides: ScriptContextOptions = {},\n  ): ScriptContextOptions => ({\n    resolvedInputs: overrides.resolvedInputs ?? config.resolvedInputs,\n    slotConfig: overrides.slotConfig ?? config.slotConfig,\n  });\n\n  const txSignBuilder: TxSignBuilder = {\n    sign: {\n      withWallet: () => {\n        const program = Sign.withWallet(config);\n        config.programs.push(program);\n        return txSignBuilder;\n      },\n      withPrivateKey: (privateKey: PrivateKey) => {\n        const program = Sign.withPrivateKey(config, privateKey);\n        config.programs.push(program);\n        return txSignBuilder;\n      },\n    },\n    partialSign: {\n      withWallet: () => makeReturn(Sign.partialWithWallet(config)).unsafeRun(),\n      withWalletEffect: () => Sign.partialWithWallet(config),\n      withWalletSafe: () =>\n        makeReturn(Sign.partialWithWallet(config)).safeRun(),\n      withPrivateKey: (privateKey: PrivateKey) =>\n        makeReturn(Sign.partialWithPrivateKey(config, privateKey)).unsafeRun(),\n      withPrivateKeyEffect: (privateKey: PrivateKey) =>\n        Sign.partialWithPrivateKey(config, privateKey),\n      withPrivateKeySafe: (privateKey: PrivateKey) =>\n        makeReturn(Sign.partialWithPrivateKey(config, privateKey)).safeRun(),\n    },\n    assemble: (witnesses: TransactionWitnesses[]) => {\n      const program = Sign.assemble(config, witnesses);\n      config.programs.push(program);\n      return txSignBuilder;\n    },\n    toCBOR: (options = { canonical: false }) =>\n      options.canonical\n        ? config.txComplete.to_canonical_cbor_hex()\n        : config.txComplete.to_cbor_hex(),\n    toTransaction: () => config.txComplete,\n    toScriptContext: (purpose, options) =>\n      makeScriptContext(\n        config.txComplete,\n        purpose,\n        scriptContextOptions(options),\n      ),\n    toScriptContexts: (options) =>\n      makeScriptContexts(config.txComplete, scriptContextOptions(options)),\n    toJSON: () =>\n      S.decodeUnknownSync(S.parseJson(S.Object))(config.txComplete.to_json()),\n    toHash: () =>\n      withCMLScope((own) =>\n        own(CML.hash_transaction(own(config.txComplete.body()))).to_hex(),\n      ),\n    complete: () =>\n      makeReturn(CompleteTxSigner.completeTxSigner(config)).unsafeRun(),\n    completeProgram: () => CompleteTxSigner.completeTxSigner(config),\n    completeSafe: () =>\n      makeReturn(CompleteTxSigner.completeTxSigner(config)).safeRun(),\n  };\n  return txSignBuilder;\n};\n","import { Effect, pipe } from \"effect\";\nimport { CML } from \"../../core.js\";\nimport {\n  ERROR_MESSAGE,\n  RunTimeError,\n  TransactionSignError,\n} from \"../../Errors.js\";\nimport * as TxSignBuilder from \"../TxSignBuilder.js\";\nimport * as TxSubmitBuilder from \"../../tx-submit/TxSubmit.js\";\nimport { signError } from \"./Sign.js\";\nimport { withCMLScope } from \"@lucid-evolution/core-utils\";\n\nexport const completeTxSigner = (\n  config: TxSignBuilder.TxSignBuilderConfig,\n): Effect.Effect<TxSubmitBuilder.TxSigned, TransactionSignError> =>\n  Effect.gen(function* () {\n    yield* Effect.all(config.programs, { concurrency: \"unbounded\" });\n    const signedTx = withCMLScope((own) => {\n      const witnessSet = own(config.txComplete.witness_set());\n      const plutus_datums = own(witnessSet.plutus_datums());\n      // TODO: currently add_existing does not support add_plutus_datums\n      // https://github.com/dcSpark/cardano-multiplatform-lib/pull/350/files\n      config.witnessSetBuilder.add_existing(witnessSet);\n      if (plutus_datums) {\n        for (let i = 0; i < plutus_datums.len(); i++) {\n          // `add_plutus_datum` takes ownership of the datum.\n          config.witnessSetBuilder.add_plutus_datum(plutus_datums.get(i));\n        }\n      }\n      // `Transaction.new` takes ownership of the auxiliary data.\n      return CML.Transaction.new(\n        own(config.txComplete.body()),\n        own(config.witnessSetBuilder.build()),\n        true,\n        config.txComplete.auxiliary_data(),\n      );\n    });\n    const wallet = yield* pipe(\n      Effect.fromNullable(config.wallet),\n      Effect.orElseFail(() => signError(ERROR_MESSAGE.MISSING_WALLET)),\n    );\n    return TxSubmitBuilder.makeSubmit(wallet, signedTx);\n  }).pipe(Effect.catchAllDefect((cause) => new RunTimeError({ cause })));\n","import { Effect } from \"effect\";\nimport * as S from \"@effect/schema/Schema\";\nimport { CML, makeReturn } from \"../core.js\";\nimport { Wallet } from \"@lucid-evolution/core-types\";\nimport { Either } from \"effect/Either\";\nimport { TxSubmitError } from \"../Errors.js\";\nimport { CBORHex, Hash } from \"../tx-builder/types.js\";\n\nexport interface TxSigned {\n  /** Submits the transaction and returns the transaction hash.\n   *\n   * Supports both canonical and non-canonical formats.\n   *\n   * Canonical format follows [RFC 7049 Section 3.9](https://datatracker.ietf.org/doc/html/rfc7049#section-3.9) rules\n   *\n   * Non-canonical format example:\n   * ```typescript\n   * .submit();\n   * ```\n   * Canonical format example:\n   * ```typescript\n   * .submit({ canonical: true });\n   * ```\n   */\n  submit: (options?: { canonical: boolean }) => Promise<string>;\n\n  /** Submits the transaction and returns the transaction hash or error as an effect.\n   *\n   * Supports both canonical and non-canonical formats.\n   *\n   * Canonical format follows [RFC 7049 Section 3.9](https://datatracker.ietf.org/doc/html/rfc7049#section-3.9) rules\n   *\n   * Non-canonical format example:\n   * ```typescript\n   * .submitProgram();\n   * ```\n   * Canonical format example:\n   * ```typescript\n   * .submitProgram({ canonical: true });\n   * ```\n   */\n  submitProgram: (options?: {\n    canonical: boolean;\n  }) => Effect.Effect<string, TxSubmitError, never>;\n\n  /** Safely submits the transaction, returning the transaction hash or an error as promise either type.\n   *\n   * Supports both canonical and non-canonical formats.\n   *\n   * Canonical format follows [RFC 7049 Section 3.9](https://datatracker.ietf.org/doc/html/rfc7049#section-3.9) rules\n   *\n   * Non-canonical format example:\n   * ```typescript\n   * .submitSafe();\n   * ```\n   * Canonical format example:\n   * ```typescript\n   * .submitSafe({ canonical: true });\n   * ```\n   */\n  submitSafe: (options?: {\n    canonical: boolean;\n  }) => Promise<Either<string, TxSubmitError>>;\n\n  /**\n   * Converts the transaction to CBOR (Concise Binary Object Representation) format.\n   *\n   * Supports both canonical and non-canonical formats.\n   *\n   * Canonical format follows [RFC 7049 Section 3.9](https://datatracker.ietf.org/doc/html/rfc7049#section-3.9) rules\n   *\n   * Non-canonical format example:\n   * ```typescript\n   * .toCBOR();\n   * ```\n   * Canonical format example:\n   * ```typescript\n   * .toCBOR({ canonical: true });\n   * ```\n   */\n  toCBOR: (options?: { canonical: boolean }) => CBORHex;\n  toTransaction: () => CML.Transaction;\n  /** Converts the transaction (transaction body and witnesses) to JSON format. */\n  toJSON: () => object;\n  /** Computes the hash of the transaction. */\n  toHash: () => Hash;\n}\nexport const makeSubmit = (\n  wallet: Wallet,\n  txSigned: CML.Transaction,\n): TxSigned => {\n  const submit = (options: { canonical: boolean }) =>\n    Effect.tryPromise({\n      try: () =>\n        wallet.submitTx(\n          options.canonical\n            ? txSigned.to_canonical_cbor_hex()\n            : txSigned.to_cbor_hex(),\n        ),\n      catch: (cause) => new TxSubmitError({ cause }),\n    });\n  return {\n    submit: (options = { canonical: false }) =>\n      makeReturn(submit(options)).unsafeRun(),\n    submitProgram: (options = { canonical: false }) => submit(options),\n    submitSafe: (options = { canonical: false }) =>\n      makeReturn(submit(options)).safeRun(),\n    toCBOR: (options = { canonical: false }) =>\n      options.canonical\n        ? txSigned.to_canonical_cbor_hex()\n        : txSigned.to_cbor_hex(),\n    toTransaction: () => txSigned,\n    toJSON: () =>\n      S.decodeUnknownSync(S.parseJson(S.Object))(txSigned.to_json()),\n    toHash: () => CML.hash_transaction(txSigned.body()).to_hex(),\n  };\n};\n","import { Effect, pipe } from \"effect\";\nimport { ERROR_MESSAGE, TxSignerError } from \"../../Errors.js\";\nimport * as TxSignBuilder from \"../TxSignBuilder.js\";\nimport {\n  PrivateKey,\n  TransactionWitnesses,\n  Wallet,\n} from \"@lucid-evolution/core-types\";\nimport { CML } from \"../../core.js\";\n\nexport const signError = (cause: unknown) => new TxSignerError({ cause });\n\nconst mkWitnessFromWallet = (\n  wallet: Wallet | undefined,\n  txComplete: CML.Transaction,\n): Effect.Effect<CML.TransactionWitnessSet, TxSignerError, never> =>\n  pipe(\n    Effect.fromNullable(wallet),\n    Effect.catchAll(() => signError(ERROR_MESSAGE.MISSING_WALLET)),\n    Effect.tryMapPromise({\n      try: (wallet) => wallet.signTx(txComplete),\n      catch: (cause) => signError(cause),\n    }),\n  );\n\nexport const withWallet = (\n  config: TxSignBuilder.TxSignBuilderConfig,\n): Effect.Effect<void, TxSignerError, never> =>\n  pipe(\n    mkWitnessFromWallet(config.wallet, config.txComplete),\n    Effect.map((witness) => config.witnessSetBuilder.add_existing(witness)),\n  );\n\nexport const partialWithWallet = (\n  config: TxSignBuilder.TxSignBuilderConfig,\n): Effect.Effect<TransactionWitnesses, TxSignerError> =>\n  pipe(\n    mkWitnessFromWallet(config.wallet, config.txComplete),\n    Effect.map((witness) => witness.to_cbor_hex()),\n  );\n\nconst mkWitnessFromPrivateKey = (\n  privateKey: PrivateKey,\n  txComplete: CML.Transaction,\n) =>\n  pipe(\n    Effect.try({\n      try: () => CML.PrivateKey.from_bech32(privateKey),\n      catch: signError,\n    }),\n    Effect.map((privateKey) =>\n      CML.make_vkey_witness(\n        CML.hash_transaction(txComplete.body()),\n        privateKey,\n      ),\n    ),\n  );\n\nexport const withPrivateKey = (\n  config: TxSignBuilder.TxSignBuilderConfig,\n  privateKey: PrivateKey,\n) =>\n  pipe(\n    mkWitnessFromPrivateKey(privateKey, config.txComplete),\n    Effect.map((witness) => config.witnessSetBuilder.add_vkey(witness)),\n  );\n\nexport const partialWithPrivateKey = (\n  config: TxSignBuilder.TxSignBuilderConfig,\n  privateKey: PrivateKey,\n) =>\n  pipe(\n    mkWitnessFromPrivateKey(privateKey, config.txComplete),\n    Effect.map((witness) => {\n      const witnessBuilder = CML.TransactionWitnessSetBuilder.new();\n      witnessBuilder.add_vkey(witness);\n      return witnessBuilder.build().to_cbor_hex();\n    }),\n  );\n\nexport const assemble = (\n  config: TxSignBuilder.TxSignBuilderConfig,\n  witnesses: TransactionWitnesses[],\n) =>\n  Effect.forEach(witnesses, (witness) =>\n    pipe(\n      Effect.try({\n        try: () => CML.TransactionWitnessSet.from_cbor_hex(witness),\n        catch: signError,\n      }),\n      Effect.map((witness) => config.witnessSetBuilder.add_existing(witness)),\n    ),\n  );\n","import { Data } from \"@lucid-evolution/plutus\";\n\nexport const PubKeyHashSchema = Data.Bytes();\nexport type PubKeyHashData = Data.Static<typeof PubKeyHashSchema>;\nexport const PubKeyHashData = PubKeyHashSchema as unknown as PubKeyHashData;\n\nexport const ScriptHashSchema = Data.Bytes();\nexport type ScriptHashData = Data.Static<typeof ScriptHashSchema>;\nexport const ScriptHashData = ScriptHashSchema as unknown as ScriptHashData;\n\nexport const DatumHashSchema = Data.Bytes();\nexport type DatumHashData = Data.Static<typeof DatumHashSchema>;\nexport const DatumHashData = DatumHashSchema as unknown as DatumHashData;\n\nexport const DatumSchema = Data.Any();\nexport type DatumData = Data.Static<typeof DatumSchema>;\nexport const DatumData = DatumSchema as unknown as DatumData;\n\nexport const RedeemerSchema = Data.Any();\nexport type RedeemerData = Data.Static<typeof RedeemerSchema>;\nexport const RedeemerData = RedeemerSchema as unknown as RedeemerData;\n\nexport const ChangedParametersSchema = Data.Any();\nexport type ChangedParametersData = Data.Static<typeof ChangedParametersSchema>;\nexport const ChangedParametersData =\n  ChangedParametersSchema as unknown as ChangedParametersData;\n\nexport const TxIdSchema = Data.Bytes();\nexport type TxIdData = Data.Static<typeof TxIdSchema>;\nexport const TxIdData = TxIdSchema as unknown as TxIdData;\n\nexport const CurrencySymbolSchema = Data.Bytes();\nexport type CurrencySymbolData = Data.Static<typeof CurrencySymbolSchema>;\nexport const CurrencySymbolData =\n  CurrencySymbolSchema as unknown as CurrencySymbolData;\n\nexport const TokenNameSchema = Data.Bytes();\nexport type TokenNameData = Data.Static<typeof TokenNameSchema>;\nexport const TokenNameData = TokenNameSchema as unknown as TokenNameData;\n\nexport const LovelaceSchema = Data.Integer();\nexport type LovelaceData = Data.Static<typeof LovelaceSchema>;\nexport const LovelaceData = LovelaceSchema as unknown as LovelaceData;\n\nexport const POSIXTimeSchema = Data.Integer();\nexport type POSIXTimeData = Data.Static<typeof POSIXTimeSchema>;\nexport const POSIXTimeData = POSIXTimeSchema as unknown as POSIXTimeData;\n\nexport const ClosureSchema = Data.Boolean();\nexport type ClosureData = Data.Static<typeof ClosureSchema>;\nexport const ClosureData = ClosureSchema as unknown as ClosureData;\n\nexport const RationalSchema = Data.Tuple([Data.Integer(), Data.Integer()], {\n  hasConstr: true,\n});\nexport type RationalData = Data.Static<typeof RationalSchema>;\nexport const RationalData = RationalSchema as unknown as RationalData;\n\nexport const ValueSchema = Data.Map(\n  CurrencySymbolSchema,\n  Data.Map(TokenNameSchema, Data.Integer()),\n);\nexport type ValueData = Data.Static<typeof ValueSchema>;\nexport const ValueData = ValueSchema as unknown as ValueData;\n\nexport const MintValueSchema = Data.Map(\n  CurrencySymbolSchema,\n  Data.Map(TokenNameSchema, Data.Integer()),\n);\nexport type MintValueData = Data.Static<typeof MintValueSchema>;\nexport const MintValueData = MintValueSchema as unknown as MintValueData;\n\nexport const CredentialSchema = Data.Enum([\n  Data.Object({ PubKeyCredential: Data.Tuple([PubKeyHashSchema]) }),\n  Data.Object({ ScriptCredential: Data.Tuple([ScriptHashSchema]) }),\n]);\nexport type CredentialData = Data.Static<typeof CredentialSchema>;\nexport const CredentialData = CredentialSchema as unknown as CredentialData;\n\nexport const StakingCredentialSchema = Data.Enum([\n  Data.Object({ StakingHash: Data.Tuple([CredentialSchema]) }),\n  Data.Object({\n    StakingPtr: Data.Tuple([Data.Integer(), Data.Integer(), Data.Integer()]),\n  }),\n]);\nexport type StakingCredentialData = Data.Static<typeof StakingCredentialSchema>;\nexport const StakingCredentialData =\n  StakingCredentialSchema as unknown as StakingCredentialData;\n\nexport const AddressSchema = Data.Object({\n  addressCredential: CredentialSchema,\n  addressStakingCredential: Data.Nullable(StakingCredentialSchema),\n});\nexport type AddressData = Data.Static<typeof AddressSchema>;\nexport const AddressData = AddressSchema as unknown as AddressData;\n\nexport const OutputDatumSchema = Data.Enum([\n  Data.Literal(\"NoOutputDatum\"),\n  Data.Object({ OutputDatumHash: Data.Tuple([DatumHashSchema]) }),\n  Data.Object({ OutputDatum: Data.Tuple([DatumSchema]) }),\n]);\nexport type OutputDatumData = Data.Static<typeof OutputDatumSchema>;\nexport const OutputDatumData = OutputDatumSchema as unknown as OutputDatumData;\n\nexport const TxOutRefSchema = Data.Object({\n  txOutRefId: TxIdSchema,\n  txOutRefIdx: Data.Integer(),\n});\nexport type TxOutRefData = Data.Static<typeof TxOutRefSchema>;\nexport const TxOutRefData = TxOutRefSchema as unknown as TxOutRefData;\n\nexport const TxOutSchema = Data.Object({\n  txOutAddress: AddressSchema,\n  txOutValue: ValueSchema,\n  txOutDatum: OutputDatumSchema,\n  txOutReferenceScript: Data.Nullable(ScriptHashSchema),\n});\nexport type TxOutData = Data.Static<typeof TxOutSchema>;\nexport const TxOutData = TxOutSchema as unknown as TxOutData;\n\nexport const ExtendedPOSIXTimeSchema = Data.Enum([\n  Data.Literal(\"NegInf\"),\n  Data.Object({ Finite: Data.Tuple([POSIXTimeSchema]) }),\n  Data.Literal(\"PosInf\"),\n]);\nexport type ExtendedPOSIXTimeData = Data.Static<typeof ExtendedPOSIXTimeSchema>;\nexport const ExtendedPOSIXTimeData =\n  ExtendedPOSIXTimeSchema as unknown as ExtendedPOSIXTimeData;\n\nexport const LowerBoundPOSIXTimeSchema = Data.Object({\n  lowerBoundLimit: ExtendedPOSIXTimeSchema,\n  lowerBoundClosed: ClosureSchema,\n});\nexport type LowerBoundPOSIXTimeData = Data.Static<\n  typeof LowerBoundPOSIXTimeSchema\n>;\nexport const LowerBoundPOSIXTimeData =\n  LowerBoundPOSIXTimeSchema as unknown as LowerBoundPOSIXTimeData;\n\nexport const UpperBoundPOSIXTimeSchema = Data.Object({\n  upperBoundLimit: ExtendedPOSIXTimeSchema,\n  upperBoundClosed: ClosureSchema,\n});\nexport type UpperBoundPOSIXTimeData = Data.Static<\n  typeof UpperBoundPOSIXTimeSchema\n>;\nexport const UpperBoundPOSIXTimeData =\n  UpperBoundPOSIXTimeSchema as unknown as UpperBoundPOSIXTimeData;\n\nexport const POSIXTimeRangeSchema = Data.Object({\n  ivFrom: LowerBoundPOSIXTimeSchema,\n  ivTo: UpperBoundPOSIXTimeSchema,\n});\nexport type POSIXTimeRangeData = Data.Static<typeof POSIXTimeRangeSchema>;\nexport const POSIXTimeRangeData =\n  POSIXTimeRangeSchema as unknown as POSIXTimeRangeData;\n\nexport const ColdCommitteeCredentialSchema = CredentialSchema;\nexport type ColdCommitteeCredentialData = Data.Static<\n  typeof ColdCommitteeCredentialSchema\n>;\nexport const ColdCommitteeCredentialData =\n  ColdCommitteeCredentialSchema as unknown as ColdCommitteeCredentialData;\n\nexport const HotCommitteeCredentialSchema = CredentialSchema;\nexport type HotCommitteeCredentialData = Data.Static<\n  typeof HotCommitteeCredentialSchema\n>;\nexport const HotCommitteeCredentialData =\n  HotCommitteeCredentialSchema as unknown as HotCommitteeCredentialData;\n\nexport const DRepCredentialSchema = CredentialSchema;\nexport type DRepCredentialData = Data.Static<typeof DRepCredentialSchema>;\nexport const DRepCredentialData =\n  DRepCredentialSchema as unknown as DRepCredentialData;\n\nexport const DRepSchema = Data.Enum([\n  Data.Object({ DRep: Data.Tuple([DRepCredentialSchema]) }),\n  Data.Literal(\"DRepAlwaysAbstain\"),\n  Data.Literal(\"DRepAlwaysNoConfidence\"),\n]);\nexport type DRepData = Data.Static<typeof DRepSchema>;\nexport const DRepData = DRepSchema as unknown as DRepData;\n\nexport const DelegateeSchema = Data.Enum([\n  Data.Object({ DelegStake: Data.Tuple([PubKeyHashSchema]) }),\n  Data.Object({ DelegVote: Data.Tuple([DRepSchema]) }),\n  Data.Object({ DelegStakeVote: Data.Tuple([PubKeyHashSchema, DRepSchema]) }),\n]);\nexport type DelegateeData = Data.Static<typeof DelegateeSchema>;\nexport const DelegateeData = DelegateeSchema as unknown as DelegateeData;\n\nexport const TxCertSchema = Data.Enum([\n  Data.Object({\n    TxCertRegStaking: Data.Tuple([\n      CredentialSchema,\n      Data.Nullable(LovelaceSchema),\n    ]),\n  }),\n  Data.Object({\n    TxCertUnRegStaking: Data.Tuple([\n      CredentialSchema,\n      Data.Nullable(LovelaceSchema),\n    ]),\n  }),\n  Data.Object({\n    TxCertDelegStaking: Data.Tuple([CredentialSchema, DelegateeSchema]),\n  }),\n  Data.Object({\n    TxCertRegDeleg: Data.Tuple([\n      CredentialSchema,\n      DelegateeSchema,\n      LovelaceSchema,\n    ]),\n  }),\n  Data.Object({\n    TxCertRegDRep: Data.Tuple([DRepCredentialSchema, LovelaceSchema]),\n  }),\n  Data.Object({ TxCertUpdateDRep: Data.Tuple([DRepCredentialSchema]) }),\n  Data.Object({\n    TxCertUnRegDRep: Data.Tuple([DRepCredentialSchema, LovelaceSchema]),\n  }),\n  Data.Object({\n    TxCertPoolRegister: Data.Tuple([PubKeyHashSchema, PubKeyHashSchema]),\n  }),\n  Data.Object({\n    TxCertPoolRetire: Data.Tuple([PubKeyHashSchema, Data.Integer()]),\n  }),\n  Data.Object({\n    TxCertAuthHotCommittee: Data.Tuple([\n      ColdCommitteeCredentialSchema,\n      HotCommitteeCredentialSchema,\n    ]),\n  }),\n  Data.Object({\n    TxCertResignColdCommittee: Data.Tuple([ColdCommitteeCredentialSchema]),\n  }),\n]);\nexport type TxCertData = Data.Static<typeof TxCertSchema>;\nexport const TxCertData = TxCertSchema as unknown as TxCertData;\n\nexport const VoterSchema = Data.Enum([\n  Data.Object({\n    CommitteeVoter: Data.Tuple([HotCommitteeCredentialSchema]),\n  }),\n  Data.Object({ DRepVoter: Data.Tuple([DRepCredentialSchema]) }),\n  Data.Object({ StakePoolVoter: Data.Tuple([PubKeyHashSchema]) }),\n]);\nexport type VoterData = Data.Static<typeof VoterSchema>;\nexport const VoterData = VoterSchema as unknown as VoterData;\n\nexport const VoteSchema = Data.Enum([\n  Data.Literal(\"VoteNo\"),\n  Data.Literal(\"VoteYes\"),\n  Data.Literal(\"Abstain\"),\n]);\nexport type VoteData = Data.Static<typeof VoteSchema>;\nexport const VoteData = VoteSchema as unknown as VoteData;\n\nexport const GovernanceActionIdSchema = Data.Object({\n  gaidTxId: TxIdSchema,\n  gaidGovActionIx: Data.Integer(),\n});\nexport type GovernanceActionIdData = Data.Static<\n  typeof GovernanceActionIdSchema\n>;\nexport const GovernanceActionIdData =\n  GovernanceActionIdSchema as unknown as GovernanceActionIdData;\n\nexport const CommitteeSchema = Data.Object({\n  committeeMembers: Data.Map(ColdCommitteeCredentialSchema, Data.Integer()),\n  committeeQuorum: RationalSchema,\n});\nexport type CommitteeData = Data.Static<typeof CommitteeSchema>;\nexport const CommitteeData = CommitteeSchema as unknown as CommitteeData;\n\nexport const ConstitutionSchema = Data.Object({\n  constitutionScript: Data.Nullable(ScriptHashSchema),\n});\nexport type ConstitutionData = Data.Static<typeof ConstitutionSchema>;\nexport const ConstitutionData =\n  ConstitutionSchema as unknown as ConstitutionData;\n\nexport const ProtocolVersionSchema = Data.Object({\n  pvMajor: Data.Integer(),\n  pvMinor: Data.Integer(),\n});\nexport type ProtocolVersionData = Data.Static<typeof ProtocolVersionSchema>;\nexport const ProtocolVersionData =\n  ProtocolVersionSchema as unknown as ProtocolVersionData;\n\nexport const GovernanceActionSchema = Data.Enum([\n  Data.Object({\n    ParameterChange: Data.Tuple([\n      Data.Nullable(GovernanceActionIdSchema),\n      ChangedParametersSchema,\n      Data.Nullable(ScriptHashSchema),\n    ]),\n  }),\n  Data.Object({\n    HardForkInitiation: Data.Tuple([\n      Data.Nullable(GovernanceActionIdSchema),\n      ProtocolVersionSchema,\n    ]),\n  }),\n  Data.Object({\n    TreasuryWithdrawals: Data.Tuple([\n      Data.Map(CredentialSchema, LovelaceSchema),\n      Data.Nullable(ScriptHashSchema),\n    ]),\n  }),\n  Data.Object({\n    NoConfidence: Data.Tuple([Data.Nullable(GovernanceActionIdSchema)]),\n  }),\n  Data.Object({\n    UpdateCommittee: Data.Tuple([\n      Data.Nullable(GovernanceActionIdSchema),\n      Data.Array(ColdCommitteeCredentialSchema),\n      Data.Map(ColdCommitteeCredentialSchema, Data.Integer()),\n      RationalSchema,\n    ]),\n  }),\n  Data.Object({\n    NewConstitution: Data.Tuple([\n      Data.Nullable(GovernanceActionIdSchema),\n      ConstitutionSchema,\n    ]),\n  }),\n  Data.Literal(\"InfoAction\"),\n]);\nexport type GovernanceActionData = Data.Static<typeof GovernanceActionSchema>;\nexport const GovernanceActionData =\n  GovernanceActionSchema as unknown as GovernanceActionData;\n\nexport const ProposalProcedureSchema = Data.Object({\n  ppDeposit: LovelaceSchema,\n  ppReturnAddr: CredentialSchema,\n  ppGovernanceAction: GovernanceActionSchema,\n});\nexport type ProposalProcedureData = Data.Static<typeof ProposalProcedureSchema>;\nexport const ProposalProcedureData =\n  ProposalProcedureSchema as unknown as ProposalProcedureData;\n\nexport const ScriptPurposeSchema = Data.Enum([\n  Data.Object({ Minting: Data.Tuple([CurrencySymbolSchema]) }),\n  Data.Object({ Spending: Data.Tuple([TxOutRefSchema]) }),\n  Data.Object({ Rewarding: Data.Tuple([CredentialSchema]) }),\n  Data.Object({\n    Certifying: Data.Tuple([Data.Integer(), TxCertSchema]),\n  }),\n  Data.Object({ Voting: Data.Tuple([VoterSchema]) }),\n  Data.Object({\n    Proposing: Data.Tuple([Data.Integer(), ProposalProcedureSchema]),\n  }),\n]);\nexport type ScriptPurposeData = Data.Static<typeof ScriptPurposeSchema>;\nexport const ScriptPurposeData =\n  ScriptPurposeSchema as unknown as ScriptPurposeData;\n\nexport const ScriptInfoSchema = Data.Enum([\n  Data.Object({ MintingScript: Data.Tuple([CurrencySymbolSchema]) }),\n  Data.Object({\n    SpendingScript: Data.Tuple([TxOutRefSchema, Data.Nullable(DatumSchema)]),\n  }),\n  Data.Object({ RewardingScript: Data.Tuple([CredentialSchema]) }),\n  Data.Object({\n    CertifyingScript: Data.Tuple([Data.Integer(), TxCertSchema]),\n  }),\n  Data.Object({ VotingScript: Data.Tuple([VoterSchema]) }),\n  Data.Object({\n    ProposingScript: Data.Tuple([Data.Integer(), ProposalProcedureSchema]),\n  }),\n]);\nexport type ScriptInfoData = Data.Static<typeof ScriptInfoSchema>;\nexport const ScriptInfoData = ScriptInfoSchema as unknown as ScriptInfoData;\n\nexport const TxInInfoSchema = Data.Object({\n  txInInfoOutRef: TxOutRefSchema,\n  txInInfoResolved: TxOutSchema,\n});\nexport type TxInInfoData = Data.Static<typeof TxInInfoSchema>;\nexport const TxInInfoData = TxInInfoSchema as unknown as TxInInfoData;\n\nexport const TxInfoSchema = Data.Object({\n  txInfoInputs: Data.Array(TxInInfoSchema),\n  txInfoReferenceInputs: Data.Array(TxInInfoSchema),\n  txInfoOutputs: Data.Array(TxOutSchema),\n  txInfoFee: LovelaceSchema,\n  txInfoMint: MintValueSchema,\n  txInfoTxCerts: Data.Array(TxCertSchema),\n  txInfoWdrl: Data.Map(CredentialSchema, LovelaceSchema),\n  txInfoValidRange: POSIXTimeRangeSchema,\n  txInfoSignatories: Data.Array(PubKeyHashSchema),\n  txInfoRedeemers: Data.Map(ScriptPurposeSchema, RedeemerSchema),\n  txInfoData: Data.Map(DatumHashSchema, DatumSchema),\n  txInfoId: TxIdSchema,\n  txInfoVotes: Data.Map(\n    VoterSchema,\n    Data.Map(GovernanceActionIdSchema, VoteSchema),\n  ),\n  txInfoProposalProcedures: Data.Array(ProposalProcedureSchema),\n  txInfoCurrentTreasuryAmount: Data.Nullable(LovelaceSchema),\n  txInfoTreasuryDonation: Data.Nullable(LovelaceSchema),\n});\nexport type TxInfoData = Data.Static<typeof TxInfoSchema>;\nexport const TxInfoData = TxInfoSchema as unknown as TxInfoData;\n\nexport const ScriptContextSchema = Data.Object({\n  scriptContextTxInfo: TxInfoSchema,\n  scriptContextRedeemer: RedeemerSchema,\n  scriptContextScriptInfo: ScriptInfoSchema,\n});\nexport type ScriptContextData = Data.Static<typeof ScriptContextSchema>;\nexport const ScriptContextData =\n  ScriptContextSchema as unknown as ScriptContextData;\n","import {\n  Data,\n  type Data as PlutusData,\n  slotToBeginUnixTime,\n} from \"@lucid-evolution/plutus\";\nimport { Effect } from \"effect\";\nimport type { Credential, SlotConfig, UTxO } from \"@lucid-evolution/core-types\";\nimport {\n  fromScriptRef,\n  getAddressDetails,\n  utxoToTransactionOutput,\n  validatorToScriptHash,\n} from \"@lucid-evolution/utils\";\nimport { CML } from \"../core.js\";\nimport { withCMLScope } from \"@lucid-evolution/core-utils\";\nimport {\n  buildCanonicalRedeemerInfo,\n  canonicalRedeemerEntries,\n  freeCanonicalRedeemerEntries,\n  proposalProcedureForRedeemerIndex,\n  type CanonicalRedeemerEntry,\n  type CanonicalRedeemerInfo,\n  voterForRedeemerIndex,\n} from \"../tx-builder/internal/RedeemerContext.js\";\nimport { ScriptPurposeData } from \"./Schema.js\";\nimport type {\n  AddressData,\n  ChangedParametersData,\n  ConstitutionData,\n  CredentialData,\n  DRepData,\n  DelegateeData,\n  GovernanceActionData,\n  GovernanceActionIdData,\n  MintValueData,\n  POSIXTimeRangeData,\n  ProposalProcedureData,\n  ProtocolVersionData,\n  ScriptContextData,\n  ScriptInfoData,\n  StakingCredentialData,\n  TxCertData,\n  TxInInfoData,\n  TxInfoData,\n  TxOutData,\n  TxOutRefData,\n  ValueData,\n  VoteData,\n  VoterData,\n} from \"./Schema.js\";\n\nexport type ScriptContextOptions = {\n  resolvedInputs?: ReadonlyArray<UTxO>;\n  slotConfig?: SlotConfig;\n};\n\nexport type ScriptContext = ScriptContextData;\nexport type ScriptPurpose = ScriptPurposeData;\n\ntype AssetMap =\n  | CML.MultiAsset\n  | CML.Mint\n  | {\n      keys(): CML.PolicyIdList;\n      get_assets(\n        key: CML.ScriptHash,\n      ): CML.MapAssetNameToCoin | CML.MapAssetNameToNonZeroInt64 | undefined;\n    };\n\ntype PlutusDataValue = PlutusData;\n\nconst slotToPosixTime = (\n  slot: bigint,\n  slotConfig: SlotConfig | undefined,\n): bigint => {\n  if (!slotConfig || slotConfig.slotLength === 0) {\n    throw new Error(\n      \"ScriptContext translation requires a valid slotConfig to translate the transaction validity interval.\",\n    );\n  }\n  return BigInt(slotToBeginUnixTime(Number(slot), slotConfig));\n};\n\nconst toArray = <T>(\n  list: { len(): number; get(index: number): T } | undefined,\n) => {\n  const result: T[] = [];\n  if (!list) return result;\n  for (let index = 0; index < list.len(); index++) {\n    result.push(list.get(index));\n  }\n  return result;\n};\n\nconst byteLength = (hex: string): number => hex.length / 2;\n\nconst compareByteArrayHex = (left: string, right: string): number => {\n  const leftLength = byteLength(left);\n  const rightLength = byteLength(right);\n  const sharedLength = Math.min(leftLength, rightLength);\n  for (let index = 0; index < sharedLength; index++) {\n    const leftByte = parseInt(left.slice(index * 2, index * 2 + 2), 16);\n    const rightByte = parseInt(right.slice(index * 2, index * 2 + 2), 16);\n    if (leftByte !== rightByte) return leftByte - rightByte;\n  }\n  return leftLength - rightLength;\n};\n\nconst compareBigInt = (left: bigint, right: bigint): number =>\n  left < right ? -1 : left > right ? 1 : 0;\n\nconst sortedMap = <K, V>(\n  entries: ReadonlyArray<readonly [K, V]>,\n  compareKey: (left: K, right: K) => number,\n): Map<K, V> =>\n  new Map([...entries].sort(([left], [right]) => compareKey(left, right)));\n\nconst datumFromPlutusData = (data: CML.PlutusData): PlutusDataValue =>\n  Data.from(data.to_cbor_hex());\n\nconst txOutRefFromCml = (input: CML.TransactionInput): TxOutRefData => ({\n  txOutRefId: input.transaction_id().to_hex(),\n  txOutRefIdx: input.index(),\n});\n\nconst compareTxOutRef = (left: TxOutRefData, right: TxOutRefData): number =>\n  compareByteArrayHex(left.txOutRefId, right.txOutRefId) ||\n  compareBigInt(left.txOutRefIdx, right.txOutRefIdx);\n\nconst credentialFromCml = (credential: CML.Credential): CredentialData => {\n  const pubKey = credential.as_pub_key();\n  if (pubKey) return { PubKeyCredential: [pubKey.to_hex()] };\n  const script = credential.as_script();\n  if (script) return { ScriptCredential: [script.to_hex()] };\n  throw new Error(\"Unsupported credential in ScriptContext translation.\");\n};\n\nconst credentialFromCore = (credential: Credential): CredentialData =>\n  credential.type === \"Key\"\n    ? { PubKeyCredential: [credential.hash] }\n    : { ScriptCredential: [credential.hash] };\n\nconst credentialFromRewardAddress = (\n  rewardAddress: CML.RewardAddress,\n): CredentialData => credentialFromCml(rewardAddress.payment());\n\nconst compareCredential = (\n  left: CredentialData,\n  right: CredentialData,\n): number => {\n  const leftPubKey = \"PubKeyCredential\" in left;\n  const rightPubKey = \"PubKeyCredential\" in right;\n  if (leftPubKey !== rightPubKey) return leftPubKey ? 1 : -1;\n  const leftHash = leftPubKey\n    ? left.PubKeyCredential[0]\n    : left.ScriptCredential[0];\n  const rightHash = rightPubKey\n    ? right.PubKeyCredential[0]\n    : right.ScriptCredential[0];\n  return compareByteArrayHex(leftHash, rightHash);\n};\n\nconst stakingCredentialFromAddress = (\n  address: CML.Address,\n): StakingCredentialData | null => {\n  const base = CML.BaseAddress.from_address(address);\n  if (base) return { StakingHash: [credentialFromCml(base.stake())] };\n\n  const enterprise = CML.EnterpriseAddress.from_address(address);\n  if (enterprise) return null;\n\n  const pointer = CML.PointerAddress.from_address(address);\n  if (pointer) {\n    throw new Error(\n      \"Pointer address ScriptContext translation is not supported by the current CML bindings.\",\n    );\n  }\n\n  throw new Error(\"Unsupported address in ScriptContext translation.\");\n};\n\nconst addressFromCml = (address: CML.Address): AddressData => {\n  const details = getAddressDetails(address.to_bech32(undefined));\n  if (!details.paymentCredential) {\n    throw new Error(\n      \"ScriptContext transaction outputs cannot use reward addresses.\",\n    );\n  }\n  return {\n    addressCredential: credentialFromCore(details.paymentCredential),\n    addressStakingCredential: stakingCredentialFromAddress(address),\n  };\n};\n\nconst assetNameHex = (assetName: CML.AssetName): string =>\n  assetName.to_js_value();\n\nconst assetMapToValue = (\n  assetMap: AssetMap | undefined,\n  ada: bigint | undefined,\n): ValueData => {\n  const policyEntries: [string, Map<string, bigint>][] = [];\n  if (ada !== undefined && ada !== 0n) {\n    policyEntries.push([\"\", new Map([[\"\", ada]])]);\n  }\n  if (assetMap) {\n    for (const policy of toArray(assetMap.keys())) {\n      const tokenEntries: [string, bigint][] = [];\n      const assets = assetMap.get_assets(policy);\n      if (!assets) continue;\n      for (const assetName of toArray(assets.keys())) {\n        const quantity = assets.get(assetName);\n        if (quantity !== undefined && quantity !== 0n) {\n          tokenEntries.push([assetNameHex(assetName), quantity]);\n        }\n      }\n      if (tokenEntries.length > 0) {\n        policyEntries.push([\n          policy.to_hex(),\n          sortedMap(tokenEntries, compareByteArrayHex),\n        ]);\n      }\n    }\n  }\n  return sortedMap(policyEntries, compareByteArrayHex);\n};\n\nconst valueFromCml = (value: CML.Value): ValueData =>\n  assetMapToValue(\n    value.has_multiassets() ? value.multi_asset() : undefined,\n    value.coin(),\n  );\n\nconst mintValueFromCml = (mint: CML.Mint | undefined): MintValueData =>\n  assetMapToValue(mint, undefined);\n\nconst outputDatumFromCml = (\n  datum: CML.DatumOption | undefined,\n): TxOutData[\"txOutDatum\"] => {\n  if (!datum) return \"NoOutputDatum\" as const;\n  const hash = datum.as_hash();\n  if (hash) return { OutputDatumHash: [hash.to_hex()] };\n  const inline = datum.as_datum();\n  if (inline) return { OutputDatum: [datumFromPlutusData(inline)] };\n  return \"NoOutputDatum\" as const;\n};\n\nconst txOutFromCml = (output: CML.TransactionOutput): TxOutData => {\n  const scriptRef = output.script_ref();\n  return {\n    txOutAddress: addressFromCml(output.address()),\n    txOutValue: valueFromCml(output.amount()),\n    txOutDatum: outputDatumFromCml(output.datum()),\n    txOutReferenceScript: scriptRef\n      ? validatorToScriptHash(fromScriptRef(scriptRef))\n      : null,\n  };\n};\n\nconst txInInfoFromUtxo = (utxo: UTxO): TxInInfoData => {\n  return {\n    txInInfoOutRef: {\n      txOutRefId: utxo.txHash,\n      txOutRefIdx: BigInt(utxo.outputIndex),\n    },\n    txInInfoResolved: txOutFromCml(utxoToTransactionOutput(utxo)),\n  };\n};\n\nconst dRepFromCml = (dRep: CML.DRep): DRepData => {\n  const key = dRep.as_key();\n  if (key) return { DRep: [{ PubKeyCredential: [key.to_hex()] }] };\n  const script = dRep.as_script();\n  if (script) return { DRep: [{ ScriptCredential: [script.to_hex()] }] };\n  switch (dRep.kind()) {\n    case CML.DRepKind.AlwaysAbstain:\n      return \"DRepAlwaysAbstain\";\n    case CML.DRepKind.AlwaysNoConfidence:\n      return \"DRepAlwaysNoConfidence\";\n    default:\n      throw new Error(\"Unsupported DRep in ScriptContext translation.\");\n  }\n};\n\nconst delegateStake = (pool: CML.Ed25519KeyHash): DelegateeData => ({\n  DelegStake: [pool.to_hex()],\n});\n\nconst delegateVote = (dRep: CML.DRep): DelegateeData => ({\n  DelegVote: [dRepFromCml(dRep)],\n});\n\nconst delegateStakeVote = (\n  pool: CML.Ed25519KeyHash,\n  dRep: CML.DRep,\n): DelegateeData => ({\n  DelegStakeVote: [pool.to_hex(), dRepFromCml(dRep)],\n});\n\nconst txCertFromCml = (certificate: CML.Certificate): TxCertData => {\n  const stakeRegistration = certificate.as_stake_registration();\n  if (stakeRegistration) {\n    return {\n      TxCertRegStaking: [\n        credentialFromCml(stakeRegistration.stake_credential()),\n        null,\n      ],\n    };\n  }\n\n  const stakeDeregistration = certificate.as_stake_deregistration();\n  if (stakeDeregistration) {\n    return {\n      TxCertUnRegStaking: [\n        credentialFromCml(stakeDeregistration.stake_credential()),\n        null,\n      ],\n    };\n  }\n\n  const stakeDelegation = certificate.as_stake_delegation();\n  if (stakeDelegation) {\n    return {\n      TxCertDelegStaking: [\n        credentialFromCml(stakeDelegation.stake_credential()),\n        delegateStake(stakeDelegation.pool()),\n      ],\n    };\n  }\n\n  const regCert = certificate.as_reg_cert();\n  if (regCert) {\n    return {\n      TxCertRegStaking: [credentialFromCml(regCert.stake_credential()), null],\n    };\n  }\n\n  const unregCert = certificate.as_unreg_cert();\n  if (unregCert) {\n    return {\n      TxCertUnRegStaking: [\n        credentialFromCml(unregCert.stake_credential()),\n        null,\n      ],\n    };\n  }\n\n  const voteDelegCert = certificate.as_vote_deleg_cert();\n  if (voteDelegCert) {\n    return {\n      TxCertDelegStaking: [\n        credentialFromCml(voteDelegCert.stake_credential()),\n        delegateVote(voteDelegCert.d_rep()),\n      ],\n    };\n  }\n\n  const stakeVoteDelegCert = certificate.as_stake_vote_deleg_cert();\n  if (stakeVoteDelegCert) {\n    return {\n      TxCertDelegStaking: [\n        credentialFromCml(stakeVoteDelegCert.stake_credential()),\n        delegateStakeVote(\n          stakeVoteDelegCert.pool(),\n          stakeVoteDelegCert.d_rep(),\n        ),\n      ],\n    };\n  }\n\n  const stakeRegDelegCert = certificate.as_stake_reg_deleg_cert();\n  if (stakeRegDelegCert) {\n    return {\n      TxCertRegDeleg: [\n        credentialFromCml(stakeRegDelegCert.stake_credential()),\n        delegateStake(stakeRegDelegCert.pool()),\n        stakeRegDelegCert.deposit(),\n      ],\n    };\n  }\n\n  const voteRegDelegCert = certificate.as_vote_reg_deleg_cert();\n  if (voteRegDelegCert) {\n    return {\n      TxCertRegDeleg: [\n        credentialFromCml(voteRegDelegCert.stake_credential()),\n        delegateVote(voteRegDelegCert.d_rep()),\n        voteRegDelegCert.deposit(),\n      ],\n    };\n  }\n\n  const stakeVoteRegDelegCert = certificate.as_stake_vote_reg_deleg_cert();\n  if (stakeVoteRegDelegCert) {\n    return {\n      TxCertRegDeleg: [\n        credentialFromCml(stakeVoteRegDelegCert.stake_credential()),\n        delegateStakeVote(\n          stakeVoteRegDelegCert.pool(),\n          stakeVoteRegDelegCert.d_rep(),\n        ),\n        stakeVoteRegDelegCert.deposit(),\n      ],\n    };\n  }\n\n  const regDrepCert = certificate.as_reg_drep_cert();\n  if (regDrepCert) {\n    return {\n      TxCertRegDRep: [\n        credentialFromCml(regDrepCert.drep_credential()),\n        regDrepCert.deposit(),\n      ],\n    };\n  }\n\n  const updateDrepCert = certificate.as_update_drep_cert();\n  if (updateDrepCert) {\n    return {\n      TxCertUpdateDRep: [credentialFromCml(updateDrepCert.drep_credential())],\n    };\n  }\n\n  const unregDrepCert = certificate.as_unreg_drep_cert();\n  if (unregDrepCert) {\n    return {\n      TxCertUnRegDRep: [\n        credentialFromCml(unregDrepCert.drep_credential()),\n        unregDrepCert.deposit(),\n      ],\n    };\n  }\n\n  const poolRegistration = certificate.as_pool_registration();\n  if (poolRegistration) {\n    const poolParams = poolRegistration.pool_params();\n    return {\n      TxCertPoolRegister: [\n        poolParams.operator().to_hex(),\n        poolParams.vrf_keyhash().to_hex(),\n      ],\n    };\n  }\n\n  const poolRetirement = certificate.as_pool_retirement();\n  if (poolRetirement) {\n    return {\n      TxCertPoolRetire: [\n        poolRetirement.pool().to_hex(),\n        poolRetirement.epoch(),\n      ],\n    };\n  }\n\n  const authCommitteeHotCert = certificate.as_auth_committee_hot_cert();\n  if (authCommitteeHotCert) {\n    return {\n      TxCertAuthHotCommittee: [\n        credentialFromCml(authCommitteeHotCert.committee_cold_credential()),\n        credentialFromCml(authCommitteeHotCert.committee_hot_credential()),\n      ],\n    };\n  }\n\n  const resignCommitteeColdCert = certificate.as_resign_committee_cold_cert();\n  if (resignCommitteeColdCert) {\n    return {\n      TxCertResignColdCommittee: [\n        credentialFromCml(resignCommitteeColdCert.committee_cold_credential()),\n      ],\n    };\n  }\n\n  throw new Error(\"Unsupported certificate in ScriptContext translation.\");\n};\n\nconst govActionIdFromCml = (\n  actionId: CML.GovActionId | undefined,\n): GovernanceActionIdData | null =>\n  actionId\n    ? {\n        gaidTxId: actionId.transaction_id().to_hex(),\n        gaidGovActionIx: actionId.gov_action_index(),\n      }\n    : null;\n\nconst compareGovActionId = (\n  left: GovernanceActionIdData,\n  right: GovernanceActionIdData,\n): number =>\n  compareByteArrayHex(left.gaidTxId, right.gaidTxId) ||\n  compareBigInt(left.gaidGovActionIx, right.gaidGovActionIx);\n\nconst protocolVersionFromCml = (\n  version: CML.ProtocolVersion,\n): ProtocolVersionData => ({\n  pvMajor: version.major(),\n  pvMinor: version.minor(),\n});\n\nconst constitutionFromCml = (\n  constitution: CML.Constitution,\n): ConstitutionData => ({\n  constitutionScript: constitution.script_hash()?.to_hex() ?? null,\n});\n\nconst rationalFromUnitInterval = (interval: CML.UnitInterval) =>\n  [interval.start(), interval.end()] as [bigint, bigint];\n\nconst rationalFromCml = (rational: CML.Rational | CML.SubCoin) =>\n  [rational.numerator(), rational.denominator()] as [bigint, bigint];\n\nconst executionUnitsFromCml = (units: CML.ExUnits) =>\n  [units.mem(), units.steps()] as [bigint, bigint];\n\nconst executionPricesFromCml = (prices: CML.ExUnitPrices) =>\n  [\n    rationalFromCml(prices.mem_price()),\n    rationalFromCml(prices.step_price()),\n  ] as [ReturnType<typeof rationalFromCml>, ReturnType<typeof rationalFromCml>];\n\nconst protocolParamUpdateFromCml = (\n  update: CML.ProtocolParamUpdate,\n): ChangedParametersData => {\n  const entries: [bigint, PlutusDataValue][] = [];\n  const add = (index: number, value: PlutusDataValue | undefined) => {\n    if (value !== undefined) entries.push([BigInt(index), value]);\n  };\n  const addUnitInterval = (\n    index: number,\n    value: CML.UnitInterval | undefined,\n  ) => add(index, value ? rationalFromUnitInterval(value) : undefined);\n\n  add(0, update.minfee_a());\n  add(1, update.minfee_b());\n  add(2, update.max_block_body_size());\n  add(3, update.max_transaction_size());\n  add(4, update.max_block_header_size());\n  add(5, update.key_deposit());\n  add(6, update.pool_deposit());\n  add(7, update.maximum_epoch());\n  add(8, update.n_opt());\n  add(\n    9,\n    update.pool_pledge_influence() &&\n      rationalFromCml(update.pool_pledge_influence()!),\n  );\n  addUnitInterval(10, update.expansion_rate());\n  addUnitInterval(11, update.treasury_growth_rate());\n  add(16, update.min_pool_cost());\n  add(17, update.ada_per_utxo_byte());\n  if (update.cost_models_for_script_languages()) {\n    throw new Error(\n      \"Protocol parameter cost model updates are not yet supported in ScriptContext translation.\",\n    );\n  }\n  add(\n    19,\n    update.execution_costs() &&\n      executionPricesFromCml(update.execution_costs()!),\n  );\n  add(\n    20,\n    update.max_tx_ex_units() &&\n      executionUnitsFromCml(update.max_tx_ex_units()!),\n  );\n  add(\n    21,\n    update.max_block_ex_units() &&\n      executionUnitsFromCml(update.max_block_ex_units()!),\n  );\n  add(22, update.max_value_size());\n  add(23, update.collateral_percentage());\n  add(24, update.max_collateral_inputs());\n  const poolVotingThresholds = update.pool_voting_thresholds();\n  add(\n    25,\n    poolVotingThresholds && [\n      rationalFromUnitInterval(poolVotingThresholds.motion_no_confidence()),\n      rationalFromUnitInterval(poolVotingThresholds.committee_normal()),\n      rationalFromUnitInterval(poolVotingThresholds.committee_no_confidence()),\n      rationalFromUnitInterval(poolVotingThresholds.hard_fork_initiation()),\n      rationalFromUnitInterval(\n        poolVotingThresholds.security_relevant_parameter_voting_threshold(),\n      ),\n    ],\n  );\n  const dRepVotingThresholds = update.d_rep_voting_thresholds();\n  add(\n    26,\n    dRepVotingThresholds && [\n      rationalFromUnitInterval(dRepVotingThresholds.motion_no_confidence()),\n      rationalFromUnitInterval(dRepVotingThresholds.committee_normal()),\n      rationalFromUnitInterval(dRepVotingThresholds.committee_no_confidence()),\n      rationalFromUnitInterval(dRepVotingThresholds.update_constitution()),\n      rationalFromUnitInterval(dRepVotingThresholds.hard_fork_initiation()),\n      rationalFromUnitInterval(dRepVotingThresholds.pp_network_group()),\n      rationalFromUnitInterval(dRepVotingThresholds.pp_economic_group()),\n      rationalFromUnitInterval(dRepVotingThresholds.pp_technical_group()),\n      rationalFromUnitInterval(dRepVotingThresholds.pp_governance_group()),\n      rationalFromUnitInterval(dRepVotingThresholds.treasury_withdrawal()),\n    ],\n  );\n  add(27, update.min_committee_size());\n  add(28, update.committee_term_limit());\n  add(29, update.governance_action_validity_period());\n  add(30, update.governance_action_deposit());\n  add(31, update.d_rep_deposit());\n  add(32, update.d_rep_inactivity_period());\n  add(\n    33,\n    update.min_fee_ref_script_cost_per_byte() &&\n      rationalFromCml(update.min_fee_ref_script_cost_per_byte()!),\n  );\n\n  return sortedMap(entries, compareBigInt) as ChangedParametersData;\n};\n\nconst treasuryWithdrawalsFromCml = (\n  withdrawals: CML.MapRewardAccountToCoin,\n): Map<CredentialData, bigint> => {\n  const entries = toArray(withdrawals.keys()).map(\n    (rewardAddress) =>\n      [\n        credentialFromRewardAddress(rewardAddress),\n        withdrawals.get(rewardAddress)!,\n      ] as const,\n  );\n  return sortedMap(entries, compareCredential);\n};\n\nconst committeeCredentialsFromCml = (\n  credentials: CML.CommitteeColdCredentialList,\n): CredentialData[] =>\n  toArray(credentials).map((credential) => credentialFromCml(credential));\n\nconst committeeCredentialMapFromCml = (\n  credentials: CML.MapCommitteeColdCredentialToEpoch,\n): Map<CredentialData, bigint> => {\n  const entries = toArray(credentials.keys()).map(\n    (credential) =>\n      [credentialFromCml(credential), credentials.get(credential)!] as const,\n  );\n  return sortedMap(entries, compareCredential);\n};\n\nconst governanceActionFromCml = (\n  action: CML.GovAction,\n): GovernanceActionData => {\n  const parameterChange = action.as_parameter_change_action();\n  if (parameterChange) {\n    return {\n      ParameterChange: [\n        govActionIdFromCml(parameterChange.action_id()),\n        protocolParamUpdateFromCml(parameterChange.update()),\n        parameterChange.policy_hash()?.to_hex() ?? null,\n      ],\n    };\n  }\n\n  const hardFork = action.as_hard_fork_initiation_action();\n  if (hardFork) {\n    return {\n      HardForkInitiation: [\n        govActionIdFromCml(hardFork.action_id()),\n        protocolVersionFromCml(hardFork.version()),\n      ],\n    };\n  }\n\n  const treasuryWithdrawals = action.as_treasury_withdrawals_action();\n  if (treasuryWithdrawals) {\n    return {\n      TreasuryWithdrawals: [\n        treasuryWithdrawalsFromCml(treasuryWithdrawals.withdrawal()),\n        treasuryWithdrawals.policy_hash()?.to_hex() ?? null,\n      ],\n    };\n  }\n\n  const noConfidence = action.as_no_confidence();\n  if (noConfidence) {\n    return {\n      NoConfidence: [govActionIdFromCml(noConfidence.action_id())],\n    };\n  }\n\n  const updateCommittee = action.as_update_committee();\n  if (updateCommittee) {\n    return {\n      UpdateCommittee: [\n        govActionIdFromCml(updateCommittee.action_id()),\n        committeeCredentialsFromCml(updateCommittee.cold_credentials()),\n        committeeCredentialMapFromCml(updateCommittee.credentials()),\n        rationalFromUnitInterval(updateCommittee.unit_interval()),\n      ],\n    };\n  }\n\n  const newConstitution = action.as_new_constitution();\n  if (newConstitution) {\n    return {\n      NewConstitution: [\n        govActionIdFromCml(newConstitution.action_id()),\n        constitutionFromCml(newConstitution.constitution()),\n      ],\n    };\n  }\n\n  if (action.kind() === CML.GovActionKind.InfoAction) {\n    return \"InfoAction\";\n  }\n\n  throw new Error(\n    \"Unsupported governance action in ScriptContext translation.\",\n  );\n};\n\nconst proposalProcedureFromCml = (\n  proposal: CML.ProposalProcedure,\n): ProposalProcedureData => ({\n  ppDeposit: proposal.deposit(),\n  ppReturnAddr: credentialFromRewardAddress(proposal.reward_account()),\n  ppGovernanceAction: governanceActionFromCml(proposal.gov_action()),\n});\n\nconst voterFromCml = (voter: CML.Voter): VoterData => {\n  switch (voter.kind()) {\n    case CML.VoterKind.ConstitutionalCommitteeHotKeyHash:\n      return {\n        CommitteeVoter: [\n          {\n            PubKeyCredential: [\n              voter.as_constitutional_committee_hot_key_hash()!.to_hex(),\n            ],\n          },\n        ],\n      };\n    case CML.VoterKind.ConstitutionalCommitteeHotScriptHash:\n      return {\n        CommitteeVoter: [\n          {\n            ScriptCredential: [\n              voter.as_constitutional_committee_hot_script_hash()!.to_hex(),\n            ],\n          },\n        ],\n      };\n    case CML.VoterKind.DRepKeyHash:\n      return {\n        DRepVoter: [\n          { PubKeyCredential: [voter.as_d_rep_key_hash()!.to_hex()] },\n        ],\n      };\n    case CML.VoterKind.DRepScriptHash:\n      return {\n        DRepVoter: [\n          { ScriptCredential: [voter.as_d_rep_script_hash()!.to_hex()] },\n        ],\n      };\n    case CML.VoterKind.StakingPoolKeyHash:\n      return { StakePoolVoter: [voter.as_staking_pool_key_hash()!.to_hex()] };\n    default:\n      throw new Error(\"Unsupported voter in ScriptContext translation.\");\n  }\n};\n\nconst voterRank = (voter: VoterData): number =>\n  \"CommitteeVoter\" in voter ? 0 : \"DRepVoter\" in voter ? 1 : 2;\n\nconst compareVoter = (left: VoterData, right: VoterData): number => {\n  const rank = voterRank(left) - voterRank(right);\n  if (rank !== 0) return rank;\n  if (\"StakePoolVoter\" in left && \"StakePoolVoter\" in right) {\n    return compareByteArrayHex(left.StakePoolVoter[0], right.StakePoolVoter[0]);\n  }\n  if (\"StakePoolVoter\" in left || \"StakePoolVoter\" in right) return 0;\n  const leftCredential =\n    \"CommitteeVoter\" in left ? left.CommitteeVoter[0] : left.DRepVoter[0];\n  const rightCredential =\n    \"CommitteeVoter\" in right ? right.CommitteeVoter[0] : right.DRepVoter[0];\n  return compareCredential(leftCredential, rightCredential);\n};\n\nconst voteFromCml = (vote: CML.Vote): VoteData => {\n  switch (vote) {\n    case CML.Vote.No:\n      return \"VoteNo\";\n    case CML.Vote.Yes:\n      return \"VoteYes\";\n    case CML.Vote.Abstain:\n      return \"Abstain\";\n    default:\n      throw new Error(\"Unsupported vote in ScriptContext translation.\");\n  }\n};\n\nconst votingProceduresFromCml = (\n  votingProcedures: CML.VotingProcedures | undefined,\n): Map<VoterData, Map<GovernanceActionIdData, VoteData>> => {\n  if (!votingProcedures) return new Map();\n  const voterEntries = toArray(votingProcedures.keys()).map((voter) => {\n    const actionMap = votingProcedures.get(voter)!;\n    const actionEntries = toArray(actionMap.keys()).map(\n      (actionId) =>\n        [\n          govActionIdFromCml(actionId)!,\n          voteFromCml(actionMap.get(actionId)!.vote()),\n        ] as const,\n    );\n    return [\n      voterFromCml(voter),\n      sortedMap(actionEntries, compareGovActionId),\n    ] as const;\n  });\n  return sortedMap(voterEntries, compareVoter);\n};\n\nconst validityRangeFromBody = (\n  body: CML.TransactionBody,\n  slotConfig: SlotConfig | undefined,\n): POSIXTimeRangeData => {\n  const lowerSlot = body.validity_interval_start();\n  const upperSlot = body.ttl();\n  return {\n    ivFrom: {\n      lowerBoundLimit:\n        lowerSlot === undefined\n          ? \"NegInf\"\n          : {\n              Finite: [slotToPosixTime(lowerSlot, slotConfig)],\n            },\n      lowerBoundClosed: true,\n    },\n    ivTo: {\n      upperBoundLimit:\n        upperSlot === undefined\n          ? \"PosInf\"\n          : {\n              Finite: [slotToPosixTime(upperSlot, slotConfig)],\n            },\n      upperBoundClosed: upperSlot === undefined,\n    },\n  };\n};\n\nconst txCertificatesFromBody = (body: CML.TransactionBody): TxCertData[] =>\n  toArray(body.certs()).map(txCertFromCml);\n\nconst withdrawalsFromBody = (\n  body: CML.TransactionBody,\n): Map<CredentialData, bigint> => {\n  const withdrawals = body.withdrawals();\n  if (!withdrawals) return new Map();\n  const entries = toArray(withdrawals.keys()).map(\n    (rewardAddress) =>\n      [\n        credentialFromRewardAddress(rewardAddress),\n        withdrawals.get(rewardAddress)!,\n      ] as const,\n  );\n  return sortedMap(entries, compareCredential);\n};\n\nconst signatoriesFromBody = (body: CML.TransactionBody): string[] =>\n  toArray(body.required_signers())\n    .map((signatory) => signatory.to_hex())\n    .sort(compareByteArrayHex);\n\nconst datumMapFromWitnessSet = (\n  witnessSet: CML.TransactionWitnessSet,\n): Map<string, PlutusDataValue> => {\n  const datums = witnessSet.plutus_datums();\n  if (!datums) return new Map();\n  const entries = toArray(datums).map(\n    (datum) =>\n      [\n        CML.hash_plutus_data(datum).to_hex(),\n        datumFromPlutusData(datum),\n      ] as const,\n  );\n  return sortedMap(entries, compareByteArrayHex);\n};\n\nconst proposalsFromBody = (\n  body: CML.TransactionBody,\n): ProposalProcedureData[] =>\n  toArray(body.proposal_procedures()).map(proposalProcedureFromCml);\n\nconst mintPoliciesFromBody = (body: CML.TransactionBody): string[] => {\n  const mint = body.mint();\n  if (!mint) return [];\n  return toArray(mint.keys())\n    .map((policy) => policy.to_hex())\n    .sort(compareByteArrayHex);\n};\n\nconst purposeRank = (purpose: ScriptPurposeData): number =>\n  \"Spending\" in purpose\n    ? 0\n    : \"Minting\" in purpose\n      ? 1\n      : \"Certifying\" in purpose\n        ? 2\n        : \"Rewarding\" in purpose\n          ? 3\n          : \"Voting\" in purpose\n            ? 4\n            : 5;\n\nconst compareScriptPurpose = (\n  left: ScriptPurposeData,\n  right: ScriptPurposeData,\n): number => {\n  const rank = purposeRank(left) - purposeRank(right);\n  if (rank !== 0) return rank;\n  if (\"Minting\" in left && \"Minting\" in right) {\n    return compareByteArrayHex(left.Minting[0], right.Minting[0]);\n  }\n  if (\"Spending\" in left && \"Spending\" in right) {\n    return compareTxOutRef(left.Spending[0], right.Spending[0]);\n  }\n  if (\"Rewarding\" in left && \"Rewarding\" in right) {\n    return compareCredential(left.Rewarding[0], right.Rewarding[0]);\n  }\n  if (\"Certifying\" in left && \"Certifying\" in right) {\n    return compareBigInt(left.Certifying[0], right.Certifying[0]);\n  }\n  if (\"Voting\" in left && \"Voting\" in right) {\n    return compareVoter(left.Voting[0], right.Voting[0]);\n  }\n  if (\"Proposing\" in left && \"Proposing\" in right) {\n    return compareBigInt(left.Proposing[0], right.Proposing[0]);\n  }\n  return 0;\n};\n\nconst scriptPurposeKey = (purpose: ScriptPurposeData): string =>\n  Data.to(purpose, ScriptPurposeData);\n\nconst purposeFromRedeemerEntry = (\n  entry: CanonicalRedeemerEntry,\n  info: CanonicalRedeemerInfo,\n  tx: CML.Transaction,\n): ScriptPurposeData => {\n  const body = tx.body();\n  switch (entry.tag) {\n    case \"spend\": {\n      const input = info.inputs[Number(entry.index)];\n      if (!input) {\n        throw new Error(`Spend redeemer index ${entry.index} has no input.`);\n      }\n      return {\n        Spending: [\n          {\n            txOutRefId: input.txHash,\n            txOutRefIdx: BigInt(input.outputIndex),\n          },\n        ],\n      };\n    }\n    case \"mint\": {\n      const policy = mintPoliciesFromBody(body)[Number(entry.index)];\n      if (!policy) {\n        throw new Error(`Mint redeemer index ${entry.index} has no policy.`);\n      }\n      return { Minting: [policy] };\n    }\n    case \"withdraw\": {\n      const withdrawal = toArray(body.withdrawals()?.keys())[\n        Number(entry.index)\n      ];\n      if (!withdrawal) {\n        throw new Error(\n          `Withdraw redeemer index ${entry.index} has no withdrawal.`,\n        );\n      }\n      return { Rewarding: [credentialFromRewardAddress(withdrawal)] };\n    }\n    case \"publish\": {\n      const certificate = body.certs()?.get(Number(entry.index));\n      if (!certificate) {\n        throw new Error(`Publish redeemer index ${entry.index} has no cert.`);\n      }\n      return {\n        Certifying: [entry.index, txCertFromCml(certificate)],\n      };\n    }\n    case \"vote\": {\n      const voter = voterForRedeemerIndex(tx, entry.index);\n      if (!voter) {\n        throw new Error(`Vote redeemer index ${entry.index} has no voter.`);\n      }\n      return { Voting: [voterFromCml(voter)] };\n    }\n    case \"propose\": {\n      const proposal = proposalProcedureForRedeemerIndex(tx, entry.index);\n      if (!proposal) {\n        throw new Error(\n          `Propose redeemer index ${entry.index} has no proposal.`,\n        );\n      }\n      return {\n        Proposing: [entry.index, proposalProcedureFromCml(proposal)],\n      };\n    }\n  }\n};\n\nconst redeemersFromWitnessSet = (\n  tx: CML.Transaction,\n  info: CanonicalRedeemerInfo,\n): {\n  redeemerMap: Map<ScriptPurposeData, PlutusDataValue>;\n  redeemerByPurpose: Map<string, PlutusDataValue>;\n  purposesByKey: Map<string, ScriptPurposeData>;\n} => {\n  const redeemers = withCMLScope((own) => own(tx.witness_set()).redeemers());\n  if (!redeemers) {\n    return {\n      redeemerMap: new Map(),\n      redeemerByPurpose: new Map(),\n      purposesByKey: new Map(),\n    };\n  }\n  const cmlEntries = canonicalRedeemerEntries(redeemers);\n  let entries;\n  try {\n    entries = cmlEntries.map((entry) => {\n      const purpose = purposeFromRedeemerEntry(entry, info, tx);\n      return [purpose, datumFromPlutusData(entry.data)] as const;\n    });\n  } finally {\n    freeCanonicalRedeemerEntries(cmlEntries);\n    redeemers.free();\n  }\n  const sortedEntries = [...entries].sort(([left], [right]) =>\n    compareScriptPurpose(left, right),\n  );\n  const redeemerMap = new Map(sortedEntries);\n  const redeemerByPurpose = new Map<string, PlutusDataValue>();\n  const purposesByKey = new Map<string, ScriptPurposeData>();\n  for (const [purpose, redeemer] of sortedEntries) {\n    const key = scriptPurposeKey(purpose);\n    redeemerByPurpose.set(key, redeemer);\n    purposesByKey.set(key, purpose);\n  }\n  return { redeemerMap, redeemerByPurpose, purposesByKey };\n};\n\nconst spendingDatumForPurpose = (\n  purpose: TxOutRefData,\n  info: CanonicalRedeemerInfo,\n  datums: Map<string, PlutusDataValue>,\n): PlutusDataValue | null => {\n  const input = info.inputs.find(\n    (candidate) =>\n      candidate.txHash === purpose.txOutRefId &&\n      BigInt(candidate.outputIndex) === purpose.txOutRefIdx,\n  );\n  if (!input) return null;\n  if (input.datum) return Data.from(input.datum);\n  if (input.datumHash) return datums.get(input.datumHash) ?? null;\n  return null;\n};\n\nconst scriptInfoFromPurpose = (\n  purpose: ScriptPurposeData,\n  info: CanonicalRedeemerInfo,\n  datums: Map<string, PlutusDataValue>,\n): ScriptInfoData => {\n  if (\"Minting\" in purpose) return { MintingScript: purpose.Minting };\n  if (\"Spending\" in purpose) {\n    return {\n      SpendingScript: [\n        purpose.Spending[0],\n        spendingDatumForPurpose(purpose.Spending[0], info, datums),\n      ],\n    };\n  }\n  if (\"Rewarding\" in purpose) return { RewardingScript: purpose.Rewarding };\n  if (\"Certifying\" in purpose) {\n    return { CertifyingScript: purpose.Certifying };\n  }\n  if (\"Voting\" in purpose) return { VotingScript: purpose.Voting };\n  return { ProposingScript: purpose.Proposing };\n};\n\nconst txInfoFromTransaction = (\n  tx: CML.Transaction,\n  info: CanonicalRedeemerInfo,\n  slotConfig: SlotConfig | undefined,\n  redeemerMap: Map<ScriptPurposeData, PlutusDataValue>,\n  txInfoId: string,\n): TxInfoData => {\n  const body = tx.body();\n  return {\n    txInfoInputs: info.inputs.map(txInInfoFromUtxo),\n    txInfoReferenceInputs: info.referenceInputs.map(txInInfoFromUtxo),\n    txInfoOutputs: toArray(body.outputs()).map(txOutFromCml),\n    txInfoFee: body.fee(),\n    txInfoMint: mintValueFromCml(body.mint()),\n    txInfoTxCerts: txCertificatesFromBody(body),\n    txInfoWdrl: withdrawalsFromBody(body),\n    txInfoValidRange: validityRangeFromBody(body, slotConfig),\n    txInfoSignatories: signatoriesFromBody(body),\n    txInfoRedeemers: redeemerMap,\n    txInfoData: datumMapFromWitnessSet(tx.witness_set()),\n    txInfoId,\n    txInfoVotes: votingProceduresFromCml(body.voting_procedures()),\n    txInfoProposalProcedures: proposalsFromBody(body),\n    txInfoCurrentTreasuryAmount: body.current_treasury_value() ?? null,\n    txInfoTreasuryDonation: body.donation() ?? null,\n  };\n};\n\nconst canonicalTransaction = (tx: CML.Transaction): CML.Transaction =>\n  CML.Transaction.from_cbor_bytes(tx.to_canonical_cbor_bytes());\n\nconst canonicalInfo = (\n  tx: CML.Transaction,\n  resolvedInputs: ReadonlyArray<UTxO>,\n): CanonicalRedeemerInfo =>\n  Effect.runSync(buildCanonicalRedeemerInfo(tx, resolvedInputs));\n\nexport const makeScriptContexts = (\n  tx: CML.Transaction,\n  options: ScriptContextOptions = {},\n): ScriptContextData[] => {\n  const txInfoId = CML.hash_transaction(tx.body()).to_hex();\n  const canonicalTx = canonicalTransaction(tx);\n  const info = canonicalInfo(canonicalTx, options.resolvedInputs ?? []);\n  const datums = datumMapFromWitnessSet(canonicalTx.witness_set());\n  const { redeemerMap, redeemerByPurpose, purposesByKey } =\n    redeemersFromWitnessSet(canonicalTx, info);\n  const txInfo = txInfoFromTransaction(\n    canonicalTx,\n    info,\n    options.slotConfig,\n    redeemerMap,\n    txInfoId,\n  );\n\n  return [...purposesByKey.entries()]\n    .sort(([, left], [, right]) => compareScriptPurpose(left, right))\n    .map(([key, purpose]) => ({\n      scriptContextTxInfo: txInfo,\n      scriptContextRedeemer: redeemerByPurpose.get(key)!,\n      scriptContextScriptInfo: scriptInfoFromPurpose(purpose, info, datums),\n    }));\n};\n\nexport const makeScriptContext = (\n  tx: CML.Transaction,\n  purpose: ScriptPurposeData,\n  options: ScriptContextOptions = {},\n): ScriptContextData => {\n  const txInfoId = CML.hash_transaction(tx.body()).to_hex();\n  const canonicalTx = canonicalTransaction(tx);\n  const info = canonicalInfo(canonicalTx, options.resolvedInputs ?? []);\n  const datums = datumMapFromWitnessSet(canonicalTx.witness_set());\n  const { redeemerMap, redeemerByPurpose, purposesByKey } =\n    redeemersFromWitnessSet(canonicalTx, info);\n  const key = scriptPurposeKey(purpose);\n  const canonicalPurpose = purposesByKey.get(key);\n  const redeemer = redeemerByPurpose.get(key);\n  if (!canonicalPurpose || redeemer === undefined) {\n    throw new Error(\n      `No redeemer found for ScriptContext purpose ${JSON.stringify(purpose)}.`,\n    );\n  }\n  return {\n    scriptContextTxInfo: txInfoFromTransaction(\n      canonicalTx,\n      info,\n      options.slotConfig,\n      redeemerMap,\n      txInfoId,\n    ),\n    scriptContextRedeemer: redeemer,\n    scriptContextScriptInfo: scriptInfoFromPurpose(\n      canonicalPurpose,\n      info,\n      datums,\n    ),\n  };\n};\n","import { Effect } from \"effect\";\nimport {\n  Assets,\n  BuildTxWithRedeemer,\n  OutRef,\n  PolicyId,\n  Redeemer,\n  RedeemerBuilder,\n  RedeemerContext,\n  RedeemerPurpose,\n  RedeemerTag,\n  RewardAddress,\n  TxOutput,\n  UTxO,\n  WithdrawalEntry,\n} from \"@lucid-evolution/core-types\";\nimport {\n  coreToOutRef,\n  coreToTxOutput,\n  fromCMLRedeemerTag,\n} from \"@lucid-evolution/utils\";\nimport { CML } from \"../../core.js\";\nimport { withCMLScope } from \"@lucid-evolution/core-utils\";\nimport { TxBuilderError } from \"../../Errors.js\";\nimport type { TxBuilderConfig } from \"../TxBuilder.js\";\n\nexport type BuildTxRedeemer = Redeemer | RedeemerBuilder | BuildTxWithRedeemer;\n\nexport type DelayedRedeemer = RedeemerBuilder | BuildTxWithRedeemer;\n\nexport type WitnessPurposeKey =\n  | { readonly tag: \"spend\"; readonly input: OutRef }\n  | { readonly tag: \"mint\"; readonly policyId: PolicyId }\n  | { readonly tag: \"withdraw\"; readonly rewardAddress: RewardAddress }\n  | { readonly tag: \"publish\"; readonly index: bigint }\n  | { readonly tag: \"propose\"; readonly index: bigint }\n  | { readonly tag: \"propose\"; readonly proposalKey: string }\n  | { readonly tag: \"vote\"; readonly index: bigint }\n  | { readonly tag: \"vote\"; readonly voterKey: string };\n\nexport type PendingRedeemer = Readonly<{\n  id: number;\n  actionId: number;\n  source: DelayedRedeemer;\n  purposeKey: WitnessPurposeKey;\n}>;\n\nexport type CanonicalRedeemerInfo = Readonly<{\n  txBody: CML.TransactionBody;\n  inputs: ReadonlyArray<UTxO>;\n  referenceInputs: ReadonlyArray<UTxO>;\n  outputs: ReadonlyArray<TxOutput>;\n  mint: Readonly<Assets>;\n  withdrawals: RedeemerContext[\"withdrawals\"];\n  redeemers: ReadonlyArray<RedeemerPurpose>;\n  inputIndex: (input: OutRef) => bigint | undefined;\n  outputIndex: (predicate: (output: TxOutput) => boolean) => bigint | undefined;\n  withdrawalIndex: (rewardAddress: RewardAddress) => bigint | undefined;\n  mintPolicyIndex: (policyId: PolicyId) => bigint | undefined;\n  redeemerIndex: (purpose: RedeemerPurpose) => bigint | undefined;\n  purposeByKey: ReadonlyMap<string, RedeemerPurpose>;\n}>;\n\nexport type CanonicalRedeemerEntry = Readonly<{\n  tag: RedeemerTag;\n  index: bigint;\n  data: CML.PlutusData;\n  exUnits: CML.ExUnits;\n  sortKey: Uint8Array;\n}>;\n\nexport type RedeemerBuilderCache = Map<number, Map<string, Redeemer>>;\n\nexport const redeemerContextError = (cause: unknown) =>\n  new TxBuilderError({ cause: `{ RedeemerContext: ${cause} }` });\n\nexport const isRedeemerBuilder = (\n  redeemer: BuildTxRedeemer | undefined,\n): redeemer is RedeemerBuilder =>\n  typeof redeemer === \"object\" &&\n  redeemer !== null &&\n  \"kind\" in redeemer &&\n  (redeemer.kind === \"selected\" || redeemer.kind === \"self\");\n\nexport const isBuildTxWithRedeemer = (\n  redeemer: BuildTxRedeemer | undefined,\n): redeemer is BuildTxWithRedeemer => typeof redeemer === \"function\";\n\nexport const isDelayedRedeemer = (\n  redeemer: BuildTxRedeemer | undefined,\n): redeemer is DelayedRedeemer =>\n  isRedeemerBuilder(redeemer) || isBuildTxWithRedeemer(redeemer);\n\nexport const cloneAssets = (assets: Assets): Assets => ({ ...assets });\n\nexport const cloneUTxO = (utxo: UTxO): UTxO => ({\n  ...utxo,\n  assets: cloneAssets(utxo.assets),\n  scriptRef: utxo.scriptRef ? { ...utxo.scriptRef } : utxo.scriptRef,\n});\n\nexport const cloneUTxOs = (utxos: UTxO[]): UTxO[] => utxos.map(cloneUTxO);\n\nexport const cloneRedeemerBuilder = (\n  redeemerBuilder: RedeemerBuilder,\n  selfInputs?: UTxO[],\n): RedeemerBuilder =>\n  redeemerBuilder.kind === \"selected\"\n    ? {\n        kind: \"selected\",\n        makeRedeemer: redeemerBuilder.makeRedeemer,\n        inputs: cloneUTxOs(redeemerBuilder.inputs),\n      }\n    : {\n        kind: \"self\",\n        makeRedeemer: redeemerBuilder.makeRedeemer,\n        inputs: selfInputs\n          ? cloneUTxOs(selfInputs)\n          : redeemerBuilder.inputs\n            ? cloneUTxOs(redeemerBuilder.inputs)\n            : undefined,\n      };\n\nexport const cloneRedeemerInput = (\n  redeemer: BuildTxRedeemer | undefined,\n  selfInputs?: UTxO[],\n): BuildTxRedeemer | undefined =>\n  isRedeemerBuilder(redeemer)\n    ? cloneRedeemerBuilder(redeemer, selfInputs)\n    : redeemer;\n\nexport const outRefKey = (outRef: OutRef): string =>\n  `${outRef.txHash}#${outRef.outputIndex}`;\n\nexport const witnessPurposeKey = (purposeKey: WitnessPurposeKey): string => {\n  switch (purposeKey.tag) {\n    case \"spend\":\n      return `spend:${outRefKey(purposeKey.input)}`;\n    case \"mint\":\n      return `mint:${purposeKey.policyId}`;\n    case \"withdraw\":\n      return `withdraw:${purposeKey.rewardAddress}`;\n    case \"publish\":\n      return `${purposeKey.tag}:${purposeKey.index}`;\n    case \"propose\":\n      return \"proposalKey\" in purposeKey\n        ? `propose:proposal:${purposeKey.proposalKey}`\n        : `propose:${purposeKey.index}`;\n    case \"vote\":\n      return \"voterKey\" in purposeKey\n        ? `vote:voter:${purposeKey.voterKey}`\n        : `vote:${purposeKey.index}`;\n  }\n};\n\nexport const purposeToWitnessKey = (\n  purpose: RedeemerPurpose,\n): WitnessPurposeKey => {\n  switch (purpose.tag) {\n    case \"spend\":\n      return { tag: \"spend\", input: purpose.input };\n    case \"mint\":\n      return { tag: \"mint\", policyId: purpose.policyId };\n    case \"withdraw\":\n      return { tag: \"withdraw\", rewardAddress: purpose.rewardAddress };\n    case \"publish\":\n      return { tag: purpose.tag, index: purpose.index };\n    case \"propose\":\n      return purpose.proposalKey\n        ? { tag: \"propose\", proposalKey: purpose.proposalKey }\n        : { tag: \"propose\", index: purpose.index };\n    case \"vote\":\n      return purpose.voterKey\n        ? { tag: \"vote\", voterKey: purpose.voterKey }\n        : { tag: \"vote\", index: purpose.index };\n  }\n};\n\nexport const registerPendingRedeemer = (\n  config: TxBuilderConfig,\n  pending: PendingRedeemer,\n) =>\n  Effect.gen(function* () {\n    const key = witnessPurposeKey(pending.purposeKey);\n    if (config.witnessRegistry.has(key)) {\n      yield* redeemerContextError(`Duplicate script witness purpose: ${key}`);\n    }\n    config.witnessRegistry.add(key);\n    config.pendingRedeemers.push(pending);\n  });\n\nconst findResolvedInput = (\n  outRef: OutRef,\n  candidates: ReadonlyArray<UTxO>,\n): UTxO | undefined => {\n  const key = outRefKey(outRef);\n  let best: UTxO | undefined;\n  let bestScore = -1;\n  for (const candidate of candidates) {\n    if (outRefKey(candidate) !== key) continue;\n    const score = resolvedUtxoCompletenessScore(candidate);\n    if (score > bestScore) {\n      best = candidate;\n      bestScore = score;\n    }\n  }\n  return best;\n};\n\nconst resolvedUtxoCompletenessScore = (utxo: UTxO): number =>\n  (utxo.datum ? 4 : 0) + (utxo.scriptRef ? 2 : 0) + (utxo.datumHash ? 1 : 0);\n\nexport const resolveCanonicalInputs = (\n  tx: CML.Transaction,\n  candidates: ReadonlyArray<UTxO>,\n): Effect.Effect<UTxO[], TxBuilderError> =>\n  Effect.gen(function* () {\n    const outRefs = withCMLScope((own) => {\n      const bodyInputs = own(own(tx.body()).inputs());\n      return Array.from({ length: bodyInputs.len() }, (_, i) =>\n        coreToOutRef(own(bodyInputs.get(i))),\n      );\n    });\n    const inputs: UTxO[] = [];\n    for (const outRef of outRefs) {\n      const resolved = findResolvedInput(outRef, candidates);\n      if (!resolved) {\n        yield* redeemerContextError(\n          `Could not resolve transaction input ${outRefKey(outRef)}`,\n        );\n        continue;\n      }\n      inputs.push(cloneUTxO(resolved));\n    }\n    return inputs;\n  });\n\nexport const resolveCanonicalReferenceInputs = (\n  tx: CML.Transaction,\n  candidates: ReadonlyArray<UTxO>,\n): Effect.Effect<UTxO[], TxBuilderError> =>\n  Effect.gen(function* () {\n    const outRefs = withCMLScope((own) => {\n      const bodyInputs = own(own(tx.body()).reference_inputs());\n      if (!bodyInputs) return [];\n      return Array.from({ length: bodyInputs.len() }, (_, i) =>\n        coreToOutRef(own(bodyInputs.get(i))),\n      );\n    });\n    const inputs: UTxO[] = [];\n    for (const outRef of outRefs) {\n      const resolved = findResolvedInput(outRef, candidates);\n      if (!resolved) {\n        yield* redeemerContextError(\n          `Could not resolve reference input ${outRefKey(outRef)}`,\n        );\n        continue;\n      }\n      inputs.push(cloneUTxO(resolved));\n    }\n    return inputs;\n  });\n\nconst deriveOutputs = (body: CML.TransactionBody): TxOutput[] =>\n  withCMLScope((own) => {\n    const outputs = own(body.outputs());\n    const result: TxOutput[] = [];\n    for (let i = 0; i < outputs.len(); i++) {\n      result.push(coreToTxOutput(own(outputs.get(i))));\n    }\n    return result;\n  });\n\nconst deriveMint = (body: CML.TransactionBody): Assets =>\n  withCMLScope((own) => {\n    const mint = own(body.mint());\n    const assets: Assets = {};\n    if (!mint) return assets;\n    const policies = own(mint.keys());\n    for (let i = 0; i < policies.len(); i++) {\n      const policy = own(policies.get(i));\n      const policyId = policy.to_hex();\n      const policyAssets = own(mint.get_assets(policy)!);\n      const assetNames = own(policyAssets.keys());\n      for (let j = 0; j < assetNames.len(); j++) {\n        const assetName = own(assetNames.get(j));\n        const quantity = policyAssets.get(assetName)!;\n        if (quantity !== 0n) {\n          assets[policyId + assetName.to_js_value()] = quantity;\n        }\n      }\n    }\n    return assets;\n  });\n\nconst deriveMintPolicyIds = (body: CML.TransactionBody): PolicyId[] =>\n  withCMLScope((own) => {\n    const mint = own(body.mint());\n    if (!mint) return [];\n    const policies = own(mint.keys());\n    const result: PolicyId[] = [];\n    for (let i = 0; i < policies.len(); i++) {\n      result.push(own(policies.get(i)).to_hex());\n    }\n    return result;\n  });\n\nconst deriveWithdrawals = (\n  body: CML.TransactionBody,\n): RedeemerContext[\"withdrawals\"] =>\n  withCMLScope((own) => {\n    const withdrawals = own(body.withdrawals());\n    if (!withdrawals) return [];\n    const rewardAddresses = own(withdrawals.keys());\n    const result: WithdrawalEntry[] = [];\n    for (let i = 0; i < rewardAddresses.len(); i++) {\n      const rewardAddress = own(rewardAddresses.get(i));\n      result.push({\n        rewardAddress: own(rewardAddress.to_address()).to_bech32(undefined),\n        amount: withdrawals.get(rewardAddress)!,\n      });\n    }\n    return result;\n  });\n\nconst redeemerKeyBytes = (tag: CML.RedeemerTag, index: bigint): Uint8Array =>\n  withCMLScope((own) =>\n    own(CML.RedeemerKey.new(tag, index)).to_canonical_cbor_bytes(),\n  );\n\nconst cmlVoterKey = (voter: CML.Voter): string => voter.to_canonical_cbor_hex();\n\nconst cmlProposalKey = (proposal: CML.ProposalProcedure): string =>\n  proposal.to_canonical_cbor_hex();\n\nconst indexToSafeNumber = (index: bigint): number | undefined => {\n  if (index < 0n || index > BigInt(Number.MAX_SAFE_INTEGER)) return undefined;\n  return Number(index);\n};\n\nexport const proposalProcedureForRedeemerIndex = (\n  tx: CML.Transaction,\n  index: bigint,\n): CML.ProposalProcedure | undefined =>\n  withCMLScope((own) => {\n    const proposals = own(own(tx.body()).proposal_procedures());\n    if (!proposals) return undefined;\n    const target = indexToSafeNumber(index);\n    if (target === undefined) return undefined;\n\n    return target < proposals.len() ? proposals.get(target) : undefined;\n  });\n\nexport const voterForRedeemerIndex = (\n  tx: CML.Transaction,\n  index: bigint,\n): CML.Voter | undefined =>\n  withCMLScope((own) => {\n    const voters = own(own(own(tx.body()).voting_procedures())?.keys());\n    if (!voters) return undefined;\n    const target = indexToSafeNumber(index);\n    if (target === undefined) return undefined;\n\n    return target < voters.len() ? voters.get(target) : undefined;\n  });\n\n/**\n * The builder-side (tag, index) of a redeemer, kept as plain values so the map\n * that carries them owns no CML memory.\n */\nexport type BuilderRedeemerKey = {\n  readonly tag: CML.RedeemerTag;\n  readonly index: bigint;\n};\n\nexport type GovernanceRedeemerNormalization = Readonly<{\n  transaction: CML.Transaction;\n  builderKeyByLedgerKey: ReadonlyMap<string, BuilderRedeemerKey>;\n}>;\n\nconst voterIndexByKey = (\n  tx: CML.Transaction,\n  voterKey: string,\n): bigint | undefined =>\n  withCMLScope((own) => {\n    const voters = own(own(own(tx.body()).voting_procedures())?.keys());\n    if (!voters) return undefined;\n    for (let i = 0; i < voters.len(); i++) {\n      if (cmlVoterKey(own(voters.get(i))) === voterKey) return BigInt(i);\n    }\n    return undefined;\n  });\n\nconst governanceIndex = (\n  tx: CML.Transaction,\n  tag: RedeemerTag,\n  rawIndex: bigint,\n  voteWitnessKeys: readonly string[],\n  proposalWitnessIndices: readonly bigint[],\n): bigint => {\n  if (tag !== \"vote\" && tag !== \"propose\") return rawIndex;\n  const witnessIndex = indexToSafeNumber(rawIndex);\n  if (witnessIndex === undefined) {\n    throw redeemerContextError(\n      `Governance redeemer index ${rawIndex} is outside the safe integer range`,\n    );\n  }\n  if (tag === \"propose\") {\n    if (proposalWitnessIndices.length === 0) return rawIndex;\n    const ledgerIndex = proposalWitnessIndices[witnessIndex];\n    const proposalCount = withCMLScope((own) =>\n      own(own(tx.body()).proposal_procedures())?.len(),\n    );\n    if (\n      ledgerIndex === undefined ||\n      proposalCount === undefined ||\n      ledgerIndex < 0n ||\n      ledgerIndex >= BigInt(proposalCount)\n    ) {\n      throw redeemerContextError(\n        `Unable to map proposing redeemer index ${rawIndex} to a proposal procedure`,\n      );\n    }\n    return ledgerIndex;\n  }\n  if (voteWitnessKeys.length === 0) return rawIndex;\n  const voterKey = voteWitnessKeys[witnessIndex];\n  const ledgerIndex = voterKey ? voterIndexByKey(tx, voterKey) : undefined;\n  if (ledgerIndex === undefined) {\n    throw redeemerContextError(\n      `Unable to map voting redeemer index ${rawIndex} to a voter`,\n    );\n  }\n  return ledgerIndex;\n};\n\nexport const normalizeGovernanceRedeemerIndices = (\n  tx: CML.Transaction,\n  voteWitnessKeys: readonly string[],\n  proposalWitnessIndices: readonly bigint[],\n): GovernanceRedeemerNormalization =>\n  withCMLScope((own) => {\n    // The returned transaction is always a fresh copy; the caller owns it.\n    const transaction = CML.Transaction.from_cbor_bytes(tx.to_cbor_bytes());\n    const ledgerIndexTransaction = own(\n      CML.Transaction.from_cbor_bytes(tx.to_canonical_cbor_bytes()),\n    );\n    const witnessSet = own(transaction.witness_set());\n    const redeemers = own(witnessSet.redeemers());\n    const builderKeyByLedgerKey = new Map<string, BuilderRedeemerKey>();\n    if (!redeemers) return { transaction, builderKeyByLedgerKey };\n\n    const seen = new Set<string>();\n    const normalizeKey = (tag: CML.RedeemerTag, index: bigint): bigint => {\n      const lucidTag = fromCMLRedeemerTag(tag);\n      const normalizedIndex = governanceIndex(\n        ledgerIndexTransaction,\n        lucidTag,\n        index,\n        voteWitnessKeys,\n        proposalWitnessIndices,\n      );\n      const ledgerKey = `${lucidTag}:${normalizedIndex}`;\n      if (seen.has(ledgerKey)) {\n        throw redeemerContextError(\n          `Multiple builder redeemers map to ledger purpose ${ledgerKey}`,\n        );\n      }\n      seen.add(ledgerKey);\n      builderKeyByLedgerKey.set(ledgerKey, { tag, index });\n      return normalizedIndex;\n    };\n    const withNormalizedWitnessSet = (): GovernanceRedeemerNormalization => {\n      own(transaction);\n      return {\n        // `Transaction.new` takes ownership of the auxiliary data.\n        transaction: CML.Transaction.new(\n          own(transaction.body()),\n          witnessSet,\n          transaction.is_valid(),\n          transaction.auxiliary_data(),\n        ),\n        builderKeyByLedgerKey,\n      };\n    };\n\n    const legacy = own(redeemers.as_arr_legacy_redeemer());\n    if (legacy) {\n      const normalized = own(CML.LegacyRedeemerList.new());\n      for (let i = 0; i < legacy.len(); i++) {\n        const redeemer = own(legacy.get(i));\n        normalized.add(\n          own(\n            CML.LegacyRedeemer.new(\n              redeemer.tag(),\n              normalizeKey(redeemer.tag(), redeemer.index()),\n              own(redeemer.data()),\n              own(redeemer.ex_units()),\n            ),\n          ),\n        );\n      }\n      witnessSet.set_redeemers(\n        own(CML.Redeemers.new_arr_legacy_redeemer(normalized)),\n      );\n      return withNormalizedWitnessSet();\n    }\n\n    const map = own(redeemers.as_map_redeemer_key_to_redeemer_val());\n    if (map) {\n      const normalized = own(CML.MapRedeemerKeyToRedeemerVal.new());\n      const keys = own(map.keys());\n      for (let i = 0; i < keys.len(); i++) {\n        const key = own(keys.get(i));\n        normalized.insert(\n          own(\n            CML.RedeemerKey.new(\n              key.tag(),\n              normalizeKey(key.tag(), key.index()),\n            ),\n          ),\n          own(map.get(key)!),\n        );\n      }\n      witnessSet.set_redeemers(\n        own(CML.Redeemers.new_map_redeemer_key_to_redeemer_val(normalized)),\n      );\n      return withNormalizedWitnessSet();\n    }\n    return { transaction, builderKeyByLedgerKey };\n  });\n\nconst compareBytes = (a: Uint8Array, b: Uint8Array): number => {\n  if (a.length !== b.length) return a.length - b.length;\n  for (let i = 0; i < a.length; i++) {\n    if (a[i] !== b[i]) return a[i] - b[i];\n  }\n  return 0;\n};\n\n/**\n * The `data` and `exUnits` of every entry belong to the caller; release them\n * with `freeCanonicalRedeemerEntries` once they have been read.\n */\nexport const canonicalRedeemerEntries = (\n  redeemers: CML.Redeemers,\n): CanonicalRedeemerEntry[] =>\n  withCMLScope((own) => {\n    const entries: CanonicalRedeemerEntry[] = [];\n\n    const legacyRedeemers = own(redeemers.as_arr_legacy_redeemer());\n    if (legacyRedeemers) {\n      for (let i = 0; i < legacyRedeemers.len(); i++) {\n        const redeemer = own(legacyRedeemers.get(i));\n        const cmlTag = redeemer.tag();\n        const index = redeemer.index();\n        entries.push({\n          tag: fromCMLRedeemerTag(cmlTag),\n          index,\n          data: redeemer.data(),\n          exUnits: redeemer.ex_units(),\n          sortKey: redeemerKeyBytes(cmlTag, index),\n        });\n      }\n    }\n\n    const mapRedeemers = own(redeemers.as_map_redeemer_key_to_redeemer_val());\n    if (mapRedeemers) {\n      const keys = own(mapRedeemers.keys());\n      for (let i = 0; i < keys.len(); i++) {\n        const key = own(keys.get(i));\n        const value = own(mapRedeemers.get(key)!);\n        const cmlTag = key.tag();\n        const index = key.index();\n        entries.push({\n          tag: fromCMLRedeemerTag(cmlTag),\n          index,\n          data: value.data(),\n          exUnits: value.ex_units(),\n          sortKey: redeemerKeyBytes(cmlTag, index),\n        });\n      }\n    }\n\n    return entries.sort((left, right) =>\n      compareBytes(left.sortKey, right.sortKey),\n    );\n  });\n\nexport const freeCanonicalRedeemerEntries = (\n  entries: ReadonlyArray<CanonicalRedeemerEntry>,\n): void => {\n  for (const entry of entries) {\n    entry.data.free();\n    entry.exUnits.free();\n  }\n};\n\nconst deriveRedeemerPurposes = (\n  tx: CML.Transaction,\n  inputs: ReadonlyArray<UTxO>,\n  mintPolicyIds: ReadonlyArray<PolicyId>,\n  withdrawals: RedeemerContext[\"withdrawals\"],\n): Effect.Effect<RedeemerPurpose[], TxBuilderError> =>\n  Effect.gen(function* () {\n    const entries = withCMLScope((own) => {\n      const redeemers = own(own(tx.witness_set()).redeemers());\n      return redeemers ? canonicalRedeemerEntries(redeemers) : [];\n    });\n    // Only tags and indices are read below.\n    freeCanonicalRedeemerEntries(entries);\n    const purposes: RedeemerPurpose[] = [];\n    const finalKeys = new Set<string>();\n\n    for (let i = 0; i < entries.length; i++) {\n      const { tag, index } = entries[i];\n      const redeemerListIndex = BigInt(i);\n      const duplicateKey = `${tag}:${index}`;\n      if (finalKeys.has(duplicateKey)) {\n        yield* redeemerContextError(\n          `Duplicate final redeemer purpose: ${duplicateKey}`,\n        );\n      }\n      finalKeys.add(duplicateKey);\n\n      switch (tag) {\n        case \"spend\": {\n          const input = inputs[Number(index)];\n          if (!input) {\n            yield* redeemerContextError(\n              `Spend redeemer index ${index} is not present in tx inputs`,\n            );\n          }\n          purposes.push({\n            tag,\n            index,\n            input: {\n              txHash: input.txHash,\n              outputIndex: input.outputIndex,\n            },\n            redeemerListIndex,\n          });\n          break;\n        }\n        case \"mint\": {\n          const policyId = mintPolicyIds[Number(index)];\n          if (!policyId) {\n            yield* redeemerContextError(\n              `Mint redeemer index ${index} is not present in tx mint policies`,\n            );\n          }\n          purposes.push({ tag, index, policyId, redeemerListIndex });\n          break;\n        }\n        case \"withdraw\": {\n          const withdrawal = withdrawals[Number(index)];\n          if (!withdrawal) {\n            yield* redeemerContextError(\n              `Withdraw redeemer index ${index} is not present in withdrawals`,\n            );\n          }\n          purposes.push({\n            tag,\n            index,\n            rewardAddress: withdrawal.rewardAddress,\n            redeemerListIndex,\n          });\n          break;\n        }\n        case \"publish\":\n          purposes.push({ tag, index, redeemerListIndex });\n          break;\n        case \"propose\": {\n          const proposalKey = withCMLScope((own) => {\n            const proposal = own(proposalProcedureForRedeemerIndex(tx, index));\n            return proposal ? cmlProposalKey(proposal) : undefined;\n          });\n          purposes.push({ tag, index, proposalKey, redeemerListIndex });\n          break;\n        }\n        case \"vote\": {\n          const voterKey = withCMLScope((own) => {\n            const voter = own(voterForRedeemerIndex(tx, index));\n            return voter ? cmlVoterKey(voter) : undefined;\n          });\n          purposes.push({ tag, index, voterKey, redeemerListIndex });\n          break;\n        }\n      }\n    }\n    return purposes;\n  });\n\nexport const buildCanonicalRedeemerInfo = (\n  tx: CML.Transaction,\n  resolvedInputs: ReadonlyArray<UTxO>,\n): Effect.Effect<CanonicalRedeemerInfo, TxBuilderError> =>\n  Effect.gen(function* () {\n    const canonicalTx = CML.Transaction.from_cbor_bytes(\n      tx.to_canonical_cbor_bytes(),\n    );\n    const txBody = canonicalTx.body();\n    const inputs = yield* resolveCanonicalInputs(canonicalTx, resolvedInputs);\n    const referenceInputs = yield* resolveCanonicalReferenceInputs(\n      canonicalTx,\n      resolvedInputs,\n    );\n    const outputs = deriveOutputs(txBody);\n    const mint = deriveMint(txBody);\n    const mintPolicyIds = deriveMintPolicyIds(txBody);\n    const withdrawals = deriveWithdrawals(txBody);\n    const redeemers = yield* deriveRedeemerPurposes(\n      canonicalTx,\n      inputs,\n      mintPolicyIds,\n      withdrawals,\n    );\n    canonicalTx.free();\n\n    const inputIndices = new Map<string, bigint>();\n    inputs.forEach((input, index) => {\n      inputIndices.set(outRefKey(input), BigInt(index));\n    });\n\n    const withdrawalIndices = new Map<RewardAddress, bigint>();\n    withdrawals.forEach((withdrawal, index) => {\n      withdrawalIndices.set(withdrawal.rewardAddress, BigInt(index));\n    });\n\n    const mintPolicyIndices = new Map<PolicyId, bigint>();\n    mintPolicyIds.forEach((policyId, index) => {\n      mintPolicyIndices.set(policyId, BigInt(index));\n    });\n\n    const purposeByKey = new Map<string, RedeemerPurpose>();\n    const redeemerIndices = new Map<string, bigint>();\n    redeemers.forEach((purpose) => {\n      const key = witnessPurposeKey(purposeToWitnessKey(purpose));\n      purposeByKey.set(key, purpose);\n      if (purpose.tag === \"vote\" && purpose.voterKey) {\n        purposeByKey.set(`vote:${purpose.index}`, purpose);\n      }\n      if (purpose.tag === \"propose\" && purpose.proposalKey) {\n        purposeByKey.set(`propose:${purpose.index}`, purpose);\n      }\n      if (purpose.redeemerListIndex !== undefined) {\n        redeemerIndices.set(key, purpose.redeemerListIndex);\n        if (purpose.tag === \"vote\" && purpose.voterKey) {\n          redeemerIndices.set(\n            `vote:${purpose.index}`,\n            purpose.redeemerListIndex,\n          );\n        }\n        if (purpose.tag === \"propose\" && purpose.proposalKey) {\n          redeemerIndices.set(\n            `propose:${purpose.index}`,\n            purpose.redeemerListIndex,\n          );\n        }\n      }\n    });\n\n    return {\n      txBody,\n      inputs,\n      referenceInputs,\n      outputs,\n      mint,\n      withdrawals,\n      redeemers,\n      inputIndex: (input: OutRef) => inputIndices.get(outRefKey(input)),\n      outputIndex: (predicate: (output: TxOutput) => boolean) => {\n        const index = outputs.findIndex(predicate);\n        return index === -1 ? undefined : BigInt(index);\n      },\n      withdrawalIndex: (rewardAddress: RewardAddress) =>\n        withdrawalIndices.get(rewardAddress),\n      mintPolicyIndex: (policyId: PolicyId) => mintPolicyIndices.get(policyId),\n      redeemerIndex: (purpose: RedeemerPurpose) =>\n        redeemerIndices.get(witnessPurposeKey(purposeToWitnessKey(purpose))),\n      purposeByKey,\n    };\n  });\n\nexport const contextForPurpose = (\n  info: CanonicalRedeemerInfo,\n  ownPurpose: RedeemerPurpose,\n): RedeemerContext => ({\n  txBody: info.txBody,\n  inputs: info.inputs,\n  referenceInputs: info.referenceInputs,\n  outputs: info.outputs,\n  mint: info.mint,\n  withdrawals: info.withdrawals,\n  redeemers: info.redeemers,\n  ownPurpose,\n  inputIndex: info.inputIndex,\n  outputIndex: info.outputIndex,\n  withdrawalIndex: info.withdrawalIndex,\n  mintPolicyIndex: info.mintPolicyIndex,\n  redeemerIndex: info.redeemerIndex,\n});\n\nconst pendingGroups = (\n  pendingRedeemers: ReadonlyArray<PendingRedeemer>,\n): Map<number, PendingRedeemer[]> => {\n  const groups = new Map<number, PendingRedeemer[]>();\n  for (const pending of pendingRedeemers) {\n    const group = groups.get(pending.id);\n    if (group) group.push(pending);\n    else groups.set(pending.id, [pending]);\n  }\n  return groups;\n};\n\nconst memoizedRedeemerBuilderResult = (\n  cache: RedeemerBuilderCache | undefined,\n  pendingId: number,\n  signature: string,\n  makeRedeemer: () => Redeemer,\n): Redeemer => {\n  if (!cache) return makeRedeemer();\n  let pendingCache = cache.get(pendingId);\n  if (!pendingCache) {\n    pendingCache = new Map();\n    cache.set(pendingId, pendingCache);\n  }\n\n  const cached = pendingCache.get(signature);\n  if (cached !== undefined) return cached;\n\n  const redeemer = makeRedeemer();\n  pendingCache.set(signature, redeemer);\n  return redeemer;\n};\n\nconst selectedSignature = (indices: readonly bigint[]): string =>\n  `selected:${indices.map((index) => index.toString()).join(\",\")}`;\n\nconst selfSignature = (index: bigint): string => `self:${index.toString()}`;\n\nexport const buildRedeemersFromCanonicalContext = (\n  info: CanonicalRedeemerInfo,\n  pendingRedeemers: ReadonlyArray<PendingRedeemer>,\n  redeemerBuilderCache?: RedeemerBuilderCache,\n): Effect.Effect<Map<number, Redeemer>, TxBuilderError> =>\n  Effect.gen(function* () {\n    const nextRedeemers = new Map<number, Redeemer>();\n    for (const [pendingId, group] of pendingGroups(pendingRedeemers)) {\n      const source = group[0].source;\n      if (isRedeemerBuilder(source)) {\n        if (source.kind === \"selected\") {\n          const inputIndices = source.inputs.map((input) =>\n            info.inputIndex(input),\n          );\n          if (inputIndices.some((index) => index === undefined)) {\n            yield* redeemerContextError(\n              `RedeemerBuilder selected inputs are missing from canonical transaction inputs`,\n            );\n          }\n          const indices = inputIndices as bigint[];\n          nextRedeemers.set(\n            pendingId,\n            memoizedRedeemerBuilderResult(\n              redeemerBuilderCache,\n              pendingId,\n              selectedSignature(indices),\n              () => source.makeRedeemer(indices),\n            ),\n          );\n        } else {\n          const purposeKey = group[0].purposeKey;\n          if (group.length !== 1 || purposeKey.tag !== \"spend\") {\n            yield* redeemerContextError(\n              \"RedeemerBuilder self is only valid for spend witnesses\",\n            );\n            continue;\n          }\n          const index = info.inputIndex(purposeKey.input);\n          if (index === undefined) {\n            yield* redeemerContextError(\n              `RedeemerBuilder self input ${outRefKey(purposeKey.input)} is missing from canonical transaction inputs`,\n            );\n            continue;\n          }\n          nextRedeemers.set(\n            pendingId,\n            memoizedRedeemerBuilderResult(\n              redeemerBuilderCache,\n              pendingId,\n              selfSignature(index),\n              () => source.makeRedeemer(index),\n            ),\n          );\n        }\n      } else {\n        if (group.length !== 1) {\n          yield* redeemerContextError(\n            \"BuildTxWithRedeemer expects exactly one canonical script purpose\",\n          );\n        }\n        const key = witnessPurposeKey(group[0].purposeKey);\n        const ownPurpose = info.purposeByKey.get(key);\n        if (!ownPurpose) {\n          yield* redeemerContextError(\n            `Could not find canonical redeemer purpose for ${key}`,\n          );\n          continue;\n        }\n        nextRedeemers.set(\n          pendingId,\n          source(contextForPurpose(info, ownPurpose)),\n        );\n      }\n    }\n    return nextRedeemers;\n  });\n\nexport const redeemerMapsEqual = (\n  a: ReadonlyMap<number, Redeemer>,\n  b: ReadonlyMap<number, Redeemer>,\n): boolean => {\n  if (a.size !== b.size) return false;\n  for (const [key, value] of a.entries()) {\n    if (b.get(key) !== value) return false;\n  }\n  return true;\n};\n\nexport const transactionFixedPointFingerprint = (tx: CML.Transaction): string =>\n  withCMLScope((own) => {\n    const body = own(tx.body()).to_canonical_cbor_hex();\n    const redeemers = own(own(tx.witness_set()).redeemers());\n    const redeemerData: string[] = [];\n    const redeemerExUnits: string[] = [];\n    if (redeemers) {\n      const entries = canonicalRedeemerEntries(redeemers);\n      try {\n        for (const redeemer of entries) {\n          const index = redeemer.index.toString();\n          redeemerData.push(\n            `${redeemer.tag}:${index}:${redeemer.data.to_canonical_cbor_hex()}`,\n          );\n          redeemerExUnits.push(\n            `${redeemer.tag}:${index}:${redeemer.exUnits.mem()}:${redeemer.exUnits.steps()}`,\n          );\n        }\n      } finally {\n        freeCanonicalRedeemerEntries(entries);\n      }\n    }\n    return `${body}|${redeemerData.join(\",\")}|${redeemerExUnits.join(\",\")}`;\n  });\n\nexport const normalizeEvalUTxO = ({\n  datumHash,\n  datum,\n  ...rest\n}: UTxO): UTxO => ({\n  ...rest,\n  datumHash,\n  datum: datumHash ? undefined : datum,\n});\n","import { ProtocolParameters } from \"@lucid-evolution/core-types\";\nimport { CML } from \"../core.js\";\n\nexport const makeTxConfig = (\n  protocolParameters: ProtocolParameters,\n  costModels: CML.CostModels,\n): CML.TransactionBuilderConfig => {\n  const exUnitsPrices = CML.ExUnitPrices.new(\n    CML.SubCoin.new(\n      BigInt(protocolParameters.priceMem * 100_000_000),\n      100_000_000n,\n    ),\n    CML.SubCoin.new(\n      BigInt(protocolParameters.priceStep * 100_000_000),\n      100_000_000n,\n    ),\n  );\n  const txBuilderConfig = CML.TransactionBuilderConfigBuilder.new()\n    .fee_algo(\n      CML.LinearFee.new(\n        BigInt(protocolParameters.minFeeA),\n        BigInt(protocolParameters.minFeeB),\n        BigInt(protocolParameters.minFeeRefScriptCostPerByte),\n      ),\n    )\n    .coins_per_utxo_byte(protocolParameters.coinsPerUtxoByte)\n    .pool_deposit(protocolParameters.poolDeposit)\n    .key_deposit(protocolParameters.keyDeposit)\n    .max_value_size(protocolParameters.maxValSize)\n    .max_tx_size(protocolParameters.maxTxSize)\n    .ex_unit_prices(exUnitsPrices)\n    .collateral_percentage(protocolParameters.collateralPercentage)\n    .max_collateral_inputs(protocolParameters.maxCollateralInputs)\n    .cost_models(costModels)\n    .collateral_percentage(protocolParameters.collateralPercentage)\n    .max_collateral_inputs(protocolParameters.maxCollateralInputs)\n    .build();\n\n  return txBuilderConfig;\n};\n","import type {\n  Network,\n  Provider,\n  SlotConfig,\n} from \"@lucid-evolution/core-types\";\nimport { SLOT_CONFIG_NETWORK } from \"@lucid-evolution/plutus\";\nimport { isEmulatorProvider } from \"@lucid-evolution/provider\";\n\nconst copyAndValidateSlotConfig = (slotConfig: SlotConfig): SlotConfig => {\n  if (\n    !Number.isSafeInteger(slotConfig.zeroTime) ||\n    !Number.isSafeInteger(slotConfig.zeroSlot) ||\n    slotConfig.zeroSlot < 0 ||\n    !Number.isSafeInteger(slotConfig.slotLength) ||\n    slotConfig.slotLength <= 0\n  ) {\n    throw new RangeError(\n      \"Invalid slotConfig: zeroTime must be a safe integer, zeroSlot must be a non-negative safe integer, and slotLength must be a positive safe integer.\",\n    );\n  }\n\n  return Object.freeze({ ...slotConfig });\n};\n\nexport const resolveSlotConfig = (\n  provider: Provider | undefined,\n  network: Network | undefined,\n  explicit: SlotConfig | undefined,\n): SlotConfig | undefined => {\n  if (explicit) return copyAndValidateSlotConfig(explicit);\n\n  if (isEmulatorProvider(provider)) {\n    return copyAndValidateSlotConfig({\n      zeroTime: provider.now(),\n      zeroSlot: provider.slot,\n      slotLength: 1000,\n    });\n  }\n\n  if (!network) return undefined;\n\n  const staticConfig = SLOT_CONFIG_NETWORK[network];\n  if (network === \"Custom\" && staticConfig.slotLength <= 0) {\n    throw new Error(\n      \"Custom network slot configuration is uninitialized. Pass Lucid(..., { slotConfig }) with the network genesis mapping.\",\n    );\n  }\n  return copyAndValidateSlotConfig(staticConfig);\n};\n","import type {\n  Address,\n  AwaitTransactionOptions,\n  Credential,\n  PolicyId,\n  Provider,\n  RewardAccountState,\n  RewardAddress,\n  TransactionConfirmation,\n  TransactionStatus,\n  TransactionStatusOptions,\n  TxHash,\n  UTxO,\n} from \"@lucid-evolution/core-types\";\nimport { ProviderCapabilityError } from \"../Errors.js\";\n\nconst requireCapability = <T>(\n  capability: string,\n  implementation: T | undefined,\n): T => {\n  if (!implementation) throw new ProviderCapabilityError(capability);\n  return implementation;\n};\n\nconst normalizedPolicyId = (policyId: PolicyId): PolicyId => {\n  if (!/^[0-9a-f]{56}$/i.test(policyId)) {\n    throw new TypeError(\"policyId must be a 56-character hexadecimal string.\");\n  }\n  return policyId.toLowerCase();\n};\n\nexport const getUtxosWithPolicy = async (\n  provider: Provider,\n  addressOrCredential: Address | Credential,\n  policyId: PolicyId,\n): Promise<UTxO[]> => {\n  const normalized = normalizedPolicyId(policyId);\n  if (provider.getUtxosWithPolicy) {\n    return provider.getUtxosWithPolicy(addressOrCredential, normalized);\n  }\n\n  const utxos = await provider.getUtxos(addressOrCredential);\n  return utxos.filter((utxo) =>\n    Object.entries(utxo.assets).some(\n      ([unit, amount]) =>\n        unit !== \"lovelace\" &&\n        amount !== 0n &&\n        unit.length >= 56 &&\n        unit.slice(0, 56).toLowerCase() === normalized,\n    ),\n  );\n};\n\nexport const getRewardAccount = async (\n  provider: Provider,\n  rewardAddress: RewardAddress,\n): Promise<RewardAccountState> =>\n  await requireCapability(\n    \"getRewardAccount\",\n    provider.getRewardAccount?.bind(provider),\n  )(rewardAddress);\n\nexport const getTransactionStatus = async (\n  provider: Provider,\n  txHash: TxHash,\n  options?: TransactionStatusOptions,\n): Promise<TransactionStatus> =>\n  await requireCapability(\n    \"getTransactionStatus\",\n    provider.getTransactionStatus?.bind(provider),\n  )(txHash, options);\n\nconst abortError = (signal: AbortSignal): Error =>\n  signal.reason instanceof Error\n    ? signal.reason\n    : new DOMException(\"The operation was aborted.\", \"AbortError\");\n\nconst wait = (milliseconds: number, signal?: AbortSignal): Promise<void> =>\n  new Promise((resolve, reject) => {\n    if (signal?.aborted) {\n      reject(abortError(signal));\n      return;\n    }\n\n    const timer = setTimeout(() => {\n      signal?.removeEventListener(\"abort\", onAbort);\n      resolve();\n    }, milliseconds);\n    const onAbort = () => {\n      clearTimeout(timer);\n      signal?.removeEventListener(\"abort\", onAbort);\n      reject(abortError(signal!));\n    };\n    signal?.addEventListener(\"abort\", onAbort, { once: true });\n  });\n\nconst positiveNumber = (name: string, value: number): number => {\n  if (!Number.isFinite(value) || value <= 0) {\n    throw new RangeError(`${name} must be a positive finite number.`);\n  }\n  return value;\n};\n\nexport const awaitTransactionConfirmation = async (\n  provider: Provider,\n  txHash: TxHash,\n  options: AwaitTransactionOptions = {},\n): Promise<TransactionConfirmation> => {\n  const getStatus = requireCapability(\n    \"getTransactionStatus\",\n    provider.getTransactionStatus?.bind(provider),\n  );\n  const checkInterval = positiveNumber(\n    \"checkInterval\",\n    options.checkInterval ?? 3_000,\n  );\n  const timeout = positiveNumber(\"timeout\", options.timeout ?? 160_000);\n  const minimumConfirmations = positiveNumber(\n    \"minimumConfirmations\",\n    options.minimumConfirmations ?? 1,\n  );\n  if (!Number.isSafeInteger(minimumConfirmations)) {\n    throw new RangeError(\n      \"minimumConfirmations must be a positive safe integer.\",\n    );\n  }\n\n  const timeoutError = () =>\n    new Error(`Timed out waiting for transaction ${txHash}.`);\n  const deadline = Date.now() + timeout;\n  while (true) {\n    if (options.signal?.aborted) throw abortError(options.signal);\n\n    const queryTimeRemaining = deadline - Date.now();\n    if (queryTimeRemaining <= 0) throw timeoutError();\n\n    const queryController = new AbortController();\n    let timeoutId: ReturnType<typeof setTimeout> | undefined;\n    let onAbort: (() => void) | undefined;\n    const queryTimeout = new Promise<never>((_, reject) => {\n      timeoutId = setTimeout(() => {\n        const error = timeoutError();\n        queryController.abort(error);\n        reject(error);\n      }, queryTimeRemaining);\n    });\n    const queryAbort = new Promise<never>((_, reject) => {\n      if (!options.signal) return;\n      onAbort = () => {\n        const error = abortError(options.signal!);\n        queryController.abort(error);\n        reject(error);\n      };\n      options.signal.addEventListener(\"abort\", onAbort, { once: true });\n    });\n\n    let result: TransactionStatus;\n    try {\n      result = await Promise.race([\n        getStatus(txHash, { signal: queryController.signal }),\n        queryTimeout,\n        queryAbort,\n      ]);\n    } finally {\n      if (timeoutId !== undefined) clearTimeout(timeoutId);\n      if (onAbort) options.signal?.removeEventListener(\"abort\", onAbort);\n    }\n    if (result.status === \"failed\") {\n      throw new Error(`Transaction ${txHash} failed.`, {\n        cause: result.reason,\n      });\n    }\n    if (result.status === \"confirmed\") {\n      const confirmations = result.confirmation.confirmations;\n      if (\n        confirmations === undefined\n          ? minimumConfirmations === 1\n          : confirmations >= minimumConfirmations\n      ) {\n        return result.confirmation;\n      }\n    }\n\n    const remaining = deadline - Date.now();\n    if (remaining <= 0) {\n      throw timeoutError();\n    }\n    await wait(Math.min(checkInterval, remaining), options.signal);\n  }\n};\n"],"mappings":"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","names":["import_utils","import_plutus","import_effect","import_plutus","import_utils","import_core_utils","import_effect","CML","CML","import_effect","import_utils","import_utils","import_effect","import_effect","import_utils","import_core_utils","import_utils","import_core_utils","import_effect","import_utils","import_core_utils","import_effect","import_core_utils","CML","mintAssets","import_effect","import_plutus","import_effect","CML","import_core_utils","import_effect","CML","credential","config","import_effect","CML","import_core_utils","CML","import_effect","CML","import_effect","vote","import_effect","import_core_utils","import_effect","import_effect","import_core_utils","import_core_utils","S","import_effect","import_effect","S","import_effect","wallet","privateKey","witness","import_core_utils","import_plutus","import_plutus","import_effect","import_utils","import_core_utils","import_effect","import_utils","import_core_utils","ledgerIndex","vote","options","import_utils","_Array","tx","nextRedeemers","_BigInt","import_effect","import_utils","vote","import_plutus","import_provider","import_plutus","import_effect","provider","costModels","network","protocolParameters","slotConfig","options"]}