@medialane/sdk 0.168.0 → 0.169.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.
Files changed (41) hide show
  1. package/dist/{chunk-BILJIXSP.cjs → chunk-4SZV7J2R.cjs} +17 -12
  2. package/dist/chunk-4SZV7J2R.cjs.map +1 -0
  3. package/dist/{chunk-H7I6TEOA.cjs → chunk-VJVBWHAD.cjs} +5 -4
  4. package/dist/chunk-VJVBWHAD.cjs.map +1 -0
  5. package/dist/{chunk-PBJLHXDB.js → chunk-WYKCGQPN.js} +5 -4
  6. package/dist/chunk-WYKCGQPN.js.map +1 -0
  7. package/dist/{chunk-3QGECZBS.js → chunk-X5RNNPDU.js} +12 -9
  8. package/dist/chunk-X5RNNPDU.js.map +1 -0
  9. package/dist/{errors-CWbsAodQ.d.ts → errors-D6S2d0Oy.d.ts} +41 -22
  10. package/dist/{errors-CwqwX-vA.d.cts → errors-GfSlToOh.d.cts} +41 -22
  11. package/dist/evm/index.cjs +3 -3
  12. package/dist/evm/index.d.cts +1 -1
  13. package/dist/evm/index.d.ts +1 -1
  14. package/dist/evm/index.js +1 -1
  15. package/dist/index.cjs +86 -78
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/index.d.cts +15 -8
  18. package/dist/index.d.ts +15 -8
  19. package/dist/index.js +2 -2
  20. package/dist/index.js.map +1 -1
  21. package/dist/solana/index.cjs +2 -2
  22. package/dist/solana/index.d.cts +1 -1
  23. package/dist/solana/index.d.ts +1 -1
  24. package/dist/solana/index.js +1 -1
  25. package/dist/starknet/index.cjs +1105 -372
  26. package/dist/starknet/index.cjs.map +1 -1
  27. package/dist/starknet/index.d.cts +780 -399
  28. package/dist/starknet/index.d.ts +780 -399
  29. package/dist/starknet/index.js +1021 -297
  30. package/dist/starknet/index.js.map +1 -1
  31. package/dist/stellar/index.cjs +2 -2
  32. package/dist/stellar/index.d.cts +1 -1
  33. package/dist/stellar/index.d.ts +1 -1
  34. package/dist/stellar/index.js +1 -1
  35. package/dist/{types-C-y68Ut2.d.cts → types-BTNjkUst.d.cts} +1 -0
  36. package/dist/{types-C-y68Ut2.d.ts → types-BTNjkUst.d.ts} +1 -0
  37. package/package.json +1 -1
  38. package/dist/chunk-3QGECZBS.js.map +0 -1
  39. package/dist/chunk-BILJIXSP.cjs.map +0 -1
  40. package/dist/chunk-H7I6TEOA.cjs.map +0 -1
  41. package/dist/chunk-PBJLHXDB.js.map +0 -1
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
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';
1
+ import { R as ResolvedFeeConfig, S as ServiceDefinition, a as ServiceCapability } from './errors-D6S2d0Oy.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 CollectionServiceId, aL as CollectionSort, aM as CollectionTokensSort, aN as ConfirmRemixOfferParams, aO as ConfirmSelfRemixParams, aP as ConsiderationItem, aQ as CreateCheckoutIntentParams, aR as CreateCoinIntentParams, aS as CreateCollectionIntentParams, aT as CreateCommentIntentParams, aU as CreateCounterOfferIntentParams, aV as CreateDropClaimIntentParams, aW as CreateDropManageIntentParams, aX as CreateDropParams, aY as CreateFundingTransferIntentParams, aZ as CreateGenesisMintIntentParams, a_ as CreateListingIntentParams, a$ as CreateMembershipParams, b0 as CreateMintIntentParams, b1 as CreatePopBurnIntentParams, b2 as CreatePopClaimIntentParams, b3 as CreatePopCollectionParams, b4 as CreatePopManageIntentParams, b5 as CreateRemixOfferParams, b6 as CreateSponsorshipOfferIntentParams, b7 as CreateSponsorshipOfferParams, b8 as CreateSponsorshipProposalIntentParams, b9 as CreateSwapIntentParams, ba as CreateTicketParams, bb as CreateTierIntentParams, bc as CreateTransferCollectionOwnershipIntentParams, bd as CreateTransferNftIntentParams, be as CreateTransferTokenIntentParams, bf as CreateWalletManageIntentParams, bg as DropManageAction, bh as DropMintStatus, bi as DropTerms, bj as DropTermsBody, 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-D6S2d0Oy.js';
3
+ import { C as Chain } from './types-BTNjkUst.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-BTNjkUst.js';
5
5
  import 'zod';
6
6
  import 'starknet';
7
7
 
@@ -222,6 +222,7 @@ declare const STARKNET_POP_COLLECTION_CLASS_HASH: `0x${string}`;
222
222
  declare const STARKNET_POP_FACTORY_START_BLOCK: number | undefined;
223
223
  declare const STARKNET_DROP_FACTORY_CONTRACT: `0x${string}`;
224
224
  declare const STARKNET_DROP_COLLECTION_CLASS_HASH: `0x${string}`;
225
+ declare const STARKNET_DROP_FACTORY_START_BLOCK: number;
225
226
  declare const STARKNET_NFTCOMMENTS_CONTRACT: `0x${string}`;
226
227
  declare const STARKNET_IP_TICKETS_FACTORY_CONTRACT: `0x${string}`;
227
228
  declare const STARKNET_IP_TICKET_COLLECTION_CLASS_HASH: `0x${string}`;
@@ -272,6 +273,7 @@ declare function chainFromSlug(slug: string): Chain | null;
272
273
  type Idish = string | number | null | undefined;
273
274
  declare function assetHref(chain: Chain, contract: Idish, tokenId: Idish): string;
274
275
  declare function collectionHref(chain: Chain, contract: Idish): string;
276
+ declare function dropHref(contract: Idish): string;
275
277
  declare function coinHref(chain: Chain, address: Idish): string;
276
278
 
277
279
  declare const SERVICES: {
@@ -401,7 +403,7 @@ declare const SERVICES: {
401
403
  readonly "drop-collection": {
402
404
  readonly id: "drop-collection";
403
405
  readonly displayName: "Collection Drop";
404
- readonly description: "Sequential mint with claim windows + allowlist.";
406
+ readonly description: "Sell an edition or a collection at a fixed price, with a sale window and an optional allowlist.";
405
407
  readonly standard: "ERC721";
406
408
  readonly provenance: "MEDIALANE";
407
409
  readonly onchain: {
@@ -416,9 +418,14 @@ declare const SERVICES: {
416
418
  readonly name: "DropCreated";
417
419
  readonly emittedBy: "factory";
418
420
  }, {
419
- readonly name: "AllowlistUpdated";
421
+ readonly name: "Claimed";
422
+ readonly emittedBy: "instance";
423
+ }, {
424
+ readonly name: "Issued";
425
+ readonly emittedBy: "instance";
426
+ }, {
427
+ readonly name: "AllowlistRootSet";
420
428
  readonly emittedBy: "instance";
421
- readonly poll: "slow";
422
429
  }];
423
430
  readonly metadataSchema: {
424
431
  readonly licenseDefault: "CC BY-SA";
@@ -821,4 +828,4 @@ declare const IPFS_SAFE_CONTENT_TYPE_PREFIXES: readonly ["image/jpeg", "image/pn
821
828
  declare function resolveSafeImageContentType(contentType: string): string;
822
829
  declare const MAX_IPFS_GATEWAY_RESPONSE_BYTES: number;
823
830
 
824
- export { ACCOUNT_SESSION_TTL_SECONDS, ALLOWED_IMAGE_CONTENT_TYPES, type AssetAttribute, type AssetMetadata, type BackendMetadataConfig, type BackendProxyConfig, type BackendUploadResult, type BuildAssetMetadataInput, type CanonicalHash, type CappedBody, type CertificateEmissionNextStep, type CertificateEmissionRun, Chain, type ConfirmResult, DEFAULT_CURRENCY, type DataTokenizationRun, type FailoverFetchOptions, type FeeEnv, IDENTITY_TTL_SECONDS, IPFS_SAFE_CONTENT_TYPE_PREFIXES, type ImageProxyConfig, type LaunchpadRun, type LaunchpadRunsClient, type LaunchpadRunsClientOptions, MAX_IMAGE_PROXY_BYTES, MAX_IMAGE_REDIRECTS, MAX_IPFS_GATEWAY_RESPONSE_BYTES, type NextStep, POLICY_REFUSAL_CODES, RESERVED_TRAITS, type RemixPolicy, type RemixPolicyInput, ResolvedFeeConfig, type RpcProxyConfig, type RunQuote, type RunQuoteLine, RunRequestError, type RunStatus, 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, ServiceCapability, ServiceDefinition, type ServiceId, type SiwsIdentity, type SupportedToken, type SupportedTokenSymbol, type TicketingNextStep, type TicketingRun, type TokenSource, type WalletRequest, assetHref, buildAssetMetadata, chainFromSlug, chainSlug, coinHref, collectionHref, createBackendProxyHandler, createFailoverFetch, createImageProxyHandler, createLaunchpadRunsClient, createRpcProxyHandler, encodeU256, formatAmount, getBackendSignedUrl, getDerivativesTerm, getListableTokens, getService, getServicesByCapability, getTokenByAddress, getTokenBySymbol, hasCapability, isCertificateEmissionRun, isDataTokenizationRun, isPolicyRefusal, isPrivateHost, isPrivateOrInsecureUrl, isSameOrigin, isServiceId, isTicketingRun, isTransientRpcError, isValidIpfsCidPath, issueAccountSessionToken, issueSiwsToken, listServices, normalizeAddress, normalizeHash, parseAmount, readBodyWithCap, resolveAppFeeConfig, resolveRemixPolicy, resolveSafeImageContentType, shortenAddress, stringifyBigInts, u256ToBigInt, uploadDirectoryToBackend, uploadFileToBackend, uploadJsonToBackend, validateUrl, verifyAccountSessionToken, verifySiwsToken };
831
+ export { ACCOUNT_SESSION_TTL_SECONDS, ALLOWED_IMAGE_CONTENT_TYPES, type AssetAttribute, type AssetMetadata, type BackendMetadataConfig, type BackendProxyConfig, type BackendUploadResult, type BuildAssetMetadataInput, type CanonicalHash, type CappedBody, type CertificateEmissionNextStep, type CertificateEmissionRun, Chain, type ConfirmResult, DEFAULT_CURRENCY, type DataTokenizationRun, type FailoverFetchOptions, type FeeEnv, IDENTITY_TTL_SECONDS, IPFS_SAFE_CONTENT_TYPE_PREFIXES, type ImageProxyConfig, type LaunchpadRun, type LaunchpadRunsClient, type LaunchpadRunsClientOptions, MAX_IMAGE_PROXY_BYTES, MAX_IMAGE_REDIRECTS, MAX_IPFS_GATEWAY_RESPONSE_BYTES, type NextStep, POLICY_REFUSAL_CODES, RESERVED_TRAITS, type RemixPolicy, type RemixPolicyInput, ResolvedFeeConfig, type RpcProxyConfig, type RunQuote, type RunQuoteLine, RunRequestError, type RunStatus, 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_DROP_FACTORY_START_BLOCK, 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, ServiceCapability, ServiceDefinition, type ServiceId, type SiwsIdentity, type SupportedToken, type SupportedTokenSymbol, type TicketingNextStep, type TicketingRun, type TokenSource, type WalletRequest, assetHref, buildAssetMetadata, chainFromSlug, chainSlug, coinHref, collectionHref, createBackendProxyHandler, createFailoverFetch, createImageProxyHandler, createLaunchpadRunsClient, createRpcProxyHandler, dropHref, encodeU256, formatAmount, getBackendSignedUrl, getDerivativesTerm, getListableTokens, getService, getServicesByCapability, getTokenByAddress, getTokenBySymbol, hasCapability, isCertificateEmissionRun, isDataTokenizationRun, isPolicyRefusal, isPrivateHost, isPrivateOrInsecureUrl, isSameOrigin, isServiceId, isTicketingRun, isTransientRpcError, isValidIpfsCidPath, issueAccountSessionToken, issueSiwsToken, listServices, normalizeAddress, normalizeHash, parseAmount, readBodyWithCap, resolveAppFeeConfig, resolveRemixPolicy, resolveSafeImageContentType, shortenAddress, stringifyBigInts, u256ToBigInt, uploadDirectoryToBackend, uploadFileToBackend, uploadJsonToBackend, validateUrl, verifyAccountSessionToken, verifySiwsToken };
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
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
- export { CHAINS, DEFAULT_CHAIN, getCoordinates, getStarknetCoordinates } from './chunk-PBJLHXDB.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_DROP_FACTORY_START_BLOCK, 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, dropHref, encodeU256, formatAmount, getListableTokens, getService, getServicesByCapability, getTokenByAddress, getTokenBySymbol, hasCapability, isPolicyRefusal, isServiceId, isTransientRpcError, listServices, normalizeAddress, normalizeHash, parseAmount, resolveAppFeeConfig, resolveConfig, resolveFeeConfig, shortenAddress, stringifyBigInts, u256ToBigInt } from './chunk-X5RNNPDU.js';
2
+ export { CHAINS, DEFAULT_CHAIN, getCoordinates, getStarknetCoordinates } from './chunk-WYKCGQPN.js';
3
3
  import { hmac } from '@noble/hashes/hmac.js';
4
4
  import { sha256 } from '@noble/hashes/sha2.js';
5
5
  import { base64urlnopad } from '@scure/base';
package/dist/index.js.map CHANGED
@@ -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"],"mappings":"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","file":"index.js","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"]}
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"],"mappings":"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","file":"index.js","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\n/** Drop sale terms on the wire: amounts as decimal strings in the token's smallest unit. */\nexport interface DropTermsBody {\n /** Unix seconds; 0 = open from creation. */\n startTime: number;\n /** Unix seconds; 0 = never closes. */\n endTime: number;\n /** Per token; \"0\" = free. */\n price: string;\n paymentToken: string;\n /** \"0\" = unlimited. */\n maxPerWallet: 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 /** drop-collection */\n terms?: DropTermsBody;\n\n /** drop-collection — Merkle root of the allowlist; omitted = open to everyone */\n allowlistRoot?: string;\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 /** Tokens to mint, decimal string. */\n quantity: string;\n /** Allowlist proof from the claim link; omitted for open drops. */\n proof?: 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 = \"issue\" | \"set_allowlist_root\";\n\nexport interface CreateDropManageIntentParams {\n owner: string;\n collection: string;\n action: DropManageAction;\n /** issue */\n recipient?: string;\n /** issue — decimal string */\n quantity?: string;\n /** set_allowlist_root — 0x0 opens the drop to everyone */\n root?: 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"]}