@medialane/sdk 0.167.0 → 0.168.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api/launchpad-runs.ts","../src/types/api.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":["headers","endpoint","hmac","sha256","base64urlnopad"],"mappings":"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","file":"index.cjs","sourcesContent":["export type RunStatus = \"DRAFT\" | \"PAID\" | \"RUNNING\" | \"COMPLETED\" | \"FAILED\" | \"CANCELLED\";\n\nexport interface RunQuoteLine {\n action: string;\n units: number;\n unitCredits: number;\n credits: number;\n}\n\nexport interface RunQuote {\n lines: RunQuoteLine[];\n total: number;\n}\n\nexport type NextStep =\n | { kind: \"collection\" }\n | { kind: \"wait-collection\" }\n | { kind: \"upload\"; files: string[] }\n | { kind: \"metadata\"; items: number[] }\n | { kind: \"wallets\" }\n | { kind: \"batch\"; index: number }\n | { kind: \"wait\"; index: number }\n | { kind: \"done\" };\n\nexport type TicketingNextStep =\n | { kind: \"collection\" }\n | { kind: \"wait-collection\" }\n | { kind: \"upload\"; files: string[] }\n | { kind: \"ticket-metadata\" }\n | { kind: \"tier\" }\n | { kind: \"wait-tier\" }\n | { kind: \"wallets\" }\n | { kind: \"batch\"; index: number }\n | { kind: \"wait\"; index: number }\n | { kind: \"done\" };\n\nexport type CertificateEmissionNextStep =\n | { kind: \"collection\" }\n | { kind: \"wait-collection\" }\n | { kind: \"upload\"; files: string[] }\n | { kind: \"certificate-metadata\" }\n | { kind: \"wallets\" }\n | { kind: \"batch\"; index: number }\n | { kind: \"wait\"; index: number }\n | { kind: \"done\" };\n\nexport interface WalletRequest {\n recipient: string;\n}\n\ninterface LaunchpadRunBase {\n id: string;\n status: RunStatus;\n spec: unknown;\n quote: RunQuote | null;\n creditsHeld: number;\n creditsSpent: number;\n progress: unknown;\n createdAt: string;\n updatedAt: string;\n}\n\nexport type DataTokenizationRun = LaunchpadRunBase & { service: \"data-tokenization-erc721\"; next?: NextStep };\nexport type TicketingRun = LaunchpadRunBase & { service: \"ip-ticketing\"; next?: TicketingNextStep };\nexport type CertificateEmissionRun = LaunchpadRunBase & { service: \"certificate-emission\"; next?: CertificateEmissionNextStep };\nexport type LaunchpadRun = DataTokenizationRun | TicketingRun | CertificateEmissionRun;\n\nexport const isDataTokenizationRun = (run: LaunchpadRun): run is DataTokenizationRun =>\n run.service === \"data-tokenization-erc721\";\n\nexport const isTicketingRun = (run: LaunchpadRun): run is TicketingRun => run.service === \"ip-ticketing\";\n\nexport const isCertificateEmissionRun = (run: LaunchpadRun): run is CertificateEmissionRun =>\n run.service === \"certificate-emission\";\n\nexport interface ConfirmResult {\n pending: boolean;\n status: string;\n completed?: boolean;\n}\n\nexport class RunRequestError extends Error {\n constructor(\n message: string,\n readonly status: number,\n readonly body: Record<string, unknown>,\n ) {\n super(message);\n }\n}\n\nexport type TokenSource = () => Promise<string | null>;\n\n\nexport interface LaunchpadRunsClientOptions {\n baseUrl: string;\n getToken: TokenSource;\n fetchImpl?: typeof fetch;\n}\n\nexport function createLaunchpadRunsClient({ baseUrl, getToken, fetchImpl = fetch }: LaunchpadRunsClientOptions) {\n const runsUrl = `${baseUrl.replace(/\\/$/, \"\")}/v1/portal/runs`;\n const runBase = (id: string): string => `${runsUrl}/${id}`;\n const runBatchBase = (id: string, index: number): string => `${runBase(id)}/batches/${index}`;\n const runCollectionBase = (id: string): string => `${runBase(id)}/collection`;\n const runTierBase = (id: string): string => `${runBase(id)}/tier`;\n\n const authorizedFetch: typeof fetch = async (input, init) => {\n const token = await getToken();\n const headers = new Headers(init?.headers);\n if (token) headers.set(\"authorization\", `Bearer ${token}`);\n return fetchImpl(input, { ...init, headers, cache: \"no-store\" });\n };\n\n async function call<T>(url: string, init?: RequestInit): Promise<{ status: number; data: T }> {\n const res = await authorizedFetch(url, {\n ...init,\n headers: { \"content-type\": \"application/json\", ...(init?.headers as Record<string, string> | undefined) },\n });\n const body = (await res.json().catch(() => ({}))) as Record<string, unknown>;\n if (!res.ok) {\n throw new RunRequestError(String(body.error ?? \"Something went wrong with this run\"), res.status, body);\n }\n return { status: res.status, data: body.data as T };\n }\n\n const post = <T>(url: string, body?: unknown) =>\n call<T>(url, { method: \"POST\", body: body === undefined ? undefined : JSON.stringify(body) });\n\n const confirm = async (url: string): Promise<ConfirmResult> => {\n const { status, data } = await post<{ status: string; completed?: boolean }>(url);\n return { pending: status === 202, status: data.status, completed: data.completed };\n };\n\n const ticketing = {\n uploadUrl: async (id: string, name: string) =>\n (await post<{ name: string; url: string }>(`${runBase(id)}/files/upload-url`, { name })).data.url,\n\n uploaded: async (id: string, name: string, cid: string) =>\n (await post<{ name: string; uri: string }>(`${runBase(id)}/files/uploaded`, { name, cid })).data,\n\n metadata: async (id: string, userAddress: string) =>\n (await post<{ tokenUri: string }>(`${runBase(id)}/metadata`, { userAddress })).data,\n\n resolveWallets: async (id: string) =>\n (await post<{ pending: string[] }>(`${runBase(id)}/wallets/resolve`)).data.pending,\n\n registerWallet: async (id: string, request: WalletRequest) =>\n (await post<{ recipient: string; walletAddress: string }>(`${runBase(id)}/wallets`, request)).data,\n\n confirmCollection: (id: string) => confirm(`${runCollectionBase(id)}/confirm`),\n confirmTier: (id: string) => confirm(`${runTierBase(id)}/confirm`),\n confirmBatch: (id: string, index: number) => confirm(`${runBatchBase(id, index)}/confirm`),\n };\n\n const certificateEmission = {\n uploadUrl: async (id: string, name: string) =>\n (await post<{ name: string; url: string }>(`${runBase(id)}/files/upload-url`, { name })).data.url,\n\n uploaded: async (id: string, name: string, cid: string) =>\n (await post<{ name: string; uri: string }>(`${runBase(id)}/files/uploaded`, { name, cid })).data,\n\n metadata: async (id: string, userAddress: string) =>\n (await post<{ tokenUri: string }>(`${runBase(id)}/certificate-metadata`, { userAddress })).data,\n\n resolveWallets: async (id: string) =>\n (await post<{ pending: string[] }>(`${runBase(id)}/recipients/resolve`)).data.pending,\n\n registerWallet: async (id: string, request: WalletRequest) =>\n (await post<{ recipient: string; walletAddress: string }>(`${runBase(id)}/recipients`, request)).data,\n\n confirmCollection: (id: string) => confirm(`${runCollectionBase(id)}/confirm`),\n confirmBatch: (id: string, index: number) => confirm(`${runBatchBase(id, index)}/confirm`),\n };\n\n return {\n authorizedFetch,\n runBase,\n runBatchBase,\n runCollectionBase,\n runTierBase,\n ticketing,\n certificateEmission,\n\n list: async () => (await call<LaunchpadRun[]>(runsUrl)).data,\n\n get: async (id: string) => (await call<LaunchpadRun>(`${runBase(id)}`)).data,\n\n create: async (service: string, spec: unknown) =>\n (await post<LaunchpadRun>(runsUrl, { service, spec })).data,\n\n update: async (id: string, spec: unknown) =>\n (await call<LaunchpadRun>(`${runBase(id)}`, { method: \"PATCH\", body: JSON.stringify({ spec }) })).data,\n\n cancel: async (id: string) => (await post<LaunchpadRun>(`${runBase(id)}/cancel`)).data,\n\n checkoutWithCredits: async (id: string) =>\n (await post<LaunchpadRun>(`${runBase(id)}/checkout`, { method: \"credits\" })).data,\n\n checkoutFromWallet: async (id: string, intentId: string) =>\n (await post<LaunchpadRun>(`${runBase(id)}/checkout`, { method: \"wallet\", intentId })).data,\n\n uploadUrl: async (id: string, name: string) =>\n (await post<{ name: string; url: string }>(`${runBase(id)}/files/upload-url`, { name })).data.url,\n\n uploaded: async (id: string, name: string, cid: string) =>\n (await post<{ name: string; uri: string }>(`${runBase(id)}/files/uploaded`, { name, cid })).data,\n\n itemMetadata: async (id: string, index: number, userAddress: string) =>\n (await post<{ index: number; tokenUri: string }>(`${runBase(id)}/items/${index}/metadata`, { userAddress })).data,\n\n resolveGuests: async (id: string) =>\n (await post<{ pending: string[] }>(`${runBase(id)}/guests/resolve`)).data.pending,\n\n registerGuest: async (id: string, request: WalletRequest) =>\n (await post<{ recipient: string; walletAddress: string }>(`${runBase(id)}/guests`, request)).data,\n\n confirmBatch: async (id: string, index: number): Promise<ConfirmResult> => {\n const { status, data } = await post<{ status: string; completed?: boolean }>(\n `${runBase(id)}/batches/${index}/confirm`,\n );\n return { pending: status === 202, status: data.status, completed: data.completed };\n },\n\n confirmCollection: async (id: string): Promise<ConfirmResult> => {\n const { status, data } = await post<{ status: string }>(`${runBase(id)}/collection/confirm`);\n return { pending: status === 202, status: data.status };\n },\n };\n}\n\nexport type LaunchpadRunsClient = ReturnType<typeof createLaunchpadRunsClient>;\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\";\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 service?: string;\n sort?: string;\n creator?: 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 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 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 status?: string;\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 status: string;\n creditBalance: number;\n}\n\nexport interface ApiPortalKey {\n id: string;\n prefix: string;\n label: string | null;\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 ApiFundingMethod {\n id: string;\n [detail: string]: unknown;\n}\n\nexport type ApiFundingStatus = \"PENDING\" | \"SETTLED\" | \"FAILED\" | \"EXPIRED\";\n\nexport interface ApiFundingIntent {\n id: string;\n method: string;\n status: ApiFundingStatus;\n expiresAt: string;\n payer?: string | null;\n}\n\nexport interface ApiFundingInstructions {\n chain: string;\n payTo: string;\n asset: string;\n amountAtomic: string;\n}\n\nexport type ApiFundingSubmit =\n | { status: \"SETTLED\"; credited?: number }\n | { status: \"PENDING\"; reason: string };\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 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 ApiChain = \"STARKNET\" | \"ETHEREUM\" | \"SOLANA\" | \"BASE\" | \"BITCOIN\";\n\nexport interface ApiSession {\n accountId: string;\n publicId: string;\n walletAddress: string | null;\n email: string | null;\n emailDeadline: string | null;\n}\n\nexport interface ApiUserWallet {\n walletAddress: string;\n email?: string | null;\n emailDeadline?: string | null;\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 chain: string;\n walletAddress: string;\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 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 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\nexport interface ApiPlatformStats {\n collections: number;\n tokens: number;\n sales: number;\n}\n\nexport interface ApiDropInfo {\n contractAddress: string;\n name: string | null;\n symbol: string | null;\n description: string | null;\n image: string | null;\n owner: string | null;\n totalMinted: number;\n}\n\nexport interface ApiDropConditions {\n maxSupply: string;\n price: string;\n paymentToken: string;\n startTime: number;\n endTime: number;\n maxPerWallet: string;\n}\n\nexport interface ApiDropState {\n conditions: ApiDropConditions;\n totalMinted: number;\n maxSupply: number;\n allowlistEnabled: boolean;\n paused: boolean;\n}\n\nexport interface ApiTierOnchain {\n maxSupply: string;\n minted: string;\n startTime: number | null;\n endTime: number | null;\n royaltyBps: number;\n}\n\nexport interface ApiIpNftTokenData {\n owner: string;\n metadataUri: string;\n originalCreator: string;\n registeredAt: number;\n}\n\nexport interface ApiTokensQuery {\n page?: number;\n limit?: number;\n sort?: string;\n ipType?: string;\n derivatives?: \"allowed\";\n}\n\nexport interface ApiUsernameClaim {\n id: string;\n username: string;\n walletAddress: string;\n status: \"PENDING\" | \"APPROVED\" | \"REJECTED\";\n adminNotes: string | null;\n reviewedAt: string | null;\n createdAt: string;\n}\n\nexport type ApiReportTargetType = \"COLLECTION\" | \"TOKEN\" | \"CREATOR\" | \"COMMENT\";\n\nexport interface ApiSubmitReport {\n targetType: ApiReportTargetType;\n targetContract?: string;\n targetTokenId?: string;\n targetAddress?: string;\n targetId?: string;\n categories: string[];\n description?: string;\n}\n\nexport interface ApiSponsorshipOffer {\n id: string;\n chain: string;\n contractAddress: string;\n offerId: string;\n author: string;\n nftContract: string;\n tokenId: string;\n minAmount: string;\n duration: number;\n paymentToken: string;\n licenseTermsUri: string;\n transferable: boolean;\n royaltyBps: number;\n specificSponsor: string | null;\n open: boolean;\n createdAtChain: string;\n updatedAt: string;\n}\n\nexport interface ApiSponsorshipBid {\n id: string;\n chain: string;\n contractAddress: string;\n offerId: string;\n sponsor: string;\n amount: string;\n placedAtChain: string;\n updatedAt: string;\n}\n\nexport interface ApiSponsorshipProposal {\n id: string;\n chain: string;\n contractAddress: string;\n proposalId: string;\n proposer: string;\n nftContract: string;\n tokenId: string;\n amount: string;\n duration: number;\n validUntil: string | null;\n paymentToken: string;\n licenseTermsUri: string;\n transferable: boolean;\n royaltyBps: number;\n open: boolean;\n accepted: boolean | null;\n createdAtChain: string;\n closedAtChain: string | null;\n updatedAt: string;\n}\n\nexport interface ApiSponsorshipLicense {\n id: string;\n chain: string;\n contractAddress: string;\n tokenId: string;\n author: string;\n recipient: string;\n assetContract: string;\n assetTokenId: string;\n expiresAt: string;\n transferable: boolean;\n royaltyBps: number;\n licenseTermsUri: string;\n offerId: string | null;\n proposalId: string | null;\n mintedAtChain: string;\n currentHolder?: string | null;\n}\n\nexport interface ApiSponsorshipOffersQuery {\n limit?: number;\n nftContract?: string;\n author?: string;\n owner?: string;\n open?: boolean;\n}\n\nexport interface ApiSponsorshipProposalsQuery {\n limit?: number;\n nftContract?: string;\n proposer?: string;\n owner?: string;\n open?: boolean;\n}\n\nexport interface ApiSponsorshipLicensesQuery {\n limit?: number;\n holder?: string;\n author?: string;\n}\n\nexport interface ApiCollectionsListQuery {\n page?: number;\n limit?: number;\n owner?: string;\n service?: string;\n sort?: CollectionSort;\n isFeatured?: boolean;\n hideEmpty?: boolean;\n standard?: string;\n chain?: ChainFilter;\n}\n\nexport interface ApiPricingRule {\n actionKey: string;\n chain: string;\n service: string;\n credits: number;\n}\n\nexport interface ApiPricing {\n creditsPerUsdc: number;\n mdln?: { contract: string | null; tiers: { minWholeTokens: number; multiplier: number }[] };\n pricing: { default: number; rules: ApiPricingRule[] };\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 { 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 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.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 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 if (bytes.slice(0, 12).every((b) => b === 0)) return isPrivateIpv4(bytes.slice(12));\n if (bytes[0] === 0x00 && bytes[1] === 0x64 && bytes[2] === 0xff && bytes[3] === 0x9b && bytes.slice(4, 12).every((b) => b === 0)) {\n return isPrivateIpv4(bytes.slice(12));\n }\n if (bytes[0] === 0x20 && bytes[1] === 0x02) return isPrivateIpv4(bytes.slice(2, 6));\n if (bytes[0] === 0xfe && (bytes[1]! & 0xc0) === 0xc0) return true;\n if (bytes[0] === 0xff) return true;\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\") || host.endsWith(\".localhost\")) 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 {\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\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 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, payload: string): string {\n return toHex(hmac(sha256, encoder.encode(secret), encoder.encode(`${domain}.${payload}`)));\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 constantTimeEquals(provided, sign(secret, domain, payload));\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"]}
1
+ {"version":3,"sources":["../src/api/launchpad-runs.ts","../src/types/api.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":["headers","endpoint","hmac","sha256","base64urlnopad"],"mappings":"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","file":"index.cjs","sourcesContent":["export type RunStatus = \"DRAFT\" | \"PAID\" | \"RUNNING\" | \"COMPLETED\" | \"FAILED\" | \"CANCELLED\";\n\nexport interface RunQuoteLine {\n action: string;\n units: number;\n unitCredits: number;\n credits: number;\n}\n\nexport interface RunQuote {\n lines: RunQuoteLine[];\n total: number;\n}\n\nexport type NextStep =\n | { kind: \"collection\" }\n | { kind: \"wait-collection\" }\n | { kind: \"upload\"; files: string[] }\n | { kind: \"metadata\"; items: number[] }\n | { kind: \"wallets\" }\n | { kind: \"batch\"; index: number }\n | { kind: \"wait\"; index: number }\n | { kind: \"done\" };\n\nexport type TicketingNextStep =\n | { kind: \"collection\" }\n | { kind: \"wait-collection\" }\n | { kind: \"upload\"; files: string[] }\n | { kind: \"ticket-metadata\" }\n | { kind: \"tier\" }\n | { kind: \"wait-tier\" }\n | { kind: \"wallets\" }\n | { kind: \"batch\"; index: number }\n | { kind: \"wait\"; index: number }\n | { kind: \"done\" };\n\nexport type CertificateEmissionNextStep =\n | { kind: \"collection\" }\n | { kind: \"wait-collection\" }\n | { kind: \"upload\"; files: string[] }\n | { kind: \"certificate-metadata\" }\n | { kind: \"wallets\" }\n | { kind: \"batch\"; index: number }\n | { kind: \"wait\"; index: number }\n | { kind: \"done\" };\n\nexport interface WalletRequest {\n recipient: string;\n}\n\ninterface LaunchpadRunBase {\n id: string;\n status: RunStatus;\n spec: unknown;\n quote: RunQuote | null;\n creditsHeld: number;\n creditsSpent: number;\n progress: unknown;\n createdAt: string;\n updatedAt: string;\n}\n\nexport type DataTokenizationRun = LaunchpadRunBase & { service: \"data-tokenization-erc721\"; next?: NextStep };\nexport type TicketingRun = LaunchpadRunBase & { service: \"ip-ticketing\"; next?: TicketingNextStep };\nexport type CertificateEmissionRun = LaunchpadRunBase & { service: \"certificate-emission\"; next?: CertificateEmissionNextStep };\nexport type LaunchpadRun = DataTokenizationRun | TicketingRun | CertificateEmissionRun;\n\nexport const isDataTokenizationRun = (run: LaunchpadRun): run is DataTokenizationRun =>\n run.service === \"data-tokenization-erc721\";\n\nexport const isTicketingRun = (run: LaunchpadRun): run is TicketingRun => run.service === \"ip-ticketing\";\n\nexport const isCertificateEmissionRun = (run: LaunchpadRun): run is CertificateEmissionRun =>\n run.service === \"certificate-emission\";\n\nexport interface ConfirmResult {\n pending: boolean;\n status: string;\n completed?: boolean;\n}\n\nexport class RunRequestError extends Error {\n constructor(\n message: string,\n readonly status: number,\n readonly body: Record<string, unknown>,\n ) {\n super(message);\n }\n}\n\nexport type TokenSource = () => Promise<string | null>;\n\n\nexport interface LaunchpadRunsClientOptions {\n baseUrl: string;\n getToken: TokenSource;\n fetchImpl?: typeof fetch;\n}\n\nexport function createLaunchpadRunsClient({ baseUrl, getToken, fetchImpl = fetch }: LaunchpadRunsClientOptions) {\n const runsUrl = `${baseUrl.replace(/\\/$/, \"\")}/v1/portal/runs`;\n const runBase = (id: string): string => `${runsUrl}/${id}`;\n const runBatchBase = (id: string, index: number): string => `${runBase(id)}/batches/${index}`;\n const runCollectionBase = (id: string): string => `${runBase(id)}/collection`;\n const runTierBase = (id: string): string => `${runBase(id)}/tier`;\n\n const authorizedFetch: typeof fetch = async (input, init) => {\n const token = await getToken();\n const headers = new Headers(init?.headers);\n if (token) headers.set(\"authorization\", `Bearer ${token}`);\n return fetchImpl(input, { ...init, headers, cache: \"no-store\" });\n };\n\n async function call<T>(url: string, init?: RequestInit): Promise<{ status: number; data: T }> {\n const res = await authorizedFetch(url, {\n ...init,\n headers: { \"content-type\": \"application/json\", ...(init?.headers as Record<string, string> | undefined) },\n });\n const body = (await res.json().catch(() => ({}))) as Record<string, unknown>;\n if (!res.ok) {\n throw new RunRequestError(String(body.error ?? \"Something went wrong with this run\"), res.status, body);\n }\n return { status: res.status, data: body.data as T };\n }\n\n const post = <T>(url: string, body?: unknown) =>\n call<T>(url, { method: \"POST\", body: body === undefined ? undefined : JSON.stringify(body) });\n\n const confirm = async (url: string): Promise<ConfirmResult> => {\n const { status, data } = await post<{ status: string; completed?: boolean }>(url);\n return { pending: status === 202, status: data.status, completed: data.completed };\n };\n\n const ticketing = {\n uploadUrl: async (id: string, name: string) =>\n (await post<{ name: string; url: string }>(`${runBase(id)}/files/upload-url`, { name })).data.url,\n\n uploaded: async (id: string, name: string, cid: string) =>\n (await post<{ name: string; uri: string }>(`${runBase(id)}/files/uploaded`, { name, cid })).data,\n\n metadata: async (id: string, userAddress: string) =>\n (await post<{ tokenUri: string }>(`${runBase(id)}/metadata`, { userAddress })).data,\n\n resolveWallets: async (id: string) =>\n (await post<{ pending: string[] }>(`${runBase(id)}/wallets/resolve`)).data.pending,\n\n registerWallet: async (id: string, request: WalletRequest) =>\n (await post<{ recipient: string; walletAddress: string }>(`${runBase(id)}/wallets`, request)).data,\n\n confirmCollection: (id: string) => confirm(`${runCollectionBase(id)}/confirm`),\n confirmTier: (id: string) => confirm(`${runTierBase(id)}/confirm`),\n confirmBatch: (id: string, index: number) => confirm(`${runBatchBase(id, index)}/confirm`),\n };\n\n const certificateEmission = {\n uploadUrl: async (id: string, name: string) =>\n (await post<{ name: string; url: string }>(`${runBase(id)}/files/upload-url`, { name })).data.url,\n\n uploaded: async (id: string, name: string, cid: string) =>\n (await post<{ name: string; uri: string }>(`${runBase(id)}/files/uploaded`, { name, cid })).data,\n\n metadata: async (id: string, userAddress: string) =>\n (await post<{ tokenUri: string }>(`${runBase(id)}/certificate-metadata`, { userAddress })).data,\n\n resolveWallets: async (id: string) =>\n (await post<{ pending: string[] }>(`${runBase(id)}/recipients/resolve`)).data.pending,\n\n registerWallet: async (id: string, request: WalletRequest) =>\n (await post<{ recipient: string; walletAddress: string }>(`${runBase(id)}/recipients`, request)).data,\n\n confirmCollection: (id: string) => confirm(`${runCollectionBase(id)}/confirm`),\n confirmBatch: (id: string, index: number) => confirm(`${runBatchBase(id, index)}/confirm`),\n };\n\n return {\n authorizedFetch,\n runBase,\n runBatchBase,\n runCollectionBase,\n runTierBase,\n ticketing,\n certificateEmission,\n\n list: async () => (await call<LaunchpadRun[]>(runsUrl)).data,\n\n get: async (id: string) => (await call<LaunchpadRun>(`${runBase(id)}`)).data,\n\n create: async (service: string, spec: unknown) =>\n (await post<LaunchpadRun>(runsUrl, { service, spec })).data,\n\n update: async (id: string, spec: unknown) =>\n (await call<LaunchpadRun>(`${runBase(id)}`, { method: \"PATCH\", body: JSON.stringify({ spec }) })).data,\n\n cancel: async (id: string) => (await post<LaunchpadRun>(`${runBase(id)}/cancel`)).data,\n\n checkoutWithCredits: async (id: string) =>\n (await post<LaunchpadRun>(`${runBase(id)}/checkout`, { method: \"credits\" })).data,\n\n checkoutFromWallet: async (id: string, intentId: string) =>\n (await post<LaunchpadRun>(`${runBase(id)}/checkout`, { method: \"wallet\", intentId })).data,\n\n uploadUrl: async (id: string, name: string) =>\n (await post<{ name: string; url: string }>(`${runBase(id)}/files/upload-url`, { name })).data.url,\n\n uploaded: async (id: string, name: string, cid: string) =>\n (await post<{ name: string; uri: string }>(`${runBase(id)}/files/uploaded`, { name, cid })).data,\n\n itemMetadata: async (id: string, index: number, userAddress: string) =>\n (await post<{ index: number; tokenUri: string }>(`${runBase(id)}/items/${index}/metadata`, { userAddress })).data,\n\n resolveGuests: async (id: string) =>\n (await post<{ pending: string[] }>(`${runBase(id)}/guests/resolve`)).data.pending,\n\n registerGuest: async (id: string, request: WalletRequest) =>\n (await post<{ recipient: string; walletAddress: string }>(`${runBase(id)}/guests`, request)).data,\n\n confirmBatch: async (id: string, index: number): Promise<ConfirmResult> => {\n const { status, data } = await post<{ status: string; completed?: boolean }>(\n `${runBase(id)}/batches/${index}/confirm`,\n );\n return { pending: status === 202, status: data.status, completed: data.completed };\n },\n\n confirmCollection: async (id: string): Promise<ConfirmResult> => {\n const { status, data } = await post<{ status: string }>(`${runBase(id)}/collection/confirm`);\n return { pending: status === 202, status: data.status };\n },\n };\n}\n\nexport type LaunchpadRunsClient = ReturnType<typeof createLaunchpadRunsClient>;\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\";\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 service?: string;\n sort?: string;\n creator?: 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 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 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 status?: string;\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 status: string;\n creditBalance: number;\n}\n\nexport interface ApiPortalKey {\n id: string;\n prefix: string;\n label: string | null;\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 ApiFundingMethod {\n id: string;\n [detail: string]: unknown;\n}\n\nexport type ApiFundingStatus = \"PENDING\" | \"SETTLED\" | \"FAILED\" | \"EXPIRED\";\n\nexport interface ApiFundingIntent {\n id: string;\n method: string;\n status: ApiFundingStatus;\n expiresAt: string;\n payer?: string | null;\n}\n\nexport interface ApiFundingInstructions {\n chain: string;\n payTo: string;\n asset: string;\n amountAtomic: string;\n}\n\nexport type ApiFundingSubmit =\n | { status: \"SETTLED\"; credited?: number }\n | { status: \"PENDING\"; reason: string };\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 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 ApiChain = \"STARKNET\" | \"ETHEREUM\" | \"SOLANA\" | \"BASE\" | \"BITCOIN\";\n\nexport interface ApiSession {\n accountId: string;\n publicId: string;\n walletAddress: string | null;\n email: string | null;\n emailDeadline: string | null;\n}\n\nexport interface ApiUserWallet {\n walletAddress: string;\n email?: string | null;\n emailDeadline?: string | null;\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 chain: string;\n walletAddress: string;\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 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 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\nexport interface ApiPlatformStats {\n collections: number;\n tokens: number;\n sales: number;\n}\n\nexport interface ApiDropInfo {\n contractAddress: string;\n name: string | null;\n symbol: string | null;\n description: string | null;\n image: string | null;\n owner: string | null;\n totalMinted: number;\n}\n\nexport interface ApiDropConditions {\n maxSupply: string;\n price: string;\n paymentToken: string;\n startTime: number;\n endTime: number;\n maxPerWallet: string;\n}\n\nexport interface ApiDropState {\n conditions: ApiDropConditions;\n totalMinted: number;\n maxSupply: number;\n allowlistEnabled: boolean;\n paused: boolean;\n}\n\nexport interface ApiTierOnchain {\n maxSupply: string;\n minted: string;\n startTime: number | null;\n endTime: number | null;\n royaltyBps: number;\n}\n\nexport interface ApiIpNftTokenData {\n owner: string;\n metadataUri: string;\n originalCreator: string;\n registeredAt: number;\n}\n\nexport interface ApiTokensQuery {\n page?: number;\n limit?: number;\n sort?: string;\n ipType?: string;\n derivatives?: \"allowed\";\n}\n\nexport interface ApiUsernameClaim {\n id: string;\n username: string;\n walletAddress: string;\n status: \"PENDING\" | \"APPROVED\" | \"REJECTED\";\n adminNotes: string | null;\n reviewedAt: string | null;\n createdAt: string;\n}\n\nexport type ApiReportTargetType = \"COLLECTION\" | \"TOKEN\" | \"CREATOR\" | \"COMMENT\";\n\nexport interface ApiSubmitReport {\n targetType: ApiReportTargetType;\n targetContract?: string;\n targetTokenId?: string;\n targetAddress?: string;\n targetId?: string;\n categories: string[];\n description?: string;\n}\n\nexport interface ApiSponsorshipOffer {\n id: string;\n chain: string;\n contractAddress: string;\n offerId: string;\n author: string;\n nftContract: string;\n tokenId: string;\n minAmount: string;\n duration: number;\n paymentToken: string;\n licenseTermsUri: string;\n transferable: boolean;\n royaltyBps: number;\n specificSponsor: string | null;\n open: boolean;\n createdAtChain: string;\n updatedAt: string;\n}\n\nexport interface ApiSponsorshipBid {\n id: string;\n chain: string;\n contractAddress: string;\n offerId: string;\n sponsor: string;\n amount: string;\n placedAtChain: string;\n updatedAt: string;\n}\n\nexport interface ApiSponsorshipProposal {\n id: string;\n chain: string;\n contractAddress: string;\n proposalId: string;\n proposer: string;\n nftContract: string;\n tokenId: string;\n amount: string;\n duration: number;\n validUntil: string | null;\n paymentToken: string;\n licenseTermsUri: string;\n transferable: boolean;\n royaltyBps: number;\n open: boolean;\n accepted: boolean | null;\n createdAtChain: string;\n closedAtChain: string | null;\n updatedAt: string;\n}\n\nexport interface ApiSponsorshipLicense {\n id: string;\n chain: string;\n contractAddress: string;\n tokenId: string;\n author: string;\n recipient: string;\n assetContract: string;\n assetTokenId: string;\n expiresAt: string;\n transferable: boolean;\n royaltyBps: number;\n licenseTermsUri: string;\n offerId: string | null;\n proposalId: string | null;\n mintedAtChain: string;\n currentHolder?: string | null;\n}\n\nexport interface ApiSponsorshipOffersQuery {\n limit?: number;\n nftContract?: string;\n author?: string;\n owner?: string;\n open?: boolean;\n}\n\nexport interface ApiSponsorshipProposalsQuery {\n limit?: number;\n nftContract?: string;\n proposer?: string;\n owner?: string;\n open?: boolean;\n}\n\nexport interface ApiSponsorshipLicensesQuery {\n limit?: number;\n holder?: string;\n author?: string;\n}\n\nexport interface ApiCollectionsListQuery {\n page?: number;\n limit?: number;\n owner?: string;\n service?: string;\n sort?: CollectionSort;\n isFeatured?: boolean;\n hideEmpty?: boolean;\n standard?: string;\n chain?: ChainFilter;\n}\n\nexport interface ApiPricingRule {\n actionKey: string;\n chain: string;\n service: string;\n credits: number;\n}\n\nexport interface ApiPricing {\n creditsPerUsdc: number;\n mdln?: { contract: string | null; tiers: { minWholeTokens: number; multiplier: number }[] };\n pricing: { default: number; rules: ApiPricingRule[] };\n}\n\nexport interface CreateTransferTokenIntentParams {\n owner: string;\n token: string;\n recipient: string;\n amount: string;\n}\n\nexport interface CreateTransferNftIntentParams {\n owner: string;\n contractAddress: string;\n tokenId: string;\n recipient: string;\n tokenStandard: \"ERC721\" | \"ERC1155\";\n}\n\nexport interface CreateTransferCollectionOwnershipIntentParams {\n owner: string;\n collectionId: string;\n newOwner: string;\n}\n\nexport interface CreateCommentIntentParams {\n author: string;\n nftContract: string;\n tokenId: string;\n text: string;\n}\n\nexport interface CreateGenesisMintIntentParams {\n owner: string;\n recipient: string;\n}\n\nexport interface CreatePopClaimIntentParams {\n claimer: string;\n collection: string;\n proof: string[];\n}\n\nexport interface CreatePopBurnIntentParams {\n owner: string;\n collection: string;\n tokenId: string;\n}\n\nexport interface CreateDropClaimIntentParams {\n claimer: string;\n collection: string;\n}\n\nexport interface CreateDropAllowlistIntentParams {\n owner: string;\n collection: string;\n addresses: string[];\n}\n\nexport type WalletManageAction = \"add_owner\" | \"remove_owner\" | \"cancel_escape\" | \"set_first_guardian\" | \"trigger_escape\" | \"complete_escape\";\n\nexport interface CreateWalletManageIntentParams {\n owner: string;\n action: WalletManageAction;\n pubkey?: string;\n ownerGuid?: string;\n newOwnerPubkey?: string;\n}\n\nexport interface CreateSwapIntentParams {\n taker: string;\n sellTokenAddress: string;\n buyTokenAddress: string;\n sellAmountRaw?: string;\n buyAmountRaw?: string;\n}\n\nexport interface CreateFundingTransferIntentParams {\n owner: string;\n asset: string;\n amountAtomic: string;\n}\n\nexport type DropManageAction = \"allowlist_enabled\" | \"allowlist_add\" | \"allowlist_remove\" | \"withdraw_payments\";\n\nexport interface CreateDropManageIntentParams {\n owner: string;\n collection: string;\n action: DropManageAction;\n enabled?: boolean;\n addresses?: string[];\n address?: string;\n}\n\nexport type PopManageAction = \"issue\" | \"set_allowlist_root\";\n\nexport interface CreatePopManageIntentParams {\n owner: string;\n collection: string;\n action: PopManageAction;\n recipient?: string;\n tokenUri?: string;\n root?: string;\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 { 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 fetchImpl?: typeof fetch;\n\n forwardCookie?: { name: string; header: string };\n forwardAuthorization?: boolean;\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.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 if (config.forwardAuthorization) {\n const authorization = req.headers.get(\"authorization\");\n if (authorization) headers.authorization = authorization;\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 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 if (bytes.slice(0, 12).every((b) => b === 0)) return isPrivateIpv4(bytes.slice(12));\n if (bytes[0] === 0x00 && bytes[1] === 0x64 && bytes[2] === 0xff && bytes[3] === 0x9b && bytes.slice(4, 12).every((b) => b === 0)) {\n return isPrivateIpv4(bytes.slice(12));\n }\n if (bytes[0] === 0x20 && bytes[1] === 0x02) return isPrivateIpv4(bytes.slice(2, 6));\n if (bytes[0] === 0xfe && (bytes[1]! & 0xc0) === 0xc0) return true;\n if (bytes[0] === 0xff) return true;\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\") || host.endsWith(\".localhost\")) 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 {\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\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 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, payload: string): string {\n return toHex(hmac(sha256, encoder.encode(secret), encoder.encode(`${domain}.${payload}`)));\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 constantTimeEquals(provided, sign(secret, domain, payload));\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"]}
package/dist/index.d.cts CHANGED
@@ -1,7 +1,7 @@
1
- import { R as ResolvedFeeConfig, S as ServiceDefinition, a as ServiceCapability } from './errors-GcSzVvZL.cjs';
2
- export { A as AcceptSponsorshipBidIntentParams, b as AcceptSponsorshipProposalIntentParams, c as ActivityType, d as ApiActivitiesQuery, e as ApiActivity, f as ApiActivityPrice, g as ApiAdminCollectionClaim, h as ApiBusinessProvisioning, i as ApiChain, j as ApiCheckoutIntentResult, k as ApiClient, l as ApiCoin, m as ApiCoinClaimResult, n as ApiCoinPrice, o as ApiCoinPrices, p as ApiCoinsQuery, q as ApiCollection, r as ApiCollectionClaim, s as ApiCollectionProfile, t as ApiCollectionSlugClaim, u as ApiCollectionsListQuery, v as ApiCollectionsQuery, w as ApiComment, x as ApiCounterOffersQuery, y as ApiCreatorListResult, z as ApiCreatorProfile, B as ApiCreditPayment, C as ApiDropConditions, D as ApiDropInfo, E as ApiDropState, F as ApiEmissionCall, G as ApiEmissionResult, H as ApiFundingInstructions, I as ApiFundingIntent, J as ApiFundingMethod, K as ApiFundingStatus, L as ApiFundingSubmit, M as ApiIntent, N as ApiIntentCreated, O as ApiIpNftTokenData, P as ApiMeta, Q as ApiMetadataSignedUrl, T as ApiMetadataUpload, U as ApiOrder, V as ApiOrderConsideration, W as ApiOrderOffer, X as ApiOrderPrice, Y as ApiOrderTokenMeta, Z as ApiOrderTxHash, _ as ApiOrdersQuery, $ as ApiPlatformStats, a0 as ApiPointEvent, a1 as ApiPortalKey, a2 as ApiPortalKeyCreated, a3 as ApiPortalMe, a4 as ApiPortalSpend, a5 as ApiPricing, a6 as ApiPricingRule, a7 as ApiPublicRemix, a8 as ApiRemixOffer, a9 as ApiRemixOfferPrice, aa as ApiRemixOffersQuery, ab as ApiReportTargetType, ac as ApiResponse, ad as ApiRewardsBadge, ae as ApiRewardsBatchEntry, af as ApiRewardsConfig, ag as ApiRewardsLeaderboardEntry, ah as ApiRewardsLevel, ai as ApiSearchCollectionResult, aj as ApiSearchCreatorResult, ak as ApiSearchResult, al as ApiSearchTokenResult, am as ApiSession, an as ApiSpendByAction, ao as ApiSponsorshipBid, ap as ApiSponsorshipLicense, aq as ApiSponsorshipLicensesQuery, ar as ApiSponsorshipOffer, as as ApiSponsorshipOffersQuery, at as ApiSponsorshipProposal, au as ApiSponsorshipProposalsQuery, av as ApiSubmitReport, aw as ApiTierOnchain, ax as ApiToken, ay as ApiTokenBalance, az as ApiTokenMetadata, aA as ApiTokensQuery, aB as ApiTxSyncResult, aC as ApiUserRewards, aD as ApiUserWallet, aE as ApiUsernameClaim, aF as ApiWalletActivity, aG as AutoRemixOfferParams, aH as CancelOrderIntentParams, aI as ChainFilter, aJ as CheckoutIntentItem, aK as ClaimConditions, aL as CollectionServiceId, aM as CollectionSort, aN as CollectionTokensSort, aO as ConfirmRemixOfferParams, aP as ConfirmSelfRemixParams, aQ as ConsiderationItem, aR as CreateCheckoutIntentParams, aS as CreateCoinIntentParams, aT as CreateCollectionIntentParams, aU as CreateCounterOfferIntentParams, aV as CreateDropParams, aW as CreateListingIntentParams, aX as CreateMembershipParams, aY as CreateMintIntentParams, aZ as CreatePopCollectionParams, a_ as CreateRemixOfferParams, a$ as CreateSponsorshipOfferIntentParams, b0 as CreateSponsorshipOfferParams, b1 as CreateSponsorshipProposalIntentParams, b2 as CreateTicketParams, b3 as CreateTierIntentParams, b4 as DropMintStatus, b5 as EmissionParams, b6 as EnforcementDeclaration, b7 as FactoryFamilyServiceId, b8 as FeeConfig, b9 as FeeConfigSchema, ba as FulfillOrderIntentParams, bb as IPType, bc as IntentCall, bd as IntentStatus, be as IntentType, bf as IpAttribute, bg as IpNftMetadata, bh as LaunchCoinIntentParams, bi as MakeOfferIntentParams, bj as MedialaneApiError, bk as MedialaneConfig, bl as MedialaneErrorCode, bm as MintMembershipsParams, bn as MintTicketsParams, bo as OPEN_LICENSES, bp as OfferItem, bq as OpenLicense, br as Order, bs as OrderDetails, bt as OrderParameters, bu as OrderStatus, bv as PasskeyCancelledError, bw as PasskeyUnsupportedError, bx as PasskeyUnsupportedReason, by as PlaceSponsorshipBidIntentParams, bz as ProposeSponsorshipParams, bA as RejectSponsorshipProposalIntentParams, bB as RemixOfferStatus, bC as ResolvedConfig, bD as RetractSponsorshipBidIntentParams, bE as RetryOptions, bF as ServiceEventDeclaration, bG as SetSponsorshipOfferOpenIntentParams, bH as SortOrder, bI as TierServiceId, bJ as TxResult, bK as UpdateCollectionProfileInput, bL as UserFacingError, bM as WithdrawSponsorshipProposalIntentParams, bN as resolveConfig, bO as resolveFeeConfig } from './errors-GcSzVvZL.cjs';
3
- import { C as Chain } from './types-PPshMWr7.cjs';
4
- export { A as AdapterTxResult, a as AssetRef, b as CHAINS, c as ChainCoordinates, d as CoordinatesByChain, e as CreateCollectionInput, D as DEFAULT_CHAIN, E as EvmCoordinates, I as IssuanceAdapter, M as MintInput, O as OrderRef, R as RegisterOrderParams, S as SolanaCoordinates, f as StarknetCoordinates, g as StellarCoordinates, V as VenueAdapter, h as getCoordinates, i as getStarknetCoordinates } from './types-PPshMWr7.cjs';
1
+ import { R as ResolvedFeeConfig, S as ServiceDefinition, a as ServiceCapability } from './errors-CwqwX-vA.cjs';
2
+ export { A as AcceptSponsorshipBidIntentParams, b as AcceptSponsorshipProposalIntentParams, c as ActivityType, d as ApiActivitiesQuery, e as ApiActivity, f as ApiActivityPrice, g as ApiAdminCollectionClaim, h as ApiBusinessProvisioning, i as ApiChain, j as ApiCheckoutIntentResult, k as ApiClient, l as ApiCoin, m as ApiCoinClaimResult, n as ApiCoinPrice, o as ApiCoinPrices, p as ApiCoinsQuery, q as ApiCollection, r as ApiCollectionClaim, s as ApiCollectionProfile, t as ApiCollectionSlugClaim, u as ApiCollectionsListQuery, v as ApiCollectionsQuery, w as ApiComment, x as ApiCounterOffersQuery, y as ApiCreatorListResult, z as ApiCreatorProfile, B as ApiCreditPayment, C as ApiDropConditions, D as ApiDropInfo, E as ApiDropState, F as ApiEmissionCall, G as ApiEmissionResult, H as ApiFundingInstructions, I as ApiFundingIntent, J as ApiFundingMethod, K as ApiFundingStatus, L as ApiFundingSubmit, M as ApiIntent, N as ApiIntentCreated, O as ApiIpNftTokenData, P as ApiMeta, Q as ApiMetadataSignedUrl, T as ApiMetadataUpload, U as ApiOrder, V as ApiOrderConsideration, W as ApiOrderOffer, X as ApiOrderPrice, Y as ApiOrderTokenMeta, Z as ApiOrderTxHash, _ as ApiOrdersQuery, $ as ApiPlatformStats, a0 as ApiPointEvent, a1 as ApiPortalKey, a2 as ApiPortalKeyCreated, a3 as ApiPortalMe, a4 as ApiPortalSpend, a5 as ApiPricing, a6 as ApiPricingRule, a7 as ApiPublicRemix, a8 as ApiRemixOffer, a9 as ApiRemixOfferPrice, aa as ApiRemixOffersQuery, ab as ApiReportTargetType, ac as ApiResponse, ad as ApiRewardsBadge, ae as ApiRewardsBatchEntry, af as ApiRewardsConfig, ag as ApiRewardsLeaderboardEntry, ah as ApiRewardsLevel, ai as ApiSearchCollectionResult, aj as ApiSearchCreatorResult, ak as ApiSearchResult, al as ApiSearchTokenResult, am as ApiSession, an as ApiSpendByAction, ao as ApiSponsorshipBid, ap as ApiSponsorshipLicense, aq as ApiSponsorshipLicensesQuery, ar as ApiSponsorshipOffer, as as ApiSponsorshipOffersQuery, at as ApiSponsorshipProposal, au as ApiSponsorshipProposalsQuery, av as ApiSubmitReport, aw as ApiTierOnchain, ax as ApiToken, ay as ApiTokenBalance, az as ApiTokenMetadata, aA as ApiTokensQuery, aB as ApiTxSyncResult, aC as ApiUserRewards, aD as ApiUserWallet, aE as ApiUsernameClaim, aF as ApiWalletActivity, aG as AutoRemixOfferParams, aH as CancelOrderIntentParams, aI as ChainFilter, aJ as CheckoutIntentItem, aK as ClaimConditions, aL as CollectionServiceId, aM as CollectionSort, aN as CollectionTokensSort, aO as ConfirmRemixOfferParams, aP as ConfirmSelfRemixParams, aQ as ConsiderationItem, aR as CreateCheckoutIntentParams, aS as CreateCoinIntentParams, aT as CreateCollectionIntentParams, aU as CreateCommentIntentParams, aV as CreateCounterOfferIntentParams, aW as CreateDropAllowlistIntentParams, aX as CreateDropClaimIntentParams, aY as CreateDropManageIntentParams, aZ as CreateDropParams, a_ as CreateFundingTransferIntentParams, a$ as CreateGenesisMintIntentParams, b0 as CreateListingIntentParams, b1 as CreateMembershipParams, b2 as CreateMintIntentParams, b3 as CreatePopBurnIntentParams, b4 as CreatePopClaimIntentParams, b5 as CreatePopCollectionParams, b6 as CreatePopManageIntentParams, b7 as CreateRemixOfferParams, b8 as CreateSponsorshipOfferIntentParams, b9 as CreateSponsorshipOfferParams, ba as CreateSponsorshipProposalIntentParams, bb as CreateSwapIntentParams, bc as CreateTicketParams, bd as CreateTierIntentParams, be as CreateTransferCollectionOwnershipIntentParams, bf as CreateTransferNftIntentParams, bg as CreateTransferTokenIntentParams, bh as CreateWalletManageIntentParams, bi as DropManageAction, bj as DropMintStatus, bk as EmissionParams, bl as EnforcementDeclaration, bm as FactoryFamilyServiceId, bn as FeeConfig, bo as FeeConfigSchema, bp as FulfillOrderIntentParams, bq as IPType, br as IntentCall, bs as IntentStatus, bt as IntentType, bu as IpAttribute, bv as IpNftMetadata, bw as LaunchCoinIntentParams, bx as MakeOfferIntentParams, by as MedialaneApiError, bz as MedialaneConfig, bA as MedialaneErrorCode, bB as MintMembershipsParams, bC as MintTicketsParams, bD as OPEN_LICENSES, bE as OfferItem, bF as OpenLicense, bG as Order, bH as OrderDetails, bI as OrderParameters, bJ as OrderStatus, bK as PasskeyCancelledError, bL as PasskeyUnsupportedError, bM as PasskeyUnsupportedReason, bN as PlaceSponsorshipBidIntentParams, bO as PopManageAction, bP as ProposeSponsorshipParams, bQ as RejectSponsorshipProposalIntentParams, bR as RemixOfferStatus, bS as ResolvedConfig, bT as RetractSponsorshipBidIntentParams, bU as RetryOptions, bV as ServiceEventDeclaration, bW as SetSponsorshipOfferOpenIntentParams, bX as SortOrder, bY as TierServiceId, bZ as TxResult, b_ as UpdateCollectionProfileInput, b$ as UserFacingError, c0 as WalletManageAction, c1 as WithdrawSponsorshipProposalIntentParams, c2 as resolveConfig, c3 as resolveFeeConfig } from './errors-CwqwX-vA.cjs';
3
+ import { C as Chain } from './types-C-y68Ut2.cjs';
4
+ export { A as AdapterTxResult, a as AssetRef, b as CHAINS, c as ChainCoordinates, d as CoordinatesByChain, e as CreateCollectionInput, D as DEFAULT_CHAIN, E as EvmCoordinates, I as IssuanceAdapter, M as MintInput, O as OrderRef, R as RegisterOrderParams, S as SolanaCoordinates, f as StarknetCoordinates, g as StellarCoordinates, V as VenueAdapter, h as getCoordinates, i as getStarknetCoordinates } from './types-C-y68Ut2.cjs';
5
5
  import 'zod';
6
6
  import 'starknet';
7
7
 
@@ -700,6 +700,7 @@ interface BackendProxyConfig {
700
700
  name: string;
701
701
  header: string;
702
702
  };
703
+ forwardAuthorization?: boolean;
703
704
  }
704
705
  declare function createBackendProxyHandler(config: BackendProxyConfig): (req: Request) => Promise<Response>;
705
706
 
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { R as ResolvedFeeConfig, S as ServiceDefinition, a as ServiceCapability } from './errors-DRiTDrwm.js';
2
- export { A as AcceptSponsorshipBidIntentParams, b as AcceptSponsorshipProposalIntentParams, c as ActivityType, d as ApiActivitiesQuery, e as ApiActivity, f as ApiActivityPrice, g as ApiAdminCollectionClaim, h as ApiBusinessProvisioning, i as ApiChain, j as ApiCheckoutIntentResult, k as ApiClient, l as ApiCoin, m as ApiCoinClaimResult, n as ApiCoinPrice, o as ApiCoinPrices, p as ApiCoinsQuery, q as ApiCollection, r as ApiCollectionClaim, s as ApiCollectionProfile, t as ApiCollectionSlugClaim, u as ApiCollectionsListQuery, v as ApiCollectionsQuery, w as ApiComment, x as ApiCounterOffersQuery, y as ApiCreatorListResult, z as ApiCreatorProfile, B as ApiCreditPayment, C as ApiDropConditions, D as ApiDropInfo, E as ApiDropState, F as ApiEmissionCall, G as ApiEmissionResult, H as ApiFundingInstructions, I as ApiFundingIntent, J as ApiFundingMethod, K as ApiFundingStatus, L as ApiFundingSubmit, M as ApiIntent, N as ApiIntentCreated, O as ApiIpNftTokenData, P as ApiMeta, Q as ApiMetadataSignedUrl, T as ApiMetadataUpload, U as ApiOrder, V as ApiOrderConsideration, W as ApiOrderOffer, X as ApiOrderPrice, Y as ApiOrderTokenMeta, Z as ApiOrderTxHash, _ as ApiOrdersQuery, $ as ApiPlatformStats, a0 as ApiPointEvent, a1 as ApiPortalKey, a2 as ApiPortalKeyCreated, a3 as ApiPortalMe, a4 as ApiPortalSpend, a5 as ApiPricing, a6 as ApiPricingRule, a7 as ApiPublicRemix, a8 as ApiRemixOffer, a9 as ApiRemixOfferPrice, aa as ApiRemixOffersQuery, ab as ApiReportTargetType, ac as ApiResponse, ad as ApiRewardsBadge, ae as ApiRewardsBatchEntry, af as ApiRewardsConfig, ag as ApiRewardsLeaderboardEntry, ah as ApiRewardsLevel, ai as ApiSearchCollectionResult, aj as ApiSearchCreatorResult, ak as ApiSearchResult, al as ApiSearchTokenResult, am as ApiSession, an as ApiSpendByAction, ao as ApiSponsorshipBid, ap as ApiSponsorshipLicense, aq as ApiSponsorshipLicensesQuery, ar as ApiSponsorshipOffer, as as ApiSponsorshipOffersQuery, at as ApiSponsorshipProposal, au as ApiSponsorshipProposalsQuery, av as ApiSubmitReport, aw as ApiTierOnchain, ax as ApiToken, ay as ApiTokenBalance, az as ApiTokenMetadata, aA as ApiTokensQuery, aB as ApiTxSyncResult, aC as ApiUserRewards, aD as ApiUserWallet, aE as ApiUsernameClaim, aF as ApiWalletActivity, aG as AutoRemixOfferParams, aH as CancelOrderIntentParams, aI as ChainFilter, aJ as CheckoutIntentItem, aK as ClaimConditions, aL as CollectionServiceId, aM as CollectionSort, aN as CollectionTokensSort, aO as ConfirmRemixOfferParams, aP as ConfirmSelfRemixParams, aQ as ConsiderationItem, aR as CreateCheckoutIntentParams, aS as CreateCoinIntentParams, aT as CreateCollectionIntentParams, aU as CreateCounterOfferIntentParams, aV as CreateDropParams, aW as CreateListingIntentParams, aX as CreateMembershipParams, aY as CreateMintIntentParams, aZ as CreatePopCollectionParams, a_ as CreateRemixOfferParams, a$ as CreateSponsorshipOfferIntentParams, b0 as CreateSponsorshipOfferParams, b1 as CreateSponsorshipProposalIntentParams, b2 as CreateTicketParams, b3 as CreateTierIntentParams, b4 as DropMintStatus, b5 as EmissionParams, b6 as EnforcementDeclaration, b7 as FactoryFamilyServiceId, b8 as FeeConfig, b9 as FeeConfigSchema, ba as FulfillOrderIntentParams, bb as IPType, bc as IntentCall, bd as IntentStatus, be as IntentType, bf as IpAttribute, bg as IpNftMetadata, bh as LaunchCoinIntentParams, bi as MakeOfferIntentParams, bj as MedialaneApiError, bk as MedialaneConfig, bl as MedialaneErrorCode, bm as MintMembershipsParams, bn as MintTicketsParams, bo as OPEN_LICENSES, bp as OfferItem, bq as OpenLicense, br as Order, bs as OrderDetails, bt as OrderParameters, bu as OrderStatus, bv as PasskeyCancelledError, bw as PasskeyUnsupportedError, bx as PasskeyUnsupportedReason, by as PlaceSponsorshipBidIntentParams, bz as ProposeSponsorshipParams, bA as RejectSponsorshipProposalIntentParams, bB as RemixOfferStatus, bC as ResolvedConfig, bD as RetractSponsorshipBidIntentParams, bE as RetryOptions, bF as ServiceEventDeclaration, bG as SetSponsorshipOfferOpenIntentParams, bH as SortOrder, bI as TierServiceId, bJ as TxResult, bK as UpdateCollectionProfileInput, bL as UserFacingError, bM as WithdrawSponsorshipProposalIntentParams, bN as resolveConfig, bO as resolveFeeConfig } from './errors-DRiTDrwm.js';
3
- import { C as Chain } from './types-PPshMWr7.js';
4
- export { A as AdapterTxResult, a as AssetRef, b as CHAINS, c as ChainCoordinates, d as CoordinatesByChain, e as CreateCollectionInput, D as DEFAULT_CHAIN, E as EvmCoordinates, I as IssuanceAdapter, M as MintInput, O as OrderRef, R as RegisterOrderParams, S as SolanaCoordinates, f as StarknetCoordinates, g as StellarCoordinates, V as VenueAdapter, h as getCoordinates, i as getStarknetCoordinates } from './types-PPshMWr7.js';
1
+ import { R as ResolvedFeeConfig, S as ServiceDefinition, a as ServiceCapability } from './errors-CWbsAodQ.js';
2
+ export { A as AcceptSponsorshipBidIntentParams, b as AcceptSponsorshipProposalIntentParams, c as ActivityType, d as ApiActivitiesQuery, e as ApiActivity, f as ApiActivityPrice, g as ApiAdminCollectionClaim, h as ApiBusinessProvisioning, i as ApiChain, j as ApiCheckoutIntentResult, k as ApiClient, l as ApiCoin, m as ApiCoinClaimResult, n as ApiCoinPrice, o as ApiCoinPrices, p as ApiCoinsQuery, q as ApiCollection, r as ApiCollectionClaim, s as ApiCollectionProfile, t as ApiCollectionSlugClaim, u as ApiCollectionsListQuery, v as ApiCollectionsQuery, w as ApiComment, x as ApiCounterOffersQuery, y as ApiCreatorListResult, z as ApiCreatorProfile, B as ApiCreditPayment, C as ApiDropConditions, D as ApiDropInfo, E as ApiDropState, F as ApiEmissionCall, G as ApiEmissionResult, H as ApiFundingInstructions, I as ApiFundingIntent, J as ApiFundingMethod, K as ApiFundingStatus, L as ApiFundingSubmit, M as ApiIntent, N as ApiIntentCreated, O as ApiIpNftTokenData, P as ApiMeta, Q as ApiMetadataSignedUrl, T as ApiMetadataUpload, U as ApiOrder, V as ApiOrderConsideration, W as ApiOrderOffer, X as ApiOrderPrice, Y as ApiOrderTokenMeta, Z as ApiOrderTxHash, _ as ApiOrdersQuery, $ as ApiPlatformStats, a0 as ApiPointEvent, a1 as ApiPortalKey, a2 as ApiPortalKeyCreated, a3 as ApiPortalMe, a4 as ApiPortalSpend, a5 as ApiPricing, a6 as ApiPricingRule, a7 as ApiPublicRemix, a8 as ApiRemixOffer, a9 as ApiRemixOfferPrice, aa as ApiRemixOffersQuery, ab as ApiReportTargetType, ac as ApiResponse, ad as ApiRewardsBadge, ae as ApiRewardsBatchEntry, af as ApiRewardsConfig, ag as ApiRewardsLeaderboardEntry, ah as ApiRewardsLevel, ai as ApiSearchCollectionResult, aj as ApiSearchCreatorResult, ak as ApiSearchResult, al as ApiSearchTokenResult, am as ApiSession, an as ApiSpendByAction, ao as ApiSponsorshipBid, ap as ApiSponsorshipLicense, aq as ApiSponsorshipLicensesQuery, ar as ApiSponsorshipOffer, as as ApiSponsorshipOffersQuery, at as ApiSponsorshipProposal, au as ApiSponsorshipProposalsQuery, av as ApiSubmitReport, aw as ApiTierOnchain, ax as ApiToken, ay as ApiTokenBalance, az as ApiTokenMetadata, aA as ApiTokensQuery, aB as ApiTxSyncResult, aC as ApiUserRewards, aD as ApiUserWallet, aE as ApiUsernameClaim, aF as ApiWalletActivity, aG as AutoRemixOfferParams, aH as CancelOrderIntentParams, aI as ChainFilter, aJ as CheckoutIntentItem, aK as ClaimConditions, aL as CollectionServiceId, aM as CollectionSort, aN as CollectionTokensSort, aO as ConfirmRemixOfferParams, aP as ConfirmSelfRemixParams, aQ as ConsiderationItem, aR as CreateCheckoutIntentParams, aS as CreateCoinIntentParams, aT as CreateCollectionIntentParams, aU as CreateCommentIntentParams, aV as CreateCounterOfferIntentParams, aW as CreateDropAllowlistIntentParams, aX as CreateDropClaimIntentParams, aY as CreateDropManageIntentParams, aZ as CreateDropParams, a_ as CreateFundingTransferIntentParams, a$ as CreateGenesisMintIntentParams, b0 as CreateListingIntentParams, b1 as CreateMembershipParams, b2 as CreateMintIntentParams, b3 as CreatePopBurnIntentParams, b4 as CreatePopClaimIntentParams, b5 as CreatePopCollectionParams, b6 as CreatePopManageIntentParams, b7 as CreateRemixOfferParams, b8 as CreateSponsorshipOfferIntentParams, b9 as CreateSponsorshipOfferParams, ba as CreateSponsorshipProposalIntentParams, bb as CreateSwapIntentParams, bc as CreateTicketParams, bd as CreateTierIntentParams, be as CreateTransferCollectionOwnershipIntentParams, bf as CreateTransferNftIntentParams, bg as CreateTransferTokenIntentParams, bh as CreateWalletManageIntentParams, bi as DropManageAction, bj as DropMintStatus, bk as EmissionParams, bl as EnforcementDeclaration, bm as FactoryFamilyServiceId, bn as FeeConfig, bo as FeeConfigSchema, bp as FulfillOrderIntentParams, bq as IPType, br as IntentCall, bs as IntentStatus, bt as IntentType, bu as IpAttribute, bv as IpNftMetadata, bw as LaunchCoinIntentParams, bx as MakeOfferIntentParams, by as MedialaneApiError, bz as MedialaneConfig, bA as MedialaneErrorCode, bB as MintMembershipsParams, bC as MintTicketsParams, bD as OPEN_LICENSES, bE as OfferItem, bF as OpenLicense, bG as Order, bH as OrderDetails, bI as OrderParameters, bJ as OrderStatus, bK as PasskeyCancelledError, bL as PasskeyUnsupportedError, bM as PasskeyUnsupportedReason, bN as PlaceSponsorshipBidIntentParams, bO as PopManageAction, bP as ProposeSponsorshipParams, bQ as RejectSponsorshipProposalIntentParams, bR as RemixOfferStatus, bS as ResolvedConfig, bT as RetractSponsorshipBidIntentParams, bU as RetryOptions, bV as ServiceEventDeclaration, bW as SetSponsorshipOfferOpenIntentParams, bX as SortOrder, bY as TierServiceId, bZ as TxResult, b_ as UpdateCollectionProfileInput, b$ as UserFacingError, c0 as WalletManageAction, c1 as WithdrawSponsorshipProposalIntentParams, c2 as resolveConfig, c3 as resolveFeeConfig } from './errors-CWbsAodQ.js';
3
+ import { C as Chain } from './types-C-y68Ut2.js';
4
+ export { A as AdapterTxResult, a as AssetRef, b as CHAINS, c as ChainCoordinates, d as CoordinatesByChain, e as CreateCollectionInput, D as DEFAULT_CHAIN, E as EvmCoordinates, I as IssuanceAdapter, M as MintInput, O as OrderRef, R as RegisterOrderParams, S as SolanaCoordinates, f as StarknetCoordinates, g as StellarCoordinates, V as VenueAdapter, h as getCoordinates, i as getStarknetCoordinates } from './types-C-y68Ut2.js';
5
5
  import 'zod';
6
6
  import 'starknet';
7
7
 
@@ -700,6 +700,7 @@ interface BackendProxyConfig {
700
700
  name: string;
701
701
  header: string;
702
702
  };
703
+ forwardAuthorization?: boolean;
703
704
  }
704
705
  declare function createBackendProxyHandler(config: BackendProxyConfig): (req: Request) => Promise<Response>;
705
706
 
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export { ApiClient, DEFAULT_CURRENCY, FeeConfigSchema, MedialaneApiError, POLICY_REFUSAL_CODES, PasskeyCancelledError, PasskeyUnsupportedError, STARKNET_COLLECTION_1155_CLASS_HASH, STARKNET_COLLECTION_1155_CONTRACT, STARKNET_COLLECTION_1155_FACTORY_CLASS_HASH, STARKNET_COLLECTION_1155_START_BLOCK, STARKNET_COLLECTION_721_CONTRACT, STARKNET_COLLECTION_721_START_BLOCK, STARKNET_CREATOR_COIN_CLASS_HASH, STARKNET_CREATOR_COIN_EKUBO_LAUNCHER, STARKNET_CREATOR_COIN_FACTORY_CLASS_HASH, STARKNET_CREATOR_COIN_FACTORY_CONTRACT, STARKNET_CREATOR_COIN_START_BLOCK, STARKNET_DATA_TOKENIZATION_721_CONTRACT, STARKNET_DROP_COLLECTION_CLASS_HASH, STARKNET_DROP_FACTORY_CONTRACT, STARKNET_EKUBO_CORE, STARKNET_GENESIS_MINT_CONTRACT, STARKNET_GENESIS_NFT_URI, STARKNET_IPCOLLECTION_CLASS_HASH, STARKNET_IPNFT_CLASS_HASH, STARKNET_IP_CLUB_COLLECTION_CLASS_HASH, STARKNET_IP_CLUB_FACTORY_CONTRACT, STARKNET_IP_SPONSORSHIP_CLASS_HASH, STARKNET_IP_SPONSORSHIP_CONTRACT, STARKNET_IP_TICKETS_FACTORY_CONTRACT, STARKNET_IP_TICKET_COLLECTION_CLASS_HASH, STARKNET_MARKETPLACE_1155_CLASS_HASH, STARKNET_MARKETPLACE_1155_CONTRACT, STARKNET_MARKETPLACE_1155_START_BLOCK, STARKNET_MARKETPLACE_721_CLASS_HASH, STARKNET_MARKETPLACE_721_CONTRACT, STARKNET_MARKETPLACE_721_START_BLOCK, STARKNET_NFTCOMMENTS_CONTRACT, STARKNET_POP_COLLECTION_CLASS_HASH, STARKNET_POP_FACTORY_CONTRACT, STARKNET_POP_FACTORY_START_BLOCK, SUPPORTED_TOKENS, SUPPORTED_URL_CHAINS, UserFacingError, assetHref, chainFromSlug, chainSlug, coinHref, collectionHref, createFailoverFetch, encodeU256, formatAmount, getListableTokens, getService, getServicesByCapability, getTokenByAddress, getTokenBySymbol, hasCapability, isPolicyRefusal, isServiceId, isTransientRpcError, listServices, normalizeAddress, normalizeHash, parseAmount, resolveAppFeeConfig, resolveConfig, resolveFeeConfig, shortenAddress, stringifyBigInts, u256ToBigInt } from './chunk-USFXQO4T.js';
1
+ export { ApiClient, DEFAULT_CURRENCY, FeeConfigSchema, MedialaneApiError, POLICY_REFUSAL_CODES, PasskeyCancelledError, PasskeyUnsupportedError, STARKNET_COLLECTION_1155_CLASS_HASH, STARKNET_COLLECTION_1155_CONTRACT, STARKNET_COLLECTION_1155_FACTORY_CLASS_HASH, STARKNET_COLLECTION_1155_START_BLOCK, STARKNET_COLLECTION_721_CONTRACT, STARKNET_COLLECTION_721_START_BLOCK, STARKNET_CREATOR_COIN_CLASS_HASH, STARKNET_CREATOR_COIN_EKUBO_LAUNCHER, STARKNET_CREATOR_COIN_FACTORY_CLASS_HASH, STARKNET_CREATOR_COIN_FACTORY_CONTRACT, STARKNET_CREATOR_COIN_START_BLOCK, STARKNET_DATA_TOKENIZATION_721_CONTRACT, STARKNET_DROP_COLLECTION_CLASS_HASH, STARKNET_DROP_FACTORY_CONTRACT, STARKNET_EKUBO_CORE, STARKNET_GENESIS_MINT_CONTRACT, STARKNET_GENESIS_NFT_URI, STARKNET_IPCOLLECTION_CLASS_HASH, STARKNET_IPNFT_CLASS_HASH, STARKNET_IP_CLUB_COLLECTION_CLASS_HASH, STARKNET_IP_CLUB_FACTORY_CONTRACT, STARKNET_IP_SPONSORSHIP_CLASS_HASH, STARKNET_IP_SPONSORSHIP_CONTRACT, STARKNET_IP_TICKETS_FACTORY_CONTRACT, STARKNET_IP_TICKET_COLLECTION_CLASS_HASH, STARKNET_MARKETPLACE_1155_CLASS_HASH, STARKNET_MARKETPLACE_1155_CONTRACT, STARKNET_MARKETPLACE_1155_START_BLOCK, STARKNET_MARKETPLACE_721_CLASS_HASH, STARKNET_MARKETPLACE_721_CONTRACT, STARKNET_MARKETPLACE_721_START_BLOCK, STARKNET_NFTCOMMENTS_CONTRACT, STARKNET_POP_COLLECTION_CLASS_HASH, STARKNET_POP_FACTORY_CONTRACT, STARKNET_POP_FACTORY_START_BLOCK, SUPPORTED_TOKENS, SUPPORTED_URL_CHAINS, UserFacingError, assetHref, chainFromSlug, chainSlug, coinHref, collectionHref, createFailoverFetch, encodeU256, formatAmount, getListableTokens, getService, getServicesByCapability, getTokenByAddress, getTokenBySymbol, hasCapability, isPolicyRefusal, isServiceId, isTransientRpcError, listServices, normalizeAddress, normalizeHash, parseAmount, resolveAppFeeConfig, resolveConfig, resolveFeeConfig, shortenAddress, stringifyBigInts, u256ToBigInt } from './chunk-3QGECZBS.js';
2
2
  export { CHAINS, DEFAULT_CHAIN, getCoordinates, getStarknetCoordinates } from './chunk-PBJLHXDB.js';
3
3
  import { hmac } from '@noble/hashes/hmac.js';
4
4
  import { sha256 } from '@noble/hashes/sha2.js';
@@ -145,6 +145,10 @@ function createBackendProxyHandler(config) {
145
145
  const value = readCookie(req, config.forwardCookie.name);
146
146
  if (value) headers2[config.forwardCookie.header] = value;
147
147
  }
148
+ if (config.forwardAuthorization) {
149
+ const authorization = req.headers.get("authorization");
150
+ if (authorization) headers2.authorization = authorization;
151
+ }
148
152
  try {
149
153
  const upstream = await doFetch(endpoint2, {
150
154
  method: "POST",