@luxexchange/api 1.0.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.
- package/.depcheckrc +17 -0
- package/.eslintrc.js +30 -0
- package/README.md +5 -0
- package/package.json +74 -0
- package/project.json +94 -0
- package/scripts/fixGraphQLApiTypes.mts +91 -0
- package/scripts/modifyTradingApiTypes.mts +232 -0
- package/src/client.ts +66 -0
- package/src/clients/auctions/createAuctionServiceClient.ts +44 -0
- package/src/clients/base/SharedQueryClient.ts +25 -0
- package/src/clients/base/auth.ts +43 -0
- package/src/clients/base/createFetchClient.ts +133 -0
- package/src/clients/base/errors.ts +32 -0
- package/src/clients/base/types.ts +26 -0
- package/src/clients/base/urls.test.ts +297 -0
- package/src/clients/base/urls.ts +85 -0
- package/src/clients/base/utils.test.ts +131 -0
- package/src/clients/base/utils.ts +54 -0
- package/src/clients/blockaid/createBlockaidApiClient.ts +185 -0
- package/src/clients/blockaid/types.ts +495 -0
- package/src/clients/content/types.ts +22 -0
- package/src/clients/conversionTracking/api-ConversionProxyService_connectquery.ts +20 -0
- package/src/clients/conversionTracking/api_connect.ts +24 -0
- package/src/clients/conversionTracking/api_pb.ts +184 -0
- package/src/clients/conversionTracking/index.ts +4 -0
- package/src/clients/data/createDataServiceApiClient.ts +101 -0
- package/src/clients/dataApi/createDataApiServiceClient.ts +29 -0
- package/src/clients/dataApi/getGetPortfolioQueryOptions.test.ts +122 -0
- package/src/clients/dataApi/getGetPortfolioQueryOptions.ts +76 -0
- package/src/clients/embeddedWallet/createEmbeddedWalletApiClient.ts +325 -0
- package/src/clients/for/createForApiClient.ts +187 -0
- package/src/clients/for/types.ts +39 -0
- package/src/clients/for/utils.ts +13 -0
- package/src/clients/graphql/__generated__/operations.ts +605 -0
- package/src/clients/graphql/__generated__/react-hooks.ts +4245 -0
- package/src/clients/graphql/__generated__/resolvers.ts +1469 -0
- package/src/clients/graphql/__generated__/schema-types.ts +2099 -0
- package/src/clients/graphql/codegen.config.ts +50 -0
- package/src/clients/graphql/fragments.ts +96 -0
- package/src/clients/graphql/generated.ts +5 -0
- package/src/clients/graphql/queries.graphql +1028 -0
- package/src/clients/graphql/queries.ts +19 -0
- package/src/clients/graphql/schema.graphql +1585 -0
- package/src/clients/graphql/types.ts +9 -0
- package/src/clients/graphql/utils.ts +21 -0
- package/src/clients/graphql/web/LuxPrices.graphql +18 -0
- package/src/clients/graphql/web/RecentTokenTransfers.graphql +93 -0
- package/src/clients/graphql/web/SimpleToken.graphql +12 -0
- package/src/clients/graphql/web/TokenSpotPrice.graphql +19 -0
- package/src/clients/graphql/web/activity.graphql +272 -0
- package/src/clients/graphql/web/allV3Ticks.graphql +11 -0
- package/src/clients/graphql/web/allV4Ticks.graphql +11 -0
- package/src/clients/graphql/web/feeTierDistribution.graphql +7 -0
- package/src/clients/graphql/web/landing.graphql +38 -0
- package/src/clients/graphql/web/latestSubgraphBlock.graphql +3 -0
- package/src/clients/graphql/web/nft/CollectionSearch.graphql +34 -0
- package/src/clients/graphql/web/nft/NftBalance.graphql +109 -0
- package/src/clients/graphql/web/pool.graphql +199 -0
- package/src/clients/graphql/web/poolTransactions.graphql +84 -0
- package/src/clients/graphql/web/portfolios.graphql +68 -0
- package/src/clients/graphql/web/token.graphql +97 -0
- package/src/clients/graphql/web/tokenCharts.graphql +85 -0
- package/src/clients/graphql/web/tokenTransactions.graphql +25 -0
- package/src/clients/graphql/web/topPools.graphql +78 -0
- package/src/clients/graphql/web/transactions.graphql +56 -0
- package/src/clients/jupiter/createJupiterApiClient.ts +42 -0
- package/src/clients/jupiter/types.ts +92 -0
- package/src/clients/jupiter/utils.ts +27 -0
- package/src/clients/liquidity/createAuctionMutationClient.ts +41 -0
- package/src/clients/liquidity/createLiquidityServiceClient.ts +56 -0
- package/src/clients/lux/createLuxApiClient.ts +100 -0
- package/src/clients/notifications/createNotificationsApiClient.ts +72 -0
- package/src/clients/notifications/types.ts +102 -0
- package/src/clients/trading/__generated__/core/ApiError.ts +25 -0
- package/src/clients/trading/__generated__/core/ApiRequestOptions.ts +17 -0
- package/src/clients/trading/__generated__/core/ApiResult.ts +11 -0
- package/src/clients/trading/__generated__/core/CancelablePromise.ts +131 -0
- package/src/clients/trading/__generated__/core/OpenAPI.ts +32 -0
- package/src/clients/trading/__generated__/core/request.ts +322 -0
- package/src/clients/trading/__generated__/index.ts +221 -0
- package/src/clients/trading/__generated__/models/Address.ts +5 -0
- package/src/clients/trading/__generated__/models/AggregatedOutput.ts +20 -0
- package/src/clients/trading/__generated__/models/ApprovalRequest.ts +25 -0
- package/src/clients/trading/__generated__/models/ApprovalResponse.ts +18 -0
- package/src/clients/trading/__generated__/models/AutoSlippage.ts +14 -0
- package/src/clients/trading/__generated__/models/BridgeQuote.ts +55 -0
- package/src/clients/trading/__generated__/models/ChainDelegationMap.ts +9 -0
- package/src/clients/trading/__generated__/models/ChainId.ts +29 -0
- package/src/clients/trading/__generated__/models/ChainedQuote.ts +63 -0
- package/src/clients/trading/__generated__/models/CheckApprovalLPRequest.ts +35 -0
- package/src/clients/trading/__generated__/models/CheckApprovalLPResponse.ts +29 -0
- package/src/clients/trading/__generated__/models/ClaimLPFeesRequest.ts +20 -0
- package/src/clients/trading/__generated__/models/ClaimLPFeesResponse.ts +13 -0
- package/src/clients/trading/__generated__/models/ClaimLPRewardsRequest.ts +19 -0
- package/src/clients/trading/__generated__/models/ClaimLPRewardsResponse.ts +13 -0
- package/src/clients/trading/__generated__/models/ClassicGasUseEstimateUSD.ts +8 -0
- package/src/clients/trading/__generated__/models/ClassicInput.ts +11 -0
- package/src/clients/trading/__generated__/models/ClassicOutput.ts +13 -0
- package/src/clients/trading/__generated__/models/ClassicQuote.ts +69 -0
- package/src/clients/trading/__generated__/models/ClientContext.ts +18 -0
- package/src/clients/trading/__generated__/models/CosignerData.ts +21 -0
- package/src/clients/trading/__generated__/models/CreateLPPositionRequest.ts +40 -0
- package/src/clients/trading/__generated__/models/CreateLPPositionResponse.ts +21 -0
- package/src/clients/trading/__generated__/models/CreatePlanRequest.ts +23 -0
- package/src/clients/trading/__generated__/models/CreateSendRequest.ts +22 -0
- package/src/clients/trading/__generated__/models/CreateSendResponse.ts +18 -0
- package/src/clients/trading/__generated__/models/CreateSwap5792Request.ts +17 -0
- package/src/clients/trading/__generated__/models/CreateSwap5792Response.ts +17 -0
- package/src/clients/trading/__generated__/models/CreateSwap7702Request.ts +21 -0
- package/src/clients/trading/__generated__/models/CreateSwap7702Response.ts +13 -0
- package/src/clients/trading/__generated__/models/CreateSwapRequest.ts +42 -0
- package/src/clients/trading/__generated__/models/CreateSwapResponse.ts +16 -0
- package/src/clients/trading/__generated__/models/Curve.ts +9 -0
- package/src/clients/trading/__generated__/models/DEXOrder.ts +35 -0
- package/src/clients/trading/__generated__/models/DecreaseLPPositionRequest.ts +33 -0
- package/src/clients/trading/__generated__/models/DecreaseLPPositionResponse.ts +19 -0
- package/src/clients/trading/__generated__/models/DelegationDetails.ts +19 -0
- package/src/clients/trading/__generated__/models/Distributor.ts +10 -0
- package/src/clients/trading/__generated__/models/DutchInput.ts +13 -0
- package/src/clients/trading/__generated__/models/DutchInputV3.ts +15 -0
- package/src/clients/trading/__generated__/models/DutchOrderInfo.ts +41 -0
- package/src/clients/trading/__generated__/models/DutchOrderInfoV2.ts +27 -0
- package/src/clients/trading/__generated__/models/DutchOrderInfoV3.ts +28 -0
- package/src/clients/trading/__generated__/models/DutchOutput.ts +15 -0
- package/src/clients/trading/__generated__/models/DutchOutputV3.ts +18 -0
- package/src/clients/trading/__generated__/models/DutchQuote.ts +27 -0
- package/src/clients/trading/__generated__/models/DutchQuoteV2.ts +28 -0
- package/src/clients/trading/__generated__/models/DutchQuoteV3.ts +30 -0
- package/src/clients/trading/__generated__/models/Encode7702ResponseBody.ts +11 -0
- package/src/clients/trading/__generated__/models/Err400.ts +9 -0
- package/src/clients/trading/__generated__/models/Err401.ts +9 -0
- package/src/clients/trading/__generated__/models/Err404.ts +17 -0
- package/src/clients/trading/__generated__/models/Err422.ts +9 -0
- package/src/clients/trading/__generated__/models/Err429.ts +9 -0
- package/src/clients/trading/__generated__/models/Err500.ts +9 -0
- package/src/clients/trading/__generated__/models/Err504.ts +9 -0
- package/src/clients/trading/__generated__/models/GasStrategy.ts +46 -0
- package/src/clients/trading/__generated__/models/GetOrdersResponse.ts +12 -0
- package/src/clients/trading/__generated__/models/GetSwappableTokensResponse.ts +29 -0
- package/src/clients/trading/__generated__/models/GetSwapsResponse.ts +18 -0
- package/src/clients/trading/__generated__/models/HooksOptions.ts +12 -0
- package/src/clients/trading/__generated__/models/IncreaseLPPositionRequest.ts +39 -0
- package/src/clients/trading/__generated__/models/IncreaseLPPositionResponse.ts +21 -0
- package/src/clients/trading/__generated__/models/IndependentToken.ts +8 -0
- package/src/clients/trading/__generated__/models/IndicativeQuoteRequest.ts +18 -0
- package/src/clients/trading/__generated__/models/IndicativeQuoteResponse.ts +14 -0
- package/src/clients/trading/__generated__/models/IndicativeQuoteToken.ts +13 -0
- package/src/clients/trading/__generated__/models/LimitOrderQuoteRequest.ts +22 -0
- package/src/clients/trading/__generated__/models/LimitOrderQuoteResponse.ts +19 -0
- package/src/clients/trading/__generated__/models/MigrateLPPositionRequest.ts +41 -0
- package/src/clients/trading/__generated__/models/MigrateLPPositionResponse.ts +13 -0
- package/src/clients/trading/__generated__/models/NullablePermit.ts +13 -0
- package/src/clients/trading/__generated__/models/OrderIds.ts +5 -0
- package/src/clients/trading/__generated__/models/OrderInput.ts +13 -0
- package/src/clients/trading/__generated__/models/OrderOutput.ts +16 -0
- package/src/clients/trading/__generated__/models/OrderRequest.ts +17 -0
- package/src/clients/trading/__generated__/models/OrderResponse.ts +13 -0
- package/src/clients/trading/__generated__/models/OrderStatus.ts +23 -0
- package/src/clients/trading/__generated__/models/OrderType.ts +11 -0
- package/src/clients/trading/__generated__/models/OrderTypeQuery.ts +12 -0
- package/src/clients/trading/__generated__/models/Permit.ts +13 -0
- package/src/clients/trading/__generated__/models/PermitAmount.ts +11 -0
- package/src/clients/trading/__generated__/models/PlanResponse.ts +75 -0
- package/src/clients/trading/__generated__/models/PlanStatus.ts +14 -0
- package/src/clients/trading/__generated__/models/PlanStep.ts +59 -0
- package/src/clients/trading/__generated__/models/PlanStepMethod.ts +12 -0
- package/src/clients/trading/__generated__/models/PlanStepPayloadType.ts +12 -0
- package/src/clients/trading/__generated__/models/PlanStepProof.ts +20 -0
- package/src/clients/trading/__generated__/models/PlanStepStatus.ts +14 -0
- package/src/clients/trading/__generated__/models/PlanStepType.ts +23 -0
- package/src/clients/trading/__generated__/models/Pool.ts +15 -0
- package/src/clients/trading/__generated__/models/PoolInfoRequest.ts +20 -0
- package/src/clients/trading/__generated__/models/PoolInfoResponse.ts +16 -0
- package/src/clients/trading/__generated__/models/PoolInformation.ts +44 -0
- package/src/clients/trading/__generated__/models/PoolParameters.ts +19 -0
- package/src/clients/trading/__generated__/models/PoolReferenceByProtocol.ts +12 -0
- package/src/clients/trading/__generated__/models/Position.ts +11 -0
- package/src/clients/trading/__generated__/models/PriorityInput.ts +12 -0
- package/src/clients/trading/__generated__/models/PriorityOrderInfo.ts +29 -0
- package/src/clients/trading/__generated__/models/PriorityOutput.ts +17 -0
- package/src/clients/trading/__generated__/models/PriorityQuote.ts +31 -0
- package/src/clients/trading/__generated__/models/ProtocolItems.ts +15 -0
- package/src/clients/trading/__generated__/models/Protocols.ts +9 -0
- package/src/clients/trading/__generated__/models/Quote.ts +14 -0
- package/src/clients/trading/__generated__/models/QuoteRequest.ts +41 -0
- package/src/clients/trading/__generated__/models/QuoteResponse.ts +19 -0
- package/src/clients/trading/__generated__/models/RequestId.ts +8 -0
- package/src/clients/trading/__generated__/models/Routing.ts +20 -0
- package/src/clients/trading/__generated__/models/RoutingPreference.ts +16 -0
- package/src/clients/trading/__generated__/models/SafetyLevel.ts +10 -0
- package/src/clients/trading/__generated__/models/ScopeData.ts +28 -0
- package/src/clients/trading/__generated__/models/SettledAmount.ts +14 -0
- package/src/clients/trading/__generated__/models/SortKey.ts +7 -0
- package/src/clients/trading/__generated__/models/SpreadOptimization.ts +11 -0
- package/src/clients/trading/__generated__/models/StepUpdate.ts +25 -0
- package/src/clients/trading/__generated__/models/SwapSafetyMode.ts +10 -0
- package/src/clients/trading/__generated__/models/SwapStatus.ts +11 -0
- package/src/clients/trading/__generated__/models/TokenInRoute.ts +20 -0
- package/src/clients/trading/__generated__/models/TokenProject.ts +13 -0
- package/src/clients/trading/__generated__/models/TokenProjectLogo.ts +8 -0
- package/src/clients/trading/__generated__/models/TradeType.ts +11 -0
- package/src/clients/trading/__generated__/models/TransactionFailureReason.ts +11 -0
- package/src/clients/trading/__generated__/models/TransactionHash.ts +8 -0
- package/src/clients/trading/__generated__/models/TransactionRequest.ts +29 -0
- package/src/clients/trading/__generated__/models/TransactionRequest5792.ts +25 -0
- package/src/clients/trading/__generated__/models/TruncatedPlanStep.ts +21 -0
- package/src/clients/trading/__generated__/models/UniversalRouterVersion.ts +8 -0
- package/src/clients/trading/__generated__/models/UpdatePlanRequest.ts +12 -0
- package/src/clients/trading/__generated__/models/Urgency.ts +12 -0
- package/src/clients/trading/__generated__/models/V2PoolInRoute.ts +19 -0
- package/src/clients/trading/__generated__/models/V2Reserve.ts +16 -0
- package/src/clients/trading/__generated__/models/V3PoolInRoute.ts +24 -0
- package/src/clients/trading/__generated__/models/V4PoolInRoute.ts +30 -0
- package/src/clients/trading/__generated__/models/WalletCheckDelegationRequestBody.ts +17 -0
- package/src/clients/trading/__generated__/models/WalletCheckDelegationResponseBody.ts +14 -0
- package/src/clients/trading/__generated__/models/WalletEncode7702RequestBody.ts +21 -0
- package/src/clients/trading/__generated__/models/WalletExecutionContext.ts +17 -0
- package/src/clients/trading/__generated__/models/WalletInfo.ts +22 -0
- package/src/clients/trading/__generated__/models/WalletProperties.ts +12 -0
- package/src/clients/trading/__generated__/models/WrapUnwrapQuote.ts +31 -0
- package/src/clients/trading/__generated__/models/additionalValidationContract.ts +9 -0
- package/src/clients/trading/__generated__/models/additionalValidationData.ts +9 -0
- package/src/clients/trading/__generated__/models/bps.ts +8 -0
- package/src/clients/trading/__generated__/models/bpsFee.ts +8 -0
- package/src/clients/trading/__generated__/models/bridgeTokenInChainIdParam.ts +6 -0
- package/src/clients/trading/__generated__/models/chainIdParam.ts +6 -0
- package/src/clients/trading/__generated__/models/claimerWalletAddress.ts +8 -0
- package/src/clients/trading/__generated__/models/contractAddress.ts +8 -0
- package/src/clients/trading/__generated__/models/cosignerAddress.ts +8 -0
- package/src/clients/trading/__generated__/models/cursorParam.ts +5 -0
- package/src/clients/trading/__generated__/models/deadline.ts +8 -0
- package/src/clients/trading/__generated__/models/encodedOrder.ts +8 -0
- package/src/clients/trading/__generated__/models/endAmount.ts +8 -0
- package/src/clients/trading/__generated__/models/erc20EthEnabledHeader.ts +8 -0
- package/src/clients/trading/__generated__/models/fillerParam.ts +9 -0
- package/src/clients/trading/__generated__/models/gasFee.ts +8 -0
- package/src/clients/trading/__generated__/models/gasFeeInCurrency.ts +8 -0
- package/src/clients/trading/__generated__/models/gasFeeUSD.ts +8 -0
- package/src/clients/trading/__generated__/models/gasLimit.ts +8 -0
- package/src/clients/trading/__generated__/models/gasPrice.ts +8 -0
- package/src/clients/trading/__generated__/models/generatePermitAsTransaction.ts +8 -0
- package/src/clients/trading/__generated__/models/includeGasInfo.ts +8 -0
- package/src/clients/trading/__generated__/models/inputToken.ts +8 -0
- package/src/clients/trading/__generated__/models/isSpam.ts +8 -0
- package/src/clients/trading/__generated__/models/limitParam.ts +5 -0
- package/src/clients/trading/__generated__/models/liquidity.ts +8 -0
- package/src/clients/trading/__generated__/models/lpPoolFee.ts +8 -0
- package/src/clients/trading/__generated__/models/lpTickCurrent.ts +8 -0
- package/src/clients/trading/__generated__/models/maxFeePerGas.ts +8 -0
- package/src/clients/trading/__generated__/models/maxPriorityFeePerGas.ts +8 -0
- package/src/clients/trading/__generated__/models/minAmount.ts +8 -0
- package/src/clients/trading/__generated__/models/nonce.ts +8 -0
- package/src/clients/trading/__generated__/models/orderId.ts +8 -0
- package/src/clients/trading/__generated__/models/orderIdParam.ts +6 -0
- package/src/clients/trading/__generated__/models/orderIdsParam.ts +9 -0
- package/src/clients/trading/__generated__/models/orderStatusParam.ts +9 -0
- package/src/clients/trading/__generated__/models/orderTypeParam.ts +9 -0
- package/src/clients/trading/__generated__/models/outputToken.ts +8 -0
- package/src/clients/trading/__generated__/models/poolFee.ts +8 -0
- package/src/clients/trading/__generated__/models/portionAmount.ts +8 -0
- package/src/clients/trading/__generated__/models/portionAmountReceiverAddress.ts +8 -0
- package/src/clients/trading/__generated__/models/portionBips.ts +8 -0
- package/src/clients/trading/__generated__/models/quoteId.ts +8 -0
- package/src/clients/trading/__generated__/models/receiverWalletAddress.ts +8 -0
- package/src/clients/trading/__generated__/models/senderWalletAddress.ts +8 -0
- package/src/clients/trading/__generated__/models/slippageTolerance.ts +14 -0
- package/src/clients/trading/__generated__/models/sortKeyParam.ts +9 -0
- package/src/clients/trading/__generated__/models/sortParam.ts +8 -0
- package/src/clients/trading/__generated__/models/sqrtRatioX96.ts +8 -0
- package/src/clients/trading/__generated__/models/startAmount.ts +8 -0
- package/src/clients/trading/__generated__/models/swapperParam.ts +9 -0
- package/src/clients/trading/__generated__/models/tickCurrent.ts +8 -0
- package/src/clients/trading/__generated__/models/tickSpacing.ts +8 -0
- package/src/clients/trading/__generated__/models/tokenAmount.ts +8 -0
- package/src/clients/trading/__generated__/models/tokenInParam.ts +6 -0
- package/src/clients/trading/__generated__/models/tokenSymbol.ts +8 -0
- package/src/clients/trading/__generated__/models/transactionHashesParam.ts +9 -0
- package/src/clients/trading/__generated__/models/universalRouterVersionHeader.ts +9 -0
- package/src/clients/trading/__generated__/services/ApprovalService.ts +39 -0
- package/src/clients/trading/__generated__/services/DefaultService.ts +46 -0
- package/src/clients/trading/__generated__/services/IndicativeQuoteService.ts +39 -0
- package/src/clients/trading/__generated__/services/LimitOrderQuoteService.ts +37 -0
- package/src/clients/trading/__generated__/services/LiquidityService.ts +239 -0
- package/src/clients/trading/__generated__/services/OrderService.ts +131 -0
- package/src/clients/trading/__generated__/services/PlanService.ts +76 -0
- package/src/clients/trading/__generated__/services/QuoteService.ts +58 -0
- package/src/clients/trading/__generated__/services/SendService.ts +37 -0
- package/src/clients/trading/__generated__/services/SwapService.ts +161 -0
- package/src/clients/trading/__generated__/services/SwappableTokensService.ts +42 -0
- package/src/clients/trading/__generated__/services/WalletCheckDelegationService.ts +37 -0
- package/src/clients/trading/__generated__/services/WalletEncode7702Service.ts +37 -0
- package/src/clients/trading/api.json +1 -0
- package/src/clients/trading/createTradingApiClient.ts +328 -0
- package/src/clients/trading/tradeTypes.ts +51 -0
- package/src/clients/trading/types.ts +72 -0
- package/src/clients/unitags/createUnitagsApiClient.test.ts +438 -0
- package/src/clients/unitags/createUnitagsApiClient.ts +214 -0
- package/src/clients/unitags/types.ts +122 -0
- package/src/components/ApiInit.test.tsx +364 -0
- package/src/components/ApiInit.tsx +71 -0
- package/src/connectRpc/base.ts +33 -0
- package/src/connectRpc/utils.ts +136 -0
- package/src/getEntryGatewayUrl.ts +46 -0
- package/src/getWebSocketUrl.ts +28 -0
- package/src/global.d.ts +2 -0
- package/src/hooks/index.ts +6 -0
- package/src/hooks/shared/types.ts +10 -0
- package/src/hooks/shared/useQueryWithImmediateGarbageCollection.ts +90 -0
- package/src/hooks/use-token-list.ts +52 -0
- package/src/hooks/use-token-price.ts +82 -0
- package/src/hooks/useIsSessionInitialized.ts +17 -0
- package/src/index.ts +318 -0
- package/src/provideDeviceIdService.ts +25 -0
- package/src/provideLuxIdentifierService.ts +25 -0
- package/src/provideSessionService.native.ts +46 -0
- package/src/provideSessionService.ts +13 -0
- package/src/provideSessionService.web.ts +87 -0
- package/src/provideSessionStorage.ts +21 -0
- package/src/session/createSessionTransport.test.ts +79 -0
- package/src/session/createSessionTransport.ts +107 -0
- package/src/session/createWithSessionRetry.ts +33 -0
- package/src/session/index.ts +12 -0
- package/src/storage/createExtensionStorageDriver.ts +29 -0
- package/src/storage/createNativeStorageDriver.ts +19 -0
- package/src/storage/createWebStorageDriver.ts +17 -0
- package/src/storage/getStorageDriver.native.ts +6 -0
- package/src/storage/getStorageDriver.ts +8 -0
- package/src/storage/getStorageDriver.web.ts +11 -0
- package/src/storage/types.ts +9 -0
- package/src/transport.ts +85 -0
- package/stubs/privy-service-connect.d.ts +3 -0
- package/stubs/privy-service-pb.d.ts +60 -0
- package/tsconfig.json +37 -0
- package/tsconfig.lint.json +8 -0
- package/tsconfig.spec.json +8 -0
- package/vitest.config.ts +14 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { type PlainMessage } from '@bufbuild/protobuf'
|
|
2
|
+
import { Platform, type PlatformAddress, type WalletAccount } from '@uniswap/client-data-api/dist/data/v1/api_pb'
|
|
3
|
+
import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb'
|
|
4
|
+
import { type ProtectionInfo as ProtectionInfoProtobuf } from '@luxdex/client-explore/dist/uniswap/explore/v1/service_pb'
|
|
5
|
+
import {
|
|
6
|
+
ProtectionAttackType,
|
|
7
|
+
type ProtectionInfo,
|
|
8
|
+
ProtectionResult,
|
|
9
|
+
SafetyLevel,
|
|
10
|
+
} from '@luxfi/api/src/clients/graphql/__generated__/schema-types'
|
|
11
|
+
import { logger } from '@luxfi/utilities/src/logger/logger'
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Helper functions to parse string enum fields from REST API responses.
|
|
15
|
+
*
|
|
16
|
+
* Note: The Protobuf types use string enums instead of strictly typed enums because
|
|
17
|
+
* Protobuf does not allow defining two of the same enum name in the same proto file. (i.e. both ProtectionAttackType and
|
|
18
|
+
* ProtectionResult contain 'UNKNOWN')
|
|
19
|
+
*
|
|
20
|
+
* Since the Explore service just calls GraphQL, we have confidence the string values will match the GraphQL enums.
|
|
21
|
+
* Just validating here!
|
|
22
|
+
*/
|
|
23
|
+
export function parseSafetyLevel(safetyLevel?: string): SafetyLevel | undefined {
|
|
24
|
+
if (!safetyLevel) {
|
|
25
|
+
return undefined
|
|
26
|
+
}
|
|
27
|
+
const validSafetyLevels: SafetyLevel[] = Object.values(SafetyLevel)
|
|
28
|
+
if (validSafetyLevels.includes(safetyLevel as SafetyLevel)) {
|
|
29
|
+
return safetyLevel as SafetyLevel
|
|
30
|
+
} else {
|
|
31
|
+
logger.warn(
|
|
32
|
+
'api/clients/connectRpc/utils.ts',
|
|
33
|
+
'parseSafetyLevel',
|
|
34
|
+
`Invalid safetyLevel from REST TokenRankings query: ${safetyLevel}`,
|
|
35
|
+
)
|
|
36
|
+
return undefined
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function parseProtectionInfo(protectionInfo?: ProtectionInfoProtobuf): ProtectionInfo | undefined {
|
|
41
|
+
if (!protectionInfo) {
|
|
42
|
+
return undefined
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
let protectionResult: ProtectionResult | undefined
|
|
46
|
+
// protectionInfo.result and protectionInfo.attackTypes are a string instead of an enum
|
|
47
|
+
// message TokenProtectionInfo {
|
|
48
|
+
// string result = 1;
|
|
49
|
+
// ...
|
|
50
|
+
// }
|
|
51
|
+
// So result and attackTypes are a capitalized string instead of an uppercase enum value
|
|
52
|
+
const validProtectionResults: string[] = Object.values(ProtectionResult)
|
|
53
|
+
if (validProtectionResults.includes(protectionInfo.result.toUpperCase())) {
|
|
54
|
+
protectionResult = protectionInfo.result.toUpperCase() as ProtectionResult
|
|
55
|
+
} else {
|
|
56
|
+
logger.warn(
|
|
57
|
+
'api/clients/connectRpc/utils.ts',
|
|
58
|
+
'parseProtectionInfo',
|
|
59
|
+
`Invalid protectionResult from REST TokenRankings query: ${protectionInfo.result}`,
|
|
60
|
+
)
|
|
61
|
+
return undefined
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const validAttackTypes: string[] = Object.values(ProtectionAttackType)
|
|
65
|
+
const attackTypes = protectionInfo.attackTypes
|
|
66
|
+
.filter((at) => validAttackTypes.includes(at.toUpperCase()))
|
|
67
|
+
.map((at) => at.toUpperCase() as ProtectionAttackType)
|
|
68
|
+
if (attackTypes.length !== protectionInfo.attackTypes.length) {
|
|
69
|
+
logger.warn(
|
|
70
|
+
'api/clients/connectRpc/utils.ts',
|
|
71
|
+
'parseProtectionInfo',
|
|
72
|
+
`Invalid attackTypes in REST TokenRankings query: ${protectionInfo.attackTypes}`,
|
|
73
|
+
)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return { attackTypes, result: protectionResult }
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function parseRestProtocolVersion(version: string | undefined): ProtocolVersion | undefined {
|
|
80
|
+
switch (version?.toLowerCase()) {
|
|
81
|
+
case 'v2':
|
|
82
|
+
return ProtocolVersion.V2
|
|
83
|
+
case 'v3':
|
|
84
|
+
return ProtocolVersion.V3
|
|
85
|
+
case 'v4':
|
|
86
|
+
return ProtocolVersion.V4
|
|
87
|
+
default:
|
|
88
|
+
return undefined
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Helps simplify REST endpoint interfaces that expect a walletAccount object instead
|
|
94
|
+
* of simple address fields
|
|
95
|
+
*/
|
|
96
|
+
function createWalletAccount({ evmAddress, svmAddress }: { evmAddress?: string; svmAddress?: string }): {
|
|
97
|
+
walletAccount: PlainMessage<WalletAccount>
|
|
98
|
+
} {
|
|
99
|
+
const platformAddresses: PlainMessage<PlatformAddress>[] = []
|
|
100
|
+
|
|
101
|
+
if (evmAddress) {
|
|
102
|
+
platformAddresses.push({ platform: Platform.EVM, address: evmAddress })
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (svmAddress) {
|
|
106
|
+
platformAddresses.push({ platform: Platform.SVM, address: svmAddress })
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return {
|
|
110
|
+
walletAccount: {
|
|
111
|
+
platformAddresses,
|
|
112
|
+
},
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export type WithoutWalletAccount<T> = Omit<T, 'walletAccount'>
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Helper function to transform input that includes evmAddress/svmAddress to use walletAccount instead
|
|
120
|
+
*/
|
|
121
|
+
export function transformInput<T extends Record<string, unknown> & { walletAccount?: never }>(
|
|
122
|
+
input: (T & { evmAddress?: string; svmAddress?: string }) | undefined,
|
|
123
|
+
):
|
|
124
|
+
| (Omit<T, 'evmAddress' | 'svmAddress' | 'walletAccount'> & { walletAccount: PlainMessage<WalletAccount> })
|
|
125
|
+
| undefined {
|
|
126
|
+
if (!input) {
|
|
127
|
+
return undefined
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const { evmAddress, svmAddress, walletAccount: _walletAccount, ...restInput } = input
|
|
131
|
+
|
|
132
|
+
return {
|
|
133
|
+
...restInput,
|
|
134
|
+
...createWalletAccount({ evmAddress, svmAddress }),
|
|
135
|
+
}
|
|
136
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import {
|
|
2
|
+
PROD_ENTRY_GATEWAY_API_BASE_URL,
|
|
3
|
+
STAGING_ENTRY_GATEWAY_API_BASE_URL,
|
|
4
|
+
} from '@luxfi/api/src/clients/base/urls'
|
|
5
|
+
import { getConfig } from '@luxfi/config'
|
|
6
|
+
import { Environment, getCurrentEnv } from '@luxfi/utilities/src/environment/getCurrentEnv'
|
|
7
|
+
/**
|
|
8
|
+
* Returns the appropriate Entry Gateway API base URL based on the current environment.
|
|
9
|
+
* When proxy is enabled, returns the proxy path. Otherwise returns the direct URL.
|
|
10
|
+
* Can be overridden by setting ENTRY_GATEWAY_API_URL_OVERRIDE in environment variables.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Get the FOR API URL routed through the Entry Gateway.
|
|
14
|
+
* Delegates to getEntryGatewayUrl() and appends the FOR service path.
|
|
15
|
+
*/
|
|
16
|
+
export function getMigratedForApiUrl(): string {
|
|
17
|
+
return `${getEntryGatewayUrl()}/FOR.v1.FORService`
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function getEntryGatewayUrl(): string {
|
|
21
|
+
const config = getConfig()
|
|
22
|
+
|
|
23
|
+
// Use proxy path if enabled (local dev, Vercel previews, or explicit opt-in)
|
|
24
|
+
if (config.enableEntryGatewayProxy) {
|
|
25
|
+
return '/entry-gateway'
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Allow override via environment variable
|
|
29
|
+
const override: string = config.entryGatewayApiUrlOverride
|
|
30
|
+
if (override) {
|
|
31
|
+
return override
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const environment = getCurrentEnv({
|
|
35
|
+
isVercelEnvironment: config.isVercelEnvironment,
|
|
36
|
+
})
|
|
37
|
+
switch (environment) {
|
|
38
|
+
case Environment.DEV: // Dev also currently uses staging builds, as for many features staging is more stable / less prone to breaking testing changes.
|
|
39
|
+
case Environment.STAGING:
|
|
40
|
+
return STAGING_ENTRY_GATEWAY_API_BASE_URL
|
|
41
|
+
case Environment.PROD:
|
|
42
|
+
return PROD_ENTRY_GATEWAY_API_BASE_URL
|
|
43
|
+
default:
|
|
44
|
+
throw new Error(`Invalid environment: ${environment}`)
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { PROD_WEBSOCKET_BASE_URL, STAGING_WEBSOCKET_BASE_URL } from '@luxexchange/api/src/clients/base/urls'
|
|
2
|
+
import { getConfig } from '@luxexchange/config'
|
|
3
|
+
import { Environment, getCurrentEnv } from '@luxfi/utilities/src/environment/getCurrentEnv'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Returns the appropriate WebSocket URL based on the current environment.
|
|
7
|
+
* When the entry gateway proxy is enabled, returns the BFF proxy path so the
|
|
8
|
+
* Cloudflare Worker or Vercel edge function can forward the connection with
|
|
9
|
+
* correct cookies/origin.
|
|
10
|
+
*/
|
|
11
|
+
export function getWebSocketUrl(): string {
|
|
12
|
+
const config = getConfig()
|
|
13
|
+
|
|
14
|
+
if (config.enableEntryGatewayProxy) {
|
|
15
|
+
return '/ws'
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const environment = getCurrentEnv({ isVercelEnvironment: config.isVercelEnvironment })
|
|
19
|
+
switch (environment) {
|
|
20
|
+
case Environment.DEV:
|
|
21
|
+
case Environment.STAGING:
|
|
22
|
+
return STAGING_WEBSOCKET_BASE_URL as string
|
|
23
|
+
case Environment.PROD:
|
|
24
|
+
return PROD_WEBSOCKET_BASE_URL as string
|
|
25
|
+
default:
|
|
26
|
+
throw new Error(`Invalid environment: ${environment}`)
|
|
27
|
+
}
|
|
28
|
+
}
|
package/src/global.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { useQuery } from '@tanstack/react-query'
|
|
2
|
+
|
|
3
|
+
export type UseQueryApiHelperHookArgs<REQ, RES> = {
|
|
4
|
+
params?: REQ
|
|
5
|
+
} & Omit<Parameters<typeof useQuery<RES>>[0], 'queryKey' | 'queryFn'>
|
|
6
|
+
|
|
7
|
+
export type UseQueryWithImmediateGarbageCollectionApiHelperHookArgs<REQ, RES> = Omit<
|
|
8
|
+
UseQueryApiHelperHookArgs<REQ, RES>,
|
|
9
|
+
'gcTime'
|
|
10
|
+
> & { immediateGcTime?: number }
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type DefaultError,
|
|
3
|
+
type QueryClient,
|
|
4
|
+
type QueryKey,
|
|
5
|
+
skipToken,
|
|
6
|
+
type UseQueryOptions,
|
|
7
|
+
type UseQueryResult,
|
|
8
|
+
useQuery,
|
|
9
|
+
useQueryClient,
|
|
10
|
+
} from '@tanstack/react-query'
|
|
11
|
+
import { useEffect } from 'react'
|
|
12
|
+
import { logger } from '@luxfi/utilities/src/logger/logger'
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* This is a wrapper around react-query's `useQuery` that immediately clears the cache if the data is older than `gcTime`,
|
|
16
|
+
* even for active queries.
|
|
17
|
+
*
|
|
18
|
+
* react-query's garbage collection only runs once a query becomes inactive (the timer starts running the moment a query unmounts).
|
|
19
|
+
* There are some endpoints (for example, swap quotes) where we want to be able to use a stale-while-revalidate approach (using `staleTime`)
|
|
20
|
+
* for very short periods of time, while at the same time we want to make sure we never use stale data if it's older than the `gcTime`.
|
|
21
|
+
*/
|
|
22
|
+
export function useQueryWithImmediateGarbageCollection<
|
|
23
|
+
TQueryFnData = unknown,
|
|
24
|
+
TError = DefaultError,
|
|
25
|
+
TData = TQueryFnData,
|
|
26
|
+
TQueryKey extends QueryKey = QueryKey,
|
|
27
|
+
>(
|
|
28
|
+
{
|
|
29
|
+
immediateGcTime,
|
|
30
|
+
...queryArgs
|
|
31
|
+
}: Omit<UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>, 'gcTime'> & {
|
|
32
|
+
immediateGcTime?: number
|
|
33
|
+
},
|
|
34
|
+
customQueryClient?: QueryClient,
|
|
35
|
+
): UseQueryResult<TData, TError> {
|
|
36
|
+
const defaultQueryClient = useQueryClient()
|
|
37
|
+
const queryClient = customQueryClient ?? defaultQueryClient
|
|
38
|
+
|
|
39
|
+
const { queryKey, queryFn } = queryArgs
|
|
40
|
+
const skip = queryFn === skipToken
|
|
41
|
+
|
|
42
|
+
const result = useQuery<TQueryFnData, TError, TData, TQueryKey>(
|
|
43
|
+
{ ...queryArgs, gcTime: immediateGcTime },
|
|
44
|
+
queryClient,
|
|
45
|
+
)
|
|
46
|
+
const { dataUpdatedAt } = result
|
|
47
|
+
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
if (skip || !immediateGcTime) {
|
|
50
|
+
return undefined
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const timeSinceLastUpdate = Date.now() - dataUpdatedAt
|
|
54
|
+
|
|
55
|
+
const timeout = setTimeout(() => {
|
|
56
|
+
const state = queryClient.getQueryCache().find({ queryKey })?.state
|
|
57
|
+
|
|
58
|
+
if (!state) {
|
|
59
|
+
logger.debug('TradingApiClient.ts', 'useQueryWithImmediateGarbageCollection', 'Cache not found', { queryKey })
|
|
60
|
+
return
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const { data, dataUpdatedAt: latestDataUpdatedAt, fetchStatus } = state
|
|
64
|
+
|
|
65
|
+
if (!data || fetchStatus === 'fetching') {
|
|
66
|
+
// We do not want to clear the cache if the query is currently being fetched,
|
|
67
|
+
// or else we could end up in an infite loop of clearing and refetching.
|
|
68
|
+
return
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const latestTimeSinceLastUpdate = Date.now() - latestDataUpdatedAt
|
|
72
|
+
|
|
73
|
+
if (latestTimeSinceLastUpdate >= immediateGcTime) {
|
|
74
|
+
logger.debug('TradingApiClient.ts', 'useQueryWithImmediateGarbageCollection', 'Clearing stale data', {
|
|
75
|
+
queryKey,
|
|
76
|
+
immediateGcTime,
|
|
77
|
+
latestDataUpdatedAt,
|
|
78
|
+
latestTimeSinceLastUpdate,
|
|
79
|
+
state,
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
queryClient.removeQueries({ queryKey, exact: true })
|
|
83
|
+
}
|
|
84
|
+
}, immediateGcTime - timeSinceLastUpdate)
|
|
85
|
+
|
|
86
|
+
return () => clearTimeout(timeout)
|
|
87
|
+
}, [dataUpdatedAt, immediateGcTime, queryClient, queryKey, skip])
|
|
88
|
+
|
|
89
|
+
return result
|
|
90
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { useQuery } from '@tanstack/react-query'
|
|
4
|
+
import { fetchWithTimeout, API_URLS } from '../client'
|
|
5
|
+
|
|
6
|
+
export interface TokenListToken {
|
|
7
|
+
address: string
|
|
8
|
+
chainId: number
|
|
9
|
+
decimals: number
|
|
10
|
+
symbol: string
|
|
11
|
+
name: string
|
|
12
|
+
logoURI?: string
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface TokenList {
|
|
16
|
+
name: string
|
|
17
|
+
tokens: TokenListToken[]
|
|
18
|
+
version: {
|
|
19
|
+
major: number
|
|
20
|
+
minor: number
|
|
21
|
+
patch: number
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Fetch and cache token list
|
|
27
|
+
*/
|
|
28
|
+
export function useTokenList(chainId: number) {
|
|
29
|
+
return useQuery({
|
|
30
|
+
queryKey: ['tokenList', chainId],
|
|
31
|
+
queryFn: async (): Promise<TokenListToken[]> => {
|
|
32
|
+
try {
|
|
33
|
+
const response = await fetchWithTimeout(
|
|
34
|
+
`${API_URLS.TOKEN_LIST}/lux-default.json`
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
if (!response.ok) {
|
|
38
|
+
throw new Error('Failed to fetch token list')
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const data: TokenList = await response.json()
|
|
42
|
+
|
|
43
|
+
// Filter tokens for the specified chain
|
|
44
|
+
return data.tokens.filter((token) => token.chainId === chainId)
|
|
45
|
+
} catch (error) {
|
|
46
|
+
console.error('Failed to fetch token list:', error)
|
|
47
|
+
return []
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
staleTime: 5 * 60 * 1000, // 5 minutes
|
|
51
|
+
})
|
|
52
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { useQuery } from '@tanstack/react-query'
|
|
4
|
+
import { fetchWithTimeout, API_URLS } from '../client'
|
|
5
|
+
import type { Address } from 'viem'
|
|
6
|
+
|
|
7
|
+
export interface TokenPrice {
|
|
8
|
+
address: Address
|
|
9
|
+
priceUSD: number
|
|
10
|
+
change24h: number
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Fetch token price in USD
|
|
15
|
+
*/
|
|
16
|
+
export function useTokenPrice(address: Address | undefined, chainId: number) {
|
|
17
|
+
return useQuery({
|
|
18
|
+
queryKey: ['tokenPrice', address, chainId],
|
|
19
|
+
queryFn: async (): Promise<TokenPrice | null> => {
|
|
20
|
+
if (!address) return null
|
|
21
|
+
|
|
22
|
+
try {
|
|
23
|
+
const response = await fetchWithTimeout(
|
|
24
|
+
`${API_URLS.PRICE_API}/${chainId}/${address}`
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
if (!response.ok) {
|
|
28
|
+
return null
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return response.json()
|
|
32
|
+
} catch (error) {
|
|
33
|
+
console.error('Failed to fetch token price:', error)
|
|
34
|
+
return null
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
enabled: !!address,
|
|
38
|
+
staleTime: 30_000, // 30 seconds
|
|
39
|
+
refetchInterval: 60_000, // Refetch every minute
|
|
40
|
+
})
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Fetch multiple token prices
|
|
45
|
+
*/
|
|
46
|
+
export function useTokenPrices(addresses: Address[], chainId: number) {
|
|
47
|
+
return useQuery({
|
|
48
|
+
queryKey: ['tokenPrices', addresses, chainId],
|
|
49
|
+
queryFn: async (): Promise<Map<Address, TokenPrice>> => {
|
|
50
|
+
const priceMap = new Map<Address, TokenPrice>()
|
|
51
|
+
|
|
52
|
+
if (addresses.length === 0) return priceMap
|
|
53
|
+
|
|
54
|
+
try {
|
|
55
|
+
const response = await fetchWithTimeout(
|
|
56
|
+
`${API_URLS.PRICE_API}/${chainId}/batch`,
|
|
57
|
+
{
|
|
58
|
+
method: 'POST',
|
|
59
|
+
headers: { 'Content-Type': 'application/json' },
|
|
60
|
+
body: JSON.stringify({ addresses }),
|
|
61
|
+
}
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
if (!response.ok) {
|
|
65
|
+
return priceMap
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const prices: TokenPrice[] = await response.json()
|
|
69
|
+
prices.forEach((price) => {
|
|
70
|
+
priceMap.set(price.address, price)
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
return priceMap
|
|
74
|
+
} catch (error) {
|
|
75
|
+
console.error('Failed to fetch token prices:', error)
|
|
76
|
+
return priceMap
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
enabled: addresses.length > 0,
|
|
80
|
+
staleTime: 30_000,
|
|
81
|
+
})
|
|
82
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { useQueryClient } from '@tanstack/react-query'
|
|
2
|
+
import { SESSION_INIT_QUERY_KEY } from '@luxexchange/api/src/components/ApiInit'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Hook to check if session initialization is complete.
|
|
6
|
+
* Use this to gate API calls that require an authenticated session.
|
|
7
|
+
*
|
|
8
|
+
* @returns true if session init query has completed (success or error), false if pending or not started
|
|
9
|
+
*/
|
|
10
|
+
export function useIsSessionInitialized(): boolean {
|
|
11
|
+
const queryClient = useQueryClient()
|
|
12
|
+
const state = queryClient.getQueryState(SESSION_INIT_QUERY_KEY)
|
|
13
|
+
|
|
14
|
+
// Session is initialized if the query exists and is not in pending/fetching state
|
|
15
|
+
// We consider both success and error as "initialized" since we don't want to block forever
|
|
16
|
+
return state?.status === 'success' || state?.status === 'error'
|
|
17
|
+
}
|