{"version":3,"sources":["../src/marketplace/client.edge.ts"],"sourcesContent":["import { addAddressPadding, cairo, getChecksumAddress } from \"starknet\";\nimport { fetchToriisSql } from \"../modules/torii-sql-fetcher\";\nimport { CategoryType, StatusType } from \"../classes\";\nimport { OrderModel } from \"../modules/marketplace/order\";\nimport type {\n  CollectionListingsOptions,\n  CollectionOrdersOptions,\n  CollectionSummaryOptions,\n  FetchCollectionTokensOptions,\n  FetchCollectionTokensResult,\n  MarketplaceClient,\n  MarketplaceClientConfig,\n  MarketplaceFees,\n  NormalizedCollection,\n  NormalizedToken,\n  RoyaltyFee,\n  RoyaltyFeeOptions,\n  TokenDetails,\n  TokenDetailsOptions,\n} from \"./types\";\nimport {\n  defaultResolveContractImage,\n  defaultResolveTokenImage,\n  inferImageFromMetadata,\n  normalizeTokens,\n  parseJsonSafe,\n} from \"./utils\";\n\nconst DEFAULT_LIMIT = 100;\n\nconst statusValueMap: Record<StatusType, number> = {\n  [StatusType.None]: 0,\n  [StatusType.Placed]: 1,\n  [StatusType.Canceled]: 2,\n  [StatusType.Executed]: 3,\n};\n\nconst categoryValueMap: Record<CategoryType, number> = {\n  [CategoryType.None]: 0,\n  [CategoryType.Buy]: 1,\n  [CategoryType.Sell]: 2,\n};\n\nconst asNumber = (value: unknown): number => {\n  if (typeof value === \"number\") return Number.isFinite(value) ? value : 0;\n  if (typeof value === \"bigint\") return Number(value);\n  if (typeof value === \"string\") {\n    if (value.startsWith(\"0x\")) return Number(BigInt(value));\n    const n = Number(value);\n    return Number.isFinite(n) ? n : 0;\n  }\n  return 0;\n};\n\nconst asBigInt = (value: unknown): bigint => {\n  if (typeof value === \"bigint\") return value;\n  if (typeof value === \"number\") return BigInt(Math.trunc(value));\n  if (typeof value === \"string\" && value.length > 0) return BigInt(value);\n  return 0n;\n};\n\nconst normalizeTokenIdForQuery = (tokenId?: string): string | undefined => {\n  if (!tokenId) return undefined;\n  try {\n    return BigInt(tokenId).toString();\n  } catch (_error) {\n    return tokenId;\n  }\n};\n\nconst ensureProjectId = (\n  projectId: string | undefined,\n  fallback: string,\n): string => {\n  if (projectId && projectId.length > 0) return projectId;\n  return fallback;\n};\n\nconst escapeSqlValue = (value: string): string => value.replace(/'/g, \"''\");\n\nconst extractRows = (data: any): any[] => {\n  if (!data) return [];\n  if (Array.isArray(data)) return data;\n  if (Array.isArray(data.data)) return data.data;\n  if (Array.isArray(data.rows)) return data.rows;\n  if (Array.isArray(data.result)) return data.result;\n  return [];\n};\n\nconst toSqlList = (values: string[]): string =>\n  values.map((value) => `'${escapeSqlValue(value)}'`).join(\", \");\n\nasync function querySql(projectId: string, sql: string): Promise<any[]> {\n  const result = await fetchToriisSql([projectId], sql);\n  if (result.errors?.length) {\n    throw result.errors[0];\n  }\n\n  const rows: any[] = [];\n  for (const entry of result.data ?? []) {\n    rows.push(...extractRows(entry));\n  }\n  return rows;\n}\n\nconst tokenMatchesAttributeFilters = (\n  token: { metadata?: any },\n  filters: FetchCollectionTokensOptions[\"attributeFilters\"],\n): boolean => {\n  if (!filters || Object.keys(filters).length === 0) return true;\n  const metadata = parseJsonSafe(token.metadata, token.metadata);\n  const attributes = Array.isArray((metadata as any)?.attributes)\n    ? (metadata as any).attributes\n    : [];\n  if (!attributes.length) return false;\n\n  const traitMap = new Map<string, Set<string>>();\n  for (const attribute of attributes) {\n    const trait = attribute?.trait_type;\n    const value = attribute?.value;\n    if (trait == null || value == null) continue;\n    const traitName = String(trait);\n    if (!traitMap.has(traitName)) traitMap.set(traitName, new Set());\n    traitMap.get(traitName)?.add(String(value));\n  }\n\n  for (const [trait, values] of Object.entries(filters)) {\n    if (values == null) continue;\n    const selected = Array.isArray(values) ? values : Array.from(values as any);\n    const available = traitMap.get(trait);\n    if (!available) return false;\n    const matched = selected.some((value) => available.has(String(value)));\n    if (!matched) return false;\n  }\n\n  return true;\n};\n\nfunction toOrderModel(row: any): OrderModel {\n  const orderLike = {\n    id: asNumber(row.id),\n    category: asNumber(row.category),\n    status: asNumber(row.status),\n    expiration: asNumber(row.expiration),\n    collection: String(row.collection ?? \"0x0\"),\n    token_id: asNumber(row.token_id),\n    quantity: asNumber(row.quantity),\n    price: asNumber(row.price),\n    currency: String(row.currency ?? \"0x0\"),\n    owner: String(row.owner ?? \"0x0\"),\n  };\n\n  const identifier =\n    typeof row.entity_id === \"string\"\n      ? row.entity_id\n      : `${orderLike.id}:${orderLike.collection}:${orderLike.token_id}`;\n\n  return OrderModel.from(identifier, orderLike);\n}\n\nasync function verifyListingsOwnership(\n  projectId: string,\n  collectionAddress: string,\n  listings: OrderModel[],\n): Promise<OrderModel[]> {\n  if (!listings.length) return listings;\n\n  const collection = addAddressPadding(getChecksumAddress(collectionAddress));\n  const owners = [\n    ...new Set(listings.map((order) => getChecksumAddress(order.owner))),\n  ];\n  if (owners.length === 0) return [];\n\n  const tokenIds = [\n    ...new Set(listings.map((order) => BigInt(order.tokenId).toString())),\n  ];\n  if (tokenIds.length === 0) return [];\n\n  const ownerList = toSqlList(owners.map((owner) => owner.toLowerCase()));\n  const tokenIdList = toSqlList(tokenIds);\n\n  const sql = `SELECT account_address, token_id, balance\nFROM token_balances\nWHERE lower(contract_address) = lower('${escapeSqlValue(collection)}')\n  AND lower(account_address) IN (${ownerList})\n  AND token_id IN (${tokenIdList})`;\n\n  const rows = await querySql(projectId, sql);\n  const ownership = new Set<string>();\n\n  for (const row of rows) {\n    const balance = asBigInt(row.balance ?? 0);\n    if (balance <= 0n) continue;\n    const owner = getChecksumAddress(String(row.account_address));\n    const tokenId = BigInt(String(row.token_id)).toString();\n    ownership.add(`${owner}_${tokenId}`);\n  }\n\n  return listings.filter((order) => {\n    const owner = getChecksumAddress(order.owner);\n    const tokenId = BigInt(order.tokenId).toString();\n    return ownership.has(`${owner}_${tokenId}`);\n  });\n}\n\nexport async function createEdgeMarketplaceClient(\n  config: MarketplaceClientConfig,\n): Promise<MarketplaceClient> {\n  const {\n    defaultProject = \"arcade-main\",\n    resolveTokenImage,\n    resolveContractImage,\n    provider,\n  } = config;\n\n  const getCollection = async (\n    options: CollectionSummaryOptions,\n  ): Promise<NormalizedCollection | null> => {\n    const { projectId: projectIdInput, address, fetchImages = true } = options;\n    const projectId = ensureProjectId(projectIdInput, defaultProject);\n    const collection = addAddressPadding(getChecksumAddress(address));\n\n    const rows = await querySql(\n      projectId,\n      `SELECT contract_address, contract_type, type, metadata, total_supply, token_id\nFROM token_contracts\nWHERE lower(contract_address) = lower('${escapeSqlValue(collection)}')\nLIMIT 1`,\n    );\n\n    const contract = rows[0];\n    if (!contract) return null;\n\n    let tokenSample: any | undefined;\n    let metadataRaw = contract.metadata;\n    if (!metadataRaw) {\n      const tokenRows = await querySql(\n        projectId,\n        `SELECT token_id, metadata\nFROM tokens\nWHERE lower(contract_address) = lower('${escapeSqlValue(collection)}')\nLIMIT 1`,\n      );\n      tokenSample = tokenRows[0];\n      if (tokenSample?.metadata) metadataRaw = tokenSample.metadata;\n    }\n\n    const metadata = parseJsonSafe(metadataRaw, metadataRaw);\n    let image: string | undefined;\n\n    if (fetchImages) {\n      const contractImageResolver =\n        resolveContractImage ?? defaultResolveContractImage;\n      const maybeImage = await contractImageResolver(contract as any, {\n        projectId,\n      });\n      if (typeof maybeImage === \"string\" && maybeImage.length > 0) {\n        image = maybeImage;\n      }\n      if (!image) image = inferImageFromMetadata(metadata);\n    }\n\n    return {\n      projectId,\n      address: getChecksumAddress(\n        String(contract.contract_address ?? collection),\n      ),\n      contractType:\n        String(contract.contract_type ?? contract.type ?? \"ERC721\") || \"ERC721\",\n      metadata,\n      totalSupply: asBigInt(contract.total_supply ?? \"0x0\"),\n      tokenIdSample:\n        (contract.token_id as string | null | undefined) ??\n        (tokenSample?.token_id as string | null | undefined) ??\n        null,\n      image,\n      raw: contract as any,\n    };\n  };\n\n  const listCollectionTokens = async (\n    options: FetchCollectionTokensOptions,\n  ): Promise<FetchCollectionTokensResult> => {\n    const {\n      address,\n      project,\n      cursor,\n      attributeFilters,\n      tokenIds,\n      limit = DEFAULT_LIMIT,\n      fetchImages = false,\n    } = options;\n    const projectId = ensureProjectId(project, defaultProject);\n    const collection = addAddressPadding(getChecksumAddress(address));\n    const offset = cursor ? Number.parseInt(cursor, 10) || 0 : 0;\n\n    const conditions = [\n      `lower(contract_address) = lower('${escapeSqlValue(collection)}')`,\n    ];\n\n    if (tokenIds && tokenIds.length > 0) {\n      const values = [\n        ...new Set(tokenIds.map((value) => escapeSqlValue(value))),\n      ];\n      conditions.push(\n        `token_id IN (${values.map((v) => `'${v}'`).join(\", \")})`,\n      );\n    }\n\n    const sql = `SELECT contract_address, token_id, metadata, name, symbol, decimals\nFROM tokens\nWHERE ${conditions.join(\" AND \")}\nORDER BY token_id\nLIMIT ${Math.max(1, Math.floor(limit))}\nOFFSET ${Math.max(0, offset)}`;\n\n    try {\n      const rows = await querySql(projectId, sql);\n      const normalized = await normalizeTokens(rows as any[], projectId, {\n        fetchImages,\n        resolveTokenImage: resolveTokenImage ?? defaultResolveTokenImage,\n      });\n\n      const filtered = normalized.filter((token) =>\n        tokenMatchesAttributeFilters(token, attributeFilters),\n      ) as NormalizedToken[];\n\n      const nextCursor =\n        rows.length >= limit ? String(offset + rows.length) : null;\n      return {\n        page: {\n          tokens: filtered,\n          nextCursor,\n        },\n        error: null,\n      };\n    } catch (error) {\n      const err =\n        error instanceof Error\n          ? error\n          : new Error(\n              typeof error === \"string\" ? error : \"Failed to list tokens\",\n            );\n      return { page: null, error: { error: err } };\n    }\n  };\n\n  const getCollectionOrders = async (\n    options: CollectionOrdersOptions,\n  ): Promise<OrderModel[]> => {\n    const collection = addAddressPadding(\n      getChecksumAddress(options.collection),\n    );\n    const tokenId = normalizeTokenIdForQuery(options.tokenId);\n    const status =\n      options.status != null ? statusValueMap[options.status] : undefined;\n    const category =\n      options.category != null ? categoryValueMap[options.category] : undefined;\n\n    const conditions = [\n      `lower(collection) = lower('${escapeSqlValue(collection)}')`,\n    ];\n    if (tokenId !== undefined) {\n      conditions.push(`token_id = '${escapeSqlValue(tokenId)}'`);\n    }\n    if (options.orderIds?.length) {\n      conditions.push(\n        `id IN (${options.orderIds.map((id) => Number(id)).join(\", \")})`,\n      );\n    }\n    if (status !== undefined) {\n      conditions.push(`status = ${status}`);\n    }\n    if (\n      category !== undefined &&\n      category !== categoryValueMap[CategoryType.None]\n    ) {\n      conditions.push(`category = ${category}`);\n    }\n\n    const sql = `SELECT id, category, status, expiration, collection, token_id, quantity, price, currency, owner\nFROM \"ARCADE-Order\"\nWHERE ${conditions.join(\" AND \")}\nORDER BY id DESC${options.limit ? ` LIMIT ${Math.max(1, Math.floor(options.limit))}` : \"\"}`;\n\n    const rows = await querySql(defaultProject, sql);\n    return rows.map(toOrderModel).filter((order) => order.exists());\n  };\n\n  const listCollectionListings = async (\n    options: CollectionListingsOptions,\n  ): Promise<OrderModel[]> => {\n    const baseOrders = await getCollectionOrders({\n      collection: options.collection,\n      tokenId: options.tokenId,\n      limit: options.limit,\n      category: CategoryType.Sell,\n      status: StatusType.Placed,\n    });\n\n    const filtered = baseOrders.filter(\n      (order) =>\n        order.category.value === CategoryType.Sell &&\n        order.status.value === StatusType.Placed,\n    );\n\n    if (options.verifyOwnership === false || filtered.length === 0) {\n      return filtered;\n    }\n\n    const projectId = ensureProjectId(options.projectId, defaultProject);\n    return verifyListingsOwnership(projectId, options.collection, filtered);\n  };\n\n  const getToken = async (\n    options: TokenDetailsOptions,\n  ): Promise<TokenDetails | null> => {\n    const {\n      collection,\n      tokenId,\n      projectId: projectOverride,\n      fetchImages = true,\n      orderLimit,\n    } = options;\n    const projectId = ensureProjectId(projectOverride, defaultProject);\n\n    const tokenPage = await listCollectionTokens({\n      address: collection,\n      project: projectId,\n      tokenIds: [tokenId],\n      limit: 1,\n      fetchImages,\n    });\n    if (tokenPage.error) {\n      throw tokenPage.error.error;\n    }\n\n    const token = tokenPage.page?.tokens[0];\n    if (!token) return null;\n\n    const orders = await getCollectionOrders({\n      collection,\n      tokenId,\n      limit: orderLimit,\n    });\n\n    const now = Date.now() / 1000;\n    let listings = orders.filter(\n      (order) =>\n        order.category.value === CategoryType.Sell &&\n        order.status.value === StatusType.Placed &&\n        order.expiration > now,\n    );\n\n    if (listings.length > 0 && options.verifyOwnership !== false) {\n      listings = await verifyListingsOwnership(projectId, collection, listings);\n    }\n\n    return {\n      projectId,\n      token,\n      orders,\n      listings,\n    };\n  };\n\n  const getFees = async (): Promise<MarketplaceFees | null> => {\n    const rows = await querySql(\n      defaultProject,\n      `SELECT fee_num, fee_receiver\nFROM \"ARCADE-Book\"\nLIMIT 1`,\n    );\n\n    const row = rows[0];\n    if (!row) return null;\n\n    return {\n      feeNum: asNumber(row.fee_num),\n      feeReceiver: getChecksumAddress(String(row.fee_receiver ?? \"0x0\")),\n      feeDenominator: 10000,\n    };\n  };\n\n  const getRoyaltyFee = async (\n    options: RoyaltyFeeOptions,\n  ): Promise<RoyaltyFee | null> => {\n    if (!provider) {\n      throw new Error(\n        \"Provider required for getRoyaltyFee. Pass provider in config.\",\n      );\n    }\n\n    const result = await provider.callContract({\n      contractAddress: options.collection,\n      entrypoint: \"royalty_info\",\n      calldata: [cairo.uint256(options.tokenId), cairo.uint256(options.amount)],\n    });\n\n    if (!result || result.length < 2) return null;\n\n    return {\n      receiver: getChecksumAddress(result[0]),\n      amount: BigInt(result[1]),\n    };\n  };\n\n  return {\n    getCollection,\n    listCollectionTokens,\n    getCollectionOrders,\n    listCollectionListings,\n    getToken,\n    getFees,\n    getRoyaltyFee,\n  };\n}\n"],"mappings":"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","names":[]}