@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,184 @@
|
|
|
1
|
+
// Follow up to remove: WEB-5827
|
|
2
|
+
// @generated by protoc-gen-es v1.10.0 with parameter "target=ts"
|
|
3
|
+
// @generated from file conversionproxy/v1/api.proto (package conversionproxy.v1, syntax proto3)
|
|
4
|
+
|
|
5
|
+
import type {
|
|
6
|
+
BinaryReadOptions,
|
|
7
|
+
FieldList,
|
|
8
|
+
JsonReadOptions,
|
|
9
|
+
JsonValue,
|
|
10
|
+
PartialMessage,
|
|
11
|
+
PlainMessage,
|
|
12
|
+
} from '@bufbuild/protobuf'
|
|
13
|
+
import { Message, proto3 } from '@bufbuild/protobuf'
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @generated from message conversionproxy.v1.Header
|
|
17
|
+
*/
|
|
18
|
+
export class Header extends Message<Header> {
|
|
19
|
+
/**
|
|
20
|
+
* @generated from field: string key = 1;
|
|
21
|
+
*/
|
|
22
|
+
key = ''
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @generated from field: string value = 2;
|
|
26
|
+
*/
|
|
27
|
+
value = ''
|
|
28
|
+
|
|
29
|
+
constructor(data?: PartialMessage<Header>) {
|
|
30
|
+
super()
|
|
31
|
+
proto3.util.initPartial(data, this)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
static readonly runtime: typeof proto3 = proto3
|
|
35
|
+
static readonly typeName = 'conversionproxy.v1.Header'
|
|
36
|
+
static readonly fields: FieldList = proto3.util.newFieldList(() => [
|
|
37
|
+
{ no: 1, name: 'key', kind: 'scalar', T: 9 /* ScalarType.STRING */ },
|
|
38
|
+
{ no: 2, name: 'value', kind: 'scalar', T: 9 /* ScalarType.STRING */ },
|
|
39
|
+
])
|
|
40
|
+
|
|
41
|
+
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): Header {
|
|
42
|
+
return new Header().fromBinary(bytes, options)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): Header {
|
|
46
|
+
return new Header().fromJson(jsonValue, options)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): Header {
|
|
50
|
+
return new Header().fromJsonString(jsonString, options)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
static equals(a: Header | PlainMessage<Header> | undefined, b: Header | PlainMessage<Header> | undefined): boolean {
|
|
54
|
+
return proto3.util.equals(Header, a, b)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* @generated from message conversionproxy.v1.ProxyRequest
|
|
60
|
+
*/
|
|
61
|
+
export class ProxyRequest extends Message<ProxyRequest> {
|
|
62
|
+
/**
|
|
63
|
+
* @generated from field: string requestType = 1;
|
|
64
|
+
*/
|
|
65
|
+
requestType = ''
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* @generated from field: string identifier = 2;
|
|
69
|
+
*/
|
|
70
|
+
identifier = ''
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* @generated from field: string to = 3;
|
|
74
|
+
*/
|
|
75
|
+
to = ''
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* @generated from field: string method = 4;
|
|
79
|
+
*/
|
|
80
|
+
method = ''
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* @generated from field: optional string body = 5;
|
|
84
|
+
*/
|
|
85
|
+
body?: string
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* @generated from field: repeated conversionproxy.v1.Header headers = 6;
|
|
89
|
+
*/
|
|
90
|
+
headers: Header[] = []
|
|
91
|
+
|
|
92
|
+
constructor(data?: PartialMessage<ProxyRequest>) {
|
|
93
|
+
super()
|
|
94
|
+
proto3.util.initPartial(data, this)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
static readonly runtime: typeof proto3 = proto3
|
|
98
|
+
static readonly typeName = 'conversionproxy.v1.ProxyRequest'
|
|
99
|
+
static readonly fields: FieldList = proto3.util.newFieldList(() => [
|
|
100
|
+
{ no: 1, name: 'requestType', kind: 'scalar', T: 9 /* ScalarType.STRING */ },
|
|
101
|
+
{ no: 2, name: 'identifier', kind: 'scalar', T: 9 /* ScalarType.STRING */ },
|
|
102
|
+
{ no: 3, name: 'to', kind: 'scalar', T: 9 /* ScalarType.STRING */ },
|
|
103
|
+
{ no: 4, name: 'method', kind: 'scalar', T: 9 /* ScalarType.STRING */ },
|
|
104
|
+
{ no: 5, name: 'body', kind: 'scalar', T: 9 /* ScalarType.STRING */, opt: true },
|
|
105
|
+
{ no: 6, name: 'headers', kind: 'message', T: Header, repeated: true },
|
|
106
|
+
])
|
|
107
|
+
|
|
108
|
+
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): ProxyRequest {
|
|
109
|
+
return new ProxyRequest().fromBinary(bytes, options)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): ProxyRequest {
|
|
113
|
+
return new ProxyRequest().fromJson(jsonValue, options)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): ProxyRequest {
|
|
117
|
+
return new ProxyRequest().fromJsonString(jsonString, options)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
static equals(
|
|
121
|
+
a: ProxyRequest | PlainMessage<ProxyRequest> | undefined,
|
|
122
|
+
b: ProxyRequest | PlainMessage<ProxyRequest> | undefined,
|
|
123
|
+
): boolean {
|
|
124
|
+
return proto3.util.equals(ProxyRequest, a, b)
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* @generated from message conversionproxy.v1.ProxyResponse
|
|
130
|
+
*/
|
|
131
|
+
export class ProxyResponse extends Message<ProxyResponse> {
|
|
132
|
+
/**
|
|
133
|
+
* @generated from field: int32 status = 1;
|
|
134
|
+
*/
|
|
135
|
+
status = 0
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* @generated from field: string statusText = 2;
|
|
139
|
+
*/
|
|
140
|
+
statusText = ''
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* @generated from field: string body = 3;
|
|
144
|
+
*/
|
|
145
|
+
body = ''
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* @generated from field: repeated conversionproxy.v1.Header headers = 4;
|
|
149
|
+
*/
|
|
150
|
+
headers: Header[] = []
|
|
151
|
+
|
|
152
|
+
constructor(data?: PartialMessage<ProxyResponse>) {
|
|
153
|
+
super()
|
|
154
|
+
proto3.util.initPartial(data, this)
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
static readonly runtime: typeof proto3 = proto3
|
|
158
|
+
static readonly typeName = 'conversionproxy.v1.ProxyResponse'
|
|
159
|
+
static readonly fields: FieldList = proto3.util.newFieldList(() => [
|
|
160
|
+
{ no: 1, name: 'status', kind: 'scalar', T: 5 /* ScalarType.INT32 */ },
|
|
161
|
+
{ no: 2, name: 'statusText', kind: 'scalar', T: 9 /* ScalarType.STRING */ },
|
|
162
|
+
{ no: 3, name: 'body', kind: 'scalar', T: 9 /* ScalarType.STRING */ },
|
|
163
|
+
{ no: 4, name: 'headers', kind: 'message', T: Header, repeated: true },
|
|
164
|
+
])
|
|
165
|
+
|
|
166
|
+
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): ProxyResponse {
|
|
167
|
+
return new ProxyResponse().fromBinary(bytes, options)
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): ProxyResponse {
|
|
171
|
+
return new ProxyResponse().fromJson(jsonValue, options)
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): ProxyResponse {
|
|
175
|
+
return new ProxyResponse().fromJsonString(jsonString, options)
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
static equals(
|
|
179
|
+
a: ProxyResponse | PlainMessage<ProxyResponse> | undefined,
|
|
180
|
+
b: ProxyResponse | PlainMessage<ProxyResponse> | undefined,
|
|
181
|
+
): boolean {
|
|
182
|
+
return proto3.util.equals(ProxyResponse, a, b)
|
|
183
|
+
}
|
|
184
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// eslint-disable-next-line check-file/no-index
|
|
2
|
+
export { ConversionProxyService } from '@luxfi/api/src/clients/conversionTracking/api_connect'
|
|
3
|
+
export { Header, ProxyRequest, ProxyResponse } from '@luxfi/api/src/clients/conversionTracking/api_pb'
|
|
4
|
+
export { proxy } from '@luxfi/api/src/clients/conversionTracking/api-ConversionProxyService_connectquery'
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { FetchClient } from '@luxfi/api/src/clients/base/types'
|
|
2
|
+
import { logger } from '@luxfi/utilities/src/logger/logger'
|
|
3
|
+
|
|
4
|
+
export const DATA_SERVICE_API_PATHS = {
|
|
5
|
+
report: '/SubmitReport',
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface DataServiceApiClientContext {
|
|
9
|
+
fetchClient: FetchClient
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface DataServiceApiClient {
|
|
13
|
+
submitTokenReport: (params: SubmitTokenReportParams) => Promise<void>
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function createDataServiceApiClient(ctx: DataServiceApiClientContext): DataServiceApiClient {
|
|
17
|
+
const { fetchClient } = ctx
|
|
18
|
+
return {
|
|
19
|
+
submitTokenReport: (params: SubmitTokenReportParams) => submitTokenReport({ ...params, fetchClient }),
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Defines the types of events that can be reported for a token.
|
|
25
|
+
*/
|
|
26
|
+
export enum TokenReportEventType {
|
|
27
|
+
// Reported when a token/NFT is spam but not marked as such.
|
|
28
|
+
FalseNegative = 'TOKEN_REPORT_EVENT_TYPE_FALSE_NEGATIVE',
|
|
29
|
+
// Reported when a token/NFT is marked as spam but is not.
|
|
30
|
+
FalsePositive = 'TOKEN_REPORT_EVENT_TYPE_FALSE_POSITIVE',
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export enum ReportAssetType {
|
|
34
|
+
Token = 'Token',
|
|
35
|
+
NFT = 'NFT',
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
interface SubmitReportRequestBody {
|
|
39
|
+
chainId: number
|
|
40
|
+
address: string
|
|
41
|
+
event: TokenReportEventType
|
|
42
|
+
details: string
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
interface SubmitTokenReportParams {
|
|
46
|
+
chainId: number
|
|
47
|
+
address: string
|
|
48
|
+
event: TokenReportEventType
|
|
49
|
+
assetType: ReportAssetType
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
interface SubmitReportResponse {
|
|
53
|
+
success: boolean
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const ASSET_TO_REPORT_STRING = {
|
|
57
|
+
[ReportAssetType.Token]: 'User reported as a spam token',
|
|
58
|
+
[ReportAssetType.NFT]: 'User reported as a spam NFT',
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Submits a report about a token (e.g., marking spam or correcting a false spam flag).
|
|
63
|
+
* @param chainId The chain ID where the token resides.
|
|
64
|
+
* @param address The address of the token contract.
|
|
65
|
+
* @param event The type of report event (FalseNegative or FalsePositive).
|
|
66
|
+
*/
|
|
67
|
+
async function submitTokenReport({
|
|
68
|
+
chainId,
|
|
69
|
+
address,
|
|
70
|
+
event,
|
|
71
|
+
assetType,
|
|
72
|
+
fetchClient,
|
|
73
|
+
}: SubmitTokenReportParams & { fetchClient: FetchClient }): Promise<void> {
|
|
74
|
+
const requestBody: SubmitReportRequestBody = {
|
|
75
|
+
chainId,
|
|
76
|
+
address,
|
|
77
|
+
event,
|
|
78
|
+
details: ASSET_TO_REPORT_STRING[assetType],
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
try {
|
|
82
|
+
logger.debug('DataApiClient', 'submitTokenReport', `Submitting report: ${JSON.stringify(requestBody)}`)
|
|
83
|
+
|
|
84
|
+
const responseData = await fetchClient.post<SubmitReportResponse>(DATA_SERVICE_API_PATHS.report, {
|
|
85
|
+
body: JSON.stringify(requestBody),
|
|
86
|
+
})
|
|
87
|
+
|
|
88
|
+
if (!responseData.success) {
|
|
89
|
+
throw new Error('API Error: Report submission indicated failure')
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
logger.debug('DataApiClient', 'submitTokenReport', 'Report submitted successfully')
|
|
93
|
+
} catch (error) {
|
|
94
|
+
logger.error(error, {
|
|
95
|
+
tags: { file: 'createDataServiceApiClient.ts', function: 'submitTokenReport' },
|
|
96
|
+
extra: { url: `${fetchClient.context().baseUrl}${DATA_SERVICE_API_PATHS.report}`, requestBody },
|
|
97
|
+
})
|
|
98
|
+
// Re-throw the error caught from createApiClient or handle it
|
|
99
|
+
throw error
|
|
100
|
+
}
|
|
101
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type PartialMessage } from '@bufbuild/protobuf'
|
|
2
|
+
import { type PromiseClient } from '@connectrpc/connect'
|
|
3
|
+
import { type DataApiService } from '@uniswap/client-data-api/dist/data/v1/api_connect'
|
|
4
|
+
import type {
|
|
5
|
+
GetPortfolioRequest,
|
|
6
|
+
GetPortfolioResponse,
|
|
7
|
+
ListTopPoolsRequest,
|
|
8
|
+
ListTopPoolsResponse,
|
|
9
|
+
ListTopTokensRequest,
|
|
10
|
+
ListTopTokensResponse,
|
|
11
|
+
} from '@uniswap/client-data-api/dist/data/v1/api_pb'
|
|
12
|
+
|
|
13
|
+
export interface DataApiServiceClientContext {
|
|
14
|
+
rpcClient: PromiseClient<typeof DataApiService>
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface DataApiServiceClient {
|
|
18
|
+
getPortfolio: (params: PartialMessage<GetPortfolioRequest>) => Promise<GetPortfolioResponse>
|
|
19
|
+
listTopTokens: (params: PartialMessage<ListTopTokensRequest>) => Promise<ListTopTokensResponse>
|
|
20
|
+
listTopPools: (params: PartialMessage<ListTopPoolsRequest>) => Promise<ListTopPoolsResponse>
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function createDataApiServiceClient({ rpcClient }: DataApiServiceClientContext): DataApiServiceClient {
|
|
24
|
+
return {
|
|
25
|
+
getPortfolio: (params): Promise<GetPortfolioResponse> => rpcClient.getPortfolio(params),
|
|
26
|
+
listTopTokens: (params): Promise<ListTopTokensResponse> => rpcClient.listTopTokens(params),
|
|
27
|
+
listTopPools: (params): Promise<ListTopPoolsResponse> => rpcClient.listTopPools(params),
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import type { GetPortfolioResponse } from '@uniswap/client-data-api/dist/data/v1/api_pb'
|
|
2
|
+
import type { DataApiServiceClient } from '@luxexchange/api/src/clients/dataApi/createDataApiServiceClient'
|
|
3
|
+
import { getGetPortfolioQueryOptions } from '@luxexchange/api/src/clients/dataApi/getGetPortfolioQueryOptions'
|
|
4
|
+
import { ReactQueryCacheKey } from '@luxfi/utilities/src/reactQuery/cache'
|
|
5
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
6
|
+
|
|
7
|
+
describe('getGetPortfolioQueryOptions', () => {
|
|
8
|
+
let mockClient: DataApiServiceClient
|
|
9
|
+
|
|
10
|
+
const createMockResponse = (): GetPortfolioResponse => ({ portfolio: undefined }) as unknown as GetPortfolioResponse
|
|
11
|
+
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
mockClient = {
|
|
14
|
+
getPortfolio: vi.fn().mockResolvedValue(createMockResponse()),
|
|
15
|
+
listTopTokens: vi.fn(),
|
|
16
|
+
listTopPools: vi.fn(),
|
|
17
|
+
}
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
describe('queryKey', () => {
|
|
21
|
+
it('uses GetPortfolio cache key and address key for evmAddress only', () => {
|
|
22
|
+
const options = getGetPortfolioQueryOptions(mockClient, {
|
|
23
|
+
input: { evmAddress: '0xabc', chainIds: [1] },
|
|
24
|
+
})
|
|
25
|
+
expect(options.queryKey).toEqual([
|
|
26
|
+
ReactQueryCacheKey.GetPortfolio,
|
|
27
|
+
{ evmAddress: '0xabc' },
|
|
28
|
+
expect.objectContaining({ chainIds: [1] }),
|
|
29
|
+
])
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
it('uses GetPortfolio cache key and address key for svmAddress only', () => {
|
|
33
|
+
const options = getGetPortfolioQueryOptions(mockClient, {
|
|
34
|
+
input: { svmAddress: 'solana-address', chainIds: [1] },
|
|
35
|
+
})
|
|
36
|
+
expect(options.queryKey).toEqual([
|
|
37
|
+
ReactQueryCacheKey.GetPortfolio,
|
|
38
|
+
{ svmAddress: 'solana-address' },
|
|
39
|
+
expect.objectContaining({ chainIds: [1] }),
|
|
40
|
+
])
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
it('includes both evmAddress and svmAddress in address key when provided', () => {
|
|
44
|
+
const options = getGetPortfolioQueryOptions(mockClient, {
|
|
45
|
+
input: { evmAddress: '0xabc', svmAddress: 'solana', chainIds: [1] },
|
|
46
|
+
})
|
|
47
|
+
expect(options.queryKey[0]).toBe(ReactQueryCacheKey.GetPortfolio)
|
|
48
|
+
expect(options.queryKey[1]).toEqual({ evmAddress: '0xabc', svmAddress: 'solana' })
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
it('sorts chainIds in query key for stable cache key', () => {
|
|
52
|
+
const options = getGetPortfolioQueryOptions(mockClient, {
|
|
53
|
+
input: { evmAddress: '0xabc', chainIds: [3, 1, 2] },
|
|
54
|
+
})
|
|
55
|
+
const cacheInputs = options.queryKey[2] as { chainIds?: number[] }
|
|
56
|
+
expect(cacheInputs['chainIds']).toEqual([1, 2, 3])
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
it('produces same query key for same logical input regardless of chainIds order', () => {
|
|
60
|
+
const options1 = getGetPortfolioQueryOptions(mockClient, {
|
|
61
|
+
input: { evmAddress: '0xabc', chainIds: [3, 1, 2] },
|
|
62
|
+
})
|
|
63
|
+
const options2 = getGetPortfolioQueryOptions(mockClient, {
|
|
64
|
+
input: { evmAddress: '0xabc', chainIds: [2, 1, 3] },
|
|
65
|
+
})
|
|
66
|
+
expect(options1.queryKey).toEqual(options2.queryKey)
|
|
67
|
+
})
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
describe('queryFn', () => {
|
|
71
|
+
it('returns undefined when input is undefined', async () => {
|
|
72
|
+
const options = getGetPortfolioQueryOptions(mockClient, {})
|
|
73
|
+
const result = await options.queryFn?.({ queryKey: options.queryKey } as unknown as Parameters<
|
|
74
|
+
NonNullable<typeof options.queryFn>
|
|
75
|
+
>[0])
|
|
76
|
+
expect(result).toBeUndefined()
|
|
77
|
+
expect(mockClient.getPortfolio).not.toHaveBeenCalled()
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
it('calls client.getPortfolio with transformed input (walletAccount) and returns response', async () => {
|
|
81
|
+
const options = getGetPortfolioQueryOptions(mockClient, {
|
|
82
|
+
input: { evmAddress: '0x123', chainIds: [1] },
|
|
83
|
+
})
|
|
84
|
+
const result = await options.queryFn?.({ queryKey: options.queryKey } as unknown as Parameters<
|
|
85
|
+
NonNullable<typeof options.queryFn>
|
|
86
|
+
>[0])
|
|
87
|
+
expect(mockClient.getPortfolio).toHaveBeenCalledTimes(1)
|
|
88
|
+
const callArg = (mockClient.getPortfolio as ReturnType<typeof vi.fn>).mock.calls[0][0]
|
|
89
|
+
expect(callArg).toHaveProperty('walletAccount')
|
|
90
|
+
expect(callArg.walletAccount).toHaveProperty('platformAddresses')
|
|
91
|
+
expect(callArg.walletAccount.platformAddresses).toHaveLength(1)
|
|
92
|
+
expect(callArg.walletAccount.platformAddresses[0]).toMatchObject({ address: '0x123' })
|
|
93
|
+
expect(callArg).toMatchObject({ chainIds: [1] })
|
|
94
|
+
expect(result).toEqual(createMockResponse())
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
it('includes svmAddress in walletAccount when provided', async () => {
|
|
98
|
+
const options = getGetPortfolioQueryOptions(mockClient, {
|
|
99
|
+
input: { svmAddress: 'svm-addr', chainIds: [1] },
|
|
100
|
+
})
|
|
101
|
+
await options.queryFn?.({ queryKey: options.queryKey } as unknown as Parameters<
|
|
102
|
+
NonNullable<typeof options.queryFn>
|
|
103
|
+
>[0])
|
|
104
|
+
const callArg = (mockClient.getPortfolio as ReturnType<typeof vi.fn>).mock.calls[0][0]
|
|
105
|
+
const svmEntry = callArg.walletAccount.platformAddresses.find(
|
|
106
|
+
(p: { address: string }) => p.address === 'svm-addr',
|
|
107
|
+
)
|
|
108
|
+
expect(svmEntry).toBeDefined()
|
|
109
|
+
})
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
describe('options', () => {
|
|
113
|
+
it('placeholderData returns previous data', () => {
|
|
114
|
+
const options = getGetPortfolioQueryOptions(mockClient, { input: { evmAddress: '0x' } })
|
|
115
|
+
expect(options.placeholderData).toBeDefined()
|
|
116
|
+
const prev = createMockResponse()
|
|
117
|
+
expect(
|
|
118
|
+
(options.placeholderData as (prev: GetPortfolioResponse | undefined) => GetPortfolioResponse | undefined)(prev),
|
|
119
|
+
).toBe(prev)
|
|
120
|
+
})
|
|
121
|
+
})
|
|
122
|
+
})
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { type PartialMessage } from '@bufbuild/protobuf'
|
|
2
|
+
import { queryOptions } from '@tanstack/react-query'
|
|
3
|
+
import type { GetPortfolioRequest, GetPortfolioResponse } from '@uniswap/client-data-api/dist/data/v1/api_pb'
|
|
4
|
+
import { type DataApiServiceClient } from '@luxexchange/api/src/clients/dataApi/createDataApiServiceClient'
|
|
5
|
+
import { transformInput, type WithoutWalletAccount } from '@luxexchange/api/src/connectRpc/utils'
|
|
6
|
+
import { ReactQueryCacheKey } from '@luxfi/utilities/src/reactQuery/cache'
|
|
7
|
+
import { type QueryOptionsResult } from '@luxfi/utilities/src/reactQuery/queryOptions'
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Sorts `chainIds` in a query cache inputs object so that the same logical input
|
|
11
|
+
* produces a stable cache key regardless of array order.
|
|
12
|
+
*/
|
|
13
|
+
function isNumberArray(arr: unknown): arr is number[] {
|
|
14
|
+
return Array.isArray(arr) && arr.every((id): id is number => typeof id === 'number')
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function sortQueryCacheInputs(inputs: Record<string, unknown>): Record<string, unknown> {
|
|
18
|
+
const result = { ...inputs }
|
|
19
|
+
if (isNumberArray(result['chainIds'])) {
|
|
20
|
+
result['chainIds'] = [...result['chainIds']].sort((a, b) => a - b)
|
|
21
|
+
}
|
|
22
|
+
return result
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** Input used to build queryKey and queryFn. Config (enabled, refetchInterval, select) is applied by the caller. */
|
|
26
|
+
export type GetPortfolioQueryParams = {
|
|
27
|
+
input?: WithoutWalletAccount<PartialMessage<GetPortfolioRequest>> & {
|
|
28
|
+
evmAddress?: string
|
|
29
|
+
svmAddress?: string
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
type GetPortfolioQueryKey = readonly [
|
|
34
|
+
ReactQueryCacheKey.GetPortfolio,
|
|
35
|
+
{ evmAddress?: string; svmAddress?: string },
|
|
36
|
+
Record<string, unknown>,
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Returns React Query options for DataApiService GetPortfolio (queryKey, queryFn, placeholderData only).
|
|
41
|
+
* Callers should merge in config (enabled, refetchInterval, select) when building the final options.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* const client = createDataApiServiceClient({ rpcClient: createPromiseClient(DataApiService, transport) })
|
|
45
|
+
* const baseOptions = getGetPortfolioQueryOptions(client, { input: { evmAddress, chainIds } })
|
|
46
|
+
* const { data } = useQuery({ ...baseOptions, enabled, select })
|
|
47
|
+
*/
|
|
48
|
+
export function getGetPortfolioQueryOptions(
|
|
49
|
+
client: DataApiServiceClient,
|
|
50
|
+
{ input }: GetPortfolioQueryParams,
|
|
51
|
+
): QueryOptionsResult<GetPortfolioResponse | undefined, Error, GetPortfolioResponse | undefined, GetPortfolioQueryKey> {
|
|
52
|
+
const transformedInput = transformInput(input)
|
|
53
|
+
|
|
54
|
+
const { modifier: _modifier, walletAccount: _walletAccount, ...queryCacheInputs } = transformedInput ?? {}
|
|
55
|
+
|
|
56
|
+
const queryCacheInputsSorted = sortQueryCacheInputs(queryCacheInputs)
|
|
57
|
+
|
|
58
|
+
const addressKey = {
|
|
59
|
+
...(input?.evmAddress && { evmAddress: input.evmAddress }),
|
|
60
|
+
...(input?.svmAddress && { svmAddress: input.svmAddress }),
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return queryOptions({
|
|
64
|
+
queryKey: [ReactQueryCacheKey.GetPortfolio, addressKey, queryCacheInputsSorted] as const,
|
|
65
|
+
queryFn: async (): Promise<GetPortfolioResponse | undefined> => {
|
|
66
|
+
if (!transformedInput) {
|
|
67
|
+
return undefined
|
|
68
|
+
}
|
|
69
|
+
const response: GetPortfolioResponse = await client.getPortfolio(
|
|
70
|
+
transformedInput as PartialMessage<GetPortfolioRequest>,
|
|
71
|
+
)
|
|
72
|
+
return response
|
|
73
|
+
},
|
|
74
|
+
placeholderData: (prev: GetPortfolioResponse | undefined) => prev,
|
|
75
|
+
})
|
|
76
|
+
}
|