{"version":3,"sources":["../src/chains.ts","../src/fee/config.ts","../src/fee/app-config.ts","../src/config.ts","../src/utils/address.ts","../src/utils/retry.ts","../src/api/client.ts","../src/types/api.ts","../src/constants.ts","../src/routes.ts","../src/services/registry.ts","../src/utils/token.ts","../src/utils/bigint.ts","../src/utils/rpc.ts","../src/server/rate-limit.ts","../src/server/origin.ts","../src/server/backend-proxy.ts","../src/server/rpc-proxy.ts","../src/server/ssrf-guard.ts","../src/server/image-proxy.ts","../src/server/backend-metadata.ts","../src/server/siws-token.ts","../src/metadata.ts","../src/remix-policy.ts","../src/utils/ipfs-gateway.ts"],"names":["z","keccak_256","base58","base32","headers","SN","entry","endpoint","hmac","sha256","base64urlnopad"],"mappings":"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","file":"index.cjs","sourcesContent":["\n\nexport const CHAINS = [\"STARKNET\", \"ETHEREUM\", \"SOLANA\", \"BASE\", \"STELLAR\", \"BITCOIN\"] as const;\nexport type Chain = (typeof CHAINS)[number];\n\nexport interface StarknetCoordinates {\n  rpcUrl: string;\n  marketplace721?: `0x${string}`;\n  marketplace721ClassHash?: `0x${string}`;\n  marketplace721StartBlock?: number;\n  marketplace1155?: `0x${string}`;\n  marketplace1155ClassHash?: `0x${string}`;\n  marketplace1155StartBlock?: number;\n  collection721?: `0x${string}`;\n  collection721StartBlock?: number;\n  dataTokenization721?: `0x${string}`;\n  dataTokenization721StartBlock?: number;\n  ipNftClassHash?: `0x${string}`;\n  ipCollectionClassHash?: `0x${string}`;\n  collection1155?: `0x${string}`;\n  collection1155FactoryClassHash?: `0x${string}`;\n  collection1155ClassHash?: `0x${string}`;\n  collection1155StartBlock?: number;\n  popFactory?: `0x${string}`;\n  popCollectionClassHash?: `0x${string}`;\n  dropFactory?: `0x${string}`;\n  dropCollectionClassHash?: `0x${string}`;\n  nftComments?: `0x${string}`;\n  creatorCoinFactory?: `0x${string}`;\n  creatorCoinEkuboLauncher?: `0x${string}`;\n  creatorCoinClassHash?: `0x${string}`;\n  creatorCoinFactoryClassHash?: `0x${string}`;\n  creatorCoinStartBlock?: number;\n  ekuboCore?: `0x${string}`;\n  ipTicketsFactory?: `0x${string}`;\n  ipTicketCollectionClassHash?: `0x${string}`;\n  ipTicketsFactoryClassHash?: `0x${string}`;\n  ipTicketsStartBlock?: number;\n  ipClubFactory?: `0x${string}`;\n  ipClubFactoryClassHash?: `0x${string}`;\n  ipClubCollectionClassHash?: `0x${string}`;\n  ipClubFactoryStartBlock?: number;\n  ipSponsorship?: `0x${string}`;\n  ipSponsorshipClassHash?: `0x${string}`;\n  ipSponsorshipStartBlock?: number;\n  mediaWalletClassHash?: `0x${string}`;\n  genesisMintLaunch?: `0x${string}`;\n  genesisMintBR?: `0x${string}`;\n  genesisMintGlobal?: `0x${string}`;\n}\n\nexport interface EvmCoordinates {\n  rpcUrl: string;\n  marketplace721?: `0x${string}`;\n  marketplace721StartBlock?: number;\n  marketplace1155?: `0x${string}`;\n  marketplace1155StartBlock?: number;\n  mipRegistry?: `0x${string}`;\n  mipRegistryStartBlock?: number;\n  mipEditionsRegistry?: `0x${string}`;\n  mipEditionsRegistryStartBlock?: number;\n}\n\nexport interface SolanaCoordinates {\n  rpcUrl: string;\n  mipCollectionsProgram?: string;\n  marketplaceProgram?: string;\n  startSlot?: number;\n}\n\nexport interface StellarCoordinates {\n  rpcUrl: string;\n  mipRegistry?: string;\n  marketplace?: string;\n  collectionWasmHash?: string;\n  startLedger?: number;\n}\n\nexport interface CoordinatesByChain {\n  STARKNET?: StarknetCoordinates;\n  ETHEREUM?: EvmCoordinates;\n  BASE?: EvmCoordinates;\n  SOLANA?: SolanaCoordinates;\n  STELLAR?: StellarCoordinates;\n  BITCOIN?: never;\n}\n\nexport type ChainCoordinates = StarknetCoordinates;\n\nconst COORDINATES: CoordinatesByChain = {\n  STARKNET: {\n    rpcUrl: \"https://rpc.starknet.lava.build\",\n    marketplace721: \"0x03eda9a2b6ad90845a43591bac8083ebaf677d51fdf20f503b2c01889e3131fc\",\n    marketplace721ClassHash: \"0x0700d9230d07e5203e27778c0dc70f9134d2b25bf319f7cf8348dc66a6923e90\",\n    marketplace721StartBlock: 11198146,\n    marketplace1155: \"0x07c4ce1c19ea48cc11135ed22b19ff745f5aec508c3828593002e4f76fdb1b38\",\n    marketplace1155ClassHash: \"0x0242f5c388da7cee2d99e2a69453c8159bf927fbec4e797a3cfdcbbcb5b68328\",\n    marketplace1155StartBlock: 11198267,\n    collection721: \"0x0225c3ae09506b8d97adc39649ca740dad5aac195b7f5f0441cc1852947acaea\",\n    collection721StartBlock: 11198496,\n    dataTokenization721: \"0x07421b4442f7f2052c65408fb3561484154cf8175a0bbb41e3cd38d9087af6d2\",\n    dataTokenization721StartBlock: 14670294,\n    ipNftClassHash: \"0x012d3ae40ba35c7e2be0946532dac60e48932447912fdf96b674da67c029b9cc\",\n    ipCollectionClassHash: \"0x022155a1a130a40e57aac4b89c07fab3f616bc351b1270fc40f756b963afe8b4\",\n    collection1155: \"0x015368976d46fae5bfa1c58600f641d5aa5dbbf53ebc6b78aa3922194aad3551\",\n    collection1155FactoryClassHash: \"0x04eb6b419770f13bd191f120b9fc9ee624c0613ad4490062d293ca2016b3b1d2\",\n    collection1155ClassHash: \"0x06cf3f5a2322dac35e07a6064a5b8802f19fda8aa3f4726f0cb7bc05dea1bd78\",\n    collection1155StartBlock: 11199527,\n    popFactory: \"0x00b32c34b427d8f346b5843ada6a37bd3368d879fc752cd52b68a87287f60111\",\n    popCollectionClassHash: \"0x077c421686f10851872561953ea16898d933364b7f8937a5d7e2b1ba0a36263f\",\n    dropFactory: \"0x03587f42e29daee1b193f6cf83bf8627908ed6632d0d83fcb26225c50547d800\",\n    dropCollectionClassHash: \"0x00092e72cdb63067521e803aaf7d4101c3e3ce026ae6bc045ec4228027e58282\",\n    nftComments: \"0x02cdac70c94447189af0389dfea63f4d5e4154ea8a563de288a5ab1c39e37843\",\n    creatorCoinFactory: \"0x50fa807b5274079fb19374673d7bab6d2dc3af7e1032ea43eb6e44bcbde4c3c\",\n    creatorCoinEkuboLauncher: \"0x4f7fceb5ac10f12f9544a09580592e5bdf1b7f04f48765eecf12286d8ccb7b4\",\n    creatorCoinClassHash: \"0x743e4c8a5b96bb83bbf4af04edbbb482d5ece89eed9b729a79fb7df0cd0b6b6\",\n    creatorCoinFactoryClassHash: \"0x51765926b1344c9a20b8cd4b5abe7b7d47375ae97cf6804db3ea5d4b05a9b55\",\n    creatorCoinStartBlock: 10474544,\n    ekuboCore: \"0x00000005dd3d2f4429af886cd1a3b08289dbcea99a294197e9eb43b0e0325b4b\",\n    ipTicketsFactory: \"0x0767bf5b57e1f812463159b5ed683183e1b0c3f942b74871b5c6cd6a93c15e99\",\n    ipTicketCollectionClassHash: \"0x0449e8eb7c117740d07cb8e0157d32c8ba3d19d1cfd2784ed5e139f5a1e04acc\",\n    ipTicketsFactoryClassHash: \"0x04a739ac3a673ebd0db96bb24475600797c3ed34827e79517f9b2b1640276e6a\",\n    ipTicketsStartBlock: 11933694,\n    ipClubFactory: \"0x06a0b0be16d70c78f2e18119dbf90e5911cbfd5d8d484bc555dc61d96f56a2b9\",\n    ipClubFactoryClassHash: \"0x05d9d431bd3532b1fa4d5bab572f49c5ad8034ee3cc83951aa41ae82c9cad266\",\n    ipClubCollectionClassHash: \"0x05b8477c72e6bf0cf64967d71155021fd4d77d9a57e8805c6b40709121c002c5\",\n    ipClubFactoryStartBlock: 11928775,\n\n    ipSponsorship: \"0x03729ebe0fedf29ec97fca34db09174772af7f870af26a26e024a61040143e5c\",\n    ipSponsorshipClassHash: \"0x0626daac2ed7e2bf630ef5b10104b3202db1559216c0c1a504c0e99be2fbfec3\",\n    ipSponsorshipStartBlock: 11896456,\n    mediaWalletClassHash: \"0x014b210c7d47392691144bafecdca3c6c7791cc295ea305988da0a724c05ac31\",\n    genesisMintLaunch: \"0x06ed61abba98a44d45bed2c4b1a456df15053c3321cfd6e007afb33b7226c9f0\",\n    genesisMintBR: \"0x01f8b92e3b9e963b8eacb075207e2cc89d4614ff2ac6c2702c7ae10ad19a9db8\",\n    genesisMintGlobal: \"0x06ad4d55ed2d12ad5d6d55587d800874ef807b051bfefe13497e60ec5b019369\",\n  },\n};\n\nexport function getCoordinates(chain: \"STARKNET\"): StarknetCoordinates;\nexport function getCoordinates(chain: \"ETHEREUM\" | \"BASE\"): EvmCoordinates;\nexport function getCoordinates(chain: \"SOLANA\"): SolanaCoordinates;\nexport function getCoordinates(chain: \"STELLAR\"): StellarCoordinates;\nexport function getCoordinates(\n  chain: Chain,\n): StarknetCoordinates | EvmCoordinates | SolanaCoordinates | StellarCoordinates;\nexport function getCoordinates(\n  chain: Chain,\n): StarknetCoordinates | EvmCoordinates | SolanaCoordinates | StellarCoordinates {\n  const c = COORDINATES[chain];\n  if (!c) throw new Error(`No coordinates configured for chain \"${chain}\"`);\n  return c;\n}\n\nexport const DEFAULT_CHAIN: Chain = \"STARKNET\";\n\nexport function getStarknetCoordinates(chain: Chain): StarknetCoordinates {\n  if (chain !== \"STARKNET\") {\n    throw new Error(`This module is Starknet-only (client chain: \"${chain}\")`);\n  }\n  return getCoordinates(\"STARKNET\");\n}\n","import { z } from \"zod\";\n\nexport const FeeConfigSchema = z.object({\n  enabled: z.boolean().default(true),\n  fundAddress: z.string().min(1).optional(),\n  marketplaceBps: z.number().int().min(0).max(10000).default(100),\n  launchpadBps: z.number().int().min(0).max(10000).default(100),\n  sponsorshipBps: z.number().int().min(0).max(10000).default(100),\n});\n\nexport type FeeConfig = z.input<typeof FeeConfigSchema>;\n\nexport interface ResolvedFeeConfig {\n  enabled: boolean;\n  fundAddress: string | undefined;\n  marketplaceBps: number;\n  launchpadBps: number;\n  sponsorshipBps: number;\n}\n\nexport function resolveFeeConfig(raw: FeeConfig | undefined): ResolvedFeeConfig {\n  const p = FeeConfigSchema.parse(raw ?? {});\n  return {\n    enabled: p.enabled,\n    fundAddress: p.fundAddress,\n    marketplaceBps: p.marketplaceBps,\n    launchpadBps: p.launchpadBps,\n    sponsorshipBps: p.sponsorshipBps,\n  };\n}\n","import { resolveFeeConfig, type ResolvedFeeConfig } from \"./config.js\";\n\nexport interface FeeEnv {\n  NEXT_PUBLIC_FEE_ENABLED?: string;\n  NEXT_PUBLIC_FEE_FUND_ADDRESS?: string;\n  NEXT_PUBLIC_FEE_MARKETPLACE_BPS?: string;\n  NEXT_PUBLIC_FEE_LAUNCHPAD_BPS?: string;\n}\n\nconst DEFAULT_BPS = 100;\n\nfunction bps(raw: string | undefined): number {\n  if (!raw) return DEFAULT_BPS;\n  const n = Number(raw);\n  return Number.isFinite(n) ? n : DEFAULT_BPS;\n}\n\nexport function resolveAppFeeConfig(env: FeeEnv = {}): ResolvedFeeConfig {\n  return resolveFeeConfig({\n    enabled: env.NEXT_PUBLIC_FEE_ENABLED !== \"false\",\n    fundAddress: env.NEXT_PUBLIC_FEE_FUND_ADDRESS || undefined,\n    marketplaceBps: bps(env.NEXT_PUBLIC_FEE_MARKETPLACE_BPS),\n    launchpadBps: bps(env.NEXT_PUBLIC_FEE_LAUNCHPAD_BPS),\n  });\n}\n","import { z } from \"zod\";\nimport { CHAINS, getCoordinates, DEFAULT_CHAIN, type Chain } from \"./chains.js\";\nimport type { RetryOptions } from \"./utils/retry.js\";\nimport { FeeConfigSchema, resolveFeeConfig, type ResolvedFeeConfig } from \"./fee/index.js\";\n\nexport const MedialaneConfigSchema = z.object({\n\n  chain: z.enum(CHAINS).default(DEFAULT_CHAIN),\n  rpcUrl: z.string().url().optional(),\n  backendUrl: z.string().url().optional(),\n  apiKey: z.string().optional(),\n\n  marketplace721Contract: z.string().optional(),\n  marketplaceContract: z.string().optional(),\n  marketplace1155Contract: z.string().optional(),\n  collection721Contract: z.string().optional(),\n  collectionContract: z.string().optional(),\n  collection1155Contract: z.string().optional(),\n  retryOptions: z.object({\n    maxAttempts: z.number().int().min(1).max(10).optional(),\n    baseDelayMs: z.number().int().min(0).optional(),\n    maxDelayMs: z.number().int().min(0).optional(),\n  }).optional(),\n  feeConfig: FeeConfigSchema.optional(),\n});\n\nexport type MedialaneConfig = z.input<typeof MedialaneConfigSchema>;\n\nexport interface ResolvedConfig {\n  chain: Chain;\n  rpcUrl: string;\n  backendUrl: string | undefined;\n  apiKey: string | undefined;\n  marketplace721Contract: string;\n  marketplaceContract: string;\n  marketplace1155Contract: string;\n  collection721Contract: string;\n  collectionContract: string;\n  collection1155Contract: string;\n  retryOptions?: RetryOptions;\n  feeConfig: ResolvedFeeConfig;\n}\n\nexport function resolveConfig(raw: MedialaneConfig): ResolvedConfig {\n  const parsed = MedialaneConfigSchema.parse(raw);\n  const coords = getCoordinates(parsed.chain);\n\n  const sn = (parsed.chain === \"STARKNET\" ? coords : {}) as import(\"./chains.js\").StarknetCoordinates;\n\n  const marketplace721Contract =\n    parsed.marketplace721Contract ?? parsed.marketplaceContract ?? sn.marketplace721!;\n  const collection721Contract =\n    parsed.collection721Contract ?? parsed.collectionContract ?? sn.collection721!;\n\n  return {\n    chain: parsed.chain,\n    rpcUrl: parsed.rpcUrl ?? coords.rpcUrl,\n    backendUrl: parsed.backendUrl,\n    apiKey: parsed.apiKey,\n    marketplace721Contract,\n    marketplaceContract: marketplace721Contract,\n    marketplace1155Contract: parsed.marketplace1155Contract ?? sn.marketplace1155!,\n    collection721Contract,\n    collectionContract: collection721Contract,\n    collection1155Contract: parsed.collection1155Contract ?? sn.collection1155!,\n    retryOptions: parsed.retryOptions,\n    feeConfig: resolveFeeConfig(parsed.feeConfig),\n  };\n}\n","import { keccak_256 } from \"@noble/hashes/sha3.js\";\nimport { base32, base58 } from \"@scure/base\";\nimport type { Chain } from \"../chains.js\";\n\nexport function normalizeAddress(chain: Chain, address: string): string {\n  switch (chain) {\n    case \"STARKNET\":\n      return normalizeStarknet(address);\n    case \"ETHEREUM\":\n    case \"BASE\":\n      return normalizeEvm(address);\n    case \"SOLANA\":\n      return normalizeSolana(address);\n    case \"STELLAR\":\n      return normalizeStellar(address);\n    case \"BITCOIN\":\n      throw new Error(\"BITCOIN address normalization not implemented\");\n  }\n}\n\nfunction normalizeStarknet(address: string): string {\n  try {\n    const hex = BigInt(address).toString(16);\n    return \"0x\" + hex.padStart(64, \"0\").toLowerCase();\n  } catch {\n    throw new Error(`Invalid STARKNET address: \"${address}\"`);\n  }\n}\n\nfunction normalizeEvm(address: string): string {\n  const m = /^0x([0-9a-fA-F]{40})$/.exec(address);\n  if (!m) throw new Error(`Invalid ETHEREUM/BASE address: \"${address}\"`);\n  const lower = m[1].toLowerCase();\n\n  const hash = keccak_256(new TextEncoder().encode(lower));\n  let out = \"0x\";\n  for (let i = 0; i < 40; i++) {\n    const nibble = (hash[i >> 1]! >> (i % 2 === 0 ? 4 : 0)) & 0xf;\n    out += nibble >= 8 ? lower[i]!.toUpperCase() : lower[i];\n  }\n  return out;\n}\n\nfunction normalizeSolana(address: string): string {\n  try {\n    const bytes = base58.decode(address);\n    if (bytes.length !== 32) throw new Error(\"not a 32-byte key\");\n    return address;\n  } catch {\n    throw new Error(`Invalid SOLANA address: \"${address}\"`);\n  }\n}\n\nconst STELLAR_VERSION_BYTES = new Set([6 << 3, 2 << 3]);\n\nfunction normalizeStellar(address: string): string {\n  const upper = address.toUpperCase();\n  if (!/^[GC][A-Z2-7]{55}$/.test(upper)) {\n    throw new Error(`Invalid STELLAR address: \"${address}\"`);\n  }\n  let decoded: Uint8Array;\n  try {\n    decoded = base32.decode(upper);\n  } catch {\n    throw new Error(`Invalid STELLAR address: \"${address}\"`);\n  }\n  if (decoded.length !== 35 || !STELLAR_VERSION_BYTES.has(decoded[0]!)) {\n    throw new Error(`Invalid STELLAR address: \"${address}\"`);\n  }\n  const payload = decoded.subarray(0, 33);\n  const checksum = decoded[33]! | (decoded[34]! << 8);\n  if (crc16xmodem(payload) !== checksum) {\n    throw new Error(`Invalid STELLAR address: \"${address}\"`);\n  }\n  return upper;\n}\n\nfunction crc16xmodem(bytes: Uint8Array): number {\n  let crc = 0;\n  for (const byte of bytes) {\n    crc ^= byte << 8;\n    for (let i = 0; i < 8; i++) {\n      crc = crc & 0x8000 ? ((crc << 1) ^ 0x1021) & 0xffff : (crc << 1) & 0xffff;\n    }\n  }\n  return crc;\n}\n\ndeclare const canonicalHashBrand: unique symbol;\n\nexport type CanonicalHash = string & { readonly [canonicalHashBrand]: true };\n\nexport function normalizeHash(hash: string): CanonicalHash {\n  try {\n    const hex = BigInt(hash).toString(16);\n    return (\"0x\" + hex.padStart(64, \"0\").toLowerCase()) as CanonicalHash;\n  } catch {\n    throw new Error(`Invalid hash: \"${hash}\"`);\n  }\n}\n\nexport function shortenAddress(chain: Chain, address: string, chars = 4): string {\n  const norm = normalizeAddress(chain, address);\n  return `${norm.slice(0, chars + 2)}...${norm.slice(-chars)}`;\n}\n","import { MedialaneApiError } from \"../api/client.js\";\n\nexport interface RetryOptions {\n  maxAttempts?: number;\n  baseDelayMs?: number;\n  maxDelayMs?: number;\n}\n\nconst DEFAULT_MAX_ATTEMPTS = 3;\nconst DEFAULT_BASE_DELAY_MS = 300;\nconst DEFAULT_MAX_DELAY_MS = 5000;\n\nfunction sleep(ms: number): Promise<void> {\n  return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function withRetry<T>(\n  fn: () => Promise<T>,\n  opts?: RetryOptions\n): Promise<T> {\n  const maxAttempts = opts?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;\n  const baseDelayMs = opts?.baseDelayMs ?? DEFAULT_BASE_DELAY_MS;\n  const maxDelayMs = opts?.maxDelayMs ?? DEFAULT_MAX_DELAY_MS;\n\n  let lastError: unknown;\n\n  for (let attempt = 0; attempt < maxAttempts; attempt++) {\n    try {\n      return await fn();\n    } catch (err) {\n      lastError = err;\n\n      if (err instanceof MedialaneApiError && err.status < 500 && err.status !== 429) {\n        throw err;\n      }\n\n      const isRetryable =\n        (err instanceof MedialaneApiError && (err.status >= 500 || err.status === 429)) ||\n        err instanceof TypeError;\n\n      if (!isRetryable || attempt === maxAttempts - 1) {\n        throw err;\n      }\n\n      const retryAfterMs = err instanceof MedialaneApiError ? err.retryAfterMs : undefined;\n      const backoff = baseDelayMs * Math.pow(2, attempt) + Math.random() * baseDelayMs;\n      const delay = Math.min(retryAfterMs ?? backoff, maxDelayMs);\n      await sleep(delay);\n    }\n  }\n\n  throw lastError;\n}\n","import { normalizeAddress } from \"../utils/address.js\";\nimport type { Chain } from \"../chains.js\";\nimport type { ChainFilter } from \"../types/api.js\";\nimport type { MedialaneErrorCode } from \"../types/errors.js\";\nimport { withRetry, type RetryOptions } from \"../utils/retry.js\";\nimport type {\n  ApiOrder,\n  ApiOrdersQuery,\n  ApiCounterOffersQuery,\n  ApiToken,\n  ApiCollection,\n  ApiCoin,\n  ApiCoinPrices,\n  ApiCoinClaimResult,\n  ApiUserRewards,\n  ApiRewardsLeaderboardEntry,\n  ApiRewardsConfig,\n  ApiRewardsBatchEntry,\n  ApiPointEvent,\n  ApiCoinsQuery,\n  ApiCollectionProfile,\n  UpdateCollectionProfileInput,\n  ApiCreatorProfile,\n  ApiCreatorListResult,\n  ApiCollectionClaim,\n  ApiCollectionSlugClaim,\n  ApiBusinessProvisioning,\n  ApiWalletActivity,\n  ApiUserWallet,\n  ApiAppSource,\n  ApiChain,\n  ApiActivity,\n  ApiActivitiesQuery,\n  ApiComment,\n  ApiRemixOffer,\n  ApiRemixOffersQuery,\n  ApiPublicRemix,\n  ApiSearchResult,\n  ApiIntent,\n  ApiIntentCreated,\n  ApiTxSyncResult,\n  ApiMetadataSignedUrl,\n  ApiMetadataUpload,\n  ApiPortalMe,\n  ApiPortalKey,\n  ApiPortalKeyCreated,\n  ApiCreditPayment,\n  ApiPortalSpend,\n  ApiWebhookEndpoint,\n  ApiWebhookCreated,\n  CreateWebhookParams,\n  CreateListingIntentParams,\n  MakeOfferIntentParams,\n  FulfillOrderIntentParams,\n  CancelOrderIntentParams,\n  CreateMintIntentParams,\n  CreateCollectionIntentParams,\n  CreateTierIntentParams,\n  EmissionParams,\n  ApiEmissionResult,\n  CreateCoinIntentParams,\n  LaunchCoinIntentParams,\n  CreateSponsorshipOfferIntentParams,\n  SetSponsorshipOfferOpenIntentParams,\n  PlaceSponsorshipBidIntentParams,\n  RetractSponsorshipBidIntentParams,\n  AcceptSponsorshipBidIntentParams,\n  CreateSponsorshipProposalIntentParams,\n  WithdrawSponsorshipProposalIntentParams,\n  AcceptSponsorshipProposalIntentParams,\n  RejectSponsorshipProposalIntentParams,\n  CreateCheckoutIntentParams,\n  ApiCheckoutIntentResult,\n  CreateCounterOfferIntentParams,\n  CreateRemixOfferParams,\n  AutoRemixOfferParams,\n  ConfirmSelfRemixParams,\n  ConfirmRemixOfferParams,\n  ApiResponse,\n  CollectionSort,\n  CollectionTokensSort,\n  PopClaimStatus,\n  PopBatchEligibilityItem,\n  DropMintStatus,\n} from \"../types/api.js\";\n\nfunction deriveErrorCode(status: number): MedialaneErrorCode {\n  if (status === 404) return \"TOKEN_NOT_FOUND\";\n  if (status === 429) return \"RATE_LIMITED\";\n  if (status === 410) return \"INTENT_EXPIRED\";\n  if (status === 401 || status === 403) return \"UNAUTHORIZED\";\n  if (status === 400) return \"INVALID_PARAMS\";\n  return \"UNKNOWN\";\n}\n\nexport class MedialaneApiError extends Error {\n  readonly code: MedialaneErrorCode;\n  constructor(\n    public readonly status: number,\n    message: string,\n\n    public readonly retryAfterMs?: number,\n    public readonly details?: unknown,\n  ) {\n    super(message);\n    this.name = \"MedialaneApiError\";\n    this.code = deriveErrorCode(status);\n  }\n}\n\nexport function parseRetryAfter(value: string | null): number | undefined {\n  if (!value) return undefined;\n  const seconds = Number(value);\n  if (Number.isFinite(seconds)) return Math.max(0, seconds * 1000);\n  const date = Date.parse(value);\n  if (!Number.isNaN(date)) return Math.max(0, date - Date.now());\n  return undefined;\n}\n\nexport class ApiClient {\n  private readonly baseHeaders: Record<string, string>;\n  private readonly retryOptions: RetryOptions | undefined;\n\n  constructor(\n    private readonly baseUrl: string,\n    apiKey?: string,\n    retryOptions?: RetryOptions,\n    private readonly chain: Chain = \"STARKNET\"\n  ) {\n    this.baseHeaders = apiKey ? { \"x-api-key\": apiKey } : {};\n    this.retryOptions = retryOptions;\n  }\n\n  private addr(a: string): string {\n    return normalizeAddress(this.chain, a);\n  }\n\n  private async request<T>(\n    path: string,\n    init?: RequestInit,\n    opts?: { allow404?: boolean; allow403?: boolean },\n  ): Promise<T> {\n    const url = `${this.baseUrl.replace(/\\/$/, \"\")}${path}`;\n    const headers: Record<string, string> = { ...this.baseHeaders };\n    if (!(init?.body instanceof FormData)) {\n      headers[\"Content-Type\"] = \"application/json\";\n    }\n    const allowed = (status: number): boolean =>\n      (opts?.allow404 === true && status === 404) || (opts?.allow403 === true && status === 403);\n\n    const res = await withRetry(async () => {\n      const response = await fetch(url, {\n        ...init,\n        headers: { ...headers, ...(init?.headers as Record<string, string> | undefined) },\n      });\n      if (!response.ok && !allowed(response.status)) {\n        const text = await response.text().catch(() => response.statusText);\n        let message = text;\n        let details: unknown;\n        try {\n          const body = JSON.parse(text) as { error?: string };\n          if (body.error) message = body.error;\n          details = body;\n        } catch {\n\n        }\n        throw new MedialaneApiError(\n          response.status,\n          message,\n          parseRetryAfter(response.headers.get(\"retry-after\")),\n          details,\n        );\n      }\n      return response;\n    }, this.retryOptions);\n\n    if (allowed(res.status)) return null as T;\n    return res.json() as Promise<T>;\n  }\n\n  private get<T>(path: string): Promise<T> {\n    return this.request<T>(path, { method: \"GET\" });\n  }\n\n  private post<T>(path: string, body: unknown): Promise<T> {\n    return this.request<T>(path, { method: \"POST\", body: JSON.stringify(body) });\n  }\n\n  private patch<T>(path: string, body: unknown): Promise<T> {\n    return this.request<T>(path, { method: \"PATCH\", body: JSON.stringify(body) });\n  }\n\n  private del<T>(path: string): Promise<T> {\n    return this.request<T>(path, { method: \"DELETE\" });\n  }\n\n  private bearer(siwsToken: string): Record<string, string> {\n    return { Authorization: `Bearer ${siwsToken}` };\n  }\n\n  private asSubject(siwsToken?: string): Record<string, string> | undefined {\n    return siwsToken ? this.bearer(siwsToken) : undefined;\n  }\n\n  getOrders(query: ApiOrdersQuery = {}): Promise<ApiResponse<ApiOrder[]>> {\n    const params = new URLSearchParams();\n    if (query.status) params.set(\"status\", query.status);\n    if (query.collection) params.set(\"collection\", query.collection);\n    if (query.currency) params.set(\"currency\", query.currency);\n    if (query.sort) params.set(\"sort\", query.sort);\n    if (query.page !== undefined) params.set(\"page\", String(query.page));\n    if (query.limit !== undefined) params.set(\"limit\", String(query.limit));\n    if (query.offerer) params.set(\"offerer\", this.addr(query.offerer));\n    if (query.minPrice) params.set(\"minPrice\", query.minPrice);\n    if (query.maxPrice) params.set(\"maxPrice\", query.maxPrice);\n    if (query.chain) params.set(\"chain\", query.chain);\n    const qs = params.toString();\n    return this.get<ApiResponse<ApiOrder[]>>(`/v1/orders${qs ? `?${qs}` : \"\"}`);\n  }\n\n  getOrder(orderHash: string): Promise<ApiResponse<ApiOrder>> {\n    return this.get<ApiResponse<ApiOrder>>(`/v1/orders/${orderHash}`);\n  }\n\n  getActiveOrdersForToken(contract: string, tokenId: string): Promise<ApiResponse<ApiOrder[]>> {\n    return this.get<ApiResponse<ApiOrder[]>>(`/v1/orders/token/${this.addr(contract)}/${tokenId}`);\n  }\n\n  getOrdersByUser(address: string, page = 1, limit = 20): Promise<ApiResponse<ApiOrder[]>> {\n    return this.get<ApiResponse<ApiOrder[]>>(\n      `/v1/orders/user/${this.addr(address)}?page=${page}&limit=${limit}`\n    );\n  }\n\n  getToken(contract: string, tokenId: string, wait = false): Promise<ApiResponse<ApiToken>> {\n    return this.get<ApiResponse<ApiToken>>(\n      `/v1/tokens/${contract}/${tokenId}${wait ? \"?wait=true\" : \"\"}`\n    );\n  }\n\n  getTokensByOwner(address: string, page = 1, limit = 20): Promise<ApiResponse<ApiToken[]>> {\n    return this.get<ApiResponse<ApiToken[]>>(\n      `/v1/tokens/owned/${this.addr(address)}?page=${page}&limit=${limit}`\n    );\n  }\n\n  getTokenHistory(\n    contract: string,\n    tokenId: string,\n    page = 1,\n    limit = 20\n  ): Promise<ApiResponse<ApiActivity[]>> {\n    return this.get<ApiResponse<ApiActivity[]>>(\n      `/v1/tokens/${contract}/${tokenId}/history?page=${page}&limit=${limit}`\n    );\n  }\n\n  getCollections(\n    page = 1,\n    limit = 20,\n    isKnown?: boolean,\n    sort?: CollectionSort,\n    service?: string,\n    chain?: ChainFilter,\n\n    standard?: string\n  ): Promise<ApiResponse<ApiCollection[]>> {\n    const params = new URLSearchParams({ page: String(page), limit: String(limit) });\n    if (isKnown !== undefined) params.set(\"isKnown\", String(isKnown));\n    if (sort) params.set(\"sort\", sort);\n    if (service) params.set(\"service\", service);\n    if (chain) params.set(\"chain\", chain);\n    if (standard) params.set(\"standard\", standard);\n    return this.get<ApiResponse<ApiCollection[]>>(`/v1/collections?${params}`);\n  }\n\n  getCollectionsByOwner(owner: string, page = 1, limit = 50): Promise<ApiResponse<ApiCollection[]>> {\n    const params = new URLSearchParams({ owner: this.addr(owner), page: String(page), limit: String(limit) });\n    return this.get<ApiResponse<ApiCollection[]>>(`/v1/collections?${params}`);\n  }\n\n  getCollection(contract: string): Promise<ApiResponse<ApiCollection>> {\n    return this.get<ApiResponse<ApiCollection>>(`/v1/collections/${this.addr(contract)}`);\n  }\n\n  getCollectionTokens(\n    contract: string,\n    page = 1,\n    limit = 20,\n    sort: CollectionTokensSort = \"recent\"\n  ): Promise<ApiResponse<ApiToken[]>> {\n    return this.get<ApiResponse<ApiToken[]>>(\n      `/v1/collections/${this.addr(contract)}/tokens?page=${page}&limit=${limit}&sort=${sort}`\n    );\n  }\n\n  getActivities(query: ApiActivitiesQuery = {}): Promise<ApiResponse<ApiActivity[]>> {\n    const params = new URLSearchParams();\n    if (query.type) params.set(\"type\", query.type);\n    if (query.contract) params.set(\"contract\", query.contract);\n    if (query.page !== undefined) params.set(\"page\", String(query.page));\n    if (query.limit !== undefined) params.set(\"limit\", String(query.limit));\n    if (query.chain) params.set(\"chain\", query.chain);\n    const qs = params.toString();\n    return this.get<ApiResponse<ApiActivity[]>>(`/v1/activities${qs ? `?${qs}` : \"\"}`);\n  }\n\n  getActivitiesByAddress(\n    address: string,\n    page = 1,\n    limit = 20\n  ): Promise<ApiResponse<ApiActivity[]>> {\n    return this.get<ApiResponse<ApiActivity[]>>(\n      `/v1/activities/${this.addr(address)}?page=${page}&limit=${limit}`\n    );\n  }\n\n  getTokenComments(\n    contract: string,\n    tokenId: string,\n    opts: { page?: number; limit?: number } = {}\n  ): Promise<ApiResponse<ApiComment[]>> {\n    const params = new URLSearchParams();\n    if (opts.page !== undefined) params.set(\"page\", String(opts.page));\n    if (opts.limit !== undefined) params.set(\"limit\", String(opts.limit));\n    const qs = params.toString();\n    return this.get<ApiResponse<ApiComment[]>>(\n      `/v1/tokens/${this.addr(contract)}/${tokenId}/comments${qs ? `?${qs}` : \"\"}`\n    );\n  }\n\n  search(q: string, limit = 10, chain?: ChainFilter): Promise<ApiResponse<ApiSearchResult> & { query: string }> {\n    const params = new URLSearchParams({ q, limit: String(limit) });\n    if (chain) params.set(\"chain\", chain);\n    return this.get<ApiResponse<ApiSearchResult> & { query: string }>(\n      `/v1/search?${params.toString()}`\n    );\n  }\n\n  createListingIntent(\n    params: CreateListingIntentParams\n  ): Promise<ApiResponse<ApiIntentCreated>> {\n    return this.post<ApiResponse<ApiIntentCreated>>(\"/v1/intents/listing\", params);\n  }\n\n  createOfferIntent(\n    params: MakeOfferIntentParams\n  ): Promise<ApiResponse<ApiIntentCreated>> {\n    return this.post<ApiResponse<ApiIntentCreated>>(\"/v1/intents/offer\", params);\n  }\n\n  createFulfillIntent(\n    params: FulfillOrderIntentParams\n  ): Promise<ApiResponse<ApiIntentCreated>> {\n    return this.post<ApiResponse<ApiIntentCreated>>(\"/v1/intents/fulfill\", params);\n  }\n\n  createCancelIntent(\n    params: CancelOrderIntentParams\n  ): Promise<ApiResponse<ApiIntentCreated>> {\n    return this.post<ApiResponse<ApiIntentCreated>>(\"/v1/intents/cancel\", params);\n  }\n\n  createCheckoutIntent(\n    params: CreateCheckoutIntentParams\n  ): Promise<{ data: ApiCheckoutIntentResult[] }> {\n    return this.post<{ data: ApiCheckoutIntentResult[] }>(\"/v1/intents/checkout\", params);\n  }\n\n  getIntent(id: string): Promise<ApiResponse<ApiIntent>> {\n    return this.get<ApiResponse<ApiIntent>>(`/v1/intents/${id}`);\n  }\n\n  submitIntentSignature(id: string, signature: string[]): Promise<ApiResponse<ApiIntent>> {\n    return this.patch<ApiResponse<ApiIntent>>(`/v1/intents/${id}/signature`, { signature });\n  }\n\n  confirmIntent(id: string, txHash: string): Promise<ApiResponse<ApiIntent>> {\n    return this.patch<ApiResponse<ApiIntent>>(`/v1/intents/${id}/confirm`, { txHash });\n  }\n\n  syncTransaction(txHash: string): Promise<ApiResponse<ApiTxSyncResult>> {\n    return this.post<ApiResponse<ApiTxSyncResult>>(\"/v1/tx/sync\", { txHash });\n  }\n\n  createMintIntent(params: CreateMintIntentParams): Promise<ApiResponse<ApiIntentCreated>> {\n    return this.post<ApiResponse<ApiIntentCreated>>(\"/v1/intents/mint\", params);\n  }\n\n  createCollectionIntent(params: CreateCollectionIntentParams): Promise<ApiResponse<ApiIntentCreated>> {\n    return this.post<ApiResponse<ApiIntentCreated>>(\"/v1/intents/create-collection\", params);\n  }\n\n  createTierIntent(params: CreateTierIntentParams): Promise<ApiResponse<ApiIntentCreated>> {\n    return this.post<ApiResponse<ApiIntentCreated>>(\"/v1/intents/create-tier\", params);\n  }\n\n  emitToRecipients(params: EmissionParams): Promise<ApiResponse<ApiEmissionResult>> {\n    return this.post<ApiResponse<ApiEmissionResult>>(\"/v1/business/issuance/emission\", params);\n  }\n\n  createCoinIntent(params: CreateCoinIntentParams): Promise<ApiResponse<ApiIntentCreated>> {\n    return this.post<ApiResponse<ApiIntentCreated>>(\"/v1/intents/create-coin\", params);\n  }\n\n  launchCoinIntent(params: LaunchCoinIntentParams): Promise<ApiResponse<ApiIntentCreated>> {\n    return this.post<ApiResponse<ApiIntentCreated>>(\"/v1/intents/launch-coin\", params);\n  }\n\n  createSponsorshipOfferIntent(params: CreateSponsorshipOfferIntentParams): Promise<ApiResponse<ApiIntentCreated>> {\n    return this.post<ApiResponse<ApiIntentCreated>>(\"/v1/intents/sponsorship-offer\", params);\n  }\n\n  setSponsorshipOfferOpenIntent(params: SetSponsorshipOfferOpenIntentParams): Promise<ApiResponse<ApiIntentCreated>> {\n    return this.post<ApiResponse<ApiIntentCreated>>(\"/v1/intents/sponsorship-offer-open\", params);\n  }\n\n  placeSponsorshipBidIntent(params: PlaceSponsorshipBidIntentParams): Promise<ApiResponse<ApiIntentCreated>> {\n    return this.post<ApiResponse<ApiIntentCreated>>(\"/v1/intents/sponsorship-bid\", params);\n  }\n\n  retractSponsorshipBidIntent(params: RetractSponsorshipBidIntentParams): Promise<ApiResponse<ApiIntentCreated>> {\n    return this.post<ApiResponse<ApiIntentCreated>>(\"/v1/intents/sponsorship-bid-retract\", params);\n  }\n\n  acceptSponsorshipBidIntent(params: AcceptSponsorshipBidIntentParams): Promise<ApiResponse<ApiIntentCreated>> {\n    return this.post<ApiResponse<ApiIntentCreated>>(\"/v1/intents/sponsorship-bid-accept\", params);\n  }\n\n  createSponsorshipProposalIntent(params: CreateSponsorshipProposalIntentParams): Promise<ApiResponse<ApiIntentCreated>> {\n    return this.post<ApiResponse<ApiIntentCreated>>(\"/v1/intents/sponsorship-proposal\", params);\n  }\n\n  withdrawSponsorshipProposalIntent(params: WithdrawSponsorshipProposalIntentParams): Promise<ApiResponse<ApiIntentCreated>> {\n    return this.post<ApiResponse<ApiIntentCreated>>(\"/v1/intents/sponsorship-proposal-withdraw\", params);\n  }\n\n  acceptSponsorshipProposalIntent(params: AcceptSponsorshipProposalIntentParams): Promise<ApiResponse<ApiIntentCreated>> {\n    return this.post<ApiResponse<ApiIntentCreated>>(\"/v1/intents/sponsorship-proposal-accept\", params);\n  }\n\n  rejectSponsorshipProposalIntent(params: RejectSponsorshipProposalIntentParams): Promise<ApiResponse<ApiIntentCreated>> {\n    return this.post<ApiResponse<ApiIntentCreated>>(\"/v1/intents/sponsorship-proposal-reject\", params);\n  }\n\n  createCounterOfferIntent(\n    params: CreateCounterOfferIntentParams,\n    siwsToken?: string\n  ): Promise<ApiResponse<ApiIntentCreated>> {\n    const extraHeaders: Record<string, string> = siwsToken ? { \"Authorization\": `Bearer ${siwsToken}` } : {};\n    return this.request<ApiResponse<ApiIntentCreated>>(\"/v1/intents/counter-offer\", {\n      method: \"POST\",\n      body: JSON.stringify(params),\n      headers: extraHeaders,\n    });\n  }\n\n  getCounterOffers(query: ApiCounterOffersQuery): Promise<ApiResponse<ApiOrder[]>> {\n    const params = new URLSearchParams();\n    if (query.originalOrderHash) params.set(\"originalOrderHash\", query.originalOrderHash);\n    if (query.sellerAddress) params.set(\"sellerAddress\", query.sellerAddress);\n    if (query.page !== undefined) params.set(\"page\", String(query.page));\n    if (query.limit !== undefined) params.set(\"limit\", String(query.limit));\n    return this.get<ApiResponse<ApiOrder[]>>(`/v1/orders/counter-offers?${params}`);\n  }\n\n  getMetadataSignedUrl(kind?: \"image\" | \"document\" | \"media\"): Promise<ApiResponse<ApiMetadataSignedUrl>> {\n    const params = kind ? `?kind=${kind}` : \"\";\n    return this.get<ApiResponse<ApiMetadataSignedUrl>>(`/v1/metadata/signed-url${params}`);\n  }\n\n  uploadMetadata(metadata: Record<string, unknown>): Promise<ApiResponse<ApiMetadataUpload>> {\n    return this.post<ApiResponse<ApiMetadataUpload>>(\"/v1/metadata/upload\", metadata);\n  }\n\n  resolveMetadata(uri: string): Promise<ApiResponse<unknown>> {\n    const params = new URLSearchParams({ uri });\n    return this.get<ApiResponse<unknown>>(`/v1/metadata/resolve?${params.toString()}`);\n  }\n\n  uploadFile(file: File): Promise<ApiResponse<ApiMetadataUpload>> {\n    const formData = new FormData();\n    formData.append(\"file\", file);\n\n    return this.request<ApiResponse<ApiMetadataUpload>>(\"/v1/metadata/upload-file\", {\n      method: \"POST\",\n      body: formData,\n    });\n  }\n\n  getMe(siwsToken?: string): Promise<ApiResponse<ApiPortalMe>> {\n    return this.request<ApiResponse<ApiPortalMe>>(\"/v1/portal/me\", {\n      method: \"GET\",\n      headers: this.asSubject(siwsToken),\n    });\n  }\n\n  getApiKeys(siwsToken?: string): Promise<ApiResponse<ApiPortalKey[]>> {\n    return this.request<ApiResponse<ApiPortalKey[]>>(\"/v1/portal/keys\", {\n      method: \"GET\",\n      headers: this.asSubject(siwsToken),\n    });\n  }\n\n  createApiKey(\n    input?: { label?: string; appSource?: string },\n    siwsToken?: string,\n  ): Promise<ApiResponse<ApiPortalKeyCreated>> {\n    return this.request<ApiResponse<ApiPortalKeyCreated>>(\"/v1/portal/keys\", {\n      method: \"POST\",\n      body: JSON.stringify(input ?? {}),\n      headers: this.asSubject(siwsToken),\n    });\n  }\n\n  deleteApiKey(id: string, siwsToken?: string): Promise<ApiResponse<{ id: string; status: string }>> {\n    return this.request<ApiResponse<{ id: string; status: string }>>(`/v1/portal/keys/${id}`, {\n      method: \"DELETE\",\n      headers: this.asSubject(siwsToken),\n    });\n  }\n\n  getCreditHistory(siwsToken?: string): Promise<ApiResponse<ApiCreditPayment[]>> {\n    return this.request<ApiResponse<ApiCreditPayment[]>>(\"/v1/portal/credits/history\", {\n      method: \"GET\",\n      headers: this.asSubject(siwsToken),\n    });\n  }\n\n  getSpend(siwsToken?: string): Promise<ApiResponse<ApiPortalSpend>> {\n    return this.request<ApiResponse<ApiPortalSpend>>(\"/v1/portal/credits/spend\", {\n      method: \"GET\",\n      headers: this.asSubject(siwsToken),\n    });\n  }\n\n  checkDeposit(txHash: string, siwsToken?: string): Promise<ApiResponse<{ deposits: number }>> {\n    return this.request<ApiResponse<{ deposits: number }>>(\"/v1/portal/credits/check\", {\n      method: \"POST\",\n      body: JSON.stringify({ txHash }),\n      headers: this.asSubject(siwsToken),\n    });\n  }\n\n  getWebhooks(): Promise<ApiResponse<ApiWebhookEndpoint[]>> {\n    return this.get<ApiResponse<ApiWebhookEndpoint[]>>(\"/v1/portal/webhooks\");\n  }\n\n  createWebhook(params: CreateWebhookParams): Promise<ApiResponse<ApiWebhookCreated>> {\n    return this.post<ApiResponse<ApiWebhookCreated>>(\"/v1/portal/webhooks\", params);\n  }\n\n  deleteWebhook(id: string): Promise<ApiResponse<{ id: string; status: string }>> {\n    return this.del<ApiResponse<{ id: string; status: string }>>(\n      `/v1/portal/webhooks/${id}`\n    );\n  }\n\n  async claimCollection(\n    contractAddress: string,\n    walletAddress: string,\n    siwsToken: string\n  ): Promise<{ verified: boolean; collection?: ApiCollection; reason?: string }> {\n    return this.request(\"/v1/collections/claim\", {\n      method: \"POST\",\n      body: JSON.stringify({ contractAddress, walletAddress }),\n      headers: this.bearer(siwsToken),\n    });\n  }\n\n  requestCollectionClaim(params: {\n    contractAddress: string;\n    walletAddress?: string;\n    email: string;\n    notes?: string;\n  }): Promise<{ claim: ApiCollectionClaim }> {\n    return this.request(\"/v1/collections/claim/request\", {\n      method: \"POST\",\n      body: JSON.stringify(params),\n    });\n  }\n\n  registerBusinessProvisioning(params: {\n    chain: \"STARKNET\";\n    recipientScheme: string;\n    recipientValue: string;\n    interimOwnerPubkey: string;\n    derivationSalt: string;\n    deployment: { typedData: unknown; signature: string[]; deployment: unknown };\n  }): Promise<ApiResponse<ApiBusinessProvisioning> & { reusedExistingWallet?: boolean }> {\n    return this.post<ApiResponse<ApiBusinessProvisioning> & { reusedExistingWallet?: boolean }>(\n      \"/v1/business/provisioning\",\n      params,\n    );\n  }\n\n  completeBusinessProvisioning(id: string): Promise<ApiResponse<ApiBusinessProvisioning>> {\n    return this.post<ApiResponse<ApiBusinessProvisioning>>(`/v1/business/provisioning/${id}/complete`, {});\n  }\n\n  getCollectionProfile(contractAddress: string): Promise<ApiCollectionProfile | null> {\n    return this.request<ApiCollectionProfile | null>(\n      `/v1/collections/${this.addr(contractAddress)}/profile`,\n      { method: \"GET\" },\n      { allow404: true },\n    );\n  }\n\n  updateCollectionProfile(\n    contractAddress: string,\n    data: UpdateCollectionProfileInput,\n    siwsToken: string\n  ): Promise<ApiCollectionProfile> {\n    return this.request<ApiCollectionProfile>(\n      `/v1/collections/${this.addr(contractAddress)}/profile`,\n      { method: \"PATCH\", body: JSON.stringify(data), headers: this.bearer(siwsToken) },\n    );\n  }\n\n  getWalletActivity(\n    address: string,\n    chain: \"STARKNET\" = \"STARKNET\",\n  ): Promise<ApiResponse<ApiWalletActivity[]>> {\n    return this.get<ApiResponse<ApiWalletActivity[]>>(\n      `/v1/wallet-activity?address=${this.addr(address)}&chain=${chain}`,\n    );\n  }\n\n  getGatedContent(\n    contractAddress: string,\n    siwsToken: string\n  ): Promise<{ title: string; url: string; type: string } | null> {\n    return this.request<{ title: string; url: string; type: string } | null>(\n      `/v1/collections/${this.addr(contractAddress)}/gated-content`,\n      { method: \"GET\", headers: this.bearer(siwsToken) },\n      { allow404: true, allow403: true },\n    );\n  }\n\n  getCreators(opts: { search?: string; page?: number; limit?: number } = {}): Promise<ApiCreatorListResult> {\n    const params = new URLSearchParams();\n    if (opts.search) params.set(\"search\", opts.search);\n    if (opts.page)  params.set(\"page\",  String(opts.page));\n    if (opts.limit) params.set(\"limit\", String(opts.limit));\n    const qs = params.toString();\n    return this.get<ApiCreatorListResult>(`/v1/creators${qs ? `?${qs}` : \"\"}`);\n  }\n\n  getCreatorProfile(walletAddress: string): Promise<ApiCreatorProfile | null> {\n    return this.request<ApiCreatorProfile | null>(\n      `/v1/creators/${this.addr(walletAddress)}/profile`,\n      { method: \"GET\" },\n      { allow404: true },\n    );\n  }\n\n  getCreatorByUsername(username: string): Promise<ApiCreatorProfile | null> {\n    return this.request<ApiCreatorProfile | null>(\n      `/v1/creators/by-username/${encodeURIComponent(username.toLowerCase().trim())}`,\n      { method: \"GET\" },\n      { allow404: true },\n    );\n  }\n\n  updateCreatorProfile(\n    walletAddress: string,\n    data: Partial<Omit<ApiCreatorProfile, \"walletAddress\" | \"chain\" | \"updatedAt\">>,\n    siwsToken: string\n  ): Promise<ApiCreatorProfile> {\n    return this.request<ApiCreatorProfile>(\n      `/v1/creators/${this.addr(walletAddress)}/profile`,\n      { method: \"PATCH\", body: JSON.stringify(data), headers: this.bearer(siwsToken) },\n    );\n  }\n\n  checkCollectionSlugAvailability(slug: string): Promise<{ available: boolean; reason?: string }> {\n    return this.get<{ available: boolean; reason?: string }>(\n      `/v1/collection-slug-claims/check/${encodeURIComponent(slug.toLowerCase().trim())}`,\n    );\n  }\n\n  submitCollectionSlugClaim(\n    contractAddress: string,\n    slug: string,\n    siwsToken: string,\n    notifyEmail?: string\n  ): Promise<{ claim: ApiCollectionSlugClaim }> {\n    return this.request<{ claim: ApiCollectionSlugClaim }>(\"/v1/collection-slug-claims\", {\n      method: \"POST\",\n      body: JSON.stringify({ contractAddress, slug, notifyEmail }),\n      headers: this.bearer(siwsToken),\n    });\n  }\n\n  getMyCollectionSlugClaims(siwsToken: string): Promise<{ claims: ApiCollectionSlugClaim[] }> {\n    return this.request<{ claims: ApiCollectionSlugClaim[] }>(\"/v1/collection-slug-claims/me\", {\n      method: \"GET\",\n      headers: this.bearer(siwsToken),\n    });\n  }\n\n  getCollectionBySlug(slug: string): Promise<ApiCollection | null> {\n    return this.request<ApiCollection | null>(\n      `/v1/collections/by-slug/${encodeURIComponent(slug.toLowerCase().trim())}`,\n      { method: \"GET\" },\n      { allow404: true },\n    );\n  }\n\n  async registerUser(params: {\n    walletAddress: string;\n\n    walletType?: string;\n    appSource?: ApiAppSource;\n    chain?: ApiChain;\n  }): Promise<{\n    accountId: string;\n    publicId: string;\n    walletAddress: string;\n    chain: string;\n\n    provider: string;\n    appSource: ApiAppSource;\n    createdAt: string;\n  }> {\n    return this.post(\"/v1/users/register\", params);\n  }\n\n  async upsertMyWallet(\n    siwsToken: string,\n    options: {\n\n      walletType?: string;\n      appSource?: ApiAppSource;\n\n      chain?: ApiChain;\n\n      emailVerificationToken?: string;\n\n      email?: string;\n\n      accountToken?: string;\n    } = {},\n  ): Promise<ApiUserWallet> {\n    const body: Record<string, string> = {\n      walletType: options.walletType ?? \"UNKNOWN\",\n      appSource: options.appSource ?? \"MEDIALANE_SDK\",\n    };\n    if (options.chain) body.chain = options.chain;\n    if (options.emailVerificationToken) body.emailVerificationToken = options.emailVerificationToken;\n    if (options.email) body.email = options.email;\n    if (options.accountToken) body.accountToken = options.accountToken;\n    return this.request<ApiUserWallet>(\"/v1/users/me\", {\n      method: \"POST\",\n      body: JSON.stringify(body),\n      headers: this.bearer(siwsToken),\n    });\n  }\n\n  async checkEmailExists(email: string): Promise<boolean> {\n    const { exists } = await this.get<{ exists: boolean }>(\n      `/v1/auth/email/exists?email=${encodeURIComponent(email)}`,\n    );\n    return exists;\n  }\n\n  getMyWallet(siwsToken: string): Promise<ApiUserWallet | null> {\n    return this.request<ApiUserWallet | null>(\n      \"/v1/users/me\",\n      { method: \"GET\", headers: this.bearer(siwsToken) },\n      { allow404: true },\n    );\n  }\n\n  changeMyEmail(email: string, siwsToken: string): Promise<{ email: string; emailVerified: boolean }> {\n    return this.request<{ email: string; emailVerified: boolean }>(\"/v1/users/me/email\", {\n      method: \"POST\",\n      headers: this.bearer(siwsToken),\n      body: JSON.stringify({ email }),\n    });\n  }\n\n  getTokenRemixes(\n    contract: string,\n    tokenId: string,\n    opts: { page?: number; limit?: number } = {}\n  ): Promise<ApiResponse<ApiPublicRemix[]>> {\n    const params = new URLSearchParams();\n    if (opts.page !== undefined) params.set(\"page\", String(opts.page));\n    if (opts.limit !== undefined) params.set(\"limit\", String(opts.limit));\n    const qs = params.toString();\n    return this.get<ApiResponse<ApiPublicRemix[]>>(\n      `/v1/tokens/${this.addr(contract)}/${tokenId}/remixes${qs ? `?${qs}` : \"\"}`\n    );\n  }\n\n  submitRemixOffer(\n    params: CreateRemixOfferParams,\n    siwsToken: string\n  ): Promise<ApiResponse<ApiRemixOffer>> {\n    return this.request<ApiResponse<ApiRemixOffer>>(\"/v1/remix-offers\", {\n      method: \"POST\",\n      body: JSON.stringify(params),\n      headers: { \"Authorization\": `Bearer ${siwsToken}` },\n    });\n  }\n\n  submitAutoRemixOffer(\n    params: AutoRemixOfferParams,\n    siwsToken: string\n  ): Promise<ApiResponse<ApiRemixOffer>> {\n    return this.request<ApiResponse<ApiRemixOffer>>(\"/v1/remix-offers/auto\", {\n      method: \"POST\",\n      body: JSON.stringify(params),\n      headers: { \"Authorization\": `Bearer ${siwsToken}` },\n    });\n  }\n\n  confirmSelfRemix(\n    params: ConfirmSelfRemixParams,\n    siwsToken: string\n  ): Promise<ApiResponse<ApiRemixOffer>> {\n    return this.request<ApiResponse<ApiRemixOffer>>(\"/v1/remix-offers/self/confirm\", {\n      method: \"POST\",\n      body: JSON.stringify(params),\n      headers: { \"Authorization\": `Bearer ${siwsToken}` },\n    });\n  }\n\n  getRemixOffers(\n    query: ApiRemixOffersQuery,\n    siwsToken: string\n  ): Promise<ApiResponse<ApiRemixOffer[]>> {\n    const params = new URLSearchParams({ role: query.role });\n    if (query.page !== undefined) params.set(\"page\", String(query.page));\n    if (query.limit !== undefined) params.set(\"limit\", String(query.limit));\n    return this.request<ApiResponse<ApiRemixOffer[]>>(`/v1/remix-offers?${params}`, {\n      method: \"GET\",\n      headers: this.bearer(siwsToken),\n    });\n  }\n\n  getRemixOffer(id: string, siwsToken?: string): Promise<ApiResponse<ApiRemixOffer>> {\n    return this.request<ApiResponse<ApiRemixOffer>>(`/v1/remix-offers/${id}`, {\n      method: \"GET\",\n      headers: siwsToken ? this.bearer(siwsToken) : undefined,\n    });\n  }\n\n  confirmRemixOffer(\n    id: string,\n    params: ConfirmRemixOfferParams,\n    siwsToken: string\n  ): Promise<ApiResponse<ApiRemixOffer>> {\n    return this.request<ApiResponse<ApiRemixOffer>>(`/v1/remix-offers/${id}/confirm`, {\n      method: \"POST\",\n      body: JSON.stringify(params),\n      headers: { \"Authorization\": `Bearer ${siwsToken}` },\n    });\n  }\n\n  rejectRemixOffer(id: string, siwsToken: string): Promise<ApiResponse<ApiRemixOffer>> {\n    return this.request<ApiResponse<ApiRemixOffer>>(`/v1/remix-offers/${id}/reject`, {\n      method: \"POST\",\n      body: JSON.stringify({}),\n      headers: { \"Authorization\": `Bearer ${siwsToken}` },\n    });\n  }\n\n  extendRemixOffer(id: string, days: number, siwsToken: string): Promise<ApiResponse<ApiRemixOffer>> {\n    return this.request<ApiResponse<ApiRemixOffer>>(`/v1/remix-offers/${id}/extend`, {\n      method: \"POST\",\n      body: JSON.stringify({ days }),\n      headers: { \"Authorization\": `Bearer ${siwsToken}` },\n    });\n  }\n\n  getPopCollections(opts: { page?: number; limit?: number; sort?: CollectionSort } = {}): Promise<ApiResponse<ApiCollection[]>> {\n    return this.getCollections(opts.page ?? 1, opts.limit ?? 20, undefined, opts.sort, \"POP_PROTOCOL\");\n  }\n\n  async getPopEligibility(collection: string, wallet: string): Promise<PopClaimStatus> {\n    const res = await this.get<{ data: PopClaimStatus }>(\n      `/v1/pop/eligibility/${this.addr(collection)}/${this.addr(wallet)}`\n    );\n    return res.data;\n  }\n\n  async getPopEligibilityBatch(collection: string, wallets: string[]): Promise<PopBatchEligibilityItem[]> {\n    const params = new URLSearchParams({ wallets: wallets.map((w) => this.addr(w)).join(\",\") });\n    const res = await this.get<{ data: PopBatchEligibilityItem[] }>(\n      `/v1/pop/eligibility/${this.addr(collection)}?${params}`\n    );\n    return res.data;\n  }\n\n  getCoins(opts: ApiCoinsQuery = {}): Promise<ApiResponse<ApiCoin[]>> {\n    const params = new URLSearchParams();\n    if (opts.page) params.set(\"page\", String(opts.page));\n    if (opts.limit) params.set(\"limit\", String(opts.limit));\n    if (opts.service) params.set(\"service\", opts.service);\n    if (opts.chain) params.set(\"chain\", opts.chain);\n    const qs = params.toString();\n    return this.get<ApiResponse<ApiCoin[]>>(`/v1/coins${qs ? `?${qs}` : \"\"}`);\n  }\n\n  getCoin(contract: string): Promise<{ data: ApiCoin }> {\n    return this.get<{ data: ApiCoin }>(`/v1/coins/${this.addr(contract)}`);\n  }\n\n  getCoinPrices(): Promise<ApiResponse<ApiCoinPrices>> {\n    return this.get<ApiResponse<ApiCoinPrices>>(\"/v1/coins/prices\");\n  }\n\n  claimCoin(coinAddress: string, siwsToken: string): Promise<ApiCoinClaimResult> {\n    return this.request<ApiCoinClaimResult>(\"/v1/coins/claim\", {\n      method: \"POST\",\n      headers: { Authorization: `Bearer ${siwsToken}` },\n      body: JSON.stringify({ coinAddress }),\n    });\n  }\n\n  getCoinClaims(status = \"PENDING\"): Promise<ApiResponse<ApiCollectionClaim[]>> {\n    return this.get<ApiResponse<ApiCollectionClaim[]>>(\n      `/v1/coins/claims?status=${encodeURIComponent(status)}`,\n    );\n  }\n\n  updateCoinProfile(\n    contract: string,\n    data: { image?: string; description?: string },\n    siwsToken: string\n  ): Promise<ApiResponse<ApiCoin>> {\n    return this.request<ApiResponse<ApiCoin>>(`/v1/coins/${this.addr(contract)}`, {\n      method: \"PATCH\",\n      body: JSON.stringify(data),\n      headers: this.bearer(siwsToken),\n    });\n  }\n\n  getDropCollections(opts: { page?: number; limit?: number; sort?: CollectionSort } = {}): Promise<ApiResponse<ApiCollection[]>> {\n    return this.getCollections(opts.page ?? 1, opts.limit ?? 20, undefined, opts.sort, \"COLLECTION_DROP\");\n  }\n\n  async getDropMintStatus(collection: string, wallet: string): Promise<DropMintStatus> {\n    const res = await this.get<{ data: DropMintStatus }>(\n      `/v1/drop/mint-status/${this.addr(collection)}/${this.addr(wallet)}`\n    );\n    return res.data;\n  }\n\n  async getRewards(address: string): Promise<ApiUserRewards> {\n    const res = await this.get<{ data: ApiUserRewards }>(`/v1/rewards/${this.addr(address)}`);\n    return res.data;\n  }\n\n  getRewardsLeaderboard(page = 1, limit = 50): Promise<ApiResponse<ApiRewardsLeaderboardEntry[]>> {\n    return this.get<ApiResponse<ApiRewardsLeaderboardEntry[]>>(`/v1/rewards?page=${page}&limit=${limit}`);\n  }\n\n  getRewardsEvents(address: string, page = 1, limit = 20): Promise<ApiResponse<ApiPointEvent[]>> {\n    return this.get<ApiResponse<ApiPointEvent[]>>(\n      `/v1/rewards/${this.addr(address)}/events?page=${page}&limit=${limit}`\n    );\n  }\n\n  async getRewardsConfig(): Promise<ApiRewardsConfig> {\n    const res = await this.get<{ data: ApiRewardsConfig }>(`/v1/rewards/config`);\n    return res.data;\n  }\n\n  async getRewardsBatch(addresses: string[]): Promise<ApiRewardsBatchEntry[]> {\n    if (addresses.length === 0) return [];\n    const params = new URLSearchParams({ addresses: addresses.map((a) => this.addr(a)).join(\",\") });\n    const res = await this.get<{ data: ApiRewardsBatchEntry[] }>(`/v1/rewards/batch?${params}`);\n    return res.data;\n  }\n}\n","export type IPType =\n  | \"Audio\"\n  | \"Art\"\n  | \"Documents\"\n  | \"NFT\"\n  | \"Video\"\n  | \"Photography\"\n  | \"Patents\"\n  | \"Posts\"\n  | \"Publications\"\n  | \"RWA\"\n  | \"Software\"\n  | \"Custom\";\n\nexport type CollectionSort = \"recent\" | \"supply\" | \"floor\" | \"volume\" | \"name\";\n\nexport type CollectionTokensSort = \"recent\" | \"oldest\" | \"name\" | \"price\";\n\nexport type ServiceCapability =\n  | \"list\" | \"buy\" | \"make_offer\" | \"cancel\"\n  | \"transfer\" | \"burn\"\n  | \"mint\" | \"claim\" | \"airdrop\"\n  | \"remix\" | \"license\"\n  | \"subscribe\" | \"redeem\"\n  | \"launch\" | \"swap\"\n  | \"sponsor\";\n\nexport interface EnforcementDeclaration {\n  royalty?: \"erc2981\" | \"service-split\" | \"none\";\n  escrow?: boolean;\n  timeLock?: boolean;\n  revocable?: boolean;\n}\n\nexport interface ServiceEventDeclaration {\n\n  name: string;\n\n  emittedBy: \"factory\" | \"instance\";\n\n  poll?: \"fast\" | \"slow\";\n}\n\nexport interface ServiceDefinition {\n\n  id: string;\n  displayName: string;\n  description: string;\n  standard: \"ERC721\" | \"ERC1155\" | \"ERC20\" | \"UNKNOWN\";\n  provenance: \"MEDIALANE\" | \"EXTERNAL\";\n  onchain?: Partial<Record<import(\"../chains.js\").Chain, {\n    factoryAddress?: string;\n    classHash?: string;\n    startBlock?: number;\n  }>>;\n\n  uiVariant: string;\n  capabilities: ServiceCapability[];\n\n  events?: ServiceEventDeclaration[];\n  metadataSchema?: {\n    requiredTraits?: string[];\n\n    licenseDefault?: string;\n    enforcement?: EnforcementDeclaration;\n  };\n}\n\nexport interface ApiCollectionsQuery {\n  page?: number;\n  limit?: number;\n  isKnown?: boolean;\n  sort?: CollectionSort;\n  owner?: string;\n\n  service?: string;\n}\n\nexport type OrderStatus = \"ACTIVE\" | \"FULFILLED\" | \"CANCELLED\" | \"EXPIRED\";\nexport type SortOrder = \"price_asc\" | \"price_desc\" | \"recent\";\nexport type ActivityType = \"mint\" | \"transfer\" | \"sale\" | \"listing\" | \"offer\" | \"cancelled\";\nexport type IntentType = \"CREATE_LISTING\" | \"MAKE_OFFER\" | \"FULFILL_ORDER\" | \"CANCEL_ORDER\" | \"MINT\" | \"CREATE_COLLECTION\" | \"COUNTER_OFFER\";\nexport type IntentStatus = \"PENDING\" | \"SIGNED\" | \"SUBMITTED\" | \"CONFIRMED\" | \"FAILED\" | \"EXPIRED\";\nexport type WebhookEventType = \"ORDER_CREATED\" | \"ORDER_FULFILLED\" | \"ORDER_CANCELLED\" | \"TRANSFER\";\nexport type WebhookStatus = \"ACTIVE\" | \"DISABLED\";\nexport type ApiKeyStatus = \"ACTIVE\" | \"REVOKED\";\nexport type TenantPlan = \"FREE\" | \"PREMIUM\";\n\nexport interface ApiMeta {\n  page: number;\n  limit: number;\n  total?: number;\n\n  counts?: Record<string, number>;\n}\n\nexport interface ApiResponse<T> {\n  data: T;\n  meta?: ApiMeta;\n}\n\nexport type ChainFilter = import(\"../chains.js\").Chain | \"all\";\n\nexport interface ApiOrdersQuery {\n  chain?: ChainFilter;\n  status?: OrderStatus;\n  collection?: string;\n  currency?: string;\n  sort?: SortOrder;\n  page?: number;\n  limit?: number;\n  offerer?: string;\n  minPrice?: string;\n  maxPrice?: string;\n}\n\nexport interface ApiOrderOffer {\n  itemType: string;\n  token: string;\n  identifier: string;\n  startAmount: string;\n  endAmount: string;\n}\n\nexport interface ApiOrderConsideration extends ApiOrderOffer {\n  recipient: string;\n}\n\nexport interface ApiOrderPrice {\n  raw: string | null;\n  formatted: string | null;\n  currency: string | null;\n  decimals: number;\n}\n\nexport interface ApiOrderTxHash {\n  created: string | null;\n  fulfilled: string | null;\n  cancelled: string | null;\n}\n\nexport interface ApiOrderTokenMeta {\n  name: string | null;\n  image: string | null;\n  description: string | null;\n  animationUrl: string | null;\n}\n\nexport interface ApiOrder {\n  id: string;\n  chain: string;\n  orderHash: string;\n  offerer: string;\n  offer: ApiOrderOffer;\n  consideration: ApiOrderConsideration;\n  startTime: string;\n  endTime: string;\n  status: OrderStatus;\n  fulfiller: string | null;\n  nftContract: string | null;\n  nftTokenId: string | null;\n  price: ApiOrderPrice;\n  txHash: ApiOrderTxHash;\n  createdBlockNumber: string;\n\n  remainingAmount: string | null;\n  createdAt: string;\n  updatedAt: string;\n\n  token: ApiOrderTokenMeta | null;\n\n  parentOrderHash?: string | null;\n\n  counterOfferMessage?: string | null;\n\n  hasActiveCounterOffer?: boolean;\n}\n\nexport interface IpAttribute {\n  trait_type: string;\n  value: string;\n}\n\nexport interface IpNftMetadata {\n  name: string;\n  description?: string;\n  image?: string | null;\n  external_url?: string;\n  attributes?: IpAttribute[];\n\n  ipType?: string | null;\n  licenseType?: string | null;\n  commercialUse?: string | null;\n  derivatives?: string | null;\n  attribution?: string | null;\n  territory?: string | null;\n  aiPolicy?: string | null;\n  royalty?: string | null;\n  registration?: string | null;\n}\n\nexport interface ApiTokenMetadata {\n  name: string | null;\n  description: string | null;\n  image: string | null;\n\n  animationUrl: string | null;\n\n  attributes: IpAttribute[] | null;\n\n  ipType: string | null;\n  licenseType: string | null;\n  commercialUse: string | null;\n  derivatives: string | null;\n  attribution: string | null;\n  territory: string | null;\n  aiPolicy: string | null;\n  royalty: string | null;\n  registration: string | null;\n  author: string | null;\n}\n\nexport interface ApiTokenBalance {\n  owner: string;\n\n  amount: string;\n}\n\nexport interface ApiToken {\n  id: string;\n  chain: string;\n  contractAddress: string;\n  tokenId: string;\n\n  owner: string | null;\n  tokenUri: string | null;\n  metadataStatus: \"PENDING\" | \"FETCHING\" | \"FETCHED\" | \"FAILED\";\n\n  standard: \"ERC721\" | \"ERC1155\" | \"UNKNOWN\";\n  metadata: ApiTokenMetadata;\n\n  balances: ApiTokenBalance[] | null;\n  activeOrders: ApiOrder[];\n  createdAt: string;\n  updatedAt: string;\n}\n\nexport interface ApiCollection {\n  id: string;\n  chain: string;\n  contractAddress: string;\n  collectionId: string | null;\n  name: string | null;\n  symbol: string | null;\n  description: string | null;\n  image: string | null;\n  owner: string | null;\n  startBlock: string;\n  metadataStatus: \"PENDING\" | \"FETCHING\" | \"FETCHED\" | \"FAILED\";\n\n  standard: \"ERC721\" | \"ERC1155\";\n  isKnown: boolean;\n\n  isHidden: boolean;\n\n  isFeatured: boolean;\n\n  service: string | null;\n  claimedBy: string | null;\n  profile?: ApiCollectionProfile | null;\n  floorPrice: string | null;\n  totalVolume: string | null;\n  holderCount: number | null;\n  totalSupply: number | null;\n  createdAt: string;\n  updatedAt: string;\n}\n\nexport interface ApiCoin {\n  id: string;\n  chain: string;\n  contractAddress: string;\n  standard: \"ERC20\";\n\n  service: string;\n  name: string | null;\n  symbol: string | null;\n  decimals: number;\n\n  totalSupply: string | null;\n  description: string | null;\n  image: string | null;\n  creator: string | null;\n\n  isLaunched?: boolean | null;\n  startBlock: string;\n  isHidden: boolean;\n  createdAt: string;\n  updatedAt: string;\n}\n\nexport interface ApiCoinPrice {\n\n  usdc: number;\n}\n\nexport type ApiCoinPrices = Record<string, ApiCoinPrice | null>;\n\nexport type ApiCoinClaimResult =\n  | { verified: true; coin: ApiCoin | null }\n  | { verified: false; reason: \"owner_mismatch\" | \"owner_check_failed\" | \"not_erc20\" | \"no_total_supply\" };\n\nexport interface ApiCoinsQuery {\n  chain?: ChainFilter;\n  page?: number;\n  limit?: number;\n\n  service?: string;\n}\n\nexport interface ApiActivityPrice {\n  raw: string | null;\n  formatted: string | null;\n  currency: string | null;\n}\n\nexport interface ApiActivity {\n  type: ActivityType;\n  chain: import(\"../chains.js\").Chain;\n\n  contractAddress?: string;\n  tokenId?: string;\n  from?: string;\n  to?: string;\n  blockNumber?: string;\n\n  amount?: string;\n\n  orderHash?: string;\n  nftContract?: string;\n  nftTokenId?: string;\n  offerer?: string;\n  fulfiller?: string | null;\n  price?: ApiActivityPrice;\n\n  tokenStandard?: \"ERC721\" | \"ERC1155\";\n  txHash: string | null;\n  timestamp: string;\n\n  token?: { name: string | null; image: string | null; animationUrl: string | null } | null;\n}\n\nexport interface ApiActivitiesQuery {\n  chain?: ChainFilter;\n  type?: ActivityType;\n\n  contract?: string;\n  page?: number;\n  limit?: number;\n}\n\nexport interface ApiComment {\n  id: string;\n  chain: string;\n  contractAddress: string;\n  tokenId: string;\n  author: string;\n  content: string;\n  txHash: string | null;\n  blockNumber: string;\n  postedAt: string;\n}\n\nexport interface ApiSearchTokenResult {\n  contractAddress: string;\n  tokenId: string;\n  name: string | null;\n  image: string | null;\n  owner: string;\n  metadataStatus: string;\n}\n\nexport interface ApiSearchCollectionResult {\n  contractAddress: string;\n  name: string | null;\n  image: string | null;\n  totalSupply: number | null;\n  floorPrice: string | null;\n  holderCount: number | null;\n}\n\nexport interface ApiSearchCreatorResult {\n  walletAddress: string;\n  username: string | null;\n  name: string | null;\n  bio: string | null;\n  avatarImage: string | null;\n}\n\nexport interface ApiSearchResult {\n  tokens: ApiSearchTokenResult[];\n  collections: ApiSearchCollectionResult[];\n  creators: ApiSearchCreatorResult[];\n}\n\nexport interface ApiIntent {\n  id: string;\n  chain: string;\n  type: IntentType;\n  status: IntentStatus;\n  requester: string;\n  typedData: unknown;\n  calls: unknown;\n  signature: string[];\n  txHash: string | null;\n  orderHash: string | null;\n\n  parentOrderHash?: string | null;\n\n  counterOfferMessage?: string | null;\n  expiresAt: string;\n  createdAt: string;\n  updatedAt: string;\n}\n\nexport interface IntentCall {\n  contractAddress: string;\n  entrypoint: string;\n  calldata: string[];\n}\n\nexport type ApiIntentCreated =\n  | { id: string; expiresAt: string; requiresSignature: true; typedData: unknown }\n  | { id: string; expiresAt: string; requiresSignature: false; calls: IntentCall[] };\n\nexport interface ApiTxSyncResult {\n  applied: number;\n  contracts?: string[];\n  pending: boolean;\n}\n\nexport interface CreateListingIntentParams {\n  offerer: string;\n  nftContract: string;\n  tokenId: string;\n  currency: string;\n  price: string;\n  endTime: number;\n  salt?: string;\n\n  amount?: string;\n}\n\nexport interface MakeOfferIntentParams {\n  offerer: string;\n  nftContract: string;\n  tokenId: string;\n  currency: string;\n  price: string;\n  endTime: number;\n  salt?: string;\n\n  tokenStandard?: string;\n\n  quantity?: string;\n}\n\nexport interface FulfillOrderIntentParams {\n  fulfiller: string;\n  orderHash: string;\n\n  tokenStandard?: string;\n\n  quantity?: string;\n}\n\nexport interface CancelOrderIntentParams {\n  offerer: string;\n  orderHash: string;\n\n  tokenStandard?: string;\n}\n\nexport type FactoryFamilyServiceId = \"mip-erc1155\" | \"ip-tickets\" | \"ip-ticketing\" | \"ip-club\";\n\nexport type TierServiceId = \"ip-tickets\" | \"ip-ticketing\" | \"ip-club\";\n\nexport type CollectionServiceId =\n  | FactoryFamilyServiceId\n  | \"pop-protocol\"\n  | \"drop-collection\"\n  | \"data-tokenization-erc721\";\n\nexport interface CreateMintIntentParams {\n\n  owner: string;\n  recipient: string;\n\n  collectionId?: string;\n\n  tokenUri?: string;\n\n  royaltyBps?: number;\n\n  tokenId?: string;\n\n  amount?: string;\n\n  value?: string;\n\n  collectionContract?: string;\n}\n\nexport interface CreateCollectionIntentParams {\n  owner: string;\n  name: string;\n  symbol: string;\n\n  description?: string;\n\n  image?: string;\n\n  baseUri?: string;\n\n  collectionContract?: string;\n\n  service?: CollectionServiceId;\n\n  claimEndTimestamp?: number;\n\n  eventType?: PopEventType;\n\n  maxSupply?: string;\n\n  conditions?: {\n    startTime: number;\n    endTime: number;\n    price: string;\n    paymentToken: string;\n    maxQuantityPerWallet: string;\n  };\n}\n\nexport interface CheckoutIntentItem {\n  orderHash: string;\n\n  quantity?: string;\n}\n\nexport interface CreateCheckoutIntentParams {\n  fulfiller: string;\n\n  items?: CheckoutIntentItem[];\n\n  orderHashes?: string[];\n}\n\nexport interface ApiCheckoutIntentResult {\n  id?: string;\n  orderHash: string;\n  requiresSignature?: false;\n  calls?: unknown;\n  expiresAt?: string;\n\n  error?: string;\n}\n\nexport interface CreateTierIntentParams {\n  owner: string;\n\n  collection: string;\n  service: TierServiceId;\n  maxSupply: string;\n  startTime?: number;\n  endTime?: number;\n  royaltyBps: number;\n  metadataUri: string;\n}\n\nexport interface EmissionParams {\n  chain?: \"STARKNET\";\n  service: string;\n  owner: string;\n  recipientScheme?: string;\n  recipients: string[];\n  tokenUri?: string;\n  collectionId?: string;\n  collectionContract?: string;\n  tokenId?: string;\n  amount?: string;\n  batchSize?: number;\n}\n\nexport interface ApiEmissionCall {\n  contractAddress: string;\n  entrypoint: string;\n  calldata: string[];\n}\n\nexport interface ApiEmissionResult {\n  service: string;\n  recipientCount: number;\n  callCount: number;\n  batches: ApiEmissionCall[][];\n}\n\nexport interface CreateCoinIntentParams {\n\n  owner: string;\n  name: string;\n  symbol: string;\n\n  initialSupply: string;\n\n  salt?: string;\n}\n\nexport interface LaunchCoinIntentParams {\n\n  owner: string;\n\n  creatorCoin: string;\n\n  quoteToken: string;\n\n  price: number;\n\n  initialHolders: string[];\n  initialHoldersAmounts: string[];\n\n  transferRestrictionDelay?: number;\n\n  maxPercentageBuyLaunch?: number;\n\n  quoteFundAmount?: string;\n}\n\nexport interface CreateSponsorshipOfferIntentParams {\n\n  author: string;\n  nftContract: string;\n  tokenId: string;\n  minAmount: string;\n\n  duration: number;\n  paymentToken: string;\n  licenseTermsUri: string;\n  transferable: boolean;\n\n  royaltyBps: number;\n\n  specificSponsor?: string;\n}\n\nexport interface SetSponsorshipOfferOpenIntentParams {\n\n  author: string;\n  offerId: string;\n  open: boolean;\n}\n\nexport interface PlaceSponsorshipBidIntentParams {\n\n  sponsor: string;\n  offerId: string;\n  amount: string;\n  paymentToken: string;\n}\n\nexport interface RetractSponsorshipBidIntentParams {\n  sponsor: string;\n  offerId: string;\n}\n\nexport interface AcceptSponsorshipBidIntentParams {\n\n  author: string;\n  offerId: string;\n\n  sponsor: string;\n}\n\nexport interface CreateSponsorshipProposalIntentParams {\n\n  proposer: string;\n  nftContract: string;\n  tokenId: string;\n\n  amount: string;\n  duration: number;\n\n  validUntil?: number;\n  paymentToken: string;\n  licenseTermsUri: string;\n  transferable: boolean;\n  royaltyBps: number;\n}\n\nexport interface WithdrawSponsorshipProposalIntentParams {\n  proposer: string;\n  proposalId: string;\n}\n\nexport interface AcceptSponsorshipProposalIntentParams {\n\n  owner: string;\n  proposalId: string;\n}\n\nexport interface RejectSponsorshipProposalIntentParams {\n  owner: string;\n  proposalId: string;\n}\n\nexport interface CreateCounterOfferIntentParams {\n\n  sellerAddress: string;\n\n  originalOrderHash: string;\n\n  priceRaw: string;\n\n  durationSeconds: number;\n\n  message?: string;\n}\n\nexport interface ApiCounterOffersQuery {\n\n  originalOrderHash?: string;\n\n  sellerAddress?: string;\n  page?: number;\n  limit?: number;\n}\n\nexport const OPEN_LICENSES = [\"CC0\", \"CC BY\", \"CC BY-SA\", \"CC BY-NC\"] as const;\nexport type OpenLicense = (typeof OPEN_LICENSES)[number];\n\nexport type RemixOfferStatus =\n  | \"PENDING\"\n  | \"AUTO_PENDING\"\n  | \"APPROVED\"\n  | \"COMPLETED\"\n  | \"REJECTED\"\n  | \"EXPIRED\"\n  | \"SELF_MINTED\";\n\nexport interface ApiRemixOfferPrice {\n  raw: string;\n  formatted: string;\n  currency: string;\n  decimals: number;\n}\n\nexport interface ApiRemixOffer {\n  id: string;\n  status: RemixOfferStatus;\n  originalContract: string;\n  originalTokenId: string;\n  creatorAddress: string;\n  requesterAddress: string | null;\n  message?: string | null;\n\n  price?: ApiRemixOfferPrice;\n  licenseType: string;\n  commercial: boolean;\n  derivatives: boolean;\n  royaltyPct: number | null;\n  approvedCollection: string | null;\n  remixContract: string | null;\n  remixTokenId: string | null;\n  orderHash: string | null;\n  createdAt: string;\n  expiresAt: string;\n  updatedAt: string;\n}\n\nexport interface ApiPublicRemix {\n  id: string;\n  remixContract: string | null;\n  remixTokenId: string | null;\n  licenseType: string;\n  commercial: boolean;\n  derivatives: boolean;\n  createdAt: string;\n}\n\nexport interface CreateRemixOfferParams {\n  originalContract: string;\n  originalTokenId: string;\n  licenseType: string;\n  commercial: boolean;\n  derivatives: boolean;\n  royaltyPct?: number;\n  proposedPrice?: string;\n  proposedCurrency?: string;\n  message?: string;\n\n  expiresInDays?: number;\n}\n\nexport interface AutoRemixOfferParams {\n  originalContract: string;\n  originalTokenId: string;\n  licenseType: string;\n}\n\nexport interface ConfirmSelfRemixParams {\n  originalContract: string;\n  originalTokenId: string;\n  remixContract: string;\n  remixTokenId: string;\n\n  txHash?: string;\n  licenseType: string;\n  commercial: boolean;\n  derivatives: boolean;\n  royaltyPct?: number;\n}\n\nexport interface ConfirmRemixOfferParams {\n  approvedCollection: string;\n  remixContract: string;\n  remixTokenId: string;\n  orderHash?: string;\n}\n\nexport interface ApiRemixOffersQuery {\n\n  role: \"creator\" | \"requester\";\n  page?: number;\n  limit?: number;\n}\n\nexport interface ApiMetadataSignedUrl {\n  url: string;\n}\n\nexport interface ApiMetadataUpload {\n  cid: string;\n  url: string;\n}\n\nexport interface ApiPortalMe {\n  id: string;\n  accountId: string;\n  plan: TenantPlan;\n  status: string;\n  creditBalance: number;\n}\n\nexport interface ApiPortalKey {\n  id: string;\n  prefix: string;\n  label: string | null;\n  appSource: string | null;\n  status: ApiKeyStatus;\n  lastUsedAt: string | null;\n  createdAt: string;\n}\n\nexport interface ApiPortalKeyCreated {\n  id: string;\n  prefix: string;\n  label: string | null;\n\n  plaintext: string;\n}\n\nexport interface ApiCreditPayment {\n  id: string;\n  asset: string;\n  amountAtomic: string;\n  creditedAmount: number;\n  mdlnMultiplier: number;\n  txHash: string;\n  status: string;\n  createdAt: string;\n}\n\nexport interface ApiSpendByAction {\n  actionKey: string;\n  credits: number;\n  units: number;\n}\n\nexport interface ApiPortalSpend {\n  recent: Array<{ actionKey: string; credits: number; createdAt: string }>;\n  byAction: ApiSpendByAction[];\n  spent: number;\n  credited: number;\n  drift: number;\n}\n\nexport interface ApiWebhookEndpoint {\n  id: string;\n  url: string;\n  events: WebhookEventType[];\n  status: WebhookStatus;\n  createdAt: string;\n}\n\nexport interface ApiWebhookCreated extends ApiWebhookEndpoint {\n\n  secret: string;\n}\n\nexport interface CreateWebhookParams {\n  url: string;\n  events: WebhookEventType[];\n  label?: string;\n}\n\nexport interface ApiCollectionProfile {\n  contractAddress: string;\n  chain: string;\n  displayName: string | null;\n  description: string | null;\n  image: string | null;\n  bannerImage: string | null;\n  websiteUrl: string | null;\n  twitterUrl: string | null;\n  discordUrl: string | null;\n  telegramUrl: string | null;\n  hasGatedContent: boolean;\n  gatedContentTitle: string | null;\n  slug: string | null;\n  updatedBy: string | null;\n  updatedAt: string;\n}\n\nexport interface UpdateCollectionProfileInput {\n  displayName?: string | null;\n  description?: string | null;\n  image?: string | null;\n  bannerImage?: string | null;\n  websiteUrl?: string | null;\n  twitterUrl?: string | null;\n  discordUrl?: string | null;\n  telegramUrl?: string | null;\n  gatedContentTitle?: string | null;\n  gatedContentUrl?: string | null;\n  gatedContentType?: \"VIDEO\" | \"STREAM\" | \"AUDIO\" | \"DOCUMENT\" | \"LINK\" | null;\n}\n\nexport interface ApiCollectionSlugClaim {\n  id: string;\n  slug: string;\n  contractAddress: string;\n  chain: string;\n  walletAddress: string;\n  status: \"PENDING\" | \"APPROVED\" | \"REJECTED\";\n  adminNotes: string | null;\n  notifyEmail: string | null;\n  reviewedAt: string | null;\n  createdAt: string;\n  updatedAt: string;\n}\n\nexport interface ApiCreatorProfile {\n  walletAddress: string;\n  chain: string;\n  username: string | null;\n  name: string | null;\n  bio: string | null;\n  avatarImage: string | null;\n\n  collectionImage?: string | null;\n  websiteUrl: string | null;\n  twitterUrl: string | null;\n  discordUrl: string | null;\n  telegramUrl: string | null;\n  updatedAt: string;\n}\n\nexport interface ApiCreatorListResult {\n  creators: ApiCreatorProfile[];\n  total: number;\n  page: number;\n  limit: number;\n}\n\nexport type ApiAppSource =\n  | \"MEDIALANE_STARKNET\"\n  | \"MEDIALANE_IO\"\n  | \"MEDIALANE_PORTAL\"\n  | \"MEDIALANE_SDK\"\n\n  | \"MEDIALANE_DAPP\";\n\nexport type ApiChain = \"STARKNET\" | \"ETHEREUM\" | \"SOLANA\" | \"BASE\" | \"BITCOIN\";\n\nexport interface ApiUserWallet {\n  walletAddress: string;\n  email?: string | null;\n  emailVerified?: boolean;\n  requiresEmailVerification?: boolean;\n}\n\nexport interface ApiCollectionClaim {\n  id: string;\n  contractAddress: string;\n  chain: string;\n  claimantAddress: string | null;\n  status: \"PENDING\" | \"AUTO_APPROVED\" | \"APPROVED\" | \"REJECTED\";\n  verificationMethod: \"ONCHAIN\" | \"SIGNATURE\" | \"MANUAL\";\n  createdAt: string;\n}\n\nexport interface ApiAdminCollectionClaim extends ApiCollectionClaim {\n  claimantEmail: string | null;\n  notes: string | null;\n  adminNotes: string | null;\n  reviewedBy: string | null;\n  reviewedAt: string | null;\n  updatedAt: string;\n}\n\nexport interface ApiBusinessProvisioning {\n  id: string;\n  accountId: string;\n  chain: string;\n  walletAddress: string;\n\n  recipientScheme: string;\n  recipientValue: string;\n  interimOwnerPubkey: string;\n  newOwnerPubkey: string | null;\n  status: \"DEPLOYED\" | \"HANDOFF\" | \"TRANSFERRED\";\n}\n\nexport interface ApiWalletActivity {\n  id: string;\n  chain: string;\n  accountAddress: string;\n  type: \"SEND\" | \"RECEIVE\" | \"SWAP\" | \"DEPLOY\" | \"GUARDIAN_SET\" | \"GUARDIAN_TRIGGER_ESCAPE\" | \"GUARDIAN_COMPLETE_ESCAPE\" | \"GUARDIAN_CANCEL_ESCAPE\";\n  txHash: string;\n  blockNumber: string;\n  timestamp: string;\n  tokenAddress: string | null;\n  amount: string | null;\n  counterparty: string | null;\n  tokenInAddress: string | null;\n  amountIn: string | null;\n  tokenOutAddress: string | null;\n  amountOut: string | null;\n}\n\nexport interface PopClaimStatus {\n  isEligible: boolean;\n  hasClaimed: boolean;\n  tokenId: string | null;\n}\n\nexport interface PopBatchEligibilityItem extends PopClaimStatus {\n  wallet: string;\n}\n\nexport type PopEventType =\n  | \"Conference\"\n  | \"Bootcamp\"\n  | \"Workshop\"\n  | \"Hackathon\"\n  | \"Meetup\"\n  | \"Course\"\n  | \"Other\";\n\nexport interface DropMintStatus {\n  mintedByWallet: number;\n  totalMinted: number;\n}\n\nexport interface ApiRewardsBadge {\n  key: string;\n  name: string;\n  description: string;\n  icon: string;\n  color: string;\n  category: string;\n}\n\nexport interface ApiRewardsLevel {\n  level: number;\n  name: string;\n  xpRequired: number;\n  badgeColor: string;\n  description: string | null;\n}\n\nexport interface ApiUserRewards {\n  address: string;\n  accountId: string | null;\n  publicId: string | null;\n  totalXp: number;\n  currentLevel: number;\n  currentLevelName: string;\n  badgeColor: string;\n  nextLevel: { level: number; name: string; xpRequired: number } | null;\n  progressPct: number;\n  breakdown: Record<string, number>;\n  badges: ApiRewardsBadge[];\n  computedAt: string | null;\n}\n\nexport interface ApiRewardsLeaderboardEntry {\n  rank: number;\n  address: string;\n  accountId: string | null;\n  publicId: string | null;\n  totalXp: number;\n  currentLevel: number;\n  currentLevelName: string;\n  badgeColor: string;\n}\n\nexport interface ApiRewardsConfig {\n  levels: ApiRewardsLevel[];\n  actions: { type: string; label: string; xp: number; dailyCap: number | null }[];\n  badges: ApiRewardsBadge[];\n}\n\nexport interface ApiRewardsBatchEntry {\n  address: string;\n  totalXp: number;\n  currentLevel: number;\n  currentLevelName: string;\n  badgeColor: string;\n}\n\nexport interface ApiPointEvent {\n  id: string;\n  actionType: string;\n  xp: number;\n  multiplier: number;\n  finalXp: number;\n  txHash: string | null;\n  createdAt: string;\n}\n","import { getCoordinates } from \"./chains.js\";\n\nconst SN = getCoordinates(\"STARKNET\");\n\nexport const STARKNET_MARKETPLACE_721_CONTRACT = SN.marketplace721!;\nexport const STARKNET_MARKETPLACE_721_CLASS_HASH = SN.marketplace721ClassHash!;\nexport const STARKNET_MARKETPLACE_721_START_BLOCK = SN.marketplace721StartBlock!;\nexport const STARKNET_MARKETPLACE_1155_CONTRACT = SN.marketplace1155!;\nexport const STARKNET_MARKETPLACE_1155_CLASS_HASH = SN.marketplace1155ClassHash!;\nexport const STARKNET_MARKETPLACE_1155_START_BLOCK = SN.marketplace1155StartBlock!;\n\nexport const STARKNET_COLLECTION_721_CONTRACT = SN.collection721!;\nexport const STARKNET_DATA_TOKENIZATION_721_CONTRACT = SN.dataTokenization721!;\nexport const STARKNET_COLLECTION_721_START_BLOCK = SN.collection721StartBlock!;\nexport const STARKNET_IPNFT_CLASS_HASH = SN.ipNftClassHash!;\nexport const STARKNET_IPCOLLECTION_CLASS_HASH = SN.ipCollectionClassHash!;\nexport const STARKNET_COLLECTION_1155_CONTRACT = SN.collection1155!;\nexport const STARKNET_COLLECTION_1155_FACTORY_CLASS_HASH = SN.collection1155FactoryClassHash!;\nexport const STARKNET_COLLECTION_1155_CLASS_HASH = SN.collection1155ClassHash!;\nexport const STARKNET_COLLECTION_1155_START_BLOCK = SN.collection1155StartBlock!;\n\nexport const STARKNET_POP_FACTORY_CONTRACT = SN.popFactory!;\nexport const STARKNET_POP_COLLECTION_CLASS_HASH = SN.popCollectionClassHash!;\nexport const STARKNET_DROP_FACTORY_CONTRACT = SN.dropFactory!;\nexport const STARKNET_DROP_COLLECTION_CLASS_HASH = SN.dropCollectionClassHash!;\nexport const STARKNET_NFTCOMMENTS_CONTRACT = SN.nftComments!;\n\nexport const STARKNET_IP_TICKETS_FACTORY_CONTRACT = SN.ipTicketsFactory!;\nexport const STARKNET_IP_TICKET_COLLECTION_CLASS_HASH = SN.ipTicketCollectionClassHash!;\nexport const STARKNET_IP_CLUB_FACTORY_CONTRACT = SN.ipClubFactory!;\nexport const STARKNET_IP_CLUB_COLLECTION_CLASS_HASH = SN.ipClubCollectionClassHash!;\nexport const STARKNET_IP_SPONSORSHIP_CONTRACT = SN.ipSponsorship!;\nexport const STARKNET_IP_SPONSORSHIP_CLASS_HASH = SN.ipSponsorshipClassHash!;\n\nexport const STARKNET_MEDIAWALLET_CLASS_HASH = SN.mediaWalletClassHash!;\n\nexport const STARKNET_CREATOR_COIN_FACTORY_CONTRACT = SN.creatorCoinFactory!;\nexport const STARKNET_CREATOR_COIN_EKUBO_LAUNCHER = SN.creatorCoinEkuboLauncher!;\nexport const STARKNET_CREATOR_COIN_CLASS_HASH = SN.creatorCoinClassHash!;\nexport const STARKNET_CREATOR_COIN_FACTORY_CLASS_HASH = SN.creatorCoinFactoryClassHash!;\nexport const STARKNET_CREATOR_COIN_START_BLOCK = SN.creatorCoinStartBlock!;\n\nexport const STARKNET_GENESIS_MINT_LAUNCH_CONTRACT = SN.genesisMintLaunch!;\nexport const STARKNET_GENESIS_MINT_BR_CONTRACT = SN.genesisMintBR!;\nexport const STARKNET_GENESIS_MINT_GLOBAL_CONTRACT = SN.genesisMintGlobal!;\nexport const STARKNET_EKUBO_CORE = SN.ekuboCore!;\n\nexport const SUPPORTED_TOKENS = [\n  {\n\n    symbol: \"USDC\",\n    address:\n      \"0x033068f6539f8e6e6b131e6b2b814e6c34a5224bc66947c47dab9dfee93b35fb\",\n    decimals: 6,\n    listable: true,\n  },\n  {\n    symbol: \"USDT\",\n    address:\n      \"0x068f5c6a61780768455de69077e07e89787839bf8166decfbf92b645209c0fb8\",\n    decimals: 6,\n    listable: true,\n  },\n  {\n    symbol: \"ETH\",\n    address:\n      \"0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7\",\n    decimals: 18,\n    listable: true,\n  },\n  {\n    symbol: \"STRK\",\n    address:\n      \"0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d\",\n    decimals: 18,\n    listable: true,\n  },\n  {\n    symbol: \"WBTC\",\n    address:\n      \"0x03fe2b97c1fd336e750087d68b9b867997fd64a2661ff3ca5a7c771641e8e7ac\",\n    decimals: 8,\n    listable: true,\n  },\n] as const;\n\nexport type SupportedTokenSymbol = (typeof SUPPORTED_TOKENS)[number][\"symbol\"];\n\nexport const DEFAULT_CURRENCY: SupportedTokenSymbol = \"USDC\";\n","import type { Chain } from \"./chains.js\";\n\nexport const SUPPORTED_URL_CHAINS = [\"STARKNET\"] as const satisfies readonly Chain[];\n\nexport function chainSlug(chain: Chain): string {\n  return chain.toLowerCase();\n}\n\nexport function chainFromSlug(slug: string): Chain | null {\n  const upper = slug.toUpperCase() as Chain;\n  return (SUPPORTED_URL_CHAINS as readonly Chain[]).includes(upper) ? upper : null;\n}\n\ntype Idish = string | number | null | undefined;\nconst seg = (v: Idish): string => (v == null ? \"\" : String(v));\n\nexport function assetHref(chain: Chain, contract: Idish, tokenId: Idish): string {\n  return `/asset/${chainSlug(chain)}/${seg(contract)}/${seg(tokenId)}`;\n}\n\nexport function collectionHref(chain: Chain, contract: Idish): string {\n  return `/collections/${chainSlug(chain)}/${seg(contract)}`;\n}\n\nexport function coinHref(chain: Chain, address: Idish): string {\n  return `/coins/${chainSlug(chain)}/${seg(address)}`;\n}\n","import type { ServiceDefinition, ServiceCapability } from \"../types/api.js\";\nimport { getStarknetCoordinates } from \"../chains.js\";\n\nconst SN = getStarknetCoordinates(\"STARKNET\");\n\nconst SERVICES = {\n  \"mip-erc721\": {\n    id: \"mip-erc721\",\n    displayName: \"IP Collection\",\n    description: \"Tokenize intellectual property as a per-creator ERC-721 collection.\",\n    standard: \"ERC721\",\n    provenance: \"MEDIALANE\",\n    onchain: {\n      STARKNET: {\n        factoryAddress: SN.collection721!,\n        startBlock: SN.collection721StartBlock!,\n      },\n    },\n    uiVariant: \"standard\",\n    capabilities: [\"list\", \"buy\", \"make_offer\", \"cancel\", \"transfer\", \"mint\", \"remix\", \"license\"],\n    events: [\n      { name: \"CollectionCreated\", emittedBy: \"factory\" },\n\n    ],\n    metadataSchema: { licenseDefault: \"CC BY-SA\" },\n  },\n  \"ip-erc721\": {\n    id: \"ip-erc721\",\n    displayName: \"Programmable IP\",\n    description: \"One shared ERC-721 contract any wallet can mint into.\",\n    standard: \"ERC721\",\n    provenance: \"MEDIALANE\",\n    uiVariant: \"standard\",\n    capabilities: [\"list\", \"buy\", \"make_offer\", \"cancel\", \"transfer\", \"mint\", \"remix\", \"license\"],\n\n    metadataSchema: { licenseDefault: \"CC BY-SA\" },\n  },\n  \"data-tokenization-erc721\": {\n    id: \"data-tokenization-erc721\",\n    displayName: \"Data Tokenization\",\n    description: \"Establish verifiable ownership of your data, with licensing terms that hold up wherever it travels.\",\n    standard: \"ERC721\",\n    provenance: \"MEDIALANE\",\n    onchain: {\n      STARKNET: {\n        factoryAddress: SN.dataTokenization721!,\n        startBlock: SN.dataTokenization721StartBlock!,\n      },\n    },\n    uiVariant: \"standard\",\n    capabilities: [\"list\", \"buy\", \"make_offer\", \"cancel\", \"transfer\", \"mint\", \"remix\", \"license\"],\n    events: [\n      { name: \"CollectionCreated\", emittedBy: \"factory\" },\n    ],\n    metadataSchema: { licenseDefault: \"CC BY-SA\" },\n  },\n  \"mip-erc1155\": {\n    id: \"mip-erc1155\",\n    displayName: \"NFT Editions\",\n    description: \"Per-creator ERC-1155 collection; creator mints editions.\",\n    standard: \"ERC1155\",\n    provenance: \"MEDIALANE\",\n    onchain: {\n      STARKNET: {\n        factoryAddress: SN.collection1155!,\n        classHash: SN.collection1155ClassHash!,\n        startBlock: SN.collection1155StartBlock!,\n      },\n    },\n    uiVariant: \"edition\",\n    capabilities: [\"list\", \"buy\", \"make_offer\", \"cancel\", \"transfer\", \"mint\", \"remix\", \"license\"],\n    events: [\n      { name: \"CollectionDeployed\", emittedBy: \"factory\" },\n    ],\n    metadataSchema: { licenseDefault: \"CC BY-SA\" },\n  },\n  \"pop-protocol\": {\n    id: \"pop-protocol\",\n    displayName: \"POP Protocol\",\n    description: \"Soulbound proof-of-presence collectibles per event.\",\n    standard: \"ERC721\",\n    provenance: \"MEDIALANE\",\n    onchain: {\n      STARKNET: {\n        factoryAddress: SN.popFactory!,\n        classHash: SN.popCollectionClassHash!,\n      },\n    },\n    uiVariant: \"pop\",\n    capabilities: [\"claim\", \"mint\"],\n    events: [\n      { name: \"CollectionCreated\", emittedBy: \"factory\" },\n      { name: \"AllowlistUpdated\", emittedBy: \"instance\", poll: \"slow\" },\n    ],\n    metadataSchema: { licenseDefault: \"CC BY-SA\" },\n  },\n  \"drop-collection\": {\n    id: \"drop-collection\",\n    displayName: \"Collection Drop\",\n    description: \"Sequential mint with claim windows + allowlist.\",\n    standard: \"ERC721\",\n    provenance: \"MEDIALANE\",\n    onchain: {\n      STARKNET: {\n        factoryAddress: SN.dropFactory!,\n        classHash: SN.dropCollectionClassHash!,\n      },\n    },\n    uiVariant: \"drop\",\n    capabilities: [\"claim\", \"list\", \"buy\", \"make_offer\", \"cancel\", \"transfer\"],\n    events: [\n      { name: \"DropCreated\", emittedBy: \"factory\" },\n      { name: \"AllowlistUpdated\", emittedBy: \"instance\", poll: \"slow\" },\n    ],\n    metadataSchema: { licenseDefault: \"CC BY-SA\" },\n  },\n  \"ip-tickets\": {\n    id: \"ip-tickets\",\n    displayName: \"IP Tickets\",\n    description: \"Create verifiable on-chain tickets — mint to attendees, trade like any collection.\",\n    standard: \"ERC1155\",\n    provenance: \"MEDIALANE\",\n    onchain: {\n      STARKNET: {\n        factoryAddress: SN.ipTicketsFactory!,\n        classHash: SN.ipTicketCollectionClassHash!,\n      },\n    },\n    uiVariant: \"ticket\",\n    capabilities: [\"mint\", \"redeem\", \"list\", \"buy\", \"make_offer\", \"cancel\", \"transfer\"],\n    events: [\n      { name: \"CollectionDeployed\", emittedBy: \"factory\" },\n      { name: \"TicketCreated\", emittedBy: \"instance\" },\n    ],\n    metadataSchema: { licenseDefault: \"CC BY-SA\" },\n  },\n  \"ip-ticketing\": {\n    id: \"ip-ticketing\",\n    displayName: \"IP Ticketing\",\n    description: \"Distribute verifiable on-chain tickets to a list of recipients in one run — everyone gets a wallet and their ticket.\",\n    standard: \"ERC1155\",\n    provenance: \"MEDIALANE\",\n    onchain: {\n      STARKNET: {\n        factoryAddress: SN.ipTicketsFactory!,\n        classHash: SN.ipTicketCollectionClassHash!,\n      },\n    },\n    uiVariant: \"ticket\",\n    capabilities: [\"mint\", \"airdrop\", \"redeem\", \"list\", \"buy\", \"make_offer\", \"cancel\", \"transfer\"],\n    events: [\n      { name: \"CollectionDeployed\", emittedBy: \"factory\" },\n      { name: \"TicketCreated\", emittedBy: \"instance\" },\n    ],\n    metadataSchema: { licenseDefault: \"CC BY-SA\" },\n  },\n  \"ip-club\": {\n    id: \"ip-club\",\n    displayName: \"IP Club\",\n    description: \"Membership clubs — create tiers, mint membership cards, trade like any collection.\",\n    standard: \"ERC1155\",\n    provenance: \"MEDIALANE\",\n    onchain: {\n      STARKNET: {\n        factoryAddress: SN.ipClubFactory!,\n        classHash: SN.ipClubCollectionClassHash!,\n      },\n    },\n    uiVariant: \"club\",\n    capabilities: [\"mint\", \"list\", \"buy\", \"make_offer\", \"cancel\", \"transfer\"],\n    events: [\n      { name: \"ClubDeployed\", emittedBy: \"factory\" },\n      { name: \"MembershipCreated\", emittedBy: \"instance\" },\n    ],\n    metadataSchema: { licenseDefault: \"CC BY-SA\" },\n  },\n  \"ip-sponsorship\": {\n    id: \"ip-sponsorship\",\n    displayName: \"IP Sponsorship\",\n    description: \"Sponsorship offers and licenses anchored to an existing Medialane asset.\",\n    standard: \"ERC721\",\n    provenance: \"MEDIALANE\",\n    onchain: {\n      STARKNET: {\n        factoryAddress: SN.ipSponsorship!,\n        classHash: SN.ipSponsorshipClassHash!,\n        startBlock: SN.ipSponsorshipStartBlock!,\n      },\n    },\n    uiVariant: \"standard\",\n\n    capabilities: [\"sponsor\", \"transfer\"],\n    events: [\n      { name: \"OfferCreated\", emittedBy: \"factory\" },\n      { name: \"ProposalCreated\", emittedBy: \"factory\" },\n      { name: \"LicenseMinted\", emittedBy: \"factory\" },\n    ],\n    metadataSchema: { licenseDefault: \"CC BY-SA\" },\n  },\n  \"creator-coin\": {\n    id: \"creator-coin\",\n    displayName: \"Creator Coin\",\n    description:\n      \"Launch a fixed-supply social token with permanently-locked Ekubo liquidity.\",\n    standard: \"ERC20\",\n    provenance: \"MEDIALANE\",\n    onchain: {\n      STARKNET: {\n        factoryAddress: SN.creatorCoinFactory!,\n        classHash: SN.creatorCoinFactoryClassHash!,\n        startBlock: SN.creatorCoinStartBlock!,\n      },\n    },\n    uiVariant: \"coin\",\n\n    capabilities: [\"launch\", \"swap\", \"transfer\"],\n    events: [\n      { name: \"CreatorCoinCreated\", emittedBy: \"factory\" },\n      { name: \"CreatorCoinLaunched\", emittedBy: \"factory\" },\n    ],\n  },\n  \"medialane-marketplace-erc721\": {\n    id: \"medialane-marketplace-erc721\",\n    displayName: \"Medialane Marketplace (ERC-721)\",\n    description: \"ERC-721 order matching venue.\",\n    standard: \"ERC721\",\n    provenance: \"MEDIALANE\",\n    onchain: {\n      STARKNET: {\n        factoryAddress: SN.marketplace721!,\n        classHash: SN.marketplace721ClassHash!,\n        startBlock: SN.marketplace721StartBlock!,\n      },\n    },\n    uiVariant: \"standard\",\n    capabilities: [\"list\", \"buy\", \"make_offer\", \"cancel\"],\n    events: [\n      { name: \"OrderCreated\", emittedBy: \"factory\" },\n      { name: \"OrderFulfilled\", emittedBy: \"factory\" },\n      { name: \"OrderCancelled\", emittedBy: \"factory\" },\n    ],\n  },\n  \"medialane-marketplace-erc1155\": {\n    id: \"medialane-marketplace-erc1155\",\n    displayName: \"Medialane Marketplace (ERC-1155)\",\n    description: \"ERC-1155 order matching venue.\",\n    standard: \"ERC1155\",\n    provenance: \"MEDIALANE\",\n    onchain: {\n      STARKNET: {\n        factoryAddress: SN.marketplace1155!,\n        classHash: SN.marketplace1155ClassHash!,\n        startBlock: SN.marketplace1155StartBlock!,\n      },\n    },\n    uiVariant: \"edition\",\n    capabilities: [\"list\", \"buy\", \"make_offer\", \"cancel\"],\n    events: [\n      { name: \"OrderCreated\", emittedBy: \"factory\" },\n      { name: \"OrderFulfilled\", emittedBy: \"factory\" },\n      { name: \"OrderCancelled\", emittedBy: \"factory\" },\n    ],\n  },\n  \"unruggable-erc20\": {\n    id: \"unruggable-erc20\",\n    displayName: \"Unruggable\",\n    description:\n      \"An ERC-20 launched through the unruggable.meme protocol, the same contract Medialane's Creator Coin is forked from. Not deployed via a Medialane service, but exposes the same on-chain guarantees: capped team allocation, permanently locked liquidity, fixed supply. Brought in by owner claim or admin/partnership — never bulk-indexed.\",\n    standard: \"ERC20\",\n    provenance: \"EXTERNAL\",\n    uiVariant: \"coin\",\n    capabilities: [\"swap\", \"transfer\"],\n  },\n  \"external-erc20\": {\n    id: \"external-erc20\",\n    displayName: \"Memecoin\",\n    description:\n      \"A plain ERC-20 not deployed via a Medialane service and carrying no protocol-level guarantees. Brought in by owner claim or admin/partnership — never bulk-indexed. Generalizes to future chains.\",\n    standard: \"ERC20\",\n    provenance: \"EXTERNAL\",\n    uiVariant: \"coin\",\n    capabilities: [\"swap\", \"transfer\"],\n  },\n  \"external-erc721\": {\n    id: \"external-erc721\",\n    displayName: \"External ERC-721\",\n    description: \"ERC-721 contract not deployed via a Medialane service.\",\n    standard: \"ERC721\",\n    provenance: \"EXTERNAL\",\n    uiVariant: \"standard\",\n    capabilities: [\"list\", \"buy\", \"make_offer\", \"cancel\", \"transfer\"],\n  },\n  \"external-erc1155\": {\n    id: \"external-erc1155\",\n    displayName: \"External ERC-1155\",\n    description: \"ERC-1155 contract not deployed via a Medialane service.\",\n    standard: \"ERC1155\",\n    provenance: \"EXTERNAL\",\n    uiVariant: \"edition\",\n    capabilities: [\"list\", \"buy\", \"make_offer\", \"cancel\", \"transfer\"],\n  },\n} as const satisfies Record<string, ServiceDefinition>;\n\nexport type ServiceId = keyof typeof SERVICES;\n\nexport function isServiceId(id: string | null | undefined): id is ServiceId {\n  return typeof id === \"string\" && id in SERVICES;\n}\n\nexport function getService(id: string | null | undefined): ServiceDefinition | undefined {\n  return id && id in SERVICES ? (SERVICES as Record<string, ServiceDefinition>)[id] : undefined;\n}\n\nexport function listServices(): ServiceDefinition[] {\n  return Object.values(SERVICES);\n}\n\nexport function getServicesByCapability(cap: ServiceCapability): ServiceDefinition[] {\n  return Object.values(SERVICES).filter(\n    (s) => (s.capabilities as readonly ServiceCapability[]).includes(cap),\n  );\n}\n\nexport function hasCapability(\n  id: string | null | undefined,\n  cap: ServiceCapability,\n): boolean {\n  return getService(id)?.capabilities.includes(cap) ?? false;\n}\n","import { SUPPORTED_TOKENS } from \"../constants.js\";\n\nexport type SupportedToken = (typeof SUPPORTED_TOKENS)[number];\n\nexport function parseAmount(human: string, decimals: number): string {\n  const [whole, frac = \"\"] = human.split(\".\");\n  const fracPadded = frac.padEnd(decimals, \"0\").slice(0, decimals);\n  return (BigInt(whole) * BigInt(10) ** BigInt(decimals) + BigInt(fracPadded)).toString();\n}\n\nexport function formatAmount(raw: string, decimals: number): string {\n  const value = BigInt(raw);\n  const factor = 10n ** BigInt(decimals);\n  const whole = value / factor;\n  const remainder = value % factor;\n  const fractional = remainder.toString().padStart(decimals, \"0\").replace(/0+$/, \"\");\n  return fractional ? `${whole}.${fractional}` : whole.toString();\n}\n\nexport function getTokenByAddress(address: string | null | undefined): SupportedToken | undefined {\n  if (typeof address !== \"string\" || address.trim() === \"\") return undefined;\n\n  let target: bigint | null = null;\n  try {\n    target = BigInt(address);\n  } catch {\n    target = null;\n  }\n  return SUPPORTED_TOKENS.find((t) => {\n    if (target !== null) {\n      try {\n        return BigInt(t.address) === target;\n      } catch {\n\n      }\n    }\n    return t.address.toLowerCase() === address.toLowerCase();\n  });\n}\n\nexport function getTokenBySymbol(symbol: string | null | undefined): SupportedToken | undefined {\n  if (typeof symbol !== \"string\") return undefined;\n  const upper = symbol.toUpperCase();\n  return SUPPORTED_TOKENS.find((t) => t.symbol === upper);\n}\n\nexport function getListableTokens(): ReadonlyArray<SupportedToken> {\n  return SUPPORTED_TOKENS.filter((t) => t.listable);\n}\n","\nexport function stringifyBigInts(obj: unknown): unknown {\n  if (typeof obj === \"bigint\") {\n    return obj.toString();\n  }\n  if (Array.isArray(obj)) {\n    return obj.map(stringifyBigInts);\n  }\n  if (obj !== null && typeof obj === \"object\") {\n    return Object.fromEntries(\n      Object.entries(obj as Record<string, unknown>).map(([key, value]) => [\n        key,\n        stringifyBigInts(value),\n      ])\n    );\n  }\n  return obj;\n}\n\nexport function u256ToBigInt(low: string, high: string): bigint {\n  return BigInt(low) + (BigInt(high) << 128n);\n}\n\nexport function encodeU256(n: bigint): [string, string] {\n  return [\n    (n & 0xffffffffffffffffffffffffffffffffn).toString(),\n    (n >> 128n).toString(),\n  ];\n}\n","const TRANSIENT_BODY_RE =\n  /\"code\"\\s*:\\s*-32001|\"code\"\\s*:\\s*-32603|unable to complete|rate.?limit|too many|throttl|exceed.*quota|temporarily unavailable|service unavailable|overload|gateway.*time|upstream.*time|backend.*error/i;\n\nexport const POLICY_REFUSAL_CODES: readonly number[] = [-32003, -32005, -32600];\n\nexport function isPolicyRefusal(input: { body?: unknown }): boolean {\n  let body = input.body;\n\n  if (typeof body === \"string\") {\n    try {\n      body = JSON.parse(body);\n    } catch {\n      return false;\n    }\n  }\n  const err = (body as { error?: { code?: unknown } } | null | undefined)?.error;\n  const code = err && typeof err === \"object\" ? (err as { code?: unknown }).code : undefined;\n  return typeof code === \"number\" && POLICY_REFUSAL_CODES.includes(code);\n}\n\nexport function isTransientRpcError(input: { status?: number; body?: unknown }): boolean {\n  const { status, body } = input;\n\n  if (isPolicyRefusal({ body })) return false;\n\n  if (typeof status === \"number\" && (status === 429 || status >= 500)) return true;\n  if (body == null) return false;\n\n  if (typeof body === \"object\") {\n    const err = (body as { error?: { code?: unknown; message?: unknown } }).error;\n    if (!err || typeof err !== \"object\") return false;\n    const code = (err as { code?: unknown }).code;\n    if (typeof code === \"number\") {\n      if (code === 429) return true;\n      if (code >= -32099 && code <= -32000) return true;\n      if (code === -32603) return true;\n    }\n    const message = (err as { message?: unknown }).message;\n    return typeof message === \"string\" ? TRANSIENT_BODY_RE.test(message) : false;\n  }\n\n  return TRANSIENT_BODY_RE.test(String(body));\n}\n\nexport interface FailoverFetchOptions {\n\n  baseFetch?: typeof fetch;\n\n  onFailover?: (info: { url: string; status?: number; error?: unknown }) => void;\n}\n\nexport function createFailoverFetch(\n  urls: string[],\n  options: FailoverFetchOptions = {},\n): typeof fetch {\n  const endpoints = urls.filter((u): u is string => Boolean(u));\n  if (endpoints.length === 0) {\n    throw new Error(\"createFailoverFetch: at least one RPC URL is required\");\n  }\n  const doFetch = options.baseFetch ?? fetch;\n\n  const failover = async (_input: unknown, init?: RequestInit): Promise<Response> => {\n    let lastError: unknown;\n\n    for (let i = 0; i < endpoints.length; i++) {\n      const url = endpoints[i];\n      const isLast = i === endpoints.length - 1;\n      try {\n        const res = await doFetch(url, init);\n        const text = await res.text();\n        const rebuilt = () =>\n          new Response(text, { status: res.status, statusText: res.statusText, headers: res.headers });\n\n        if (isLast || !isTransientRpcError({ status: res.status, body: text })) {\n          return rebuilt();\n        }\n        options.onFailover?.({ url, status: res.status });\n      } catch (err) {\n        lastError = err;\n        if (isLast) throw err;\n        options.onFailover?.({ url, error: err });\n      }\n    }\n\n    throw lastError ?? new Error(\"createFailoverFetch: all endpoints failed\");\n  };\n\n  return failover as unknown as typeof fetch;\n}\n","export function createRateLimiter(windowMs: number, max: number) {\n  const counts = new Map<string, { count: number; resetAt: number }>();\n  let nextSweepAt = Date.now() + windowMs;\n\n  return function checkRateLimit(key: string): boolean {\n    const now = Date.now();\n\n    if (now >= nextSweepAt) {\n      for (const [k, entry] of counts) {\n        if (now >= entry.resetAt) counts.delete(k);\n      }\n      nextSweepAt = now + windowMs;\n    }\n\n    const entry = counts.get(key);\n    if (!entry || now >= entry.resetAt) {\n      counts.set(key, { count: 1, resetAt: now + windowMs });\n      return true;\n    }\n    if (entry.count >= max) return false;\n    entry.count += 1;\n    return true;\n  };\n}\n\nexport const TRUSTED_APP_IP_HEADER = \"x-medialane-client-ip\";\n\nexport function requestIp(req: Request): string {\n  const fromApp = req.headers.get(TRUSTED_APP_IP_HEADER)?.trim();\n  if (fromApp) return fromApp;\n\n  const fromEdge = req.headers.get(\"x-vercel-forwarded-for\")?.split(\",\")[0]?.trim();\n  if (fromEdge) return fromEdge;\n\n  const forwarded = req.headers.get(\"x-forwarded-for\");\n  if (forwarded) {\n    const hops = forwarded.split(\",\").map((hop) => hop.trim()).filter(Boolean);\n    const nearest = hops[hops.length - 1];\n    if (nearest) return nearest;\n  }\n\n  return \"unknown\";\n}\n","export function isSameOrigin(req: Request): boolean {\n  const origin = req.headers.get(\"origin\");\n  if (!origin) return true;\n  const host = req.headers.get(\"host\");\n  try {\n    return new URL(origin).host === host;\n  } catch {\n    return false;\n  }\n}\n","import { requestIp } from \"./rate-limit.js\";\nimport { isSameOrigin } from \"./origin.js\";\n\nfunction proxyError(code: number, message: string, status: number): Response {\n  return Response.json({ jsonrpc: \"2.0\", error: { code, message }, id: null }, { status });\n}\n\nexport interface BackendProxyConfig {\n  path: string;\n  backendUrl: string;\n  apiKey: string | undefined;\n  checkRateLimit: (ip: string) => boolean;\n  fetchImpl?: typeof fetch;\n\n  forwardCookie?: { name: string; header: string };\n}\n\nfunction readCookie(req: Request, name: string): string | null {\n  const raw = req.headers.get(\"cookie\");\n  if (!raw) return null;\n  for (const part of raw.split(\";\")) {\n    const eq = part.indexOf(\"=\");\n    if (eq === -1) continue;\n    if (part.slice(0, eq).trim() === name) return part.slice(eq + 1).trim();\n  }\n  return null;\n}\n\nexport function createBackendProxyHandler(\n  config: BackendProxyConfig,\n): (req: Request) => Promise<Response> {\n  const doFetch = config.fetchImpl ?? fetch;\n  const endpoint = `${config.backendUrl.replace(/\\/$/, \"\")}/${config.path.replace(/^\\//, \"\")}`;\n\n  return async function handleBackendProxy(req: Request): Promise<Response> {\n    if (!isSameOrigin(req)) {\n      return proxyError(-32600, \"Cross-origin requests are not allowed\", 403);\n    }\n\n    if (!config.checkRateLimit(requestIp(req))) {\n      return proxyError(-32005, \"Too many requests\", 429);\n    }\n\n    if (!config.apiKey) {\n      return proxyError(-32003, \"No API key configured — request not forwarded\", 402);\n    }\n\n    let body: unknown;\n    try {\n      body = await req.json();\n    } catch {\n      return proxyError(-32700, \"Parse error\", 400);\n    }\n\n    const headers: Record<string, string> = { \"Content-Type\": \"application/json\", \"x-api-key\": config.apiKey };\n    if (config.forwardCookie) {\n      const value = readCookie(req, config.forwardCookie.name);\n      if (value) headers[config.forwardCookie.header] = value;\n    }\n\n    try {\n      const upstream = await doFetch(endpoint, {\n        method: \"POST\",\n        headers,\n        body: JSON.stringify(body),\n      });\n\n      const text = await upstream.text();\n      return new Response(text, {\n        status: upstream.status,\n        headers: { \"Content-Type\": \"application/json\" },\n      });\n    } catch {\n      return proxyError(-32603, \"Backend unreachable\", 502);\n    }\n  };\n}\n","import { createBackendProxyHandler } from \"./backend-proxy.js\";\n\nexport interface RpcProxyConfig {\n  backendUrl: string;\n  apiKey: string | undefined;\n  checkRateLimit: (ip: string) => boolean;\n  fetchImpl?: typeof fetch;\n}\n\nexport function createRpcProxyHandler(config: RpcProxyConfig): (req: Request) => Promise<Response> {\n  return createBackendProxyHandler({ ...config, path: \"/v1/rpc\" });\n}\n","export const ALLOWED_IMAGE_CONTENT_TYPES = new Set([\n  \"image/jpeg\",\n  \"image/jpg\",\n  \"image/png\",\n  \"image/gif\",\n  \"image/webp\",\n  \"image/svg+xml\",\n  \"image/avif\",\n  \"image/bmp\",\n  \"image/tiff\",\n]);\n\nexport const MAX_IMAGE_REDIRECTS = 5;\n\nexport const MAX_IMAGE_PROXY_BYTES = 15 * 1024 * 1024;\n\nfunction parseIpv4(ip: string): number[] | null {\n  const parts = ip.split(\".\");\n  if (parts.length !== 4) return null;\n  const bytes: number[] = [];\n  for (const part of parts) {\n    if (!/^\\d{1,3}$/.test(part)) return null;\n    const n = Number(part);\n    if (n > 255) return null;\n    bytes.push(n);\n  }\n  return bytes;\n}\n\nfunction isPrivateIpv4(bytes: number[]): boolean {\n  const a = bytes[0]!;\n  const b = bytes[1]!;\n  const c = bytes[2]!;\n  if (a === 0) return true;\n  if (a === 10) return true;\n  if (a === 100 && b >= 64 && b <= 127) return true;\n  if (a === 127) return true;\n  if (a === 169 && b === 254) return true;\n  if (a === 172 && b >= 16 && b <= 31) return true;\n  if (a === 192 && b === 0 && c === 0) return true;\n  if (a === 192 && b === 168) return true;\n  if (a === 198 && (b === 18 || b === 19)) return true;\n  if (a >= 224) return true;\n  return false;\n}\n\nfunction expandIpv6(rawIp: string): number[] | null {\n  let ip = rawIp;\n\n  let embeddedV4: number[] | null = null;\n  const v4Tail = ip.match(/(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})$/);\n  if (v4Tail && ip.includes(\":\")) {\n    embeddedV4 = parseIpv4(v4Tail[1]!);\n    if (!embeddedV4) return null;\n    ip = ip.slice(0, ip.length - v4Tail[1]!.length) + \"0:0\";\n  }\n\n  const sides = ip.split(\"::\");\n  if (sides.length > 2) return null;\n\n  const head = sides[0] ? sides[0].split(\":\").filter(Boolean) : [];\n  const tail = sides.length === 2 && sides[1] ? sides[1].split(\":\").filter(Boolean) : [];\n\n  let groups: string[];\n  if (sides.length === 1) {\n    groups = head;\n    if (groups.length !== 8) return null;\n  } else {\n    const missing = 8 - head.length - tail.length;\n    if (missing < 0) return null;\n    groups = [...head, ...Array(missing).fill(\"0\"), ...tail];\n  }\n  if (groups.length !== 8) return null;\n\n  const bytes: number[] = [];\n  for (const group of groups) {\n    if (!/^[0-9a-fA-F]{1,4}$/.test(group)) return null;\n    const n = parseInt(group, 16);\n    bytes.push((n >> 8) & 0xff, n & 0xff);\n  }\n\n  if (embeddedV4) {\n    bytes[12] = embeddedV4[0]!;\n    bytes[13] = embeddedV4[1]!;\n    bytes[14] = embeddedV4[2]!;\n    bytes[15] = embeddedV4[3]!;\n  }\n\n  return bytes;\n}\n\nfunction isPrivateIpv6(bytes: number[]): boolean {\n  if (bytes.every((b) => b === 0)) return true;\n  if (bytes.slice(0, 15).every((b) => b === 0) && bytes[15] === 1) return true;\n  if ((bytes[0]! & 0xfe) === 0xfc) return true;\n  if (bytes[0] === 0xfe && (bytes[1]! & 0xc0) === 0x80) return true;\n\n  if (bytes.slice(0, 10).every((b) => b === 0) && bytes[10] === 0xff && bytes[11] === 0xff) {\n    return isPrivateIpv4(bytes.slice(12));\n  }\n  return false;\n}\n\nfunction parseNumber(part: string): number | null {\n  if (/^0x[0-9a-f]+$/i.test(part)) return parseInt(part.slice(2), 16);\n  if (/^0[0-7]+$/.test(part)) return parseInt(part, 8);\n  if (/^\\d+$/.test(part)) return parseInt(part, 10);\n  return null;\n}\n\nfunction normalizeNumericHostname(host: string): string | null {\n  const parts = host.trim().split(\".\");\n  if (parts.length < 1 || parts.length > 4) return null;\n\n  const values: number[] = [];\n  for (const part of parts) {\n    const value = parseNumber(part);\n    if (value === null || value < 0) return null;\n    values.push(value);\n  }\n\n  const leading = values.slice(0, -1);\n  if (leading.some((v) => v > 255)) return null;\n\n  const tail = values[values.length - 1]!;\n  const tailBytes = 4 - leading.length;\n  if (tail > 2 ** (8 * tailBytes) - 1) return null;\n\n  const bytes = [...leading];\n  for (let i = tailBytes - 1; i >= 0; i--) bytes.push((tail >>> (8 * i)) & 0xff);\n\n  return bytes.join(\".\");\n}\n\nconst BLOCKED_HOSTNAMES = new Set([\n  \"localhost\",\n  \"metadata.google.internal\",\n  \"metadata.azure.internal\",\n]);\n\nexport function isPrivateHost(hostname: string): boolean {\n  const host = hostname.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n\n  if (BLOCKED_HOSTNAMES.has(host)) return true;\n  if (host.endsWith(\".local\") || host.endsWith(\".internal\")) return true;\n\n  const candidate = normalizeNumericHostname(host) ?? host;\n\n  const v4 = parseIpv4(candidate);\n  if (v4) return isPrivateIpv4(v4);\n\n  const v6 = expandIpv6(candidate);\n  if (v6) return isPrivateIpv6(v6);\n\n  return false;\n}\n\nexport function validateUrl(\n  raw: string,\n  options: { requireHttps?: boolean } = {},\n): { url: URL } | { error: string; status: number } {\n  const requireHttps = options.requireHttps ?? true;\n\n  let parsed: URL;\n  try {\n    parsed = new URL(raw);\n  } catch {\n    return { error: \"Invalid url\", status: 400 };\n  }\n\n  if (requireHttps && parsed.protocol !== \"https:\") {\n    return { error: \"Only https URLs allowed\", status: 400 };\n  }\n\n  if (!requireHttps && parsed.protocol !== \"https:\" && parsed.protocol !== \"http:\") {\n    return { error: \"Only http and https URLs allowed\", status: 400 };\n  }\n\n  if (parsed.username || parsed.password) {\n    return { error: \"URL credentials not allowed\", status: 400 };\n  }\n\n  if (isPrivateHost(parsed.hostname)) {\n    return { error: \"URL not allowed\", status: 400 };\n  }\n\n  return { url: parsed };\n}\n\nexport function isPrivateOrInsecureUrl(raw: string, requireHttps = true): boolean {\n  return \"error\" in validateUrl(raw, { requireHttps });\n}\n","import { requestIp } from \"./rate-limit.js\";\nimport {\n  ALLOWED_IMAGE_CONTENT_TYPES,\n  MAX_IMAGE_PROXY_BYTES,\n  MAX_IMAGE_REDIRECTS,\n  isPrivateHost,\n  validateUrl,\n} from \"./ssrf-guard.js\";\n\nexport interface ImageProxyConfig {\n  checkRateLimit: (ip: string) => boolean;\n\n  resolveHostname: (hostname: string) => Promise<string[]>;\n  fetchImpl?: typeof fetch;\n  userAgent?: string;\n}\n\nconst DEFAULT_USER_AGENT =\n  \"Mozilla/5.0 (compatible; Medialane/1.0; +https://www.medialane.io)\";\n\nfunction jsonError(message: string, status: number): Response {\n  return Response.json({ error: message }, { status });\n}\n\nexport interface CappedBody {\n  ok: boolean;\n  body?: Uint8Array;\n  error?: string;\n  status?: number;\n}\n\nexport async function readBodyWithCap(res: Response, maxBytes: number): Promise<CappedBody> {\n  const declared = Number(res.headers.get(\"content-length\") ?? 0);\n  if (declared > maxBytes) {\n    return { ok: false, error: \"Image too large\", status: 413 };\n  }\n\n  const reader = res.body?.getReader();\n  if (!reader) return { ok: false, error: \"Empty response body\", status: 502 };\n\n  const chunks: Uint8Array[] = [];\n  let total = 0;\n  for (;;) {\n    const { done, value } = await reader.read();\n    if (done) break;\n    if (!value) continue;\n    total += value.byteLength;\n    if (total > maxBytes) {\n      await reader.cancel().catch(() => {});\n      return { ok: false, error: \"Image too large\", status: 413 };\n    }\n    chunks.push(value);\n  }\n\n  const body = new Uint8Array(total);\n  let offset = 0;\n  for (const chunk of chunks) {\n    body.set(chunk, offset);\n    offset += chunk.byteLength;\n  }\n  return { ok: true, body };\n}\n\nexport function createImageProxyHandler(\n  config: ImageProxyConfig,\n): (req: Request) => Promise<Response> {\n  const doFetch = config.fetchImpl ?? fetch;\n  const userAgent = config.userAgent ?? DEFAULT_USER_AGENT;\n\n  async function resolvesToPrivateHost(hostname: string): Promise<boolean> {\n    try {\n      const addresses = await config.resolveHostname(hostname);\n\n      if (addresses.length === 0) return true;\n      return addresses.some((address) => isPrivateHost(address));\n    } catch {\n      return true;\n    }\n  }\n\n  async function safeFetch(url: URL, hopsLeft: number): Promise<Response> {\n    if (hopsLeft < 0) throw new Error(\"Too many redirects\");\n\n    if (await resolvesToPrivateHost(url.hostname)) {\n      throw new Error(\"Blocked: hostname resolves to a private address\");\n    }\n\n    const res = await doFetch(url.toString(), {\n      redirect: \"manual\",\n      headers: { \"User-Agent\": userAgent },\n    });\n\n    if (res.status >= 300 && res.status < 400) {\n      const location = res.headers.get(\"location\");\n      if (!location) throw new Error(\"Redirect with no Location header\");\n\n      const next = new URL(location, url);\n      const validated = validateUrl(next.toString());\n      if (\"error\" in validated) throw new Error(`Redirect blocked: ${validated.error}`);\n\n      return safeFetch(validated.url, hopsLeft - 1);\n    }\n\n    return res;\n  }\n\n  return async function handleImageProxy(req: Request): Promise<Response> {\n    if (!config.checkRateLimit(requestIp(req))) {\n      return jsonError(\"Too many requests\", 429);\n    }\n\n    const raw = new URL(req.url).searchParams.get(\"url\");\n    if (!raw) return jsonError(\"Missing url\", 400);\n\n    const validated = validateUrl(raw);\n    if (\"error\" in validated) return jsonError(validated.error, validated.status);\n\n    let upstream: Response;\n    try {\n      upstream = await safeFetch(validated.url, MAX_IMAGE_REDIRECTS);\n    } catch {\n      return jsonError(\"Failed to fetch image\", 502);\n    }\n\n    if (!upstream.ok) {\n      return jsonError(`Upstream returned ${upstream.status}`, upstream.status);\n    }\n\n    const contentType = upstream.headers.get(\"content-type\") ?? \"\";\n    const baseType = contentType.split(\";\")[0]!.trim().toLowerCase();\n    if (!ALLOWED_IMAGE_CONTENT_TYPES.has(baseType)) {\n      return jsonError(\"Not an image\", 400);\n    }\n\n    const capped = await readBodyWithCap(upstream, MAX_IMAGE_PROXY_BYTES);\n    if (!capped.ok) return jsonError(capped.error!, capped.status!);\n\n    return new Response(capped.body as unknown as BodyInit, {\n      status: 200,\n      headers: {\n        \"Content-Type\": contentType,\n        \"X-Content-Type-Options\": \"nosniff\",\n        \"Content-Security-Policy\":\n          \"default-src 'none'; img-src 'self' data:; style-src 'unsafe-inline'; sandbox\",\n        \"Cache-Control\": \"public, max-age=86400, s-maxage=86400, stale-while-revalidate=604800\",\n        \"Access-Control-Allow-Origin\": \"*\",\n      },\n    });\n  };\n}\n","export interface BackendMetadataConfig {\n  backendUrl: string;\n  apiKey: string;\n  fetchImpl?: typeof fetch;\n}\n\nfunction endpoint(config: BackendMetadataConfig, path: string): string {\n  return `${config.backendUrl.replace(/\\/$/, \"\")}/v1/metadata/${path}`;\n}\n\nfunction headers(config: BackendMetadataConfig, extra?: Record<string, string>): Record<string, string> {\n  return { \"x-api-key\": config.apiKey, ...extra };\n}\n\nexport interface BackendUploadResult {\n  cid: string;\n  uri: string;\n}\n\nexport async function uploadJsonToBackend(config: BackendMetadataConfig, json: unknown): Promise<BackendUploadResult> {\n  const res = await (config.fetchImpl ?? fetch)(endpoint(config, \"upload\"), {\n    method: \"POST\",\n    headers: headers(config, { \"Content-Type\": \"application/json\" }),\n    body: JSON.stringify(json),\n  });\n  const data = (await res.json().catch(() => ({}))) as { data?: { cid: string; url: string }; error?: string };\n  if (!res.ok || !data.data) throw new Error(data.error ?? \"Metadata upload failed\");\n  return { cid: data.data.cid, uri: data.data.url };\n}\n\nexport async function uploadFileToBackend(config: BackendMetadataConfig, file: File): Promise<BackendUploadResult> {\n  const form = new FormData();\n  form.append(\"file\", file, file.name);\n  const res = await (config.fetchImpl ?? fetch)(endpoint(config, \"upload-file\"), {\n    method: \"POST\",\n    headers: headers(config),\n    body: form,\n  });\n  const data = (await res.json().catch(() => ({}))) as { data?: { cid: string; url: string }; error?: string };\n  if (!res.ok || !data.data) throw new Error(data.error ?? \"File upload failed\");\n  return { cid: data.data.cid, uri: data.data.url };\n}\n\nexport async function uploadDirectoryToBackend(\n  config: BackendMetadataConfig,\n  files: { name: string; content: unknown }[],\n): Promise<{ cid: string; baseUri: string }> {\n  const res = await (config.fetchImpl ?? fetch)(endpoint(config, \"upload-directory\"), {\n    method: \"POST\",\n    headers: headers(config, { \"Content-Type\": \"application/json\" }),\n    body: JSON.stringify({ files }),\n  });\n  const data = (await res.json().catch(() => ({}))) as {\n    data?: { cid: string; baseUri: string };\n    error?: string;\n  };\n  if (!res.ok || !data.data) throw new Error(data.error ?? \"Directory pin failed\");\n  return data.data;\n}\n\nexport async function getBackendSignedUrl(\n  config: BackendMetadataConfig,\n  kind: \"image\" | \"document\" | \"media\" = \"image\",\n): Promise<string> {\n  const res = await (config.fetchImpl ?? fetch)(`${endpoint(config, \"signed-url\")}?kind=${kind}`, {\n    method: \"GET\",\n    headers: headers(config),\n  });\n  const data = (await res.json().catch(() => ({}))) as { data?: { url: string }; error?: string };\n  if (!res.ok || !data.data) throw new Error(data.error ?? \"Failed to create upload URL\");\n  return data.data.url;\n}\n","import { hmac } from \"@noble/hashes/hmac.js\";\nimport { sha256 } from \"@noble/hashes/sha2.js\";\nimport { base64urlnopad } from \"@scure/base\";\nimport type { Chain } from \"../chains.js\";\n\nconst IDENTITY_PREFIX = \"siws_\";\nconst ACCOUNT_SESSION_PREFIX = \"account_session_\";\n\nconst IDENTITY_DOMAIN = \"siws-identity-v1\";\nconst ACCOUNT_SESSION_DOMAIN = \"account-session-v1\";\n\nexport const IDENTITY_TTL_SECONDS = 86_400;\nexport const ACCOUNT_SESSION_TTL_SECONDS = 30 * 24 * 60 * 60;\n\nconst CLOCK_SKEW_SECONDS = 60;\n\nexport interface SiwsIdentity {\n  address: string;\n  chain: Chain;\n}\n\ninterface IdentityPayload {\n  sub?: string;\n  chain?: Chain;\n  iat?: number;\n  exp?: number;\n}\n\ninterface AccountSessionPayload {\n  accountId?: string;\n  iat?: number;\n  exp?: number;\n}\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nfunction toHex(bytes: Uint8Array): string {\n  let out = \"\";\n  for (const b of bytes) out += b.toString(16).padStart(2, \"0\");\n  return out;\n}\n\nfunction sign(secret: string, domain: string | null, payload: string): string {\n  const message = domain === null ? payload : `${domain}.${payload}`;\n  return toHex(hmac(sha256, encoder.encode(secret), encoder.encode(message)));\n}\n\nfunction constantTimeEquals(a: string, b: string): boolean {\n  if (a.length !== b.length) return false;\n  let diff = 0;\n  for (let i = 0; i < a.length; i++) diff |= a.charCodeAt(i) ^ b.charCodeAt(i);\n  return diff === 0;\n}\n\nfunction signatureMatches(secret: string, domain: string, payload: string, provided: string): boolean {\n  return (\n    constantTimeEquals(provided, sign(secret, domain, payload)) ||\n    constantTimeEquals(provided, sign(secret, null, payload))\n  );\n}\n\nfunction encodePayload(value: unknown): string {\n  return base64urlnopad.encode(encoder.encode(JSON.stringify(value)));\n}\n\nfunction decodePayload<T>(payload: string): T | null {\n  try {\n    return JSON.parse(decoder.decode(base64urlnopad.decode(payload))) as T;\n  } catch {\n    return null;\n  }\n}\n\nfunction splitToken(raw: string, prefix: string): { payload: string; signature: string } | null {\n  if (!raw.startsWith(prefix)) return null;\n  const inner = raw.slice(prefix.length);\n  const dot = inner.lastIndexOf(\".\");\n  if (dot === -1) return null;\n  return { payload: inner.slice(0, dot), signature: inner.slice(dot + 1) };\n}\n\nfunction withinLifetime(iat: number | undefined, exp: number | undefined): boolean {\n  if (!iat || !exp) return false;\n  const now = Math.floor(Date.now() / 1000);\n  return exp >= now && iat <= now + CLOCK_SKEW_SECONDS;\n}\n\nexport function issueSiwsToken(\n  secret: string,\n  chain: Chain,\n  wallet: string,\n  ttlSeconds: number = IDENTITY_TTL_SECONDS,\n): string {\n  const iat = Math.floor(Date.now() / 1000);\n  const payload = encodePayload({ sub: wallet, chain, iat, exp: iat + ttlSeconds });\n  return `${IDENTITY_PREFIX}${payload}.${sign(secret, IDENTITY_DOMAIN, payload)}`;\n}\n\nexport function verifySiwsToken(secret: string, raw: string): SiwsIdentity | null {\n  const parts = splitToken(raw, IDENTITY_PREFIX);\n  if (!parts) return null;\n  if (!signatureMatches(secret, IDENTITY_DOMAIN, parts.payload, parts.signature)) return null;\n\n  const data = decodePayload<IdentityPayload>(parts.payload);\n  if (!data?.sub || !withinLifetime(data.iat, data.exp)) return null;\n\n  return { address: data.sub, chain: data.chain ?? \"STARKNET\" };\n}\n\nexport function issueAccountSessionToken(\n  secret: string,\n  accountId: string,\n  ttlSeconds: number = ACCOUNT_SESSION_TTL_SECONDS,\n): string {\n  const iat = Math.floor(Date.now() / 1000);\n  const payload = encodePayload({ accountId, iat, exp: iat + ttlSeconds });\n  return `${ACCOUNT_SESSION_PREFIX}${payload}.${sign(secret, ACCOUNT_SESSION_DOMAIN, payload)}`;\n}\n\nexport function verifyAccountSessionToken(secret: string, raw: string): string | null {\n  const parts = splitToken(raw, ACCOUNT_SESSION_PREFIX);\n  if (!parts) return null;\n  if (!signatureMatches(secret, ACCOUNT_SESSION_DOMAIN, parts.payload, parts.signature)) return null;\n\n  const data = decodePayload<AccountSessionPayload>(parts.payload);\n  if (!data?.accountId || !withinLifetime(data.iat, data.exp)) return null;\n\n  return data.accountId;\n}\n","\n\nexport type AssetAttribute = { trait_type: string; value: string };\n\nexport interface AssetMetadata {\n  name: string;\n  description: string;\n  image: string | null;\n  external_url: string;\n  attributes: AssetAttribute[];\n}\n\nexport interface BuildAssetMetadataInput {\n  name: string;\n  description?: string | null;\n  externalUrl?: string | null;\n  imageUri?: string | null;\n  creator?: string | null;\n  ipType?: string | null;\n  licenseType?: string | null;\n  commercialUse?: string | null;\n  derivatives?: string | null;\n  attribution?: string | null;\n  geographicScope?: string | null;\n  aiPolicy?: string | null;\n  royalty?: string | null;\n  edition?: string | null;\n\n  templateTraits?: { traitType: string; value: string }[];\n\n  registrationDate?: string;\n}\n\nexport const RESERVED_TRAITS = new Set([\n  \"Creator\", \"IP Type\", \"License\", \"Commercial Use\", \"Derivatives\",\n  \"Attribution\", \"Territory\", \"AI Policy\", \"Royalty\", \"Edition\",\n  \"Standard\", \"Registration\",\n]);\nconst RESERVED_TRAITS_NORMALIZED = new Set([...RESERVED_TRAITS].map((t) => t.toLowerCase()));\n\nexport function buildAssetMetadata(input: BuildAssetMetadataInput): AssetMetadata {\n  const attributes: AssetAttribute[] = [];\n\n  if (input.creator) attributes.push({ trait_type: \"Creator\", value: input.creator });\n  if (input.ipType) attributes.push({ trait_type: \"IP Type\", value: input.ipType });\n  if (input.licenseType) attributes.push({ trait_type: \"License\", value: input.licenseType });\n  if (input.commercialUse) attributes.push({ trait_type: \"Commercial Use\", value: input.commercialUse });\n  if (input.derivatives) attributes.push({ trait_type: \"Derivatives\", value: input.derivatives });\n  if (input.attribution) attributes.push({ trait_type: \"Attribution\", value: input.attribution });\n  if (input.geographicScope) attributes.push({ trait_type: \"Territory\", value: input.geographicScope });\n  if (input.aiPolicy) attributes.push({ trait_type: \"AI Policy\", value: input.aiPolicy });\n\n  if (input.royalty) {\n    const num = parseFloat(String(input.royalty).replace(\"%\", \"\"));\n    if (!isNaN(num) && num > 0) attributes.push({ trait_type: \"Royalty\", value: `${num}%` });\n  }\n\n  if (input.edition) attributes.push({ trait_type: \"Edition\", value: input.edition });\n\n  for (const t of input.templateTraits ?? []) {\n    const traitType = t.traitType?.trim() ?? \"\";\n    const traitValue = String(t.value ?? \"\").trim();\n    if (!traitType || !traitValue || RESERVED_TRAITS_NORMALIZED.has(traitType.toLowerCase())) continue;\n    if (traitType.length > 64 || traitValue.length > 512) continue;\n    attributes.push({ trait_type: traitType, value: traitValue });\n  }\n\n  if (input.licenseType) {\n    attributes.push({ trait_type: \"Standard\", value: \"Berne Convention\" });\n    attributes.push({\n      trait_type: \"Registration\",\n      value: input.registrationDate ?? new Date().toISOString().split(\"T\")[0],\n    });\n  }\n\n  return {\n    name: input.name,\n    description: input.description ?? \"\",\n    image: input.imageUri ?? null,\n    external_url: input.externalUrl || \"https://medialane.io\",\n    attributes,\n  };\n}\n","\n\ntype Attribute = { trait_type?: string; value?: string };\n\nexport function getDerivativesTerm(\n  attributes: Attribute[] | null | undefined,\n): \"Allowed\" | \"Not Allowed\" | null {\n  const v = (Array.isArray(attributes) ? attributes : []).find(\n    (a) => a.trait_type === \"Derivatives\",\n  )?.value;\n  return v === \"Allowed\" || v === \"Not Allowed\" ? v : null;\n}\n\nexport interface RemixPolicyInput {\n\n  parentNoDerivatives: boolean;\n\n  viewerIsParentOwner: boolean;\n\n  dealAvailable: boolean;\n}\n\nexport interface RemixPolicy extends RemixPolicyInput {\n\n  canRemixDirect: boolean;\n\n  showDealOption: boolean;\n}\n\nexport function resolveRemixPolicy(input: RemixPolicyInput): RemixPolicy {\n  const canRemixDirect = input.viewerIsParentOwner || !input.parentNoDerivatives;\n  const showDealOption = input.dealAvailable && !input.viewerIsParentOwner;\n  return { ...input, canRemixDirect, showDealOption };\n}\n","const CID_PATH_PATTERN = /^(Qm[1-9A-HJ-NP-Za-km-z]{44,}|b[a-z2-7]{58,})(\\/[\\w.\\-/]*)?$/;\n\nexport function isValidIpfsCidPath(cidPath: string): boolean {\n  if (!CID_PATH_PATTERN.test(cidPath)) return false;\n  if (cidPath.split(\"/\").includes(\"..\")) return false;\n  return true;\n}\n\nexport const IPFS_SAFE_CONTENT_TYPE_PREFIXES = [\n  \"image/jpeg\", \"image/png\", \"image/gif\", \"image/webp\", \"image/avif\", \"image/svg+xml\",\n  \"video/\", \"audio/\", \"model/\", \"font/\", \"application/json\", \"application/octet-stream\",\n] as const;\n\nexport function resolveSafeImageContentType(contentType: string): string {\n  return IPFS_SAFE_CONTENT_TYPE_PREFIXES.some((p) => contentType.startsWith(p))\n    ? contentType\n    : \"application/octet-stream\";\n}\n\nexport const MAX_IPFS_GATEWAY_RESPONSE_BYTES = 25 * 1024 * 1024;\n"]}