{"version":3,"sources":["../src/marketplace/client.dojo.ts"],"sourcesContent":["import {\n  AndComposeClause,\n  ClauseBuilder,\n  KeysClause,\n  MemberClause,\n  OrComposeClause,\n  ToriiQueryBuilder,\n} from \"@dojoengine/sdk\";\nimport type { constants } from \"starknet\";\nimport { addAddressPadding, cairo, getChecksumAddress } from \"starknet\";\nimport type {\n  ToriiClient,\n  Token as ToriiToken,\n} from \"@dojoengine/torii-wasm/types\";\nimport {\n  fetchToriis,\n  type ClientCallbackParams,\n} from \"../modules/torii-fetcher\";\nimport { initArcadeSDK } from \"../modules/init-sdk\";\nimport type { SchemaType } from \"../bindings\";\nimport { ArcadeModelsMapping, OrderCategory, OrderStatus } from \"../bindings\";\nimport { NAMESPACE } from \"../constants\";\nimport { Book } from \"../modules/marketplace/book\";\nimport { Order, type OrderModel } from \"../modules/marketplace/order\";\nimport { CategoryType, StatusType } from \"../classes\";\nimport { fetchCollectionTokens, fetchTokenBalances } from \"./tokens\";\nimport {\n  defaultResolveContractImage,\n  defaultResolveTokenImage,\n  inferImageFromMetadata,\n  parseJsonSafe,\n} from \"./utils\";\nimport type {\n  CollectionListingsOptions,\n  CollectionOrdersOptions,\n  CollectionSummaryOptions,\n  MarketplaceClient,\n  MarketplaceClientConfig,\n  MarketplaceFees,\n  NormalizedCollection,\n  RoyaltyFee,\n  RoyaltyFeeOptions,\n  TokenDetails,\n  TokenDetailsOptions,\n} from \"./types\";\n\ntype TokenContractsResponse = Awaited<\n  ReturnType<ToriiClient[\"getTokenContracts\"]>\n>;\n\nconst statusMap: Record<StatusType, OrderStatus> = {\n  [StatusType.None]: OrderStatus.None,\n  [StatusType.Placed]: OrderStatus.Placed,\n  [StatusType.Canceled]: OrderStatus.Canceled,\n  [StatusType.Executed]: OrderStatus.Executed,\n};\n\nconst categoryMap: Record<CategoryType, OrderCategory> = {\n  [CategoryType.None]: OrderCategory.None,\n  [CategoryType.Buy]: OrderCategory.Buy,\n  [CategoryType.Sell]: OrderCategory.Sell,\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) {\n    return projectId;\n  }\n  return fallback;\n};\n\nasync function fetchContractMetadata(\n  projectId: string,\n  address: string,\n  resolveContractImage: MarketplaceClientConfig[\"resolveContractImage\"],\n  fetchImages: boolean,\n): Promise<NormalizedCollection | null> {\n  const checksumAddress = getChecksumAddress(address);\n\n  const response = await fetchToriis([projectId], {\n    client: async ({ client }: ClientCallbackParams) => {\n      return client.getTokenContracts({\n        contract_addresses: [checksumAddress],\n        contract_types: [],\n        pagination: {\n          limit: 1,\n          cursor: undefined,\n          direction: \"Forward\",\n          order_by: [],\n        },\n      });\n    },\n  });\n\n  const contractPages = response.data as TokenContractsResponse[];\n  const contract = contractPages\n    .flatMap((page) => page.items)\n    .find(\n      (item) => getChecksumAddress(item.contract_address) === checksumAddress,\n    );\n\n  if (!contract) {\n    return null;\n  }\n\n  let tokenSample: ToriiToken | undefined;\n\n  if (!contract.metadata || contract.metadata.length === 0) {\n    try {\n      const tokensResponse = await fetchToriis([projectId], {\n        client: async ({ client }: ClientCallbackParams) => {\n          return client.getTokens({\n            contract_addresses: [checksumAddress],\n            token_ids: [],\n            attribute_filters: [],\n            pagination: {\n              limit: 1,\n              cursor: undefined,\n              direction: \"Forward\",\n              order_by: [],\n            },\n          });\n        },\n      });\n\n      const tokenPages = tokensResponse.data as Awaited<\n        ReturnType<ToriiClient[\"getTokens\"]>\n      >[];\n      tokenSample = tokenPages.flatMap((page) => page.items)[0];\n      if (tokenSample?.metadata && !contract.metadata) {\n        contract.metadata = tokenSample.metadata;\n      }\n      if (tokenSample?.token_id && !(contract as any).token_id) {\n        (contract as any).token_id = tokenSample.token_id;\n      }\n    } catch (_error) {\n      // Silently ignore token metadata enrichment failures\n    }\n  }\n\n  const metadata = parseJsonSafe(contract.metadata, contract.metadata);\n  const totalSupply = BigInt(contract.total_supply ?? \"0x0\");\n  const contractType =\n    (contract as any).contract_type ?? (contract as any).type ?? \"ERC721\";\n\n  let image: string | undefined;\n  if (fetchImages) {\n    const contractImageResolver =\n      resolveContractImage ?? defaultResolveContractImage;\n    const maybeImage = await contractImageResolver(contract, { projectId });\n    if (typeof maybeImage === \"string\" && maybeImage.length > 0) {\n      image = maybeImage;\n    }\n\n    if (!image) {\n      image = inferImageFromMetadata(metadata);\n    }\n  }\n\n  return {\n    projectId,\n    address: checksumAddress,\n    contractType,\n    metadata,\n    totalSupply,\n    tokenIdSample: (contract as any).token_id ?? tokenSample?.token_id ?? null,\n    image,\n    raw: contract,\n  };\n}\n\nexport async function createDojoMarketplaceClient(\n  config: MarketplaceClientConfig,\n): Promise<MarketplaceClient> {\n  const {\n    chainId,\n    defaultProject = \"arcade-main\",\n    resolveTokenImage,\n    resolveContractImage,\n    provider,\n  } = config;\n\n  const sdk = await initArcadeSDK(chainId as constants.StarknetChainId);\n\n  const queryOrders = async (\n    options: CollectionOrdersOptions,\n  ): Promise<OrderModel[]> => {\n    const checksumCollection = getChecksumAddress(options.collection);\n    const tokenId = normalizeTokenIdForQuery(options.tokenId);\n    const orderIds = options.orderIds ?? [];\n\n    let baseClause:\n      | ReturnType<typeof KeysClause>\n      | ReturnType<typeof OrComposeClause>;\n\n    if (orderIds.length > 0) {\n      const orderIdClauses = orderIds.map((id) =>\n        KeysClause(\n          [ArcadeModelsMapping.Order],\n          [\n            id.toString(),\n            addAddressPadding(checksumCollection),\n            tokenId,\n            undefined,\n          ],\n          \"FixedLen\",\n        ),\n      );\n      baseClause =\n        orderIdClauses.length === 1\n          ? orderIdClauses[0]\n          : OrComposeClause(orderIdClauses);\n    } else {\n      baseClause = KeysClause(\n        [ArcadeModelsMapping.Order],\n        [undefined, addAddressPadding(checksumCollection), tokenId, undefined],\n        \"FixedLen\",\n      );\n    }\n\n    const builders: Array<\n      | ReturnType<typeof KeysClause>\n      | ReturnType<typeof MemberClause>\n      | ReturnType<typeof OrComposeClause>\n    > = [baseClause];\n\n    const status =\n      options.status != null ? statusMap[options.status] : undefined;\n    if (status !== undefined) {\n      builders.push(\n        MemberClause(\n          ArcadeModelsMapping.Order,\n          \"status\",\n          \"Eq\",\n          status.toString(),\n        ),\n      );\n    }\n\n    const category =\n      options.category != null ? categoryMap[options.category] : undefined;\n    if (category !== undefined && category !== OrderCategory.None) {\n      builders.push(\n        MemberClause(\n          ArcadeModelsMapping.Order,\n          \"category\",\n          \"Eq\",\n          category.toString(),\n        ),\n      );\n    }\n\n    const query = new ToriiQueryBuilder<SchemaType>()\n      .withClause(\n        builders.length === 1\n          ? builders[0].build()\n          : AndComposeClause(builders).build(),\n      )\n      .withEntityModels([ArcadeModelsMapping.Order])\n      .includeHashedKeys();\n\n    if (options.limit) {\n      query.withLimit(options.limit);\n    }\n\n    const entities = await sdk.getEntities({ query });\n    const items = entities?.getItems() ?? [];\n\n    const orders: OrderModel[] = [];\n    for (const entity of items) {\n      const model = entity.models[NAMESPACE]?.[Order.getModelName()];\n      if (!model) continue;\n      const order = Order.parse(entity);\n      if (order.exists()) {\n        orders.push(order);\n      }\n    }\n\n    return orders;\n  };\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\n    return fetchContractMetadata(\n      projectId,\n      address,\n      resolveContractImage,\n      fetchImages,\n    );\n  };\n\n  const getCollectionOrders = async (\n    options: CollectionOrdersOptions,\n  ): Promise<OrderModel[]> => {\n    return queryOrders(options);\n  };\n\n  const listCollectionListings = async (\n    options: CollectionListingsOptions,\n  ): Promise<OrderModel[]> => {\n    const baseOrders = await queryOrders({\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    const checksumCollection = getChecksumAddress(options.collection);\n    const ownerAddresses = [...new Set(filtered.map((o) => o.owner))];\n    const tokenIds = [\n      ...new Set(\n        filtered.map((o) => addAddressPadding(`0x${o.tokenId.toString(16)}`)),\n      ),\n    ];\n\n    const { page, error } = await fetchTokenBalances({\n      project: projectId,\n      contractAddresses: [checksumCollection],\n      accountAddresses: ownerAddresses,\n      tokenIds,\n    });\n\n    if (error || !page) {\n      throw new Error(\"Failed to verify listing ownership\");\n    }\n\n    const ownershipSet = new Set<string>();\n    for (const balance of page.balances) {\n      if (BigInt(balance.balance) > 0n && balance.token_id) {\n        const normalizedOwner = getChecksumAddress(balance.account_address);\n        const normalizedTokenId = BigInt(balance.token_id).toString();\n        ownershipSet.add(`${normalizedOwner}_${normalizedTokenId}`);\n      }\n    }\n\n    return filtered.filter((order) => {\n      const normalizedOwner = getChecksumAddress(order.owner);\n      const normalizedTokenId = BigInt(order.tokenId).toString();\n      const key = `${normalizedOwner}_${normalizedTokenId}`;\n      return ownershipSet.has(key);\n    });\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\n    const projectId = ensureProjectId(projectOverride, defaultProject);\n    const { page, error } = await fetchCollectionTokens({\n      address: collection,\n      project: projectId,\n      tokenIds: [tokenId],\n      limit: 1,\n      fetchImages,\n      resolveTokenImage: resolveTokenImage ?? defaultResolveTokenImage,\n      defaultProjectId: defaultProject,\n    });\n\n    if (error) {\n      throw error.error;\n    }\n\n    const token = page?.tokens[0];\n    if (!token) return null;\n\n    const orders = await queryOrders({\n      collection,\n      tokenId,\n      limit: orderLimit,\n    });\n\n    const now = Date.now() / 1000;\n    const activeSellOrders = orders.filter(\n      (order) =>\n        order.category.value === CategoryType.Sell &&\n        order.status.value === StatusType.Placed &&\n        order.expiration > now,\n    );\n\n    // Verify ownership of active listings\n    let listings = activeSellOrders;\n    if (listings.length > 0 && options.verifyOwnership !== false) {\n      const checksumCollection = getChecksumAddress(collection);\n      const ownerAddresses = [...new Set(listings.map((o) => o.owner))];\n      const ownerTokenIds = [\n        ...new Set(\n          listings.map((o) => addAddressPadding(`0x${o.tokenId.toString(16)}`)),\n        ),\n      ];\n\n      const { page: balancePage } = await fetchTokenBalances({\n        project: projectId,\n        contractAddresses: [checksumCollection],\n        accountAddresses: ownerAddresses,\n        tokenIds: ownerTokenIds,\n      });\n\n      if (balancePage) {\n        const ownershipSet = new Set<string>();\n        for (const balance of balancePage.balances) {\n          if (BigInt(balance.balance) > 0n && balance.token_id) {\n            const normalizedOwner = getChecksumAddress(balance.account_address);\n            const normalizedTokenId = BigInt(balance.token_id).toString();\n            ownershipSet.add(`${normalizedOwner}_${normalizedTokenId}`);\n          }\n        }\n\n        listings = listings.filter((order) => {\n          const normalizedOwner = getChecksumAddress(order.owner);\n          const normalizedTokenId = BigInt(order.tokenId).toString();\n          return ownershipSet.has(`${normalizedOwner}_${normalizedTokenId}`);\n        });\n      }\n    }\n\n    return {\n      projectId,\n      token,\n      orders,\n      listings,\n    };\n  };\n\n  const getFees = async (): Promise<MarketplaceFees | null> => {\n    const clauses = new ClauseBuilder().keys(\n      [`${NAMESPACE}-${Book.getModelName()}`],\n      [],\n    );\n    const query = new ToriiQueryBuilder<SchemaType>()\n      .withClause(clauses.build())\n      .withEntityModels([`${NAMESPACE}-${Book.getModelName()}`])\n      .includeHashedKeys();\n\n    const entities = await sdk.getEntities({ query });\n    const items = entities?.getItems() ?? [];\n\n    for (const entity of items) {\n      const book = Book.parse(entity);\n      if (book.exists()) {\n        return {\n          feeNum: book.fee_num,\n          feeReceiver: book.fee_receiver,\n          feeDenominator: 10000,\n        };\n      }\n    }\n    return null;\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: (options) =>\n      fetchCollectionTokens({\n        ...options,\n        project: options.project ?? defaultProject,\n        resolveTokenImage: resolveTokenImage ?? defaultResolveTokenImage,\n        defaultProjectId: defaultProject,\n      }),\n    getCollectionOrders,\n    listCollectionListings,\n    getToken,\n    getFees,\n    getRoyaltyFee,\n  };\n}\n"],"mappings":"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","names":[]}