@lifi/perps-sdk 0.2.0-alpha.0 → 1.0.1
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/README.md +21 -47
- package/dist/cjs/client/PerpsClient.d.ts +27 -48
- package/dist/cjs/client/PerpsClient.d.ts.map +1 -1
- package/dist/cjs/client/PerpsClient.js +119 -578
- package/dist/cjs/client/PerpsClient.js.map +1 -1
- package/dist/cjs/client/bindProvider.d.ts +3 -0
- package/dist/cjs/client/bindProvider.d.ts.map +1 -0
- package/dist/cjs/client/bindProvider.js +9 -0
- package/dist/cjs/client/bindProvider.js.map +1 -0
- package/dist/cjs/client/createPerpsClient.d.ts +7 -38
- package/dist/cjs/client/createPerpsClient.d.ts.map +1 -1
- package/dist/cjs/client/createPerpsClient.js +25 -8
- package/dist/cjs/client/createPerpsClient.js.map +1 -1
- package/dist/cjs/client/requireProvider.d.ts +3 -0
- package/dist/cjs/client/requireProvider.d.ts.map +1 -0
- package/dist/cjs/client/requireProvider.js +16 -0
- package/dist/cjs/client/requireProvider.js.map +1 -0
- package/dist/cjs/errors/PerpsError.d.ts.map +1 -1
- package/dist/cjs/errors/PerpsError.js.map +1 -1
- package/dist/cjs/errors/constants.d.ts +2 -2
- package/dist/cjs/errors/constants.d.ts.map +1 -1
- package/dist/cjs/errors/constants.js +2 -2
- package/dist/cjs/errors/constants.js.map +1 -1
- package/dist/cjs/index.d.ts +41 -23
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +73 -41
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/registry/assetRegistry.d.ts +11 -0
- package/dist/cjs/registry/assetRegistry.d.ts.map +1 -0
- package/dist/cjs/registry/assetRegistry.js +39 -0
- package/dist/cjs/registry/assetRegistry.js.map +1 -0
- package/dist/cjs/registry/marketRegistry.d.ts +13 -0
- package/dist/cjs/registry/marketRegistry.d.ts.map +1 -0
- package/dist/cjs/registry/marketRegistry.js +58 -0
- package/dist/cjs/registry/marketRegistry.js.map +1 -0
- package/dist/cjs/registry/referenceDataRegistry.d.ts +20 -0
- package/dist/cjs/registry/referenceDataRegistry.d.ts.map +1 -0
- package/dist/cjs/registry/referenceDataRegistry.js +59 -0
- package/dist/cjs/registry/referenceDataRegistry.js.map +1 -0
- package/dist/cjs/services/createAction.d.ts +4 -2
- package/dist/cjs/services/createAction.d.ts.map +1 -1
- package/dist/cjs/services/createAction.js +1 -1
- package/dist/cjs/services/createAction.js.map +1 -1
- package/dist/cjs/services/executeAction.d.ts +4 -2
- package/dist/cjs/services/executeAction.d.ts.map +1 -1
- package/dist/cjs/services/executeAction.js +2 -1
- package/dist/cjs/services/executeAction.js.map +1 -1
- package/dist/cjs/services/getAccount.d.ts +4 -2
- package/dist/cjs/services/getAccount.d.ts.map +1 -1
- package/dist/cjs/services/getAccount.js +2 -6
- package/dist/cjs/services/getAccount.js.map +1 -1
- package/dist/cjs/services/getActivity.d.ts +4 -2
- package/dist/cjs/services/getActivity.d.ts.map +1 -1
- package/dist/cjs/services/getActivity.js +4 -10
- package/dist/cjs/services/getActivity.js.map +1 -1
- package/dist/cjs/services/getAssets.d.ts +2 -1
- package/dist/cjs/services/getAssets.d.ts.map +1 -1
- package/dist/cjs/services/getAssets.js +1 -1
- package/dist/cjs/services/getAssets.js.map +1 -1
- package/dist/cjs/services/getFills.d.ts +4 -2
- package/dist/cjs/services/getFills.d.ts.map +1 -1
- package/dist/cjs/services/getFills.js +3 -5
- package/dist/cjs/services/getFills.js.map +1 -1
- package/dist/cjs/services/getMarket.d.ts +9 -0
- package/dist/cjs/services/getMarket.d.ts.map +1 -0
- package/dist/cjs/services/getMarket.js +13 -0
- package/dist/cjs/services/getMarket.js.map +1 -0
- package/dist/cjs/services/getMarkets.d.ts +9 -0
- package/dist/cjs/services/getMarkets.d.ts.map +1 -0
- package/dist/cjs/services/{getAsset.js → getMarkets.js} +6 -5
- package/dist/cjs/services/getMarkets.js.map +1 -0
- package/dist/cjs/services/getMeta.d.ts +5 -0
- package/dist/cjs/services/getMeta.d.ts.map +1 -0
- package/dist/cjs/services/getMeta.js +8 -0
- package/dist/cjs/services/getMeta.js.map +1 -0
- package/dist/cjs/services/getOhlcv.d.ts +3 -2
- package/dist/cjs/services/getOhlcv.d.ts.map +1 -1
- package/dist/cjs/services/getOhlcv.js +3 -2
- package/dist/cjs/services/getOhlcv.js.map +1 -1
- package/dist/cjs/services/getOrder.d.ts +4 -2
- package/dist/cjs/services/getOrder.d.ts.map +1 -1
- package/dist/cjs/services/getOrder.js +2 -6
- package/dist/cjs/services/getOrder.js.map +1 -1
- package/dist/cjs/services/getOrderbook.d.ts +3 -2
- package/dist/cjs/services/getOrderbook.d.ts.map +1 -1
- package/dist/cjs/services/getOrderbook.js +3 -2
- package/dist/cjs/services/getOrderbook.js.map +1 -1
- package/dist/cjs/services/getOrders.d.ts +5 -3
- package/dist/cjs/services/getOrders.d.ts.map +1 -1
- package/dist/cjs/services/getOrders.js +6 -8
- package/dist/cjs/services/getOrders.js.map +1 -1
- package/dist/cjs/services/getPositions.d.ts +5 -3
- package/dist/cjs/services/getPositions.d.ts.map +1 -1
- package/dist/cjs/services/getPositions.js +6 -8
- package/dist/cjs/services/getPositions.js.map +1 -1
- package/dist/cjs/services/getPrices.d.ts +3 -2
- package/dist/cjs/services/getPrices.d.ts.map +1 -1
- package/dist/cjs/services/getPrices.js +2 -2
- package/dist/cjs/services/getPrices.js.map +1 -1
- package/dist/cjs/services/getProviders.d.ts +2 -1
- package/dist/cjs/services/getProviders.d.ts.map +1 -1
- package/dist/cjs/services/getProviders.js +1 -1
- package/dist/cjs/services/getProviders.js.map +1 -1
- package/dist/cjs/services/getQuote.d.ts +12 -0
- package/dist/cjs/services/getQuote.d.ts.map +1 -0
- package/dist/cjs/services/getQuote.js +13 -0
- package/dist/cjs/services/getQuote.js.map +1 -0
- package/dist/cjs/services/getTermsAcceptance.d.ts +6 -0
- package/dist/cjs/services/getTermsAcceptance.d.ts.map +1 -0
- package/dist/cjs/services/getTermsAcceptance.js +9 -0
- package/dist/cjs/services/getTermsAcceptance.js.map +1 -0
- package/dist/cjs/services/resolveQuote.d.ts +7 -0
- package/dist/cjs/services/resolveQuote.d.ts.map +1 -0
- package/dist/cjs/services/resolveQuote.js +50 -0
- package/dist/cjs/services/resolveQuote.js.map +1 -0
- package/dist/cjs/services/resolveSubscribeQuote.d.ts +6 -0
- package/dist/cjs/services/resolveSubscribeQuote.d.ts.map +1 -0
- package/dist/cjs/services/resolveSubscribeQuote.js +65 -0
- package/dist/cjs/services/resolveSubscribeQuote.js.map +1 -0
- package/dist/cjs/storage/parseStoredRecord.d.ts +4 -0
- package/dist/cjs/storage/parseStoredRecord.d.ts.map +1 -0
- package/dist/cjs/storage/parseStoredRecord.js +26 -0
- package/dist/cjs/storage/parseStoredRecord.js.map +1 -0
- package/dist/cjs/storage/storage.d.ts.map +1 -0
- package/dist/cjs/storage/storage.js.map +1 -0
- package/dist/cjs/{agent → storage}/types.d.ts +0 -5
- package/dist/cjs/storage/types.d.ts.map +1 -0
- package/dist/cjs/{agent → storage}/types.js.map +1 -1
- package/dist/cjs/transport/fetchWithRetry.d.ts +8 -0
- package/dist/cjs/transport/fetchWithRetry.d.ts.map +1 -0
- package/dist/cjs/transport/fetchWithRetry.js +81 -0
- package/dist/cjs/transport/fetchWithRetry.js.map +1 -0
- package/dist/cjs/{utils → transport}/request.d.ts +3 -2
- package/dist/cjs/transport/request.d.ts.map +1 -0
- package/dist/cjs/{utils → transport}/request.js +14 -14
- package/dist/cjs/transport/request.js.map +1 -0
- package/dist/cjs/transport/retryPolicy.d.ts +37 -0
- package/dist/cjs/transport/retryPolicy.d.ts.map +1 -0
- package/dist/cjs/transport/retryPolicy.js +79 -0
- package/dist/cjs/transport/retryPolicy.js.map +1 -0
- package/dist/cjs/types/api.d.ts +85 -0
- package/dist/cjs/types/api.d.ts.map +1 -0
- package/dist/cjs/{realtime/lighter/types.js → types/api.js} +1 -1
- package/dist/cjs/types/api.js.map +1 -0
- package/dist/cjs/types/config.d.ts +26 -0
- package/dist/cjs/types/config.d.ts.map +1 -0
- package/dist/cjs/{realtime/types.js → types/config.js} +1 -1
- package/dist/cjs/types/config.js.map +1 -0
- package/dist/cjs/types/provider.d.ts +84 -0
- package/dist/cjs/types/provider.d.ts.map +1 -0
- package/dist/cjs/types/provider.js +3 -0
- package/dist/cjs/types/provider.js.map +1 -0
- package/dist/cjs/utils/accountSummary.d.ts +2 -8
- package/dist/cjs/utils/accountSummary.d.ts.map +1 -1
- package/dist/cjs/utils/accountSummary.js +12 -70
- package/dist/cjs/utils/accountSummary.js.map +1 -1
- package/dist/cjs/utils/assertNever.d.ts.map +1 -1
- package/dist/cjs/utils/assertNever.js.map +1 -1
- package/dist/cjs/utils/calculations.d.ts +36 -0
- package/dist/cjs/utils/calculations.d.ts.map +1 -1
- package/dist/cjs/utils/calculations.js +77 -0
- package/dist/cjs/utils/calculations.js.map +1 -1
- package/dist/cjs/utils/depositChain.d.ts +6 -0
- package/dist/cjs/utils/depositChain.d.ts.map +1 -0
- package/dist/cjs/utils/depositChain.js +13 -0
- package/dist/cjs/utils/depositChain.js.map +1 -0
- package/dist/cjs/utils/explorer.d.ts +9 -0
- package/dist/cjs/utils/explorer.d.ts.map +1 -0
- package/dist/cjs/utils/explorer.js +23 -0
- package/dist/cjs/utils/explorer.js.map +1 -0
- package/dist/cjs/utils/fillClassification.d.ts +3 -0
- package/dist/cjs/utils/fillClassification.d.ts.map +1 -0
- package/dist/cjs/utils/fillClassification.js +37 -0
- package/dist/cjs/utils/fillClassification.js.map +1 -0
- package/dist/cjs/utils/format.d.ts +13 -0
- package/dist/cjs/utils/format.d.ts.map +1 -0
- package/dist/cjs/utils/format.js +117 -0
- package/dist/cjs/utils/format.js.map +1 -0
- package/dist/cjs/utils/orderClassification.d.ts +3 -1
- package/dist/cjs/utils/orderClassification.d.ts.map +1 -1
- package/dist/cjs/utils/orderClassification.js +11 -1
- package/dist/cjs/utils/orderClassification.js.map +1 -1
- package/dist/cjs/utils/orderMath.d.ts +1 -1
- package/dist/cjs/utils/orderMath.d.ts.map +1 -1
- package/dist/cjs/utils/orderMath.js +2 -2
- package/dist/cjs/utils/orderMath.js.map +1 -1
- package/dist/cjs/utils/parse.d.ts.map +1 -1
- package/dist/cjs/utils/parse.js.map +1 -1
- package/dist/cjs/utils/positionMath.d.ts +6 -0
- package/dist/cjs/utils/positionMath.d.ts.map +1 -1
- package/dist/cjs/utils/positionMath.js +14 -0
- package/dist/cjs/utils/positionMath.js.map +1 -1
- package/dist/cjs/utils/signTypedData.d.ts +3 -3
- package/dist/cjs/utils/signTypedData.d.ts.map +1 -1
- package/dist/cjs/utils/signTypedData.js +3 -2
- package/dist/cjs/utils/signTypedData.js.map +1 -1
- package/dist/cjs/utils/sleep.d.ts.map +1 -1
- package/dist/cjs/utils/sleep.js.map +1 -1
- package/dist/cjs/utils/units.d.ts.map +1 -1
- package/dist/cjs/utils/units.js.map +1 -1
- package/dist/cjs/utils/validation.d.ts.map +1 -1
- package/dist/cjs/utils/validation.js.map +1 -1
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.d.ts.map +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/cjs/version.js.map +1 -1
- package/dist/cjs/websocket/PerpsWsClient.d.ts +27 -0
- package/dist/cjs/websocket/PerpsWsClient.d.ts.map +1 -0
- package/dist/cjs/websocket/PerpsWsClient.js +84 -0
- package/dist/cjs/websocket/PerpsWsClient.js.map +1 -0
- package/dist/{types/realtime → cjs/websocket}/ReconnectingWebSocket.d.ts +23 -7
- package/dist/cjs/websocket/ReconnectingWebSocket.d.ts.map +1 -0
- package/dist/cjs/websocket/ReconnectingWebSocket.js +213 -0
- package/dist/cjs/websocket/ReconnectingWebSocket.js.map +1 -0
- package/dist/cjs/websocket/WsProviderBase.d.ts +31 -0
- package/dist/cjs/websocket/WsProviderBase.d.ts.map +1 -0
- package/dist/cjs/websocket/WsProviderBase.js +197 -0
- package/dist/cjs/websocket/WsProviderBase.js.map +1 -0
- package/dist/cjs/websocket/cachePromise.d.ts +2 -0
- package/dist/cjs/websocket/cachePromise.d.ts.map +1 -0
- package/dist/cjs/websocket/cachePromise.js +18 -0
- package/dist/cjs/websocket/cachePromise.js.map +1 -0
- package/dist/cjs/websocket/types.d.ts +15 -0
- package/dist/cjs/websocket/types.d.ts.map +1 -0
- package/dist/cjs/{realtime → websocket}/types.js.map +1 -1
- package/dist/cjs/websocket/wsLog.d.ts +10 -0
- package/dist/cjs/websocket/wsLog.d.ts.map +1 -0
- package/dist/cjs/websocket/wsLog.js +31 -0
- package/dist/cjs/websocket/wsLog.js.map +1 -0
- package/dist/esm/client/PerpsClient.d.ts +200 -195
- package/dist/esm/client/PerpsClient.d.ts.map +1 -1
- package/dist/esm/client/PerpsClient.js +305 -794
- package/dist/esm/client/PerpsClient.js.map +1 -1
- package/dist/esm/client/bindProvider.d.ts +13 -0
- package/dist/esm/client/bindProvider.d.ts.map +1 -0
- package/dist/esm/client/bindProvider.js +16 -0
- package/dist/esm/client/bindProvider.js.map +1 -0
- package/dist/esm/client/createPerpsClient.d.ts +34 -53
- package/dist/esm/client/createPerpsClient.d.ts.map +1 -1
- package/dist/esm/client/createPerpsClient.js +51 -8
- package/dist/esm/client/createPerpsClient.js.map +1 -1
- package/dist/esm/client/requireProvider.d.ts +12 -0
- package/dist/esm/client/requireProvider.d.ts.map +1 -0
- package/dist/esm/client/requireProvider.js +22 -0
- package/dist/esm/client/requireProvider.js.map +1 -0
- package/dist/esm/errors/PerpsError.d.ts +8 -0
- package/dist/esm/errors/PerpsError.d.ts.map +1 -1
- package/dist/esm/errors/PerpsError.js +8 -0
- package/dist/esm/errors/PerpsError.js.map +1 -1
- package/dist/esm/errors/constants.d.ts +8 -2
- package/dist/esm/errors/constants.d.ts.map +1 -1
- package/dist/esm/errors/constants.js +8 -2
- package/dist/esm/errors/constants.js.map +1 -1
- package/dist/esm/index.d.ts +49 -23
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +38 -23
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/registry/assetRegistry.d.ts +25 -0
- package/dist/esm/registry/assetRegistry.d.ts.map +1 -0
- package/dist/esm/registry/assetRegistry.js +48 -0
- package/dist/esm/registry/assetRegistry.js.map +1 -0
- package/dist/esm/registry/marketRegistry.d.ts +42 -0
- package/dist/esm/registry/marketRegistry.d.ts.map +1 -0
- package/dist/esm/registry/marketRegistry.js +81 -0
- package/dist/esm/registry/marketRegistry.js.map +1 -0
- package/dist/esm/registry/referenceDataRegistry.d.ts +44 -0
- package/dist/esm/registry/referenceDataRegistry.d.ts.map +1 -0
- package/dist/esm/registry/referenceDataRegistry.js +79 -0
- package/dist/esm/registry/referenceDataRegistry.js.map +1 -0
- package/dist/esm/services/createAction.d.ts +17 -2
- package/dist/esm/services/createAction.d.ts.map +1 -1
- package/dist/esm/services/createAction.js +9 -1
- package/dist/esm/services/createAction.js.map +1 -1
- package/dist/esm/services/executeAction.d.ts +17 -2
- package/dist/esm/services/executeAction.d.ts.map +1 -1
- package/dist/esm/services/executeAction.js +13 -1
- package/dist/esm/services/executeAction.js.map +1 -1
- package/dist/esm/services/getAccount.d.ts +19 -16
- package/dist/esm/services/getAccount.d.ts.map +1 -1
- package/dist/esm/services/getAccount.js +12 -18
- package/dist/esm/services/getAccount.js.map +1 -1
- package/dist/esm/services/getActivity.d.ts +15 -25
- package/dist/esm/services/getActivity.d.ts.map +1 -1
- package/dist/esm/services/getActivity.js +10 -28
- package/dist/esm/services/getActivity.js.map +1 -1
- package/dist/esm/services/getAssets.d.ts +14 -5
- package/dist/esm/services/getAssets.d.ts.map +1 -1
- package/dist/esm/services/getAssets.js +8 -4
- package/dist/esm/services/getAssets.js.map +1 -1
- package/dist/esm/services/getFills.d.ts +18 -29
- package/dist/esm/services/getFills.d.ts.map +1 -1
- package/dist/esm/services/getFills.js +10 -26
- package/dist/esm/services/getFills.js.map +1 -1
- package/dist/esm/services/getMarket.d.ts +34 -0
- package/dist/esm/services/getMarket.d.ts.map +1 -0
- package/dist/esm/services/getMarket.js +25 -0
- package/dist/esm/services/getMarket.js.map +1 -0
- package/dist/esm/services/getMarkets.d.ts +28 -0
- package/dist/esm/services/getMarkets.d.ts.map +1 -0
- package/dist/esm/services/getMarkets.js +22 -0
- package/dist/esm/services/getMarkets.js.map +1 -0
- package/dist/esm/services/getMeta.d.ts +19 -0
- package/dist/esm/services/getMeta.d.ts.map +1 -0
- package/dist/esm/services/getMeta.js +19 -0
- package/dist/esm/services/getMeta.js.map +1 -0
- package/dist/esm/services/getOhlcv.d.ts +15 -19
- package/dist/esm/services/getOhlcv.d.ts.map +1 -1
- package/dist/esm/services/getOhlcv.js +7 -13
- package/dist/esm/services/getOhlcv.js.map +1 -1
- package/dist/esm/services/getOrder.d.ts +16 -16
- package/dist/esm/services/getOrder.d.ts.map +1 -1
- package/dist/esm/services/getOrder.js +9 -17
- package/dist/esm/services/getOrder.js.map +1 -1
- package/dist/esm/services/getOrderbook.d.ts +13 -23
- package/dist/esm/services/getOrderbook.d.ts.map +1 -1
- package/dist/esm/services/getOrderbook.js +7 -21
- package/dist/esm/services/getOrderbook.js.map +1 -1
- package/dist/esm/services/getOrders.d.ts +17 -9
- package/dist/esm/services/getOrders.d.ts.map +1 -1
- package/dist/esm/services/getOrders.js +12 -9
- package/dist/esm/services/getOrders.js.map +1 -1
- package/dist/esm/services/getPositions.d.ts +17 -9
- package/dist/esm/services/getPositions.d.ts.map +1 -1
- package/dist/esm/services/getPositions.js +12 -9
- package/dist/esm/services/getPositions.js.map +1 -1
- package/dist/esm/services/getPrices.d.ts +12 -24
- package/dist/esm/services/getPrices.d.ts.map +1 -1
- package/dist/esm/services/getPrices.js +5 -22
- package/dist/esm/services/getPrices.js.map +1 -1
- package/dist/esm/services/getProviders.d.ts +3 -3
- package/dist/esm/services/getProviders.d.ts.map +1 -1
- package/dist/esm/services/getProviders.js +2 -3
- package/dist/esm/services/getProviders.js.map +1 -1
- package/dist/esm/services/getQuote.d.ts +42 -0
- package/dist/esm/services/getQuote.d.ts.map +1 -0
- package/dist/esm/services/getQuote.js +33 -0
- package/dist/esm/services/getQuote.js.map +1 -0
- package/dist/esm/services/getTermsAcceptance.d.ts +24 -0
- package/dist/esm/services/getTermsAcceptance.d.ts.map +1 -0
- package/dist/esm/services/getTermsAcceptance.js +24 -0
- package/dist/esm/services/getTermsAcceptance.js.map +1 -0
- package/dist/esm/services/resolveQuote.d.ts +36 -0
- package/dist/esm/services/resolveQuote.d.ts.map +1 -0
- package/dist/esm/services/resolveQuote.js +74 -0
- package/dist/esm/services/resolveQuote.js.map +1 -0
- package/dist/esm/services/resolveSubscribeQuote.d.ts +31 -0
- package/dist/esm/services/resolveSubscribeQuote.d.ts.map +1 -0
- package/dist/esm/services/resolveSubscribeQuote.js +86 -0
- package/dist/esm/services/resolveSubscribeQuote.js.map +1 -0
- package/dist/esm/storage/parseStoredRecord.d.ts +29 -0
- package/dist/esm/storage/parseStoredRecord.d.ts.map +1 -0
- package/dist/esm/storage/parseStoredRecord.js +47 -0
- package/dist/esm/storage/parseStoredRecord.js.map +1 -0
- package/dist/{types/agent → esm/storage}/storage.d.ts +6 -3
- package/dist/esm/storage/storage.d.ts.map +1 -0
- package/dist/esm/{agent → storage}/storage.js +6 -4
- package/dist/esm/storage/storage.js.map +1 -0
- package/dist/esm/storage/types.d.ts +14 -0
- package/dist/esm/storage/types.d.ts.map +1 -0
- package/dist/esm/{agent → storage}/types.js.map +1 -1
- package/dist/esm/transport/fetchWithRetry.d.ts +22 -0
- package/dist/esm/transport/fetchWithRetry.d.ts.map +1 -0
- package/dist/esm/transport/fetchWithRetry.js +87 -0
- package/dist/esm/transport/fetchWithRetry.js.map +1 -0
- package/dist/esm/transport/request.d.ts +25 -0
- package/dist/esm/transport/request.d.ts.map +1 -0
- package/dist/esm/{utils → transport}/request.js +19 -31
- package/dist/esm/transport/request.js.map +1 -0
- package/dist/esm/transport/retryPolicy.d.ts +106 -0
- package/dist/esm/transport/retryPolicy.d.ts.map +1 -0
- package/dist/esm/transport/retryPolicy.js +99 -0
- package/dist/esm/transport/retryPolicy.js.map +1 -0
- package/dist/esm/types/api.d.ts +214 -0
- package/dist/esm/types/api.d.ts.map +1 -0
- package/dist/esm/types/api.js +2 -0
- package/dist/esm/types/api.js.map +1 -0
- package/dist/esm/types/config.d.ts +70 -0
- package/dist/esm/types/config.d.ts.map +1 -0
- package/dist/esm/types/config.js +2 -0
- package/dist/esm/types/config.js.map +1 -0
- package/dist/esm/types/provider.d.ts +330 -0
- package/dist/esm/types/provider.d.ts.map +1 -0
- package/dist/esm/types/provider.js +2 -0
- package/dist/esm/types/provider.js.map +1 -0
- package/dist/esm/utils/accountSummary.d.ts +12 -12
- package/dist/esm/utils/accountSummary.d.ts.map +1 -1
- package/dist/esm/utils/accountSummary.js +18 -83
- package/dist/esm/utils/accountSummary.js.map +1 -1
- package/dist/esm/utils/assertNever.d.ts +1 -0
- package/dist/esm/utils/assertNever.d.ts.map +1 -1
- package/dist/esm/utils/assertNever.js +1 -0
- package/dist/esm/utils/assertNever.js.map +1 -1
- package/dist/esm/utils/calculations.d.ts +116 -0
- package/dist/esm/utils/calculations.d.ts.map +1 -1
- package/dist/esm/utils/calculations.js +140 -3
- package/dist/esm/utils/calculations.js.map +1 -1
- package/dist/esm/utils/depositChain.d.ts +25 -0
- package/dist/esm/utils/depositChain.d.ts.map +1 -0
- package/dist/esm/utils/depositChain.js +23 -0
- package/dist/esm/utils/depositChain.js.map +1 -0
- package/dist/esm/utils/explorer.d.ts +33 -0
- package/dist/esm/utils/explorer.d.ts.map +1 -0
- package/dist/esm/utils/explorer.js +38 -0
- package/dist/esm/utils/explorer.js.map +1 -0
- package/dist/esm/utils/fillClassification.d.ts +13 -0
- package/dist/esm/utils/fillClassification.d.ts.map +1 -0
- package/dist/esm/utils/fillClassification.js +44 -0
- package/dist/esm/utils/fillClassification.js.map +1 -0
- package/dist/esm/utils/format.d.ts +66 -0
- package/dist/esm/utils/format.d.ts.map +1 -0
- package/dist/esm/utils/format.js +171 -0
- package/dist/esm/utils/format.js.map +1 -0
- package/dist/esm/utils/orderClassification.d.ts +19 -1
- package/dist/esm/utils/orderClassification.d.ts.map +1 -1
- package/dist/esm/utils/orderClassification.js +26 -1
- package/dist/esm/utils/orderClassification.js.map +1 -1
- package/dist/esm/utils/orderMath.d.ts +8 -4
- package/dist/esm/utils/orderMath.d.ts.map +1 -1
- package/dist/esm/utils/orderMath.js +9 -5
- package/dist/esm/utils/orderMath.js.map +1 -1
- package/dist/esm/utils/parse.d.ts +8 -5
- package/dist/esm/utils/parse.d.ts.map +1 -1
- package/dist/esm/utils/parse.js +8 -6
- package/dist/esm/utils/parse.js.map +1 -1
- package/dist/esm/utils/positionMath.d.ts +29 -0
- package/dist/esm/utils/positionMath.d.ts.map +1 -1
- package/dist/esm/utils/positionMath.js +36 -0
- package/dist/esm/utils/positionMath.js.map +1 -1
- package/dist/esm/utils/signTypedData.d.ts +9 -4
- package/dist/esm/utils/signTypedData.d.ts.map +1 -1
- package/dist/esm/utils/signTypedData.js +9 -3
- package/dist/esm/utils/signTypedData.js.map +1 -1
- package/dist/esm/utils/sleep.d.ts +5 -0
- package/dist/esm/utils/sleep.d.ts.map +1 -1
- package/dist/esm/utils/sleep.js +5 -0
- package/dist/esm/utils/sleep.js.map +1 -1
- package/dist/esm/utils/units.d.ts +8 -1
- package/dist/esm/utils/units.d.ts.map +1 -1
- package/dist/esm/utils/units.js +8 -1
- package/dist/esm/utils/units.js.map +1 -1
- package/dist/esm/utils/validation.d.ts +4 -1
- package/dist/esm/utils/validation.d.ts.map +1 -1
- package/dist/esm/utils/validation.js +4 -1
- package/dist/esm/utils/validation.js.map +1 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.d.ts.map +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/esm/version.js.map +1 -1
- package/dist/esm/websocket/PerpsWsClient.d.ts +100 -0
- package/dist/esm/websocket/PerpsWsClient.d.ts.map +1 -0
- package/dist/esm/websocket/PerpsWsClient.js +121 -0
- package/dist/esm/websocket/PerpsWsClient.js.map +1 -0
- package/dist/esm/websocket/ReconnectingWebSocket.d.ts +130 -0
- package/dist/esm/websocket/ReconnectingWebSocket.d.ts.map +1 -0
- package/dist/esm/websocket/ReconnectingWebSocket.js +288 -0
- package/dist/esm/websocket/ReconnectingWebSocket.js.map +1 -0
- package/dist/esm/websocket/WsProviderBase.d.ts +89 -0
- package/dist/esm/websocket/WsProviderBase.d.ts.map +1 -0
- package/dist/esm/websocket/WsProviderBase.js +246 -0
- package/dist/esm/websocket/WsProviderBase.js.map +1 -0
- package/dist/esm/websocket/cachePromise.d.ts +14 -0
- package/dist/esm/websocket/cachePromise.d.ts.map +1 -0
- package/dist/esm/websocket/cachePromise.js +27 -0
- package/dist/esm/websocket/cachePromise.js.map +1 -0
- package/dist/esm/websocket/types.d.ts +60 -0
- package/dist/esm/websocket/types.d.ts.map +1 -0
- package/dist/esm/{realtime → websocket}/types.js.map +1 -1
- package/dist/esm/websocket/wsLog.d.ts +50 -0
- package/dist/esm/websocket/wsLog.d.ts.map +1 -0
- package/dist/esm/websocket/wsLog.js +68 -0
- package/dist/esm/websocket/wsLog.js.map +1 -0
- package/dist/types/client/PerpsClient.d.ts +200 -195
- package/dist/types/client/PerpsClient.d.ts.map +1 -1
- package/dist/types/client/bindProvider.d.ts +13 -0
- package/dist/types/client/bindProvider.d.ts.map +1 -0
- package/dist/types/client/createPerpsClient.d.ts +34 -53
- package/dist/types/client/createPerpsClient.d.ts.map +1 -1
- package/dist/types/client/requireProvider.d.ts +12 -0
- package/dist/types/client/requireProvider.d.ts.map +1 -0
- package/dist/types/errors/PerpsError.d.ts +8 -0
- package/dist/types/errors/PerpsError.d.ts.map +1 -1
- package/dist/types/errors/constants.d.ts +8 -2
- package/dist/types/errors/constants.d.ts.map +1 -1
- package/dist/types/index.d.ts +49 -23
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/registry/assetRegistry.d.ts +25 -0
- package/dist/types/registry/assetRegistry.d.ts.map +1 -0
- package/dist/types/registry/marketRegistry.d.ts +42 -0
- package/dist/types/registry/marketRegistry.d.ts.map +1 -0
- package/dist/types/registry/referenceDataRegistry.d.ts +44 -0
- package/dist/types/registry/referenceDataRegistry.d.ts.map +1 -0
- package/dist/types/services/createAction.d.ts +17 -2
- package/dist/types/services/createAction.d.ts.map +1 -1
- package/dist/types/services/executeAction.d.ts +17 -2
- package/dist/types/services/executeAction.d.ts.map +1 -1
- package/dist/types/services/getAccount.d.ts +19 -16
- package/dist/types/services/getAccount.d.ts.map +1 -1
- package/dist/types/services/getActivity.d.ts +15 -25
- package/dist/types/services/getActivity.d.ts.map +1 -1
- package/dist/types/services/getAssets.d.ts +14 -5
- package/dist/types/services/getAssets.d.ts.map +1 -1
- package/dist/types/services/getFills.d.ts +18 -29
- package/dist/types/services/getFills.d.ts.map +1 -1
- package/dist/types/services/getMarket.d.ts +34 -0
- package/dist/types/services/getMarket.d.ts.map +1 -0
- package/dist/types/services/getMarkets.d.ts +28 -0
- package/dist/types/services/getMarkets.d.ts.map +1 -0
- package/dist/types/services/getMeta.d.ts +19 -0
- package/dist/types/services/getMeta.d.ts.map +1 -0
- package/dist/types/services/getOhlcv.d.ts +15 -19
- package/dist/types/services/getOhlcv.d.ts.map +1 -1
- package/dist/types/services/getOrder.d.ts +16 -16
- package/dist/types/services/getOrder.d.ts.map +1 -1
- package/dist/types/services/getOrderbook.d.ts +13 -23
- package/dist/types/services/getOrderbook.d.ts.map +1 -1
- package/dist/types/services/getOrders.d.ts +17 -9
- package/dist/types/services/getOrders.d.ts.map +1 -1
- package/dist/types/services/getPositions.d.ts +17 -9
- package/dist/types/services/getPositions.d.ts.map +1 -1
- package/dist/types/services/getPrices.d.ts +12 -24
- package/dist/types/services/getPrices.d.ts.map +1 -1
- package/dist/types/services/getProviders.d.ts +3 -3
- package/dist/types/services/getProviders.d.ts.map +1 -1
- package/dist/types/services/getQuote.d.ts +42 -0
- package/dist/types/services/getQuote.d.ts.map +1 -0
- package/dist/types/services/getTermsAcceptance.d.ts +24 -0
- package/dist/types/services/getTermsAcceptance.d.ts.map +1 -0
- package/dist/types/services/resolveQuote.d.ts +36 -0
- package/dist/types/services/resolveQuote.d.ts.map +1 -0
- package/dist/types/services/resolveSubscribeQuote.d.ts +31 -0
- package/dist/types/services/resolveSubscribeQuote.d.ts.map +1 -0
- package/dist/types/storage/parseStoredRecord.d.ts +29 -0
- package/dist/types/storage/parseStoredRecord.d.ts.map +1 -0
- package/dist/{esm/agent → types/storage}/storage.d.ts +6 -3
- package/dist/types/storage/storage.d.ts.map +1 -0
- package/dist/types/storage/types.d.ts +14 -0
- package/dist/types/storage/types.d.ts.map +1 -0
- package/dist/types/transport/fetchWithRetry.d.ts +22 -0
- package/dist/types/transport/fetchWithRetry.d.ts.map +1 -0
- package/dist/types/transport/request.d.ts +25 -0
- package/dist/types/transport/request.d.ts.map +1 -0
- package/dist/types/transport/retryPolicy.d.ts +106 -0
- package/dist/types/transport/retryPolicy.d.ts.map +1 -0
- package/dist/types/types/api.d.ts +214 -0
- package/dist/types/types/api.d.ts.map +1 -0
- package/dist/types/types/config.d.ts +70 -0
- package/dist/types/types/config.d.ts.map +1 -0
- package/dist/types/types/provider.d.ts +330 -0
- package/dist/types/types/provider.d.ts.map +1 -0
- package/dist/types/utils/accountSummary.d.ts +12 -12
- package/dist/types/utils/accountSummary.d.ts.map +1 -1
- package/dist/types/utils/assertNever.d.ts +1 -0
- package/dist/types/utils/assertNever.d.ts.map +1 -1
- package/dist/types/utils/calculations.d.ts +116 -0
- package/dist/types/utils/calculations.d.ts.map +1 -1
- package/dist/types/utils/depositChain.d.ts +25 -0
- package/dist/types/utils/depositChain.d.ts.map +1 -0
- package/dist/types/utils/explorer.d.ts +33 -0
- package/dist/types/utils/explorer.d.ts.map +1 -0
- package/dist/types/utils/fillClassification.d.ts +13 -0
- package/dist/types/utils/fillClassification.d.ts.map +1 -0
- package/dist/types/utils/format.d.ts +66 -0
- package/dist/types/utils/format.d.ts.map +1 -0
- package/dist/types/utils/orderClassification.d.ts +19 -1
- package/dist/types/utils/orderClassification.d.ts.map +1 -1
- package/dist/types/utils/orderMath.d.ts +8 -4
- package/dist/types/utils/orderMath.d.ts.map +1 -1
- package/dist/types/utils/parse.d.ts +8 -5
- package/dist/types/utils/parse.d.ts.map +1 -1
- package/dist/types/utils/positionMath.d.ts +29 -0
- package/dist/types/utils/positionMath.d.ts.map +1 -1
- package/dist/types/utils/signTypedData.d.ts +9 -4
- package/dist/types/utils/signTypedData.d.ts.map +1 -1
- package/dist/types/utils/sleep.d.ts +5 -0
- package/dist/types/utils/sleep.d.ts.map +1 -1
- package/dist/types/utils/units.d.ts +8 -1
- package/dist/types/utils/units.d.ts.map +1 -1
- package/dist/types/utils/validation.d.ts +4 -1
- package/dist/types/utils/validation.d.ts.map +1 -1
- package/dist/types/version.d.ts +1 -1
- package/dist/types/version.d.ts.map +1 -1
- package/dist/types/websocket/PerpsWsClient.d.ts +100 -0
- package/dist/types/websocket/PerpsWsClient.d.ts.map +1 -0
- package/dist/types/websocket/ReconnectingWebSocket.d.ts +130 -0
- package/dist/types/websocket/ReconnectingWebSocket.d.ts.map +1 -0
- package/dist/types/websocket/WsProviderBase.d.ts +89 -0
- package/dist/types/websocket/WsProviderBase.d.ts.map +1 -0
- package/dist/types/websocket/cachePromise.d.ts +14 -0
- package/dist/types/websocket/cachePromise.d.ts.map +1 -0
- package/dist/types/websocket/types.d.ts +60 -0
- package/dist/types/websocket/types.d.ts.map +1 -0
- package/dist/types/websocket/wsLog.d.ts +50 -0
- package/dist/types/websocket/wsLog.d.ts.map +1 -0
- package/package.json +13 -60
- package/src/client/PerpsClient.ts +404 -1115
- package/src/client/bindProvider.ts +24 -0
- package/src/client/createPerpsClient.ts +68 -72
- package/src/client/requireProvider.ts +29 -0
- package/src/errors/PerpsError.ts +8 -0
- package/src/errors/constants.ts +8 -2
- package/src/index.ts +138 -82
- package/src/registry/assetRegistry.ts +62 -0
- package/src/registry/marketRegistry.ts +100 -0
- package/src/registry/referenceDataRegistry.ts +95 -0
- package/src/services/createAction.ts +17 -6
- package/src/services/executeAction.ts +21 -6
- package/src/services/getAccount.ts +24 -25
- package/src/services/getActivity.ts +27 -47
- package/src/services/getAssets.ts +15 -9
- package/src/services/getFills.ts +29 -42
- package/src/services/getMarket.ts +52 -0
- package/src/services/getMarkets.ts +40 -0
- package/src/services/getMeta.ts +30 -0
- package/src/services/getOhlcv.ts +24 -33
- package/src/services/getOrder.ts +20 -27
- package/src/services/getOrderbook.ts +19 -34
- package/src/services/getOrders.ts +27 -21
- package/src/services/getPositions.ts +27 -21
- package/src/services/getPrices.ts +14 -29
- package/src/services/getProviders.ts +4 -7
- package/src/services/getQuote.ts +58 -0
- package/src/services/getTermsAcceptance.ts +32 -0
- package/src/services/resolveQuote.ts +122 -0
- package/src/services/resolveSubscribeQuote.ts +109 -0
- package/src/storage/parseStoredRecord.ts +55 -0
- package/src/{agent → storage}/storage.ts +6 -4
- package/src/storage/types.ts +13 -0
- package/src/transport/fetchWithRetry.ts +116 -0
- package/src/{utils → transport}/request.ts +33 -45
- package/src/transport/retryPolicy.ts +202 -0
- package/src/types/api.ts +239 -0
- package/src/types/config.ts +79 -0
- package/src/types/provider.ts +429 -0
- package/src/utils/accountSummary.ts +25 -109
- package/src/utils/assertNever.ts +1 -0
- package/src/utils/calculations.ts +204 -7
- package/src/utils/depositChain.ts +37 -0
- package/src/utils/explorer.ts +51 -0
- package/src/utils/fillClassification.ts +51 -0
- package/src/utils/format.ts +212 -0
- package/src/utils/orderClassification.ts +33 -1
- package/src/utils/orderMath.ts +9 -5
- package/src/utils/parse.ts +8 -7
- package/src/utils/positionMath.ts +42 -0
- package/src/utils/signTypedData.ts +11 -5
- package/src/utils/sleep.ts +5 -0
- package/src/utils/units.ts +8 -1
- package/src/utils/validation.ts +4 -1
- package/src/version.ts +1 -1
- package/src/websocket/PerpsWsClient.ts +204 -0
- package/src/websocket/ReconnectingWebSocket.ts +353 -0
- package/src/websocket/WsProviderBase.ts +333 -0
- package/src/websocket/cachePromise.ts +30 -0
- package/src/websocket/types.ts +75 -0
- package/src/websocket/wsLog.ts +82 -0
- package/dist/cjs/agent/AgentManager.d.ts +0 -15
- package/dist/cjs/agent/AgentManager.d.ts.map +0 -1
- package/dist/cjs/agent/AgentManager.js +0 -82
- package/dist/cjs/agent/AgentManager.js.map +0 -1
- package/dist/cjs/agent/storage.d.ts.map +0 -1
- package/dist/cjs/agent/storage.js.map +0 -1
- package/dist/cjs/agent/types.d.ts.map +0 -1
- package/dist/cjs/client/projectAccountConfigSettings.d.ts +0 -3
- package/dist/cjs/client/projectAccountConfigSettings.d.ts.map +0 -1
- package/dist/cjs/client/projectAccountConfigSettings.js +0 -17
- package/dist/cjs/client/projectAccountConfigSettings.js.map +0 -1
- package/dist/cjs/client/types.d.ts +0 -85
- package/dist/cjs/client/types.d.ts.map +0 -1
- package/dist/cjs/client/types.js +0 -9
- package/dist/cjs/client/types.js.map +0 -1
- package/dist/cjs/providers/hyperliquid/accountConfig.d.ts +0 -3
- package/dist/cjs/providers/hyperliquid/accountConfig.d.ts.map +0 -1
- package/dist/cjs/providers/hyperliquid/accountConfig.js +0 -41
- package/dist/cjs/providers/hyperliquid/accountConfig.js.map +0 -1
- package/dist/cjs/providers/lighter/accountConfig.d.ts +0 -3
- package/dist/cjs/providers/lighter/accountConfig.d.ts.map +0 -1
- package/dist/cjs/providers/lighter/accountConfig.js +0 -45
- package/dist/cjs/providers/lighter/accountConfig.js.map +0 -1
- package/dist/cjs/realtime/PerpsWsClient.d.ts +0 -20
- package/dist/cjs/realtime/PerpsWsClient.d.ts.map +0 -1
- package/dist/cjs/realtime/PerpsWsClient.js +0 -69
- package/dist/cjs/realtime/PerpsWsClient.js.map +0 -1
- package/dist/cjs/realtime/ReconnectingWebSocket.d.ts +0 -36
- package/dist/cjs/realtime/ReconnectingWebSocket.d.ts.map +0 -1
- package/dist/cjs/realtime/ReconnectingWebSocket.js +0 -132
- package/dist/cjs/realtime/ReconnectingWebSocket.js.map +0 -1
- package/dist/cjs/realtime/hyperliquid/HyperliquidWsProvider.d.ts +0 -30
- package/dist/cjs/realtime/hyperliquid/HyperliquidWsProvider.d.ts.map +0 -1
- package/dist/cjs/realtime/hyperliquid/HyperliquidWsProvider.js +0 -331
- package/dist/cjs/realtime/hyperliquid/HyperliquidWsProvider.js.map +0 -1
- package/dist/cjs/realtime/hyperliquid/types.d.ts +0 -37
- package/dist/cjs/realtime/hyperliquid/types.d.ts.map +0 -1
- package/dist/cjs/realtime/hyperliquid/types.js.map +0 -1
- package/dist/cjs/realtime/lighter/LighterWsProvider.d.ts +0 -48
- package/dist/cjs/realtime/lighter/LighterWsProvider.d.ts.map +0 -1
- package/dist/cjs/realtime/lighter/LighterWsProvider.js +0 -424
- package/dist/cjs/realtime/lighter/LighterWsProvider.js.map +0 -1
- package/dist/cjs/realtime/lighter/types.d.ts +0 -84
- package/dist/cjs/realtime/lighter/types.d.ts.map +0 -1
- package/dist/cjs/realtime/lighter/types.js.map +0 -1
- package/dist/cjs/realtime/types.d.ts +0 -10
- package/dist/cjs/realtime/types.d.ts.map +0 -1
- package/dist/cjs/services/getAsset.d.ts +0 -8
- package/dist/cjs/services/getAsset.d.ts.map +0 -1
- package/dist/cjs/services/getAsset.js.map +0 -1
- package/dist/cjs/signers/lighter/LighterKeyStore.d.ts +0 -20
- package/dist/cjs/signers/lighter/LighterKeyStore.d.ts.map +0 -1
- package/dist/cjs/signers/lighter/LighterKeyStore.js +0 -42
- package/dist/cjs/signers/lighter/LighterKeyStore.js.map +0 -1
- package/dist/cjs/signers/lighter/LighterReadOnlyTokenManager.d.ts +0 -66
- package/dist/cjs/signers/lighter/LighterReadOnlyTokenManager.d.ts.map +0 -1
- package/dist/cjs/signers/lighter/LighterReadOnlyTokenManager.js +0 -141
- package/dist/cjs/signers/lighter/LighterReadOnlyTokenManager.js.map +0 -1
- package/dist/cjs/signers/lighter/LighterSigner.d.ts +0 -41
- package/dist/cjs/signers/lighter/LighterSigner.d.ts.map +0 -1
- package/dist/cjs/signers/lighter/LighterSigner.js +0 -176
- package/dist/cjs/signers/lighter/LighterSigner.js.map +0 -1
- package/dist/cjs/signers/lighter/index.d.ts +0 -9
- package/dist/cjs/signers/lighter/index.d.ts.map +0 -1
- package/dist/cjs/signers/lighter/index.js +0 -20
- package/dist/cjs/signers/lighter/index.js.map +0 -1
- package/dist/cjs/signers/lighter/wasmLoader.d.ts +0 -42
- package/dist/cjs/signers/lighter/wasmLoader.d.ts.map +0 -1
- package/dist/cjs/signers/lighter/wasmLoader.js +0 -166
- package/dist/cjs/signers/lighter/wasmLoader.js.map +0 -1
- package/dist/cjs/utils/hyperliquid/index.d.ts +0 -3
- package/dist/cjs/utils/hyperliquid/index.d.ts.map +0 -1
- package/dist/cjs/utils/hyperliquid/index.js +0 -11
- package/dist/cjs/utils/hyperliquid/index.js.map +0 -1
- package/dist/cjs/utils/hyperliquid/liquidation.d.ts +0 -3
- package/dist/cjs/utils/hyperliquid/liquidation.d.ts.map +0 -1
- package/dist/cjs/utils/hyperliquid/liquidation.js +0 -24
- package/dist/cjs/utils/hyperliquid/liquidation.js.map +0 -1
- package/dist/cjs/utils/hyperliquid/orderFormatting.d.ts +0 -4
- package/dist/cjs/utils/hyperliquid/orderFormatting.d.ts.map +0 -1
- package/dist/cjs/utils/hyperliquid/orderFormatting.js +0 -33
- package/dist/cjs/utils/hyperliquid/orderFormatting.js.map +0 -1
- package/dist/cjs/utils/request.d.ts.map +0 -1
- package/dist/cjs/utils/request.js.map +0 -1
- package/dist/cjs/wasm/lighter-signer.wasm +0 -0
- package/dist/cjs/wasm/wasm_exec.js +0 -575
- package/dist/esm/agent/AgentManager.d.ts +0 -45
- package/dist/esm/agent/AgentManager.d.ts.map +0 -1
- package/dist/esm/agent/AgentManager.js +0 -112
- package/dist/esm/agent/AgentManager.js.map +0 -1
- package/dist/esm/agent/storage.d.ts.map +0 -1
- package/dist/esm/agent/storage.js.map +0 -1
- package/dist/esm/agent/types.d.ts +0 -23
- package/dist/esm/agent/types.d.ts.map +0 -1
- package/dist/esm/client/projectAccountConfigSettings.d.ts +0 -18
- package/dist/esm/client/projectAccountConfigSettings.d.ts.map +0 -1
- package/dist/esm/client/projectAccountConfigSettings.js +0 -29
- package/dist/esm/client/projectAccountConfigSettings.js.map +0 -1
- package/dist/esm/client/types.d.ts +0 -200
- package/dist/esm/client/types.d.ts.map +0 -1
- package/dist/esm/client/types.js +0 -12
- package/dist/esm/client/types.js.map +0 -1
- package/dist/esm/providers/hyperliquid/accountConfig.d.ts +0 -13
- package/dist/esm/providers/hyperliquid/accountConfig.d.ts.map +0 -1
- package/dist/esm/providers/hyperliquid/accountConfig.js +0 -69
- package/dist/esm/providers/hyperliquid/accountConfig.js.map +0 -1
- package/dist/esm/providers/lighter/accountConfig.d.ts +0 -13
- package/dist/esm/providers/lighter/accountConfig.d.ts.map +0 -1
- package/dist/esm/providers/lighter/accountConfig.js +0 -79
- package/dist/esm/providers/lighter/accountConfig.js.map +0 -1
- package/dist/esm/realtime/PerpsWsClient.d.ts +0 -26
- package/dist/esm/realtime/PerpsWsClient.d.ts.map +0 -1
- package/dist/esm/realtime/PerpsWsClient.js +0 -65
- package/dist/esm/realtime/PerpsWsClient.js.map +0 -1
- package/dist/esm/realtime/ReconnectingWebSocket.d.ts +0 -36
- package/dist/esm/realtime/ReconnectingWebSocket.d.ts.map +0 -1
- package/dist/esm/realtime/ReconnectingWebSocket.js +0 -128
- package/dist/esm/realtime/ReconnectingWebSocket.js.map +0 -1
- package/dist/esm/realtime/hyperliquid/HyperliquidWsProvider.d.ts +0 -32
- package/dist/esm/realtime/hyperliquid/HyperliquidWsProvider.d.ts.map +0 -1
- package/dist/esm/realtime/hyperliquid/HyperliquidWsProvider.js +0 -339
- package/dist/esm/realtime/hyperliquid/HyperliquidWsProvider.js.map +0 -1
- package/dist/esm/realtime/hyperliquid/types.d.ts +0 -37
- package/dist/esm/realtime/hyperliquid/types.d.ts.map +0 -1
- package/dist/esm/realtime/hyperliquid/types.js +0 -4
- package/dist/esm/realtime/hyperliquid/types.js.map +0 -1
- package/dist/esm/realtime/lighter/LighterWsProvider.d.ts +0 -68
- package/dist/esm/realtime/lighter/LighterWsProvider.d.ts.map +0 -1
- package/dist/esm/realtime/lighter/LighterWsProvider.js +0 -474
- package/dist/esm/realtime/lighter/LighterWsProvider.js.map +0 -1
- package/dist/esm/realtime/lighter/types.d.ts +0 -108
- package/dist/esm/realtime/lighter/types.d.ts.map +0 -1
- package/dist/esm/realtime/lighter/types.js +0 -14
- package/dist/esm/realtime/lighter/types.js.map +0 -1
- package/dist/esm/realtime/types.d.ts +0 -10
- package/dist/esm/realtime/types.d.ts.map +0 -1
- package/dist/esm/services/getAsset.d.ts +0 -20
- package/dist/esm/services/getAsset.d.ts.map +0 -1
- package/dist/esm/services/getAsset.js +0 -18
- package/dist/esm/services/getAsset.js.map +0 -1
- package/dist/esm/signers/lighter/LighterKeyStore.d.ts +0 -29
- package/dist/esm/signers/lighter/LighterKeyStore.d.ts.map +0 -1
- package/dist/esm/signers/lighter/LighterKeyStore.js +0 -53
- package/dist/esm/signers/lighter/LighterKeyStore.js.map +0 -1
- package/dist/esm/signers/lighter/LighterReadOnlyTokenManager.d.ts +0 -174
- package/dist/esm/signers/lighter/LighterReadOnlyTokenManager.d.ts.map +0 -1
- package/dist/esm/signers/lighter/LighterReadOnlyTokenManager.js +0 -214
- package/dist/esm/signers/lighter/LighterReadOnlyTokenManager.js.map +0 -1
- package/dist/esm/signers/lighter/LighterSigner.d.ts +0 -88
- package/dist/esm/signers/lighter/LighterSigner.d.ts.map +0 -1
- package/dist/esm/signers/lighter/LighterSigner.js +0 -226
- package/dist/esm/signers/lighter/LighterSigner.js.map +0 -1
- package/dist/esm/signers/lighter/index.d.ts +0 -9
- package/dist/esm/signers/lighter/index.d.ts.map +0 -1
- package/dist/esm/signers/lighter/index.js +0 -5
- package/dist/esm/signers/lighter/index.js.map +0 -1
- package/dist/esm/signers/lighter/wasmLoader.d.ts +0 -71
- package/dist/esm/signers/lighter/wasmLoader.d.ts.map +0 -1
- package/dist/esm/signers/lighter/wasmLoader.js +0 -181
- package/dist/esm/signers/lighter/wasmLoader.js.map +0 -1
- package/dist/esm/utils/hyperliquid/index.d.ts +0 -3
- package/dist/esm/utils/hyperliquid/index.d.ts.map +0 -1
- package/dist/esm/utils/hyperliquid/index.js +0 -3
- package/dist/esm/utils/hyperliquid/index.js.map +0 -1
- package/dist/esm/utils/hyperliquid/liquidation.d.ts +0 -46
- package/dist/esm/utils/hyperliquid/liquidation.d.ts.map +0 -1
- package/dist/esm/utils/hyperliquid/liquidation.js +0 -63
- package/dist/esm/utils/hyperliquid/liquidation.js.map +0 -1
- package/dist/esm/utils/hyperliquid/orderFormatting.d.ts +0 -44
- package/dist/esm/utils/hyperliquid/orderFormatting.d.ts.map +0 -1
- package/dist/esm/utils/hyperliquid/orderFormatting.js +0 -79
- package/dist/esm/utils/hyperliquid/orderFormatting.js.map +0 -1
- package/dist/esm/utils/request.d.ts +0 -25
- package/dist/esm/utils/request.d.ts.map +0 -1
- package/dist/esm/utils/request.js.map +0 -1
- package/dist/esm/wasm/lighter-signer.wasm +0 -0
- package/dist/esm/wasm/wasm_exec.js +0 -575
- package/dist/types/agent/AgentManager.d.ts +0 -45
- package/dist/types/agent/AgentManager.d.ts.map +0 -1
- package/dist/types/agent/storage.d.ts.map +0 -1
- package/dist/types/agent/types.d.ts +0 -23
- package/dist/types/agent/types.d.ts.map +0 -1
- package/dist/types/client/projectAccountConfigSettings.d.ts +0 -18
- package/dist/types/client/projectAccountConfigSettings.d.ts.map +0 -1
- package/dist/types/client/types.d.ts +0 -200
- package/dist/types/client/types.d.ts.map +0 -1
- package/dist/types/providers/hyperliquid/accountConfig.d.ts +0 -13
- package/dist/types/providers/hyperliquid/accountConfig.d.ts.map +0 -1
- package/dist/types/providers/lighter/accountConfig.d.ts +0 -13
- package/dist/types/providers/lighter/accountConfig.d.ts.map +0 -1
- package/dist/types/realtime/PerpsWsClient.d.ts +0 -26
- package/dist/types/realtime/PerpsWsClient.d.ts.map +0 -1
- package/dist/types/realtime/ReconnectingWebSocket.d.ts.map +0 -1
- package/dist/types/realtime/hyperliquid/HyperliquidWsProvider.d.ts +0 -32
- package/dist/types/realtime/hyperliquid/HyperliquidWsProvider.d.ts.map +0 -1
- package/dist/types/realtime/hyperliquid/types.d.ts +0 -37
- package/dist/types/realtime/hyperliquid/types.d.ts.map +0 -1
- package/dist/types/realtime/lighter/LighterWsProvider.d.ts +0 -68
- package/dist/types/realtime/lighter/LighterWsProvider.d.ts.map +0 -1
- package/dist/types/realtime/lighter/types.d.ts +0 -108
- package/dist/types/realtime/lighter/types.d.ts.map +0 -1
- package/dist/types/realtime/types.d.ts +0 -10
- package/dist/types/realtime/types.d.ts.map +0 -1
- package/dist/types/services/getAsset.d.ts +0 -20
- package/dist/types/services/getAsset.d.ts.map +0 -1
- package/dist/types/signers/lighter/LighterKeyStore.d.ts +0 -29
- package/dist/types/signers/lighter/LighterKeyStore.d.ts.map +0 -1
- package/dist/types/signers/lighter/LighterReadOnlyTokenManager.d.ts +0 -174
- package/dist/types/signers/lighter/LighterReadOnlyTokenManager.d.ts.map +0 -1
- package/dist/types/signers/lighter/LighterSigner.d.ts +0 -88
- package/dist/types/signers/lighter/LighterSigner.d.ts.map +0 -1
- package/dist/types/signers/lighter/index.d.ts +0 -9
- package/dist/types/signers/lighter/index.d.ts.map +0 -1
- package/dist/types/signers/lighter/wasmLoader.d.ts +0 -71
- package/dist/types/signers/lighter/wasmLoader.d.ts.map +0 -1
- package/dist/types/utils/hyperliquid/index.d.ts +0 -3
- package/dist/types/utils/hyperliquid/index.d.ts.map +0 -1
- package/dist/types/utils/hyperliquid/liquidation.d.ts +0 -46
- package/dist/types/utils/hyperliquid/liquidation.d.ts.map +0 -1
- package/dist/types/utils/hyperliquid/orderFormatting.d.ts +0 -44
- package/dist/types/utils/hyperliquid/orderFormatting.d.ts.map +0 -1
- package/dist/types/utils/request.d.ts +0 -25
- package/dist/types/utils/request.d.ts.map +0 -1
- package/src/agent/AgentManager.ts +0 -137
- package/src/agent/types.ts +0 -24
- package/src/client/projectAccountConfigSettings.ts +0 -39
- package/src/client/types.ts +0 -240
- package/src/providers/hyperliquid/accountConfig.ts +0 -92
- package/src/providers/lighter/accountConfig.ts +0 -103
- package/src/realtime/PerpsWsClient.ts +0 -108
- package/src/realtime/ReconnectingWebSocket.ts +0 -156
- package/src/realtime/hyperliquid/HyperliquidWsProvider.ts +0 -413
- package/src/realtime/hyperliquid/types.ts +0 -46
- package/src/realtime/lighter/LighterWsProvider.ts +0 -682
- package/src/realtime/lighter/types.ts +0 -121
- package/src/realtime/types.ts +0 -16
- package/src/services/getAsset.ts +0 -37
- package/src/signers/lighter/LighterKeyStore.ts +0 -74
- package/src/signers/lighter/LighterReadOnlyTokenManager.ts +0 -358
- package/src/signers/lighter/LighterSigner.ts +0 -396
- package/src/signers/lighter/index.ts +0 -36
- package/src/signers/lighter/wasmLoader.ts +0 -291
- package/src/utils/hyperliquid/index.ts +0 -9
- package/src/utils/hyperliquid/liquidation.ts +0 -71
- package/src/utils/hyperliquid/orderFormatting.ts +0 -96
- package/wasm/lighter-signer.wasm +0 -0
- package/wasm/wasm_exec.js +0 -575
- /package/dist/cjs/{agent → storage}/storage.d.ts +0 -0
- /package/dist/cjs/{agent → storage}/storage.js +0 -0
- /package/dist/cjs/{agent → storage}/types.js +0 -0
- /package/dist/cjs/{realtime/hyperliquid → websocket}/types.js +0 -0
- /package/dist/esm/{agent → storage}/types.js +0 -0
- /package/dist/esm/{realtime → websocket}/types.js +0 -0
|
@@ -1,17 +1,11 @@
|
|
|
1
|
-
import { ActionType, PerpsErrorCode
|
|
2
|
-
import { parseAbi } from 'viem';
|
|
3
|
-
import { localStorageAdapter } from '../agent/storage.js';
|
|
1
|
+
import { ActionType, PerpsErrorCode } from '@lifi/perps-types';
|
|
4
2
|
import { PerpsError } from '../errors/PerpsError.js';
|
|
5
3
|
import { createAction } from '../services/createAction.js';
|
|
6
4
|
import { executeAction } from '../services/executeAction.js';
|
|
7
|
-
import { getAccount } from '../services/getAccount.js';
|
|
5
|
+
import { getAccount as fetchAccount } from '../services/getAccount.js';
|
|
8
6
|
import { getProviders } from '../services/getProviders.js';
|
|
9
|
-
import { DEFAULT_API_KEY_INDEX, LighterKeyStore, LighterReadOnlyTokenManager, LighterSigner, walletClientSigner, } from '../signers/lighter/index.js';
|
|
10
|
-
import { signTypedData, signTypedDataWithSigner, } from '../utils/signTypedData.js';
|
|
11
7
|
import { createPerpsClient } from './createPerpsClient.js';
|
|
12
|
-
import {
|
|
13
|
-
import { SigningMode, } from './types.js';
|
|
14
|
-
const MAX_NONCE_RETRIES = 3;
|
|
8
|
+
import { requireProvider as resolveProvider } from './requireProvider.js';
|
|
15
9
|
/**
|
|
16
10
|
* Look up an action's descriptor in the provider's metadata. Throws if the
|
|
17
11
|
* action isn't declared — defensive: better to fail loudly than to mis-sign.
|
|
@@ -27,71 +21,48 @@ function findActionDescriptor(metadata, action) {
|
|
|
27
21
|
}
|
|
28
22
|
return descriptor;
|
|
29
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* The primary high-level perps API: wraps a {@link PerpsSDKClient} and owns the
|
|
26
|
+
* end-to-end signing pipeline for provider setup, orders, and account-level
|
|
27
|
+
* actions. Construct via `new PerpsClient(options)` or the SDK's higher-level
|
|
28
|
+
* wiring.
|
|
29
|
+
*
|
|
30
|
+
* @public
|
|
31
|
+
*/
|
|
30
32
|
export class PerpsClient {
|
|
31
33
|
sdkClient;
|
|
32
|
-
storage;
|
|
33
|
-
signingModes = new Map();
|
|
34
34
|
providerMetadataCache = new Map();
|
|
35
|
-
|
|
36
|
-
lighterConfig;
|
|
37
|
-
lighterReadOnlyTokenOptions;
|
|
38
|
-
_lighterSigner;
|
|
39
|
-
_lighterKeyStore;
|
|
40
|
-
_lighterReadOnlyTokenManager;
|
|
35
|
+
_userWallet;
|
|
41
36
|
constructor(options) {
|
|
42
|
-
this.storage = options.storage ?? localStorageAdapter;
|
|
43
|
-
this.lighterConfig = options.lighter;
|
|
44
|
-
this.lighterReadOnlyTokenOptions = options.lighterReadOnlyToken;
|
|
45
37
|
this.sdkClient = createPerpsClient({
|
|
46
38
|
integrator: options.integrator,
|
|
47
39
|
apiKey: options.apiKey,
|
|
48
40
|
apiUrl: options.apiUrl,
|
|
49
|
-
storage: this.storage,
|
|
50
41
|
providers: options.providers,
|
|
51
42
|
});
|
|
52
43
|
}
|
|
53
|
-
getLighterSigner() {
|
|
54
|
-
if (!this._lighterSigner) {
|
|
55
|
-
this._lighterSigner = new LighterSigner(this.lighterConfig);
|
|
56
|
-
}
|
|
57
|
-
return this._lighterSigner;
|
|
58
|
-
}
|
|
59
|
-
getLighterKeyStore() {
|
|
60
|
-
if (!this._lighterKeyStore) {
|
|
61
|
-
this._lighterKeyStore = new LighterKeyStore(this.storage);
|
|
62
|
-
}
|
|
63
|
-
return this._lighterKeyStore;
|
|
64
|
-
}
|
|
65
|
-
getLighterReadOnlyTokenManager() {
|
|
66
|
-
if (!this._lighterReadOnlyTokenManager) {
|
|
67
|
-
this._lighterReadOnlyTokenManager = new LighterReadOnlyTokenManager({
|
|
68
|
-
storage: this.storage,
|
|
69
|
-
...this.lighterReadOnlyTokenOptions,
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
return this._lighterReadOnlyTokenManager;
|
|
73
|
-
}
|
|
74
44
|
/**
|
|
75
|
-
* Set or update the wallet
|
|
45
|
+
* Set or update the end-user's wallet. Used whenever an action's descriptor
|
|
76
46
|
* names the user wallet in its `signers` list. Pass undefined to clear.
|
|
47
|
+
*
|
|
48
|
+
* @public
|
|
77
49
|
*/
|
|
78
|
-
|
|
79
|
-
this.
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
get: () => this._signer,
|
|
50
|
+
setUserWallet(userWallet) {
|
|
51
|
+
this._userWallet = userWallet;
|
|
52
|
+
Object.defineProperty(this.sdkClient, 'userWallet', {
|
|
53
|
+
get: () => this._userWallet,
|
|
83
54
|
configurable: true,
|
|
84
55
|
});
|
|
85
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* The underlying low-level {@link PerpsSDKClient} (config, user wallet,
|
|
59
|
+
* provider registry) backing this instance.
|
|
60
|
+
*
|
|
61
|
+
* @public
|
|
62
|
+
*/
|
|
86
63
|
get client() {
|
|
87
64
|
return this.sdkClient;
|
|
88
65
|
}
|
|
89
|
-
modeKey(address, provider) {
|
|
90
|
-
return `${address.toLowerCase()}:${provider.toLowerCase()}`;
|
|
91
|
-
}
|
|
92
|
-
signingModeStorageKey(address, provider) {
|
|
93
|
-
return `lifi-perps-mode:${address.toLowerCase()}:${provider.toLowerCase()}`;
|
|
94
|
-
}
|
|
95
66
|
async getProviderMetadata(provider) {
|
|
96
67
|
const cached = this.providerMetadataCache.get(provider);
|
|
97
68
|
if (cached) {
|
|
@@ -110,524 +81,134 @@ export class PerpsClient {
|
|
|
110
81
|
return metadata;
|
|
111
82
|
}
|
|
112
83
|
/**
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
* value is picked. The post-`APPROVE_AGENT` auto-upgrade path also
|
|
117
|
-
* dispatches `ACCOUNT_MODE` directly with `mode: 'unifiedAccount'`.
|
|
84
|
+
* Resolve the registered provider plugin for `provider`, throwing a
|
|
85
|
+
* `PerpsError` when the caller has not registered one via the SDK's
|
|
86
|
+
* `providers` option. The plugin owns signer identity and write-side signing.
|
|
118
87
|
*/
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
return prerequisites
|
|
122
|
-
.filter((p) => {
|
|
123
|
-
// ACCOUNT_MODE / ACCOUNT_TYPE require explicit params; they're
|
|
124
|
-
// dispatched separately via `execute(...)` (or the post-APPROVE_AGENT
|
|
125
|
-
// auto-upgrade chain) rather than bulk-staged.
|
|
126
|
-
if (PerpsClient.EXPLICIT_INPUT_PREREQUISITES.has(p.type)) {
|
|
127
|
-
return false;
|
|
128
|
-
}
|
|
129
|
-
if (mode === SigningMode.USER) {
|
|
130
|
-
// USER mode: only items the user can sign, and never APPROVE_AGENT
|
|
131
|
-
// (no agent is created in this mode).
|
|
132
|
-
if (!p.signers.includes(PerpsSigner.USER)) {
|
|
133
|
-
return false;
|
|
134
|
-
}
|
|
135
|
-
if (p.type === ActionType.APPROVE_AGENT) {
|
|
136
|
-
return false;
|
|
137
|
-
}
|
|
138
|
-
return true;
|
|
139
|
-
}
|
|
140
|
-
// USER_AGENT mode: include every remaining declared prerequisite.
|
|
141
|
-
return true;
|
|
142
|
-
})
|
|
143
|
-
.map((p) => {
|
|
144
|
-
const params = {};
|
|
145
|
-
if (p.type === ActionType.APPROVE_AGENT && agentAddress) {
|
|
146
|
-
params.agentAddress = agentAddress;
|
|
147
|
-
}
|
|
148
|
-
return {
|
|
149
|
-
key: p.type,
|
|
150
|
-
...(Object.keys(params).length > 0 ? { params } : {}),
|
|
151
|
-
};
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
async resolveSignerForAction(action, address, provider) {
|
|
155
|
-
const mode = await this.loadSigningMode(address, provider);
|
|
156
|
-
if (mode !== SigningMode.USER_AGENT) {
|
|
157
|
-
return undefined;
|
|
158
|
-
}
|
|
159
|
-
// Only AGENT-signed actions surface a distinct signerAddress on the wire.
|
|
160
|
-
// API_KEY signers (e.g. Lighter's LighterKeyStore) are managed per-provider
|
|
161
|
-
// and don't have an EVM address — the backend identifies the action by the
|
|
162
|
-
// L1 `address` instead.
|
|
163
|
-
const metadata = await this.getProviderMetadata(provider);
|
|
164
|
-
const allActions = [
|
|
165
|
-
...metadata.setup,
|
|
166
|
-
...metadata.options,
|
|
167
|
-
...metadata.actions,
|
|
168
|
-
];
|
|
169
|
-
const descriptor = allActions.find((d) => d.type === action);
|
|
170
|
-
if (!descriptor?.signers.includes(PerpsSigner.AGENT)) {
|
|
171
|
-
return undefined;
|
|
172
|
-
}
|
|
173
|
-
const agent = await this.sdkClient.agentManager.getAgent(address, provider);
|
|
174
|
-
return agent.address;
|
|
88
|
+
requireProvider(provider) {
|
|
89
|
+
return resolveProvider(this.sdkClient, provider);
|
|
175
90
|
}
|
|
176
91
|
/**
|
|
177
|
-
*
|
|
178
|
-
*
|
|
179
|
-
*
|
|
92
|
+
* Ask the provider plugin for the signer-bearing wire fields of `action` —
|
|
93
|
+
* the on-wire `signerAddress` and any signer-derived params (e.g.
|
|
94
|
+
* Hyperliquid's `agentAddress` for `APPROVE_AGENT`). Forwards the descriptor's
|
|
95
|
+
* `signers` so the plugin can branch on signer role. Returns empty when the
|
|
96
|
+
* plugin signs as the user or with a non-EVM credential. Core constructs no
|
|
97
|
+
* `signerAddress` itself; signer identity is plugin-owned.
|
|
180
98
|
*/
|
|
181
|
-
async
|
|
182
|
-
const
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
}
|
|
186
|
-
async autoSignAndExecute(provider, address, action, actions, descriptor) {
|
|
187
|
-
switch (descriptor.signingMethod) {
|
|
188
|
-
case SigningMethod.EIP712: {
|
|
189
|
-
const eip712Actions = actions;
|
|
190
|
-
if (descriptor.signers.includes(PerpsSigner.AGENT)) {
|
|
191
|
-
const agent = await this.sdkClient.agentManager.getAgent(address, provider);
|
|
192
|
-
const signedActions = await Promise.all(eip712Actions.map(async (a) => ({
|
|
193
|
-
action: a.action,
|
|
194
|
-
typedData: a.typedData,
|
|
195
|
-
signature: await signTypedData(agent.privateKey, a.typedData),
|
|
196
|
-
})));
|
|
197
|
-
return executeAction(this.sdkClient, {
|
|
198
|
-
provider,
|
|
199
|
-
address,
|
|
200
|
-
signerAddress: agent.address,
|
|
201
|
-
action,
|
|
202
|
-
actions: signedActions,
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
if (descriptor.signers.includes(PerpsSigner.USER)) {
|
|
206
|
-
const signer = this.sdkClient.signer;
|
|
207
|
-
if (!signer) {
|
|
208
|
-
throw new PerpsError(PerpsErrorCode.SDKError, `Action '${action}' requires a user-wallet signature, but no signer was configured. Pass a WalletClient to createPerpsClient({ signer }).`);
|
|
209
|
-
}
|
|
210
|
-
const signedActions = await Promise.all(eip712Actions.map(async (a) => ({
|
|
211
|
-
action: a.action,
|
|
212
|
-
typedData: a.typedData,
|
|
213
|
-
signature: await signTypedDataWithSigner(signer, a.typedData),
|
|
214
|
-
})));
|
|
215
|
-
return executeAction(this.sdkClient, {
|
|
216
|
-
provider,
|
|
217
|
-
address,
|
|
218
|
-
signerAddress: address,
|
|
219
|
-
action,
|
|
220
|
-
actions: signedActions,
|
|
221
|
-
});
|
|
222
|
-
}
|
|
223
|
-
throw new PerpsError(PerpsErrorCode.SDKError, `Action '${action}' descriptor names no supported signer (signers=[${descriptor.signers.join(', ')}]).`);
|
|
224
|
-
}
|
|
225
|
-
case SigningMethod.WASM_BLOB: {
|
|
226
|
-
const wasmActions = actions;
|
|
227
|
-
const signedActions = await this.signWasmBlobActions(provider, address, wasmActions);
|
|
228
|
-
return executeAction(this.sdkClient, {
|
|
229
|
-
provider,
|
|
230
|
-
address,
|
|
231
|
-
signerAddress: address,
|
|
232
|
-
action,
|
|
233
|
-
actions: signedActions,
|
|
234
|
-
});
|
|
235
|
-
}
|
|
236
|
-
case SigningMethod.EVM_TX: {
|
|
237
|
-
const evmActions = actions;
|
|
238
|
-
const signedActions = await this.signEvmTxActions(evmActions);
|
|
239
|
-
return executeAction(this.sdkClient, {
|
|
240
|
-
provider,
|
|
241
|
-
address,
|
|
242
|
-
signerAddress: address,
|
|
243
|
-
action,
|
|
244
|
-
actions: signedActions,
|
|
245
|
-
});
|
|
246
|
-
}
|
|
247
|
-
default:
|
|
248
|
-
throw new Error(`Unknown signingMethod: ${descriptor.signingMethod}`);
|
|
99
|
+
async resolveActionRequest(provider, descriptor, address) {
|
|
100
|
+
const plugin = this.requireProvider(provider);
|
|
101
|
+
if (typeof plugin.resolveActionRequest !== 'function') {
|
|
102
|
+
return {};
|
|
249
103
|
}
|
|
104
|
+
return plugin.resolveActionRequest(descriptor.type, address, descriptor.signers);
|
|
250
105
|
}
|
|
251
106
|
/**
|
|
252
|
-
*
|
|
253
|
-
*
|
|
254
|
-
*
|
|
255
|
-
*
|
|
107
|
+
* Delegate signing of `actions` to the provider plugin. The plugin owns
|
|
108
|
+
* every signing arm and branches on the descriptor's `signers` internally,
|
|
109
|
+
* reading the end-user's wallet from the {@link SignActionsContext} when an
|
|
110
|
+
* arm signs as the user.
|
|
256
111
|
*/
|
|
257
|
-
async
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
}
|
|
263
|
-
return {
|
|
264
|
-
action: step.action,
|
|
265
|
-
typedData: step.typedData,
|
|
266
|
-
signature: await signTypedDataWithSigner(this.sdkClient.signer, step.typedData),
|
|
267
|
-
};
|
|
268
|
-
}
|
|
269
|
-
if ('wasmSignParams' in step) {
|
|
270
|
-
const [signed] = await this.signWasmBlobActions(provider, address, [step]);
|
|
271
|
-
return signed;
|
|
112
|
+
async delegateSignActions(provider, address, descriptor, actions) {
|
|
113
|
+
const plugin = this.requireProvider(provider);
|
|
114
|
+
if (typeof plugin.signActions !== 'function') {
|
|
115
|
+
throw new PerpsError(PerpsErrorCode.SDKError, `Provider '${provider}' does not implement signActions for ` +
|
|
116
|
+
`signingMethod '${descriptor.signingMethod}'.`);
|
|
272
117
|
}
|
|
273
|
-
|
|
274
|
-
const [signed] = await this.signEvmTxActions([step]);
|
|
275
|
-
return signed;
|
|
276
|
-
}
|
|
277
|
-
throw new PerpsError(PerpsErrorCode.SDKError, 'Unknown ActionStep shape — expected typedData, wasmSignParams, or txParams.');
|
|
118
|
+
return plugin.signActions(descriptor.signingMethod, actions, address, this.buildSignActionsContext(descriptor));
|
|
278
119
|
}
|
|
279
120
|
/**
|
|
280
|
-
*
|
|
281
|
-
*
|
|
282
|
-
*
|
|
283
|
-
*
|
|
284
|
-
*
|
|
121
|
+
* Assemble the per-call context the provider plugin needs in order to sign:
|
|
122
|
+
* the end-user's wallet and the descriptor's declared `signers`. Core
|
|
123
|
+
* forwards `signers` as data so the plugin can pick WHO signs; it does not
|
|
124
|
+
* branch on them. Provider-owned session credentials (the Hyperliquid agent
|
|
125
|
+
* keypair, Lighter's API key) are resolved inside the provider's
|
|
126
|
+
* `signActions`, not threaded through here.
|
|
285
127
|
*/
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
}
|
|
291
|
-
const { signer } = this.sdkClient;
|
|
292
|
-
const signed = [];
|
|
293
|
-
for (const step of actions) {
|
|
294
|
-
const params = step.txParams;
|
|
295
|
-
const txHash = await signer.writeContract({
|
|
296
|
-
address: params.to,
|
|
297
|
-
abi: parseAbi(params.abi),
|
|
298
|
-
functionName: params.functionName,
|
|
299
|
-
args: params.args,
|
|
300
|
-
chain: signer.chain,
|
|
301
|
-
account: signer.account,
|
|
302
|
-
});
|
|
303
|
-
signed.push({
|
|
304
|
-
action: step.action,
|
|
305
|
-
txParams: step.txParams,
|
|
306
|
-
txHash,
|
|
307
|
-
});
|
|
128
|
+
buildSignActionsContext(descriptor) {
|
|
129
|
+
const ctx = { signers: descriptor.signers };
|
|
130
|
+
if (this.sdkClient.userWallet !== undefined) {
|
|
131
|
+
ctx.userWallet = this.sdkClient.userWallet;
|
|
308
132
|
}
|
|
309
|
-
return
|
|
133
|
+
return ctx;
|
|
310
134
|
}
|
|
311
135
|
/**
|
|
312
|
-
* Sign a
|
|
313
|
-
*
|
|
314
|
-
*
|
|
315
|
-
*
|
|
136
|
+
* Sign a single provider setup action step by delegating to the provider
|
|
137
|
+
* plugin, which branches on the step's signing scheme internally. Lets
|
|
138
|
+
* consumers collect signed setup actions without embedding per-method
|
|
139
|
+
* signing logic.
|
|
316
140
|
*
|
|
317
|
-
*
|
|
318
|
-
*
|
|
319
|
-
* Lighter authenticates the endpoint with an auth token and enforces
|
|
320
|
-
* anti-replay server-side (24h cooldown, no open positions). The signer
|
|
321
|
-
* mints a Lighter auth token via the same WASM `CreateAuthToken` the read
|
|
322
|
-
* endpoints use and parks it in `signedTx.txInfo`; the backend's
|
|
323
|
-
* `executeChangeAccountTier` consumes that field as the `auth` form
|
|
324
|
-
* parameter. `txType`/`txHash` are unused for this action — they carry
|
|
325
|
-
* placeholder values to satisfy the `WasmBlobSignedActionStep` shape.
|
|
141
|
+
* @throws {PerpsError} When the step's action is not declared by the provider.
|
|
142
|
+
* @public
|
|
326
143
|
*/
|
|
327
|
-
async
|
|
328
|
-
const
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
signed.push(await this.signRegisterApiKey(provider, address, step));
|
|
332
|
-
}
|
|
333
|
-
else if (step.action === ActionType.ACCOUNT_TYPE) {
|
|
334
|
-
signed.push(await this.signAccountTierChange(address, step));
|
|
335
|
-
}
|
|
336
|
-
else {
|
|
337
|
-
signed.push(await this.signStandardWasmAction(provider, address, step));
|
|
338
|
-
}
|
|
339
|
-
}
|
|
144
|
+
async signProviderSetupAction(provider, address, step) {
|
|
145
|
+
const metadata = await this.getProviderMetadata(provider);
|
|
146
|
+
const descriptor = findActionDescriptor(metadata, step.action);
|
|
147
|
+
const [signed] = await this.delegateSignActions(provider, address, descriptor, [step]);
|
|
340
148
|
return signed;
|
|
341
149
|
}
|
|
342
|
-
async signStandardWasmAction(provider, address, step) {
|
|
343
|
-
const apiKey = await this.getLighterKeyStore().get(address);
|
|
344
|
-
if (!apiKey) {
|
|
345
|
-
throw new PerpsError(PerpsErrorCode.SDKError, `No Lighter API key registered for ${address}. ` +
|
|
346
|
-
'Run prepareAccount / REGISTER_API_KEY first.');
|
|
347
|
-
}
|
|
348
|
-
const signer = this.getLighterSigner();
|
|
349
|
-
const signedTx = await signer.sign(step.action, step.wasmSignParams, {
|
|
350
|
-
apiKeyPrivateKey: apiKey.apiKeyPrivateKey,
|
|
351
|
-
apiKeyIndex: apiKey.apiKeyIndex,
|
|
352
|
-
accountIndex: apiKey.accountIndex,
|
|
353
|
-
});
|
|
354
|
-
void provider;
|
|
355
|
-
return {
|
|
356
|
-
action: step.action,
|
|
357
|
-
wasmSignParams: step.wasmSignParams,
|
|
358
|
-
signedTx,
|
|
359
|
-
};
|
|
360
|
-
}
|
|
361
|
-
/**
|
|
362
|
-
* REGISTER_API_KEY flow:
|
|
363
|
-
* 1. Look up the user's Lighter accountIndex from getAccount()
|
|
364
|
-
* 2. Generate a fresh Lighter API keypair via the WASM signer
|
|
365
|
-
* 3. Call SignChangePubKey to produce the WASM blob + EIP-191 message
|
|
366
|
-
* 4. Have the user's L1 Ethereum wallet sign the message
|
|
367
|
-
* 5. Inject the L1 signature into the ChangePubKey txInfo JSON
|
|
368
|
-
* 6. Persist the keypair and return the signed blob
|
|
369
|
-
*
|
|
370
|
-
* Requires a USER wallet signer to be set via `setSigner` or passed at
|
|
371
|
-
* construction — the L1 signature is the user's consent to rotate keys.
|
|
372
|
-
*/
|
|
373
|
-
async signRegisterApiKey(provider, address, step) {
|
|
374
|
-
if (!this.sdkClient.signer) {
|
|
375
|
-
throw new PerpsError(PerpsErrorCode.SDKError, 'REGISTER_API_KEY requires a wallet signer — pass `signer` to ' +
|
|
376
|
-
'createPerpsClient or call setSigner(walletClient).');
|
|
377
|
-
}
|
|
378
|
-
const params = step.wasmSignParams;
|
|
379
|
-
const apiKeyIndex = params.api_key_index ?? DEFAULT_API_KEY_INDEX;
|
|
380
|
-
const nonce = params.nonce;
|
|
381
|
-
if (typeof nonce !== 'number') {
|
|
382
|
-
throw new PerpsError(PerpsErrorCode.SDKError, 'REGISTER_API_KEY wasmSignParams is missing `nonce`.');
|
|
383
|
-
}
|
|
384
|
-
const account = await getAccount(this.sdkClient, { provider, address });
|
|
385
|
-
if (account.config.provider !== 'lighter') {
|
|
386
|
-
throw new PerpsError(PerpsErrorCode.SDKError, `REGISTER_API_KEY requires a Lighter account, but getAccount ` +
|
|
387
|
-
`returned config for provider '${account.config.provider}'.`);
|
|
388
|
-
}
|
|
389
|
-
const accountIndex = account.config.accountIndex;
|
|
390
|
-
const signer = this.getLighterSigner();
|
|
391
|
-
const keypair = await signer.generateAPIKey();
|
|
392
|
-
const changePubKey = await signer.signChangePubKey(keypair.publicKey, keypair.privateKey, nonce, apiKeyIndex, accountIndex);
|
|
393
|
-
const l1Signature = await this.sdkClient.signer.signMessage({
|
|
394
|
-
account: this.sdkClient.signer.account,
|
|
395
|
-
message: changePubKey.messageToSign,
|
|
396
|
-
});
|
|
397
|
-
const txInfoWithL1Sig = signer.embedL1Signature(changePubKey.txInfo, l1Signature);
|
|
398
|
-
const apiKey = {
|
|
399
|
-
accountIndex,
|
|
400
|
-
apiKeyIndex,
|
|
401
|
-
apiKeyPrivateKey: keypair.privateKey,
|
|
402
|
-
apiKeyPublicKey: keypair.publicKey,
|
|
403
|
-
};
|
|
404
|
-
await this.getLighterKeyStore().set(address, apiKey);
|
|
405
|
-
return {
|
|
406
|
-
action: step.action,
|
|
407
|
-
wasmSignParams: {
|
|
408
|
-
...step.wasmSignParams,
|
|
409
|
-
new_public_key: keypair.publicKey,
|
|
410
|
-
},
|
|
411
|
-
signedTx: {
|
|
412
|
-
txType: changePubKey.txType,
|
|
413
|
-
txInfo: txInfoWithL1Sig,
|
|
414
|
-
txHash: changePubKey.txHash,
|
|
415
|
-
},
|
|
416
|
-
};
|
|
417
|
-
}
|
|
418
|
-
/**
|
|
419
|
-
* Sign an `ACCOUNT_TYPE` step (Lighter `changeAccountTier`).
|
|
420
|
-
*
|
|
421
|
-
* Lighter's `/api/v1/changeAccountTier` is an HTTP-only mutation —
|
|
422
|
-
* Lighter does NOT consume a wasm-signed transaction here; it
|
|
423
|
-
* authenticates the request with the same auth token its read endpoints
|
|
424
|
-
* use, and enforces anti-replay business rules server-side. The backend
|
|
425
|
-
* therefore declares the step as a `WasmBlobActionStep` with
|
|
426
|
-
* `wasmSignParams.kind = 'changeAccountTier'` and expects the SDK to
|
|
427
|
-
* mint an auth token in lieu of a transaction signature. That contract
|
|
428
|
-
* is documented in `lifi-perps-backend/src/providers/lighter/actions/
|
|
429
|
-
* lighter.actions.accountType.ts` and consumed by `executeChangeAccountTier`.
|
|
430
|
-
*
|
|
431
|
-
* The auth-token deadline mirrors {@link createLighterAuthToken}'s 1h
|
|
432
|
-
* default — Lighter caps tokens at 8h hard, and the backend's executor
|
|
433
|
-
* runs `verifyPendingAction` then a single `/changeAccountTier` POST,
|
|
434
|
-
* which completes well inside an hour.
|
|
435
|
-
*/
|
|
436
|
-
async signAccountTierChange(address, step) {
|
|
437
|
-
const apiKey = await this.getLighterKeyStore().get(address);
|
|
438
|
-
if (!apiKey) {
|
|
439
|
-
throw new PerpsError(PerpsErrorCode.SDKError, `No Lighter API key registered for ${address}. ` +
|
|
440
|
-
'Run prepareAccount / REGISTER_API_KEY first.');
|
|
441
|
-
}
|
|
442
|
-
const signer = this.getLighterSigner();
|
|
443
|
-
const deadline = Math.floor(Date.now() / 1000) + 60 * 60;
|
|
444
|
-
const authToken = await signer.createAuthToken(deadline, {
|
|
445
|
-
apiKeyPrivateKey: apiKey.apiKeyPrivateKey,
|
|
446
|
-
apiKeyIndex: apiKey.apiKeyIndex,
|
|
447
|
-
accountIndex: apiKey.accountIndex,
|
|
448
|
-
});
|
|
449
|
-
return {
|
|
450
|
-
action: step.action,
|
|
451
|
-
wasmSignParams: step.wasmSignParams,
|
|
452
|
-
signedTx: {
|
|
453
|
-
// `/changeAccountTier` reads only `txInfo` (the auth token); `txType`
|
|
454
|
-
// and `txHash` are placeholders to satisfy the envelope shape.
|
|
455
|
-
txType: 0,
|
|
456
|
-
txInfo: authToken,
|
|
457
|
-
txHash: '',
|
|
458
|
-
},
|
|
459
|
-
};
|
|
460
|
-
}
|
|
461
150
|
/**
|
|
462
|
-
*
|
|
463
|
-
*
|
|
151
|
+
* Build (but do not sign or submit) the unsigned action steps for `action`,
|
|
152
|
+
* letting the provider plugin contribute any signer-bearing request fields.
|
|
464
153
|
*
|
|
465
|
-
*
|
|
466
|
-
* 1. The long-lived read-only token persisted by `approveReadOnlyToken`,
|
|
467
|
-
* when one is stored for this `(address, accountIndex)` AND has not
|
|
468
|
-
* passed its recorded `expiry`. The SDK never returns an expired
|
|
469
|
-
* stored token.
|
|
470
|
-
* 2. A freshly minted 8h Lighter auth token, signed off the user's
|
|
471
|
-
* Lighter API key. Requires `REGISTER_API_KEY` to have completed.
|
|
472
|
-
* 3. `undefined` — caller falls back to public reads.
|
|
473
|
-
*
|
|
474
|
-
* `accountIndex` lets callers in pure read-only mode (no API key
|
|
475
|
-
* registered) target the RO token. When omitted, the SDK derives it from
|
|
476
|
-
* the user's registered API key.
|
|
477
|
-
*
|
|
478
|
-
* `deadlineSeconds` only affects the standard-token fallback (Lighter caps
|
|
479
|
-
* those tokens at 8h). Read-only tokens carry their own mint-time expiry
|
|
480
|
-
* recorded by {@link approveReadOnlyToken}.
|
|
154
|
+
* @public
|
|
481
155
|
*/
|
|
482
|
-
async createLighterAuthToken(address, deadlineSeconds, accountIndex) {
|
|
483
|
-
const apiKey = await this.getLighterKeyStore().get(address);
|
|
484
|
-
const resolvedAccountIndex = accountIndex ?? apiKey?.accountIndex;
|
|
485
|
-
if (resolvedAccountIndex !== undefined) {
|
|
486
|
-
const stored = await this.getLighterReadOnlyTokenManager().get(address, resolvedAccountIndex);
|
|
487
|
-
if (stored) {
|
|
488
|
-
return stored.token;
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
if (!apiKey) {
|
|
492
|
-
return undefined;
|
|
493
|
-
}
|
|
494
|
-
const deadline = deadlineSeconds ?? Math.floor(Date.now() / 1000) + 60 * 60;
|
|
495
|
-
const signer = this.getLighterSigner();
|
|
496
|
-
return signer.createAuthToken(deadline, {
|
|
497
|
-
apiKeyPrivateKey: apiKey.apiKeyPrivateKey,
|
|
498
|
-
apiKeyIndex: apiKey.apiKeyIndex,
|
|
499
|
-
accountIndex: apiKey.accountIndex,
|
|
500
|
-
});
|
|
501
|
-
}
|
|
502
|
-
/**
|
|
503
|
-
* Mint a long-lived Lighter read-only token via Lighter's
|
|
504
|
-
* `tokens/create` endpoint and persist it through the configured
|
|
505
|
-
* `StorageAdapter`, keyed by `(L1 address, accountIndex)`.
|
|
506
|
-
*
|
|
507
|
-
* The user's connected wallet signs an EIP-191 message describing the
|
|
508
|
-
* mint request; the resulting `Authorization` header authenticates the
|
|
509
|
-
* Lighter HTTP call. The bearer string Lighter returns is persisted
|
|
510
|
-
* alongside its `expiry` and `scope`; subsequent calls to
|
|
511
|
-
* {@link createLighterAuthToken} prefer it over the 8h standard token.
|
|
512
|
-
*
|
|
513
|
-
* `expirySeconds` is the absolute unix-seconds expiry recorded on
|
|
514
|
-
* Lighter's row. Lighter enforces 1 day ≤ lifetime ≤ 10 years
|
|
515
|
-
* server-side; the SDK does NOT pre-validate and surfaces Lighter's 400
|
|
516
|
-
* verbatim. `scope` defaults to `'all'`; the `'single'` variant is wired
|
|
517
|
-
* through but only useful when the caller has a specific reason to scope
|
|
518
|
-
* the token to one account.
|
|
519
|
-
*
|
|
520
|
-
* Requires a USER wallet signer to be set via {@link setSigner} or
|
|
521
|
-
* passed at construction — the L1 signature is the user's consent.
|
|
522
|
-
*/
|
|
523
|
-
async approveReadOnlyToken(address, params) {
|
|
524
|
-
if (!this.sdkClient.signer) {
|
|
525
|
-
throw new PerpsError(PerpsErrorCode.SDKError, 'approveReadOnlyToken requires a wallet signer — pass `signer` to ' +
|
|
526
|
-
'createPerpsClient or call setSigner(walletClient).');
|
|
527
|
-
}
|
|
528
|
-
const signer = walletClientSigner(this.sdkClient.signer);
|
|
529
|
-
return this.getLighterReadOnlyTokenManager().approve(signer, {
|
|
530
|
-
address,
|
|
531
|
-
...params,
|
|
532
|
-
});
|
|
533
|
-
}
|
|
534
|
-
/**
|
|
535
|
-
* Whether the stored Lighter read-only token for `(address, accountIndex)`
|
|
536
|
-
* falls within `thresholdDays` of its `expiry`. Returns `false` when no
|
|
537
|
-
* token is stored, when the stored token has already expired, or when
|
|
538
|
-
* more than `thresholdDays` of life remain. Intended for widget renewal
|
|
539
|
-
* banners (default threshold: 30 days).
|
|
540
|
-
*/
|
|
541
|
-
async isLighterReadOnlyTokenExpiringSoon(address, accountIndex, thresholdDays) {
|
|
542
|
-
return this.getLighterReadOnlyTokenManager().isReadOnlyTokenExpiringSoon(address, accountIndex, thresholdDays);
|
|
543
|
-
}
|
|
544
|
-
// ---------------------------------------------------------------------------
|
|
545
|
-
// Generic action helpers
|
|
546
|
-
// ---------------------------------------------------------------------------
|
|
547
156
|
async buildAction(action, params) {
|
|
548
|
-
const
|
|
157
|
+
const metadata = await this.getProviderMetadata(params.provider);
|
|
158
|
+
const descriptor = findActionDescriptor(metadata, action);
|
|
159
|
+
const { signerAddress, params: signerParams } = await this.resolveActionRequest(params.provider, descriptor, params.address);
|
|
549
160
|
return createAction(this.sdkClient, {
|
|
550
161
|
provider: params.provider,
|
|
551
162
|
address: params.address,
|
|
552
163
|
signerAddress,
|
|
553
164
|
action,
|
|
554
|
-
params:
|
|
165
|
+
params: {
|
|
166
|
+
...params.params,
|
|
167
|
+
...signerParams,
|
|
168
|
+
},
|
|
555
169
|
});
|
|
556
170
|
}
|
|
557
|
-
// ---------------------------------------------------------------------------
|
|
558
|
-
// Signing mode management
|
|
559
|
-
// ---------------------------------------------------------------------------
|
|
560
|
-
async setSigningMode(address, provider, mode) {
|
|
561
|
-
const key = this.modeKey(address, provider);
|
|
562
|
-
this.signingModes.set(key, mode);
|
|
563
|
-
await this.storage.set(this.signingModeStorageKey(address, provider), mode);
|
|
564
|
-
if (mode === SigningMode.USER_AGENT &&
|
|
565
|
-
(await this.providerUsesAgent(provider))) {
|
|
566
|
-
await this.sdkClient.agentManager.getOrCreateAgent(address, provider);
|
|
567
|
-
}
|
|
568
|
-
}
|
|
569
|
-
getSigningMode(address, provider) {
|
|
570
|
-
return (this.signingModes.get(this.modeKey(address, provider)) ??
|
|
571
|
-
SigningMode.USER_AGENT);
|
|
572
|
-
}
|
|
573
|
-
async loadSigningMode(address, provider) {
|
|
574
|
-
const key = this.modeKey(address, provider);
|
|
575
|
-
if (this.signingModes.has(key)) {
|
|
576
|
-
return this.signingModes.get(key);
|
|
577
|
-
}
|
|
578
|
-
const stored = await this.storage.get(this.signingModeStorageKey(address, provider));
|
|
579
|
-
const mode = stored === SigningMode.USER_AGENT || stored === SigningMode.USER
|
|
580
|
-
? stored
|
|
581
|
-
: SigningMode.USER_AGENT;
|
|
582
|
-
this.signingModes.set(key, mode);
|
|
583
|
-
return mode;
|
|
584
|
-
}
|
|
585
|
-
async loadAgentMode(address, provider) {
|
|
586
|
-
const mode = await this.loadSigningMode(address, provider);
|
|
587
|
-
return mode === SigningMode.USER_AGENT;
|
|
588
|
-
}
|
|
589
|
-
async setAgentMode(address, provider, useAgent) {
|
|
590
|
-
await this.setSigningMode(address, provider, useAgent ? SigningMode.USER_AGENT : SigningMode.USER);
|
|
591
|
-
}
|
|
592
|
-
async getAgentAddress(address, provider) {
|
|
593
|
-
const agent = await this.sdkClient.agentManager.getAgent(address, provider);
|
|
594
|
-
return agent.address;
|
|
595
|
-
}
|
|
596
|
-
async hasAgent(address, provider) {
|
|
597
|
-
return this.sdkClient.agentManager.hasAgent(address, provider);
|
|
598
|
-
}
|
|
599
|
-
async removeAgent(address, provider) {
|
|
600
|
-
await this.sdkClient.agentManager.removeAgent(address, provider);
|
|
601
|
-
this.signingModes.delete(this.modeKey(address, provider));
|
|
602
|
-
await this.storage.remove(this.signingModeStorageKey(address, provider));
|
|
603
|
-
}
|
|
604
|
-
// ---------------------------------------------------------------------------
|
|
605
|
-
// Account
|
|
606
|
-
// ---------------------------------------------------------------------------
|
|
607
171
|
/**
|
|
608
172
|
* Fetch the user's account state from the backend and attach the
|
|
609
173
|
* SDK-projected `settings` array — one `AccountConfigSetting` per
|
|
610
174
|
* descriptor on `Provider.setup` + `Provider.options`. Callers read
|
|
611
175
|
* `result.settings` directly without re-deriving values from the typed
|
|
612
176
|
* `AccountConfig`.
|
|
177
|
+
*
|
|
178
|
+
* @throws {PerpsError} When the provider plugin is not registered, or the
|
|
179
|
+
* backend account fetch fails.
|
|
180
|
+
* @public
|
|
613
181
|
*/
|
|
614
182
|
async getAccount(params) {
|
|
183
|
+
const plugin = this.requireProvider(params.provider);
|
|
615
184
|
const [response, metadata] = await Promise.all([
|
|
616
|
-
|
|
185
|
+
fetchAccount(this.sdkClient, params),
|
|
617
186
|
this.getProviderMetadata(params.provider),
|
|
618
187
|
]);
|
|
619
|
-
const settings =
|
|
188
|
+
const settings = plugin.projectConfig(response.config, metadata.setup, metadata.options);
|
|
620
189
|
return { ...response, settings };
|
|
621
190
|
}
|
|
191
|
+
/**
|
|
192
|
+
* Roll an already-fetched {@link AccountResponse} (plus its positions) up
|
|
193
|
+
* into an {@link AccountSummary}, delegating to the owning provider so the
|
|
194
|
+
* venue-specific collateral and margin semantics are applied correctly.
|
|
195
|
+
*/
|
|
196
|
+
getAccountSummary(account, positions) {
|
|
197
|
+
return this.requireProvider(account.provider).getAccountSummary(account, positions);
|
|
198
|
+
}
|
|
622
199
|
/**
|
|
623
200
|
* Thin existence check for a provider account at `address`. Returns
|
|
624
201
|
* `true` when `getAccount` resolves, `false` when the backend reports
|
|
625
202
|
* `PerpsErrorCode.AccountNotFound`, and re-throws on any other error
|
|
626
203
|
* (transport failures, validation errors, server errors).
|
|
204
|
+
*
|
|
205
|
+
* @throws {PerpsError} On any backend error other than
|
|
206
|
+
* `PerpsErrorCode.AccountNotFound`.
|
|
207
|
+
* @public
|
|
627
208
|
*/
|
|
628
209
|
async accountExists(provider, address) {
|
|
629
210
|
try {
|
|
630
|
-
await
|
|
211
|
+
await fetchAccount(this.sdkClient, { provider, address });
|
|
631
212
|
return true;
|
|
632
213
|
}
|
|
633
214
|
catch (err) {
|
|
@@ -638,292 +219,185 @@ export class PerpsClient {
|
|
|
638
219
|
throw err;
|
|
639
220
|
}
|
|
640
221
|
}
|
|
641
|
-
// ---------------------------------------------------------------------------
|
|
642
|
-
// Setup
|
|
643
|
-
// ---------------------------------------------------------------------------
|
|
644
222
|
/**
|
|
645
|
-
* Return the unsatisfied entries on `Provider.setup` for this account
|
|
646
|
-
*
|
|
223
|
+
* Return the unsatisfied entries on `Provider.setup` for this account as a
|
|
224
|
+
* flat, self-describing list. Trading is gated on `isReady === true`.
|
|
647
225
|
*
|
|
648
226
|
* `Provider.options` descriptors are NEVER returned here — options are
|
|
649
227
|
* post-setup tunables and never gate trading. Option state is surfaced
|
|
650
228
|
* separately via `getAccount().settings`.
|
|
229
|
+
*
|
|
230
|
+
* @public
|
|
651
231
|
*/
|
|
652
232
|
async checkSetup(params) {
|
|
653
233
|
const { provider, address } = params;
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
...metadata.options,
|
|
659
|
-
...metadata.actions,
|
|
660
|
-
].some((d) => d.signers.includes(PerpsSigner.AGENT));
|
|
661
|
-
let agentAddress;
|
|
662
|
-
if (mode === SigningMode.USER_AGENT && usesAgent) {
|
|
663
|
-
const agent = await this.sdkClient.agentManager.getOrCreateAgent(address, provider);
|
|
664
|
-
agentAddress = agent.address;
|
|
665
|
-
}
|
|
666
|
-
const allInputs = this.buildPrerequisiteInputs(metadata.setup, mode, agentAddress);
|
|
667
|
-
if (allInputs.length === 0) {
|
|
668
|
-
return { userPrerequisites: [], agentPrerequisites: [], isReady: true };
|
|
669
|
-
}
|
|
670
|
-
// Build a signer lookup from setup descriptors.
|
|
671
|
-
const signersByAction = new Map();
|
|
672
|
-
for (const desc of metadata.setup) {
|
|
673
|
-
signersByAction.set(desc.type, desc.signers);
|
|
674
|
-
}
|
|
675
|
-
// Send all to backend via createAction for the first prerequisite type
|
|
676
|
-
// The backend filters already-satisfied ones and returns typed data
|
|
677
|
-
const { actions } = await this.buildPrerequisites({
|
|
678
|
-
provider,
|
|
679
|
-
address,
|
|
680
|
-
signerAddress: agentAddress,
|
|
681
|
-
});
|
|
682
|
-
if (actions.length === 0) {
|
|
683
|
-
return { userPrerequisites: [], agentPrerequisites: [], isReady: true };
|
|
684
|
-
}
|
|
685
|
-
const userPrerequisites = actions.filter((a) => {
|
|
686
|
-
const signers = signersByAction.get(a.action) ?? [];
|
|
687
|
-
return signers.includes(PerpsSigner.USER);
|
|
688
|
-
});
|
|
689
|
-
const agentPrerequisites = actions.filter((a) => {
|
|
690
|
-
const signers = signersByAction.get(a.action) ?? [];
|
|
691
|
-
return signers.includes(PerpsSigner.AGENT);
|
|
692
|
-
});
|
|
234
|
+
// The backend filters already-satisfied setup actions and returns typed
|
|
235
|
+
// data for those still outstanding; each plugin contributes its own
|
|
236
|
+
// signer-bearing request fields.
|
|
237
|
+
const { actions } = await this.buildProviderSetup({ provider, address });
|
|
693
238
|
return {
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
isReady: false,
|
|
239
|
+
setup: actions,
|
|
240
|
+
isReady: actions.length === 0,
|
|
697
241
|
};
|
|
698
242
|
}
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
243
|
+
/**
|
|
244
|
+
* Build the unsigned setup `ActionStep`s still outstanding for an account,
|
|
245
|
+
* ordered by descriptor `sequence`. The backend filters already-satisfied
|
|
246
|
+
* setup; each plugin contributes its own signer-bearing request fields and
|
|
247
|
+
* any local-state params (e.g. Lighter's known pubkey).
|
|
248
|
+
*
|
|
249
|
+
* @public
|
|
250
|
+
*/
|
|
251
|
+
async buildProviderSetup(params) {
|
|
252
|
+
const { provider, address } = params;
|
|
253
|
+
const metadata = await this.getProviderMetadata(provider);
|
|
254
|
+
const orderedSetup = [...metadata.setup].sort((a, b) => (a.sequence ?? Number.MAX_SAFE_INTEGER) -
|
|
255
|
+
(b.sequence ?? Number.MAX_SAFE_INTEGER));
|
|
256
|
+
const plugin = this.sdkClient.getProvider(provider);
|
|
710
257
|
const allActions = [];
|
|
711
|
-
for (const
|
|
258
|
+
for (const descriptor of orderedSetup) {
|
|
259
|
+
const action = descriptor.type;
|
|
260
|
+
const { signerAddress, params: signerParams } = await this.resolveActionRequest(provider, descriptor, address);
|
|
261
|
+
const localParams = plugin?.resolveSetupParams
|
|
262
|
+
? await plugin.resolveSetupParams(action, address)
|
|
263
|
+
: {};
|
|
712
264
|
const { actions } = await createAction(this.sdkClient, {
|
|
713
|
-
provider
|
|
714
|
-
address
|
|
265
|
+
provider,
|
|
266
|
+
address,
|
|
715
267
|
signerAddress,
|
|
716
|
-
action
|
|
717
|
-
params:
|
|
268
|
+
action,
|
|
269
|
+
params: {
|
|
270
|
+
...signerParams,
|
|
271
|
+
...localParams,
|
|
272
|
+
},
|
|
718
273
|
});
|
|
719
274
|
allActions.push(...actions);
|
|
720
275
|
}
|
|
721
276
|
return { actions: allActions };
|
|
722
277
|
}
|
|
723
278
|
/**
|
|
724
|
-
*
|
|
725
|
-
*
|
|
726
|
-
*
|
|
727
|
-
*
|
|
279
|
+
* Submit the signed setup steps returned by `checkSetup` (and signed by the
|
|
280
|
+
* caller / `signProviderSetupAction`). Routes the batch on the first step's
|
|
281
|
+
* action and lets the plugin contribute that action's `signerAddress`.
|
|
282
|
+
* Throws on any per-step venue rejection.
|
|
283
|
+
*
|
|
284
|
+
* @public
|
|
728
285
|
*/
|
|
729
|
-
|
|
286
|
+
async executeProviderSetup(params) {
|
|
287
|
+
const { provider, address, setup, signedActions } = params;
|
|
288
|
+
if (signedActions.length === 0) {
|
|
289
|
+
return { results: { results: [] } };
|
|
290
|
+
}
|
|
291
|
+
const action = setup[0]?.action ?? signedActions[0].action;
|
|
292
|
+
const metadata = await this.getProviderMetadata(provider);
|
|
293
|
+
const descriptor = findActionDescriptor(metadata, action);
|
|
294
|
+
const { signerAddress } = await this.resolveActionRequest(provider, descriptor, address);
|
|
295
|
+
const results = await executeAction(this.sdkClient, {
|
|
296
|
+
provider,
|
|
297
|
+
address,
|
|
298
|
+
// The submitting account: the plugin-resolved signer (Hyperliquid's
|
|
299
|
+
// agent) when present, else the end-user's address.
|
|
300
|
+
signerAddress: signerAddress ?? address,
|
|
301
|
+
action,
|
|
302
|
+
actions: signedActions,
|
|
303
|
+
});
|
|
304
|
+
const failure = results.results.find((r) => !r.success);
|
|
305
|
+
if (failure) {
|
|
306
|
+
throw new PerpsError(PerpsErrorCode.ExchangeRejected, failure.error);
|
|
307
|
+
}
|
|
308
|
+
return { results };
|
|
309
|
+
}
|
|
730
310
|
/**
|
|
731
|
-
*
|
|
732
|
-
* current `config.abstractionMode` and routing to the correct signer:
|
|
311
|
+
* Sign and submit one pre-staged setup `ActionStep` end-to-end.
|
|
733
312
|
*
|
|
734
|
-
*
|
|
735
|
-
*
|
|
736
|
-
*
|
|
737
|
-
*
|
|
738
|
-
*
|
|
739
|
-
*
|
|
740
|
-
*
|
|
741
|
-
*
|
|
742
|
-
* surface a wallet prompt via `fallbackUserPrerequisites`.
|
|
313
|
+
* The caller is expected to have already obtained the step from a prior
|
|
314
|
+
* {@link checkSetup} call (typically cached by the widget's react-query) —
|
|
315
|
+
* we do NOT refetch. This avoids the double `createAction` round-trip and
|
|
316
|
+
* keeps the nonce that was allocated at staging time committed all the way
|
|
317
|
+
* through submit. If the cached step has gone stale (Lighter's `/nextNonce`
|
|
318
|
+
* advanced underneath us), `executeProviderSetup` will surface a nonce
|
|
319
|
+
* conflict that the caller invalidates on, refetches `checkSetup`, and
|
|
320
|
+
* retries with a fresh step.
|
|
743
321
|
*
|
|
744
|
-
*
|
|
745
|
-
*
|
|
746
|
-
*
|
|
747
|
-
* provider (gated by `hasWritableAccountMode`).
|
|
322
|
+
* @throws {PerpsError} When the step's action is not in the provider's
|
|
323
|
+
* `setup` descriptors.
|
|
324
|
+
* @public
|
|
748
325
|
*/
|
|
749
|
-
async
|
|
750
|
-
const
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
}
|
|
756
|
-
const currentStatus = account.config.abstractionMode;
|
|
757
|
-
// Idempotent short-circuit: already in the requested mode.
|
|
758
|
-
if (currentStatus === mode) {
|
|
759
|
-
return {};
|
|
760
|
-
}
|
|
761
|
-
// Never set → the agent is authorised to perform the change.
|
|
762
|
-
if (currentStatus == null) {
|
|
763
|
-
const agent = await this.sdkClient.agentManager.getAgent(address, provider);
|
|
764
|
-
const { actions } = await createAction(this.sdkClient, {
|
|
765
|
-
provider,
|
|
766
|
-
address,
|
|
767
|
-
signerAddress: agent.address,
|
|
768
|
-
action: ActionType.ACCOUNT_MODE,
|
|
769
|
-
params: { mode },
|
|
770
|
-
});
|
|
771
|
-
if (actions.length === 0) {
|
|
772
|
-
// Backend's per-mode early-exit (defensive — shouldn't fire given
|
|
773
|
-
// the short-circuit above, but covers a race between our /account
|
|
774
|
-
// read and the backend's view of the current status).
|
|
775
|
-
return { results: { results: [] } };
|
|
776
|
-
}
|
|
777
|
-
const signedActions = await Promise.all(actions.map(async (a) => ({
|
|
778
|
-
action: a.action,
|
|
779
|
-
typedData: a.typedData,
|
|
780
|
-
signature: await signTypedData(agent.privateKey, a.typedData),
|
|
781
|
-
})));
|
|
782
|
-
const results = await executeAction(this.sdkClient, {
|
|
783
|
-
provider,
|
|
784
|
-
address,
|
|
785
|
-
signerAddress: agent.address,
|
|
786
|
-
action: ActionType.ACCOUNT_MODE,
|
|
787
|
-
actions: signedActions,
|
|
788
|
-
});
|
|
789
|
-
return { results };
|
|
326
|
+
async executeProviderSetupAction(params) {
|
|
327
|
+
const { provider, address, step } = params;
|
|
328
|
+
const metadata = await this.getProviderMetadata(provider);
|
|
329
|
+
const descriptor = metadata.setup.find((d) => d.type === step.action);
|
|
330
|
+
if (!descriptor) {
|
|
331
|
+
throw new PerpsError(PerpsErrorCode.SDKError, `Action '${step.action}' is not in '${provider}'.setup`);
|
|
790
332
|
}
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
const { actions: fallbackActions } = await createAction(this.sdkClient, {
|
|
333
|
+
const signed = await this.signProviderSetupAction(provider, address, step);
|
|
334
|
+
await this.executeProviderSetup({
|
|
794
335
|
provider,
|
|
795
336
|
address,
|
|
796
|
-
|
|
797
|
-
|
|
337
|
+
setup: [step],
|
|
338
|
+
signedActions: [signed],
|
|
798
339
|
});
|
|
799
|
-
return {
|
|
800
|
-
fallback: fallbackActions.length > 0 ? fallbackActions : undefined,
|
|
801
|
-
};
|
|
802
340
|
}
|
|
803
341
|
/**
|
|
804
|
-
*
|
|
805
|
-
*
|
|
806
|
-
*
|
|
807
|
-
*
|
|
342
|
+
* Sign and submit a single provider-option change (a `Provider.options`
|
|
343
|
+
* tunable such as Lighter `ACCOUNT_TYPE` or Hyperliquid `ACCOUNT_MODE`)
|
|
344
|
+
* end-to-end, throwing on a venue rejection.
|
|
345
|
+
*
|
|
346
|
+
* Options are dispatched through the same {@link execute} pipeline as
|
|
347
|
+
* trades, but unlike a trade an option change is a single mandatory action:
|
|
348
|
+
* a per-action `success: false` (returned as a 200 OK) means the user's
|
|
349
|
+
* selection was rejected and must surface, not be silently dropped. This
|
|
350
|
+
* wrapper inspects the result and throws a {@link PerpsError} carrying the
|
|
351
|
+
* venue `error`, giving options the same throw contract that setup has via
|
|
352
|
+
* {@link executeProviderSetupAction}. The only structural difference is that
|
|
353
|
+
* an option carries `params` (the selected value) rather than a pre-staged
|
|
354
|
+
* step.
|
|
355
|
+
*
|
|
356
|
+
* `execute` itself is unchanged — it still returns results without throwing,
|
|
357
|
+
* which the trade hooks rely on for partial-fill handling.
|
|
358
|
+
*
|
|
359
|
+
* @throws {PerpsError} `PerpsErrorCode.ExchangeRejected` carrying the venue
|
|
360
|
+
* error when any returned result has `success: false`; also the errors
|
|
361
|
+
* `execute` itself can throw (unregistered provider, no signer, signing
|
|
362
|
+
* failure).
|
|
363
|
+
* @public
|
|
808
364
|
*/
|
|
809
|
-
|
|
810
|
-
const
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
const modeParam = item.params.find((p) => p.name === 'mode');
|
|
815
|
-
if (!modeParam) {
|
|
816
|
-
return false;
|
|
365
|
+
async executeProviderOption(params) {
|
|
366
|
+
const { results } = await this.execute(params);
|
|
367
|
+
const failure = results.find((r) => !r.success);
|
|
368
|
+
if (failure) {
|
|
369
|
+
throw new PerpsError(PerpsErrorCode.ExchangeRejected, failure.error);
|
|
817
370
|
}
|
|
818
|
-
// Writable multi-option: `values` enumerates choices and `readOnly`
|
|
819
|
-
// is not set (treat absence as writable, matching the descriptor
|
|
820
|
-
// contract in `Param`).
|
|
821
|
-
if (!modeParam.values || modeParam.values.length === 0) {
|
|
822
|
-
return false;
|
|
823
|
-
}
|
|
824
|
-
return !modeParam.readOnly;
|
|
825
371
|
}
|
|
826
372
|
/**
|
|
827
|
-
*
|
|
828
|
-
* with
|
|
373
|
+
* Place a market or limit order. Convenience wrapper over {@link execute}
|
|
374
|
+
* with `ActionType.PLACE_ORDER`.
|
|
829
375
|
*
|
|
830
|
-
*
|
|
831
|
-
*
|
|
832
|
-
*
|
|
833
|
-
*
|
|
834
|
-
*
|
|
835
|
-
*
|
|
836
|
-
*
|
|
837
|
-
*
|
|
838
|
-
*
|
|
376
|
+
* @throws {PerpsError} When the provider is unregistered or the action
|
|
377
|
+
* cannot be signed/submitted.
|
|
378
|
+
* @example
|
|
379
|
+
* ```ts
|
|
380
|
+
* await client.placeOrder({
|
|
381
|
+
* provider: 'hyperliquid',
|
|
382
|
+
* address: '0xUser',
|
|
383
|
+
* market: { symbol: 'ETH' },
|
|
384
|
+
* side: 'buy',
|
|
385
|
+
* size: '0.1',
|
|
386
|
+
* })
|
|
387
|
+
* ```
|
|
388
|
+
* @public
|
|
839
389
|
*/
|
|
840
|
-
async satisfySetup(params) {
|
|
841
|
-
const { provider, address, required, userSignedActions } = params;
|
|
842
|
-
const mode = await this.loadSigningMode(address, provider);
|
|
843
|
-
// 1. Submit user-signed prerequisites
|
|
844
|
-
let userResults = { results: [] };
|
|
845
|
-
if (userSignedActions.length > 0) {
|
|
846
|
-
const signerAddress = mode === SigningMode.USER_AGENT
|
|
847
|
-
? (await this.sdkClient.agentManager.getAgent(address, provider))
|
|
848
|
-
.address
|
|
849
|
-
: address;
|
|
850
|
-
// Submit all user-signed actions — use first action's type for routing
|
|
851
|
-
const firstAction = required.userPrerequisites[0]?.action;
|
|
852
|
-
userResults = await executeAction(this.sdkClient, {
|
|
853
|
-
provider,
|
|
854
|
-
address,
|
|
855
|
-
signerAddress,
|
|
856
|
-
action: (firstAction ?? ActionType.APPROVE_AGENT),
|
|
857
|
-
actions: userSignedActions,
|
|
858
|
-
});
|
|
859
|
-
const mandatoryFailure = userResults.results.find((r) => !r.success);
|
|
860
|
-
if (mandatoryFailure) {
|
|
861
|
-
return { userResults };
|
|
862
|
-
}
|
|
863
|
-
}
|
|
864
|
-
// 2. Auto-upgrade ACCOUNT_MODE after APPROVE_AGENT.
|
|
865
|
-
//
|
|
866
|
-
// When the user-signed setup included a successful APPROVE_AGENT, the
|
|
867
|
-
// freshly approved agent is now authorised to sign account-level
|
|
868
|
-
// actions for accounts whose abstraction has never been set. If the
|
|
869
|
-
// provider exposes a writable `ACCOUNT_MODE` descriptor (Hyperliquid
|
|
870
|
-
// today), the SDK reads `account.config.abstractionMode` to decide
|
|
871
|
-
// the signer: `null` → agent-dispatch silently to the SDK's preferred
|
|
872
|
-
// default; non-null → return a wallet-signing fallback step. Either
|
|
873
|
-
// way the chain does NOT abort onboarding — `ACCOUNT_MODE` lives on
|
|
874
|
-
// `Provider.options`, not `Provider.setup`, and so does not gate
|
|
875
|
-
// trading.
|
|
876
|
-
let agentResults;
|
|
877
|
-
let fallbackUserPrerequisites;
|
|
878
|
-
if (mode === SigningMode.USER_AGENT) {
|
|
879
|
-
const justApprovedAgent = userResults.results.some((r) => r.success && r.action === ActionType.APPROVE_AGENT);
|
|
880
|
-
if (justApprovedAgent) {
|
|
881
|
-
const metadata = await this.getProviderMetadata(provider);
|
|
882
|
-
if (PerpsClient.hasWritableAccountMode(metadata)) {
|
|
883
|
-
const upgrade = await this.prepareAccountModeChange(provider, address, PerpsClient.DEFAULT_ACCOUNT_MODE);
|
|
884
|
-
agentResults = upgrade.results;
|
|
885
|
-
fallbackUserPrerequisites = upgrade.fallback;
|
|
886
|
-
}
|
|
887
|
-
}
|
|
888
|
-
}
|
|
889
|
-
// 3. Sign and submit any pre-staged agent prerequisites returned by the
|
|
890
|
-
// backend's `buildPrerequisites` call. ACCOUNT_MODE is filtered out of
|
|
891
|
-
// bulk staging (it requires explicit `mode` params), so this block
|
|
892
|
-
// today only runs for future agent-signed steps the backend chooses
|
|
893
|
-
// to stage.
|
|
894
|
-
if (required.agentPrerequisites.length > 0 &&
|
|
895
|
-
mode === SigningMode.USER_AGENT) {
|
|
896
|
-
const agent = await this.sdkClient.agentManager.getAgent(address, provider);
|
|
897
|
-
const signedAgentActions = await Promise.all(required.agentPrerequisites.map(async (action) => ({
|
|
898
|
-
action: action.action,
|
|
899
|
-
typedData: action.typedData,
|
|
900
|
-
signature: await signTypedData(agent.privateKey, action.typedData),
|
|
901
|
-
})));
|
|
902
|
-
const firstAction = required.agentPrerequisites[0]?.action;
|
|
903
|
-
const stagedResults = await executeAction(this.sdkClient, {
|
|
904
|
-
provider,
|
|
905
|
-
address,
|
|
906
|
-
signerAddress: agent.address,
|
|
907
|
-
action: (firstAction ?? ActionType.ACCOUNT_MODE),
|
|
908
|
-
actions: signedAgentActions,
|
|
909
|
-
});
|
|
910
|
-
// Merge staged-prereq results with any auto-upgrade results from step 2.
|
|
911
|
-
agentResults = {
|
|
912
|
-
results: [...(agentResults?.results ?? []), ...stagedResults.results],
|
|
913
|
-
};
|
|
914
|
-
}
|
|
915
|
-
return {
|
|
916
|
-
userResults,
|
|
917
|
-
...(agentResults ? { agentResults } : {}),
|
|
918
|
-
...(fallbackUserPrerequisites ? { fallbackUserPrerequisites } : {}),
|
|
919
|
-
};
|
|
920
|
-
}
|
|
921
|
-
// ---------------------------------------------------------------------------
|
|
922
|
-
// Typed action helpers
|
|
923
|
-
// ---------------------------------------------------------------------------
|
|
924
390
|
async placeOrder(params) {
|
|
925
391
|
return this.execute({ ...params, action: ActionType.PLACE_ORDER, params });
|
|
926
392
|
}
|
|
393
|
+
/**
|
|
394
|
+
* Place a trigger (take-profit / stop-loss) order. Convenience wrapper over
|
|
395
|
+
* {@link execute} with `ActionType.PLACE_TRIGGER_ORDER`.
|
|
396
|
+
*
|
|
397
|
+
* @throws {PerpsError} When the provider is unregistered or the action
|
|
398
|
+
* cannot be signed/submitted.
|
|
399
|
+
* @public
|
|
400
|
+
*/
|
|
927
401
|
async placeTriggerOrder(params) {
|
|
928
402
|
return this.execute({
|
|
929
403
|
...params,
|
|
@@ -931,12 +405,36 @@ export class PerpsClient {
|
|
|
931
405
|
params,
|
|
932
406
|
});
|
|
933
407
|
}
|
|
408
|
+
/**
|
|
409
|
+
* Cancel one or more open orders. Convenience wrapper over {@link execute}
|
|
410
|
+
* with `ActionType.CANCEL_ORDER`.
|
|
411
|
+
*
|
|
412
|
+
* @throws {PerpsError} When the provider is unregistered or the action
|
|
413
|
+
* cannot be signed/submitted.
|
|
414
|
+
* @public
|
|
415
|
+
*/
|
|
934
416
|
async cancelOrders(params) {
|
|
935
417
|
return this.execute({ ...params, action: ActionType.CANCEL_ORDER, params });
|
|
936
418
|
}
|
|
419
|
+
/**
|
|
420
|
+
* Modify one or more open orders. Convenience wrapper over {@link execute}
|
|
421
|
+
* with `ActionType.MODIFY_ORDER`.
|
|
422
|
+
*
|
|
423
|
+
* @throws {PerpsError} When the provider is unregistered or the action
|
|
424
|
+
* cannot be signed/submitted.
|
|
425
|
+
* @public
|
|
426
|
+
*/
|
|
937
427
|
async modifyOrders(params) {
|
|
938
428
|
return this.execute({ ...params, action: ActionType.MODIFY_ORDER, params });
|
|
939
429
|
}
|
|
430
|
+
/**
|
|
431
|
+
* Add or remove isolated-position margin. Convenience wrapper over
|
|
432
|
+
* {@link execute} with `ActionType.UPDATE_POSITION_MARGIN`.
|
|
433
|
+
*
|
|
434
|
+
* @throws {PerpsError} When the provider is unregistered or the action
|
|
435
|
+
* cannot be signed/submitted.
|
|
436
|
+
* @public
|
|
437
|
+
*/
|
|
940
438
|
async updatePositionMargin(params) {
|
|
941
439
|
return this.execute({
|
|
942
440
|
...params,
|
|
@@ -944,6 +442,14 @@ export class PerpsClient {
|
|
|
944
442
|
params,
|
|
945
443
|
});
|
|
946
444
|
}
|
|
445
|
+
/**
|
|
446
|
+
* Withdraw funds from the provider account. Convenience wrapper over
|
|
447
|
+
* {@link execute} with `ActionType.WITHDRAWAL`.
|
|
448
|
+
*
|
|
449
|
+
* @throws {PerpsError} When the provider is unregistered or the action
|
|
450
|
+
* cannot be signed/submitted.
|
|
451
|
+
* @public
|
|
452
|
+
*/
|
|
947
453
|
async withdraw(params) {
|
|
948
454
|
return this.execute({
|
|
949
455
|
provider: params.provider,
|
|
@@ -953,35 +459,40 @@ export class PerpsClient {
|
|
|
953
459
|
});
|
|
954
460
|
}
|
|
955
461
|
/**
|
|
956
|
-
* Execute any action through the SDK's signing pipeline
|
|
957
|
-
*
|
|
958
|
-
*
|
|
959
|
-
* the
|
|
462
|
+
* Execute any action through the SDK's signing pipeline: fetch the unsigned
|
|
463
|
+
* steps, delegate signing to the provider plugin (which branches on the
|
|
464
|
+
* descriptor's scheme and signer internally), and submit. Core stays
|
|
465
|
+
* signer-agnostic — the plugin owns WHO signs and HOW.
|
|
466
|
+
*
|
|
467
|
+
* @throws {PerpsError} When the action is not declared by the provider,
|
|
468
|
+
* the plugin cannot sign it, or submission fails.
|
|
469
|
+
* @public
|
|
960
470
|
*/
|
|
961
471
|
async execute(params) {
|
|
962
|
-
|
|
963
|
-
const metadata = await this.getProviderMetadata(
|
|
964
|
-
const descriptor = findActionDescriptor(metadata,
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
}
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
472
|
+
const { provider, address, action } = params;
|
|
473
|
+
const metadata = await this.getProviderMetadata(provider);
|
|
474
|
+
const descriptor = findActionDescriptor(metadata, action);
|
|
475
|
+
const { signerAddress, params: signerParams } = await this.resolveActionRequest(provider, descriptor, address);
|
|
476
|
+
const { actions } = await createAction(this.sdkClient, {
|
|
477
|
+
provider,
|
|
478
|
+
address,
|
|
479
|
+
signerAddress,
|
|
480
|
+
action,
|
|
481
|
+
params: {
|
|
482
|
+
...params.params,
|
|
483
|
+
...signerParams,
|
|
484
|
+
},
|
|
485
|
+
});
|
|
486
|
+
const signedActions = await this.delegateSignActions(provider, address, descriptor, actions);
|
|
487
|
+
return executeAction(this.sdkClient, {
|
|
488
|
+
provider,
|
|
489
|
+
address,
|
|
490
|
+
// The submitting account: the plugin-resolved signer (Hyperliquid's
|
|
491
|
+
// agent) when present, else the end-user's address.
|
|
492
|
+
signerAddress: signerAddress ?? address,
|
|
493
|
+
action,
|
|
494
|
+
actions: signedActions,
|
|
495
|
+
});
|
|
985
496
|
}
|
|
986
497
|
}
|
|
987
498
|
//# sourceMappingURL=PerpsClient.js.map
|