@lifi/perps-sdk 0.2.0-alpha.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +138 -24
- 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,69 +1,45 @@
|
|
|
1
1
|
import type {
|
|
2
|
-
|
|
2
|
+
AccountResponse,
|
|
3
|
+
AccountSummary,
|
|
3
4
|
ActionParamsMap,
|
|
4
5
|
ActionStep,
|
|
5
|
-
Address,
|
|
6
|
-
ApproveReadOnlyTokenParams,
|
|
7
|
-
AssetIdentity,
|
|
8
6
|
CreateActionResponse,
|
|
9
|
-
Eip712ActionStep,
|
|
10
|
-
Eip712SignedActionStep,
|
|
11
|
-
EvmTxActionStep,
|
|
12
|
-
EvmTxSignedActionStep,
|
|
13
7
|
ExecuteActionResponse,
|
|
8
|
+
MarketRef,
|
|
9
|
+
Position,
|
|
14
10
|
Provider,
|
|
11
|
+
ProviderAction,
|
|
15
12
|
SignedActionStep,
|
|
16
|
-
WasmBlobActionStep,
|
|
17
|
-
WasmBlobSignedActionStep,
|
|
18
13
|
} from '@lifi/perps-types'
|
|
19
|
-
import {
|
|
20
|
-
|
|
21
|
-
PerpsErrorCode,
|
|
22
|
-
PerpsSigner,
|
|
23
|
-
SigningMethod,
|
|
24
|
-
} from '@lifi/perps-types'
|
|
25
|
-
import { parseAbi } from 'viem'
|
|
26
|
-
import { localStorageAdapter } from '../agent/storage.js'
|
|
27
|
-
import type { StorageAdapter } from '../agent/types.js'
|
|
14
|
+
import { ActionType, PerpsErrorCode } from '@lifi/perps-types'
|
|
15
|
+
import type { Address } from 'viem'
|
|
28
16
|
import { PerpsError } from '../errors/PerpsError.js'
|
|
29
17
|
import { createAction } from '../services/createAction.js'
|
|
30
18
|
import { executeAction } from '../services/executeAction.js'
|
|
31
|
-
import { getAccount } from '../services/getAccount.js'
|
|
19
|
+
import { getAccount as fetchAccount } from '../services/getAccount.js'
|
|
32
20
|
import { getProviders } from '../services/getProviders.js'
|
|
33
|
-
import {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
type ModifyOrdersParams,
|
|
56
|
-
type PerpsClientOptions,
|
|
57
|
-
type PlaceOrderParams,
|
|
58
|
-
type PlaceTriggerOrderParams,
|
|
59
|
-
type SatisfySetupParams,
|
|
60
|
-
type SatisfySetupResult,
|
|
61
|
-
type SetupResult,
|
|
62
|
-
SigningMode,
|
|
63
|
-
type WithdrawParams,
|
|
64
|
-
} from './types.js'
|
|
65
|
-
|
|
66
|
-
const MAX_NONCE_RETRIES = 3
|
|
21
|
+
import type {
|
|
22
|
+
BuildProviderSetupParams,
|
|
23
|
+
CancelOrdersParams,
|
|
24
|
+
ExecuteProviderSetupParams,
|
|
25
|
+
ExecuteProviderSetupResult,
|
|
26
|
+
GetAccountResult,
|
|
27
|
+
GetSetupParams,
|
|
28
|
+
ModifyOrdersParams,
|
|
29
|
+
PerpsClientOptions,
|
|
30
|
+
PlaceOrderParams,
|
|
31
|
+
PlaceTriggerOrderParams,
|
|
32
|
+
ProviderSetup,
|
|
33
|
+
WithdrawParams,
|
|
34
|
+
} from '../types/api.js'
|
|
35
|
+
import type {
|
|
36
|
+
ActionSignerContribution,
|
|
37
|
+
PerpsProvider,
|
|
38
|
+
PerpsSDKClient,
|
|
39
|
+
SignActionsContext,
|
|
40
|
+
} from '../types/provider.js'
|
|
41
|
+
import { createPerpsClient } from './createPerpsClient.js'
|
|
42
|
+
import { requireProvider as resolveProvider } from './requireProvider.js'
|
|
67
43
|
|
|
68
44
|
/**
|
|
69
45
|
* Look up an action's descriptor in the provider's metadata. Throws if the
|
|
@@ -72,7 +48,7 @@ const MAX_NONCE_RETRIES = 3
|
|
|
72
48
|
function findActionDescriptor(
|
|
73
49
|
metadata: Provider,
|
|
74
50
|
action: ActionType
|
|
75
|
-
):
|
|
51
|
+
): ProviderAction {
|
|
76
52
|
const descriptor = [
|
|
77
53
|
...metadata.setup,
|
|
78
54
|
...metadata.options,
|
|
@@ -87,82 +63,52 @@ function findActionDescriptor(
|
|
|
87
63
|
return descriptor
|
|
88
64
|
}
|
|
89
65
|
|
|
66
|
+
/**
|
|
67
|
+
* The primary high-level perps API: wraps a {@link PerpsSDKClient} and owns the
|
|
68
|
+
* end-to-end signing pipeline for provider setup, orders, and account-level
|
|
69
|
+
* actions. Construct via `new PerpsClient(options)` or the SDK's higher-level
|
|
70
|
+
* wiring.
|
|
71
|
+
*
|
|
72
|
+
* @public
|
|
73
|
+
*/
|
|
90
74
|
export class PerpsClient {
|
|
91
75
|
private sdkClient: PerpsSDKClient
|
|
92
|
-
private storage: StorageAdapter
|
|
93
|
-
private signingModes: Map<string, SigningMode> = new Map()
|
|
94
76
|
private providerMetadataCache: Map<string, Provider> = new Map()
|
|
95
|
-
private
|
|
96
|
-
private readonly lighterConfig: LighterSignerConfig | undefined
|
|
97
|
-
private readonly lighterReadOnlyTokenOptions:
|
|
98
|
-
| LighterReadOnlyTokenManagerOptions
|
|
99
|
-
| undefined
|
|
100
|
-
private _lighterSigner: LighterSigner | undefined
|
|
101
|
-
private _lighterKeyStore: LighterKeyStore | undefined
|
|
102
|
-
private _lighterReadOnlyTokenManager: LighterReadOnlyTokenManager | undefined
|
|
77
|
+
private _userWallet: PerpsSDKClient['userWallet'] | undefined
|
|
103
78
|
|
|
104
79
|
constructor(options: PerpsClientOptions) {
|
|
105
|
-
this.storage = options.storage ?? localStorageAdapter
|
|
106
|
-
this.lighterConfig = options.lighter
|
|
107
|
-
this.lighterReadOnlyTokenOptions = options.lighterReadOnlyToken
|
|
108
80
|
this.sdkClient = createPerpsClient({
|
|
109
81
|
integrator: options.integrator,
|
|
110
82
|
apiKey: options.apiKey,
|
|
111
83
|
apiUrl: options.apiUrl,
|
|
112
|
-
storage: this.storage,
|
|
113
84
|
providers: options.providers,
|
|
114
85
|
})
|
|
115
86
|
}
|
|
116
87
|
|
|
117
|
-
private getLighterSigner(): LighterSigner {
|
|
118
|
-
if (!this._lighterSigner) {
|
|
119
|
-
this._lighterSigner = new LighterSigner(this.lighterConfig)
|
|
120
|
-
}
|
|
121
|
-
return this._lighterSigner
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
private getLighterKeyStore(): LighterKeyStore {
|
|
125
|
-
if (!this._lighterKeyStore) {
|
|
126
|
-
this._lighterKeyStore = new LighterKeyStore(this.storage)
|
|
127
|
-
}
|
|
128
|
-
return this._lighterKeyStore
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
private getLighterReadOnlyTokenManager(): LighterReadOnlyTokenManager {
|
|
132
|
-
if (!this._lighterReadOnlyTokenManager) {
|
|
133
|
-
this._lighterReadOnlyTokenManager = new LighterReadOnlyTokenManager({
|
|
134
|
-
storage: this.storage,
|
|
135
|
-
...this.lighterReadOnlyTokenOptions,
|
|
136
|
-
})
|
|
137
|
-
}
|
|
138
|
-
return this._lighterReadOnlyTokenManager
|
|
139
|
-
}
|
|
140
|
-
|
|
141
88
|
/**
|
|
142
|
-
* Set or update the wallet
|
|
89
|
+
* Set or update the end-user's wallet. Used whenever an action's descriptor
|
|
143
90
|
* names the user wallet in its `signers` list. Pass undefined to clear.
|
|
91
|
+
*
|
|
92
|
+
* @public
|
|
144
93
|
*/
|
|
145
|
-
|
|
146
|
-
this.
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
get: () => this._signer,
|
|
94
|
+
setUserWallet(userWallet: PerpsSDKClient['userWallet']): void {
|
|
95
|
+
this._userWallet = userWallet
|
|
96
|
+
Object.defineProperty(this.sdkClient, 'userWallet', {
|
|
97
|
+
get: () => this._userWallet,
|
|
150
98
|
configurable: true,
|
|
151
99
|
})
|
|
152
100
|
}
|
|
153
101
|
|
|
102
|
+
/**
|
|
103
|
+
* The underlying low-level {@link PerpsSDKClient} (config, user wallet,
|
|
104
|
+
* provider registry) backing this instance.
|
|
105
|
+
*
|
|
106
|
+
* @public
|
|
107
|
+
*/
|
|
154
108
|
get client(): PerpsSDKClient {
|
|
155
109
|
return this.sdkClient
|
|
156
110
|
}
|
|
157
111
|
|
|
158
|
-
private modeKey(address: Address, provider: string): string {
|
|
159
|
-
return `${address.toLowerCase()}:${provider.toLowerCase()}`
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
private signingModeStorageKey(address: Address, provider: string): string {
|
|
163
|
-
return `lifi-perps-mode:${address.toLowerCase()}:${provider.toLowerCase()}`
|
|
164
|
-
}
|
|
165
|
-
|
|
166
112
|
private async getProviderMetadata(provider: string): Promise<Provider> {
|
|
167
113
|
const cached = this.providerMetadataCache.get(provider)
|
|
168
114
|
if (cached) {
|
|
@@ -187,714 +133,160 @@ export class PerpsClient {
|
|
|
187
133
|
}
|
|
188
134
|
|
|
189
135
|
/**
|
|
190
|
-
*
|
|
191
|
-
*
|
|
192
|
-
*
|
|
193
|
-
* value is picked. The post-`APPROVE_AGENT` auto-upgrade path also
|
|
194
|
-
* dispatches `ACCOUNT_MODE` directly with `mode: 'unifiedAccount'`.
|
|
136
|
+
* Resolve the registered provider plugin for `provider`, throwing a
|
|
137
|
+
* `PerpsError` when the caller has not registered one via the SDK's
|
|
138
|
+
* `providers` option. The plugin owns signer identity and write-side signing.
|
|
195
139
|
*/
|
|
196
|
-
private
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
private buildPrerequisiteInputs(
|
|
200
|
-
prerequisites: ActionDescriptor[],
|
|
201
|
-
mode: SigningMode,
|
|
202
|
-
agentAddress?: Address
|
|
203
|
-
): Array<{ key: string; params?: Record<string, unknown> }> {
|
|
204
|
-
return prerequisites
|
|
205
|
-
.filter((p) => {
|
|
206
|
-
// ACCOUNT_MODE / ACCOUNT_TYPE require explicit params; they're
|
|
207
|
-
// dispatched separately via `execute(...)` (or the post-APPROVE_AGENT
|
|
208
|
-
// auto-upgrade chain) rather than bulk-staged.
|
|
209
|
-
if (PerpsClient.EXPLICIT_INPUT_PREREQUISITES.has(p.type)) {
|
|
210
|
-
return false
|
|
211
|
-
}
|
|
212
|
-
if (mode === SigningMode.USER) {
|
|
213
|
-
// USER mode: only items the user can sign, and never APPROVE_AGENT
|
|
214
|
-
// (no agent is created in this mode).
|
|
215
|
-
if (!p.signers.includes(PerpsSigner.USER)) {
|
|
216
|
-
return false
|
|
217
|
-
}
|
|
218
|
-
if (p.type === ActionType.APPROVE_AGENT) {
|
|
219
|
-
return false
|
|
220
|
-
}
|
|
221
|
-
return true
|
|
222
|
-
}
|
|
223
|
-
// USER_AGENT mode: include every remaining declared prerequisite.
|
|
224
|
-
return true
|
|
225
|
-
})
|
|
226
|
-
.map((p) => {
|
|
227
|
-
const params: Record<string, unknown> = {}
|
|
228
|
-
if (p.type === ActionType.APPROVE_AGENT && agentAddress) {
|
|
229
|
-
params.agentAddress = agentAddress
|
|
230
|
-
}
|
|
231
|
-
return {
|
|
232
|
-
key: p.type,
|
|
233
|
-
...(Object.keys(params).length > 0 ? { params } : {}),
|
|
234
|
-
}
|
|
235
|
-
})
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
private async resolveSignerForAction(
|
|
239
|
-
action: ActionType,
|
|
240
|
-
address: Address,
|
|
241
|
-
provider: string
|
|
242
|
-
): Promise<Address | undefined> {
|
|
243
|
-
const mode = await this.loadSigningMode(address, provider)
|
|
244
|
-
if (mode !== SigningMode.USER_AGENT) {
|
|
245
|
-
return undefined
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
// Only AGENT-signed actions surface a distinct signerAddress on the wire.
|
|
249
|
-
// API_KEY signers (e.g. Lighter's LighterKeyStore) are managed per-provider
|
|
250
|
-
// and don't have an EVM address — the backend identifies the action by the
|
|
251
|
-
// L1 `address` instead.
|
|
252
|
-
const metadata = await this.getProviderMetadata(provider)
|
|
253
|
-
const allActions = [
|
|
254
|
-
...metadata.setup,
|
|
255
|
-
...metadata.options,
|
|
256
|
-
...metadata.actions,
|
|
257
|
-
]
|
|
258
|
-
const descriptor = allActions.find((d) => d.type === action)
|
|
259
|
-
if (!descriptor?.signers.includes(PerpsSigner.AGENT)) {
|
|
260
|
-
return undefined
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
const agent = await this.sdkClient.agentManager.getAgent(address, provider)
|
|
264
|
-
return agent.address
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
/**
|
|
268
|
-
* True if any descriptor for the provider lists `PerpsSigner.AGENT`.
|
|
269
|
-
* Providers like Lighter sign with their own keystore and never need an
|
|
270
|
-
* AgentManager-managed agent.
|
|
271
|
-
*/
|
|
272
|
-
private async providerUsesAgent(provider: string): Promise<boolean> {
|
|
273
|
-
const metadata = await this.getProviderMetadata(provider)
|
|
274
|
-
const all = [...metadata.setup, ...metadata.options, ...metadata.actions]
|
|
275
|
-
return all.some((d) => d.signers.includes(PerpsSigner.AGENT))
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
private async autoSignAndExecute(
|
|
279
|
-
provider: string,
|
|
280
|
-
address: Address,
|
|
281
|
-
action: ActionType,
|
|
282
|
-
actions: ActionStep[],
|
|
283
|
-
descriptor: ActionDescriptor
|
|
284
|
-
): Promise<ExecuteActionResponse> {
|
|
285
|
-
switch (descriptor.signingMethod) {
|
|
286
|
-
case SigningMethod.EIP712: {
|
|
287
|
-
const eip712Actions = actions as Eip712ActionStep[]
|
|
288
|
-
|
|
289
|
-
if (descriptor.signers.includes(PerpsSigner.AGENT)) {
|
|
290
|
-
const agent = await this.sdkClient.agentManager.getAgent(
|
|
291
|
-
address,
|
|
292
|
-
provider
|
|
293
|
-
)
|
|
294
|
-
const signedActions: SignedActionStep[] = await Promise.all(
|
|
295
|
-
eip712Actions.map(
|
|
296
|
-
async (a) =>
|
|
297
|
-
({
|
|
298
|
-
action: a.action,
|
|
299
|
-
typedData: a.typedData,
|
|
300
|
-
signature: await signTypedData(agent.privateKey, a.typedData),
|
|
301
|
-
}) satisfies Eip712SignedActionStep
|
|
302
|
-
)
|
|
303
|
-
)
|
|
304
|
-
return executeAction(this.sdkClient, {
|
|
305
|
-
provider,
|
|
306
|
-
address,
|
|
307
|
-
signerAddress: agent.address,
|
|
308
|
-
action,
|
|
309
|
-
actions: signedActions,
|
|
310
|
-
})
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
if (descriptor.signers.includes(PerpsSigner.USER)) {
|
|
314
|
-
const signer = this.sdkClient.signer
|
|
315
|
-
if (!signer) {
|
|
316
|
-
throw new PerpsError(
|
|
317
|
-
PerpsErrorCode.SDKError,
|
|
318
|
-
`Action '${action}' requires a user-wallet signature, but no signer was configured. Pass a WalletClient to createPerpsClient({ signer }).`
|
|
319
|
-
)
|
|
320
|
-
}
|
|
321
|
-
const signedActions: SignedActionStep[] = await Promise.all(
|
|
322
|
-
eip712Actions.map(
|
|
323
|
-
async (a) =>
|
|
324
|
-
({
|
|
325
|
-
action: a.action,
|
|
326
|
-
typedData: a.typedData,
|
|
327
|
-
signature: await signTypedDataWithSigner(signer, a.typedData),
|
|
328
|
-
}) satisfies Eip712SignedActionStep
|
|
329
|
-
)
|
|
330
|
-
)
|
|
331
|
-
return executeAction(this.sdkClient, {
|
|
332
|
-
provider,
|
|
333
|
-
address,
|
|
334
|
-
signerAddress: address,
|
|
335
|
-
action,
|
|
336
|
-
actions: signedActions,
|
|
337
|
-
})
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
throw new PerpsError(
|
|
341
|
-
PerpsErrorCode.SDKError,
|
|
342
|
-
`Action '${action}' descriptor names no supported signer (signers=[${descriptor.signers.join(', ')}]).`
|
|
343
|
-
)
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
case SigningMethod.WASM_BLOB: {
|
|
347
|
-
const wasmActions = actions as WasmBlobActionStep[]
|
|
348
|
-
const signedActions = await this.signWasmBlobActions(
|
|
349
|
-
provider,
|
|
350
|
-
address,
|
|
351
|
-
wasmActions
|
|
352
|
-
)
|
|
353
|
-
return executeAction(this.sdkClient, {
|
|
354
|
-
provider,
|
|
355
|
-
address,
|
|
356
|
-
signerAddress: address,
|
|
357
|
-
action,
|
|
358
|
-
actions: signedActions,
|
|
359
|
-
})
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
case SigningMethod.EVM_TX: {
|
|
363
|
-
const evmActions = actions as EvmTxActionStep[]
|
|
364
|
-
const signedActions = await this.signEvmTxActions(evmActions)
|
|
365
|
-
return executeAction(this.sdkClient, {
|
|
366
|
-
provider,
|
|
367
|
-
address,
|
|
368
|
-
signerAddress: address,
|
|
369
|
-
action,
|
|
370
|
-
actions: signedActions,
|
|
371
|
-
})
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
default:
|
|
375
|
-
throw new Error(`Unknown signingMethod: ${descriptor.signingMethod}`)
|
|
376
|
-
}
|
|
140
|
+
private requireProvider(provider: string): PerpsProvider {
|
|
141
|
+
return resolveProvider(this.sdkClient, provider)
|
|
377
142
|
}
|
|
378
143
|
|
|
379
144
|
/**
|
|
380
|
-
*
|
|
381
|
-
*
|
|
382
|
-
*
|
|
383
|
-
*
|
|
145
|
+
* Ask the provider plugin for the signer-bearing wire fields of `action` —
|
|
146
|
+
* the on-wire `signerAddress` and any signer-derived params (e.g.
|
|
147
|
+
* Hyperliquid's `agentAddress` for `APPROVE_AGENT`). Forwards the descriptor's
|
|
148
|
+
* `signers` so the plugin can branch on signer role. Returns empty when the
|
|
149
|
+
* plugin signs as the user or with a non-EVM credential. Core constructs no
|
|
150
|
+
* `signerAddress` itself; signer identity is plugin-owned.
|
|
384
151
|
*/
|
|
385
|
-
async
|
|
152
|
+
private async resolveActionRequest(
|
|
386
153
|
provider: string,
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
): Promise<
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
PerpsErrorCode.SDKError,
|
|
394
|
-
'EIP-712 prerequisite signing requires a wallet signer. Pass ' +
|
|
395
|
-
'`signer` to createPerpsClient or call setSigner(walletClient).'
|
|
396
|
-
)
|
|
397
|
-
}
|
|
398
|
-
return {
|
|
399
|
-
action: step.action,
|
|
400
|
-
typedData: step.typedData,
|
|
401
|
-
signature: await signTypedDataWithSigner(
|
|
402
|
-
this.sdkClient.signer,
|
|
403
|
-
step.typedData
|
|
404
|
-
),
|
|
405
|
-
} satisfies Eip712SignedActionStep
|
|
406
|
-
}
|
|
407
|
-
if ('wasmSignParams' in step) {
|
|
408
|
-
const [signed] = await this.signWasmBlobActions(provider, address, [step])
|
|
409
|
-
return signed
|
|
410
|
-
}
|
|
411
|
-
if ('txParams' in step) {
|
|
412
|
-
const [signed] = await this.signEvmTxActions([step])
|
|
413
|
-
return signed
|
|
154
|
+
descriptor: ProviderAction,
|
|
155
|
+
address: Address
|
|
156
|
+
): Promise<ActionSignerContribution> {
|
|
157
|
+
const plugin = this.requireProvider(provider)
|
|
158
|
+
if (typeof plugin.resolveActionRequest !== 'function') {
|
|
159
|
+
return {}
|
|
414
160
|
}
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
161
|
+
return plugin.resolveActionRequest(
|
|
162
|
+
descriptor.type,
|
|
163
|
+
address,
|
|
164
|
+
descriptor.signers
|
|
418
165
|
)
|
|
419
166
|
}
|
|
420
167
|
|
|
421
168
|
/**
|
|
422
|
-
*
|
|
423
|
-
*
|
|
424
|
-
*
|
|
425
|
-
*
|
|
426
|
-
* human-readable abi from the backend.
|
|
169
|
+
* Delegate signing of `actions` to the provider plugin. The plugin owns
|
|
170
|
+
* every signing arm and branches on the descriptor's `signers` internally,
|
|
171
|
+
* reading the end-user's wallet from the {@link SignActionsContext} when an
|
|
172
|
+
* arm signs as the user.
|
|
427
173
|
*/
|
|
428
|
-
private async
|
|
429
|
-
actions: EvmTxActionStep[]
|
|
430
|
-
): Promise<EvmTxSignedActionStep[]> {
|
|
431
|
-
if (!this.sdkClient.signer) {
|
|
432
|
-
throw new PerpsError(
|
|
433
|
-
PerpsErrorCode.SDKError,
|
|
434
|
-
'EVM_TX signing requires a wallet signer. Pass `signer` to ' +
|
|
435
|
-
'createPerpsClient or call setSigner(walletClient).'
|
|
436
|
-
)
|
|
437
|
-
}
|
|
438
|
-
const { signer } = this.sdkClient
|
|
439
|
-
const signed: EvmTxSignedActionStep[] = []
|
|
440
|
-
|
|
441
|
-
for (const step of actions) {
|
|
442
|
-
const params = step.txParams as {
|
|
443
|
-
chainId: number
|
|
444
|
-
to: Address
|
|
445
|
-
functionName: string
|
|
446
|
-
args: readonly unknown[]
|
|
447
|
-
abi: readonly string[]
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
const txHash = await signer.writeContract({
|
|
451
|
-
address: params.to,
|
|
452
|
-
abi: parseAbi(params.abi),
|
|
453
|
-
functionName: params.functionName,
|
|
454
|
-
args: params.args,
|
|
455
|
-
chain: signer.chain,
|
|
456
|
-
account: signer.account,
|
|
457
|
-
})
|
|
458
|
-
|
|
459
|
-
signed.push({
|
|
460
|
-
action: step.action,
|
|
461
|
-
txParams: step.txParams,
|
|
462
|
-
txHash,
|
|
463
|
-
})
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
return signed
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
/**
|
|
470
|
-
* Sign a batch of WASM_BLOB action steps (Lighter). Ensures the user's
|
|
471
|
-
* Lighter API keypair is registered first — generating one and running the
|
|
472
|
-
* REGISTER_API_KEY hybrid flow via the L1 signer if not — then feeds each
|
|
473
|
-
* subsequent step through the WASM signer and returns signed blobs.
|
|
474
|
-
*
|
|
475
|
-
* `ACCOUNT_TYPE` (Lighter `/api/v1/changeAccountTier`) is dispatched as a
|
|
476
|
-
* WASM_BLOB envelope by the backend but is NOT a wasm-signed transaction —
|
|
477
|
-
* Lighter authenticates the endpoint with an auth token and enforces
|
|
478
|
-
* anti-replay server-side (24h cooldown, no open positions). The signer
|
|
479
|
-
* mints a Lighter auth token via the same WASM `CreateAuthToken` the read
|
|
480
|
-
* endpoints use and parks it in `signedTx.txInfo`; the backend's
|
|
481
|
-
* `executeChangeAccountTier` consumes that field as the `auth` form
|
|
482
|
-
* parameter. `txType`/`txHash` are unused for this action — they carry
|
|
483
|
-
* placeholder values to satisfy the `WasmBlobSignedActionStep` shape.
|
|
484
|
-
*/
|
|
485
|
-
private async signWasmBlobActions(
|
|
174
|
+
private async delegateSignActions(
|
|
486
175
|
provider: string,
|
|
487
176
|
address: Address,
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
signed.push(await this.signRegisterApiKey(provider, address, step))
|
|
494
|
-
} else if (step.action === ActionType.ACCOUNT_TYPE) {
|
|
495
|
-
signed.push(await this.signAccountTierChange(address, step))
|
|
496
|
-
} else {
|
|
497
|
-
signed.push(await this.signStandardWasmAction(provider, address, step))
|
|
498
|
-
}
|
|
499
|
-
}
|
|
500
|
-
return signed
|
|
501
|
-
}
|
|
502
|
-
|
|
503
|
-
private async signStandardWasmAction(
|
|
504
|
-
provider: string,
|
|
505
|
-
address: Address,
|
|
506
|
-
step: WasmBlobActionStep
|
|
507
|
-
): Promise<WasmBlobSignedActionStep> {
|
|
508
|
-
const apiKey = await this.getLighterKeyStore().get(address)
|
|
509
|
-
if (!apiKey) {
|
|
177
|
+
descriptor: ProviderAction,
|
|
178
|
+
actions: ActionStep[]
|
|
179
|
+
): Promise<SignedActionStep[]> {
|
|
180
|
+
const plugin = this.requireProvider(provider)
|
|
181
|
+
if (typeof plugin.signActions !== 'function') {
|
|
510
182
|
throw new PerpsError(
|
|
511
183
|
PerpsErrorCode.SDKError,
|
|
512
|
-
`
|
|
513
|
-
'
|
|
184
|
+
`Provider '${provider}' does not implement signActions for ` +
|
|
185
|
+
`signingMethod '${descriptor.signingMethod}'.`
|
|
514
186
|
)
|
|
515
187
|
}
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
})
|
|
522
|
-
void provider
|
|
523
|
-
return {
|
|
524
|
-
action: step.action,
|
|
525
|
-
wasmSignParams: step.wasmSignParams,
|
|
526
|
-
signedTx,
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
/**
|
|
531
|
-
* REGISTER_API_KEY flow:
|
|
532
|
-
* 1. Look up the user's Lighter accountIndex from getAccount()
|
|
533
|
-
* 2. Generate a fresh Lighter API keypair via the WASM signer
|
|
534
|
-
* 3. Call SignChangePubKey to produce the WASM blob + EIP-191 message
|
|
535
|
-
* 4. Have the user's L1 Ethereum wallet sign the message
|
|
536
|
-
* 5. Inject the L1 signature into the ChangePubKey txInfo JSON
|
|
537
|
-
* 6. Persist the keypair and return the signed blob
|
|
538
|
-
*
|
|
539
|
-
* Requires a USER wallet signer to be set via `setSigner` or passed at
|
|
540
|
-
* construction — the L1 signature is the user's consent to rotate keys.
|
|
541
|
-
*/
|
|
542
|
-
private async signRegisterApiKey(
|
|
543
|
-
provider: string,
|
|
544
|
-
address: Address,
|
|
545
|
-
step: WasmBlobActionStep
|
|
546
|
-
): Promise<WasmBlobSignedActionStep> {
|
|
547
|
-
if (!this.sdkClient.signer) {
|
|
548
|
-
throw new PerpsError(
|
|
549
|
-
PerpsErrorCode.SDKError,
|
|
550
|
-
'REGISTER_API_KEY requires a wallet signer — pass `signer` to ' +
|
|
551
|
-
'createPerpsClient or call setSigner(walletClient).'
|
|
552
|
-
)
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
const params = step.wasmSignParams as {
|
|
556
|
-
api_key_index?: number
|
|
557
|
-
nonce?: number
|
|
558
|
-
}
|
|
559
|
-
const apiKeyIndex = params.api_key_index ?? DEFAULT_API_KEY_INDEX
|
|
560
|
-
const nonce = params.nonce
|
|
561
|
-
if (typeof nonce !== 'number') {
|
|
562
|
-
throw new PerpsError(
|
|
563
|
-
PerpsErrorCode.SDKError,
|
|
564
|
-
'REGISTER_API_KEY wasmSignParams is missing `nonce`.'
|
|
565
|
-
)
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
const account = await getAccount(this.sdkClient, { provider, address })
|
|
569
|
-
if (account.config.provider !== 'lighter') {
|
|
570
|
-
throw new PerpsError(
|
|
571
|
-
PerpsErrorCode.SDKError,
|
|
572
|
-
`REGISTER_API_KEY requires a Lighter account, but getAccount ` +
|
|
573
|
-
`returned config for provider '${account.config.provider}'.`
|
|
574
|
-
)
|
|
575
|
-
}
|
|
576
|
-
const accountIndex = account.config.accountIndex
|
|
577
|
-
|
|
578
|
-
const signer = this.getLighterSigner()
|
|
579
|
-
const keypair = await signer.generateAPIKey()
|
|
580
|
-
const changePubKey = await signer.signChangePubKey(
|
|
581
|
-
keypair.publicKey,
|
|
582
|
-
keypair.privateKey,
|
|
583
|
-
nonce,
|
|
584
|
-
apiKeyIndex,
|
|
585
|
-
accountIndex
|
|
586
|
-
)
|
|
587
|
-
|
|
588
|
-
const l1Signature = await this.sdkClient.signer.signMessage({
|
|
589
|
-
account: this.sdkClient.signer.account,
|
|
590
|
-
message: changePubKey.messageToSign,
|
|
591
|
-
})
|
|
592
|
-
|
|
593
|
-
const txInfoWithL1Sig = signer.embedL1Signature(
|
|
594
|
-
changePubKey.txInfo,
|
|
595
|
-
l1Signature
|
|
188
|
+
return plugin.signActions(
|
|
189
|
+
descriptor.signingMethod,
|
|
190
|
+
actions,
|
|
191
|
+
address,
|
|
192
|
+
this.buildSignActionsContext(descriptor)
|
|
596
193
|
)
|
|
597
|
-
|
|
598
|
-
const apiKey: LighterApiKey = {
|
|
599
|
-
accountIndex,
|
|
600
|
-
apiKeyIndex,
|
|
601
|
-
apiKeyPrivateKey: keypair.privateKey,
|
|
602
|
-
apiKeyPublicKey: keypair.publicKey,
|
|
603
|
-
}
|
|
604
|
-
await this.getLighterKeyStore().set(address, apiKey)
|
|
605
|
-
|
|
606
|
-
return {
|
|
607
|
-
action: step.action,
|
|
608
|
-
wasmSignParams: {
|
|
609
|
-
...step.wasmSignParams,
|
|
610
|
-
new_public_key: keypair.publicKey,
|
|
611
|
-
},
|
|
612
|
-
signedTx: {
|
|
613
|
-
txType: changePubKey.txType,
|
|
614
|
-
txInfo: txInfoWithL1Sig,
|
|
615
|
-
txHash: changePubKey.txHash,
|
|
616
|
-
},
|
|
617
|
-
}
|
|
618
194
|
}
|
|
619
195
|
|
|
620
196
|
/**
|
|
621
|
-
*
|
|
622
|
-
*
|
|
623
|
-
*
|
|
624
|
-
*
|
|
625
|
-
*
|
|
626
|
-
*
|
|
627
|
-
* therefore declares the step as a `WasmBlobActionStep` with
|
|
628
|
-
* `wasmSignParams.kind = 'changeAccountTier'` and expects the SDK to
|
|
629
|
-
* mint an auth token in lieu of a transaction signature. That contract
|
|
630
|
-
* is documented in `lifi-perps-backend/src/providers/lighter/actions/
|
|
631
|
-
* lighter.actions.accountType.ts` and consumed by `executeChangeAccountTier`.
|
|
632
|
-
*
|
|
633
|
-
* The auth-token deadline mirrors {@link createLighterAuthToken}'s 1h
|
|
634
|
-
* default — Lighter caps tokens at 8h hard, and the backend's executor
|
|
635
|
-
* runs `verifyPendingAction` then a single `/changeAccountTier` POST,
|
|
636
|
-
* which completes well inside an hour.
|
|
197
|
+
* Assemble the per-call context the provider plugin needs in order to sign:
|
|
198
|
+
* the end-user's wallet and the descriptor's declared `signers`. Core
|
|
199
|
+
* forwards `signers` as data so the plugin can pick WHO signs; it does not
|
|
200
|
+
* branch on them. Provider-owned session credentials (the Hyperliquid agent
|
|
201
|
+
* keypair, Lighter's API key) are resolved inside the provider's
|
|
202
|
+
* `signActions`, not threaded through here.
|
|
637
203
|
*/
|
|
638
|
-
private
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
throw new PerpsError(
|
|
645
|
-
PerpsErrorCode.SDKError,
|
|
646
|
-
`No Lighter API key registered for ${address}. ` +
|
|
647
|
-
'Run prepareAccount / REGISTER_API_KEY first.'
|
|
648
|
-
)
|
|
649
|
-
}
|
|
650
|
-
const signer = this.getLighterSigner()
|
|
651
|
-
const deadline = Math.floor(Date.now() / 1000) + 60 * 60
|
|
652
|
-
const authToken = await signer.createAuthToken(deadline, {
|
|
653
|
-
apiKeyPrivateKey: apiKey.apiKeyPrivateKey,
|
|
654
|
-
apiKeyIndex: apiKey.apiKeyIndex,
|
|
655
|
-
accountIndex: apiKey.accountIndex,
|
|
656
|
-
})
|
|
657
|
-
return {
|
|
658
|
-
action: step.action,
|
|
659
|
-
wasmSignParams: step.wasmSignParams,
|
|
660
|
-
signedTx: {
|
|
661
|
-
// `/changeAccountTier` reads only `txInfo` (the auth token); `txType`
|
|
662
|
-
// and `txHash` are placeholders to satisfy the envelope shape.
|
|
663
|
-
txType: 0,
|
|
664
|
-
txInfo: authToken,
|
|
665
|
-
txHash: '',
|
|
666
|
-
},
|
|
204
|
+
private buildSignActionsContext(
|
|
205
|
+
descriptor: ProviderAction
|
|
206
|
+
): SignActionsContext {
|
|
207
|
+
const ctx: SignActionsContext = { signers: descriptor.signers }
|
|
208
|
+
if (this.sdkClient.userWallet !== undefined) {
|
|
209
|
+
ctx.userWallet = this.sdkClient.userWallet
|
|
667
210
|
}
|
|
211
|
+
return ctx
|
|
668
212
|
}
|
|
669
213
|
|
|
670
214
|
/**
|
|
671
|
-
*
|
|
672
|
-
*
|
|
673
|
-
*
|
|
674
|
-
*
|
|
675
|
-
* 1. The long-lived read-only token persisted by `approveReadOnlyToken`,
|
|
676
|
-
* when one is stored for this `(address, accountIndex)` AND has not
|
|
677
|
-
* passed its recorded `expiry`. The SDK never returns an expired
|
|
678
|
-
* stored token.
|
|
679
|
-
* 2. A freshly minted 8h Lighter auth token, signed off the user's
|
|
680
|
-
* Lighter API key. Requires `REGISTER_API_KEY` to have completed.
|
|
681
|
-
* 3. `undefined` — caller falls back to public reads.
|
|
682
|
-
*
|
|
683
|
-
* `accountIndex` lets callers in pure read-only mode (no API key
|
|
684
|
-
* registered) target the RO token. When omitted, the SDK derives it from
|
|
685
|
-
* the user's registered API key.
|
|
215
|
+
* Sign a single provider setup action step by delegating to the provider
|
|
216
|
+
* plugin, which branches on the step's signing scheme internally. Lets
|
|
217
|
+
* consumers collect signed setup actions without embedding per-method
|
|
218
|
+
* signing logic.
|
|
686
219
|
*
|
|
687
|
-
*
|
|
688
|
-
*
|
|
689
|
-
* recorded by {@link approveReadOnlyToken}.
|
|
220
|
+
* @throws {PerpsError} When the step's action is not declared by the provider.
|
|
221
|
+
* @public
|
|
690
222
|
*/
|
|
691
|
-
async
|
|
692
|
-
|
|
693
|
-
deadlineSeconds?: number,
|
|
694
|
-
accountIndex?: number
|
|
695
|
-
): Promise<string | undefined> {
|
|
696
|
-
const apiKey = await this.getLighterKeyStore().get(address)
|
|
697
|
-
const resolvedAccountIndex = accountIndex ?? apiKey?.accountIndex
|
|
698
|
-
if (resolvedAccountIndex !== undefined) {
|
|
699
|
-
const stored = await this.getLighterReadOnlyTokenManager().get(
|
|
700
|
-
address,
|
|
701
|
-
resolvedAccountIndex
|
|
702
|
-
)
|
|
703
|
-
if (stored) {
|
|
704
|
-
return stored.token
|
|
705
|
-
}
|
|
706
|
-
}
|
|
707
|
-
if (!apiKey) {
|
|
708
|
-
return undefined
|
|
709
|
-
}
|
|
710
|
-
const deadline = deadlineSeconds ?? Math.floor(Date.now() / 1000) + 60 * 60
|
|
711
|
-
const signer = this.getLighterSigner()
|
|
712
|
-
return signer.createAuthToken(deadline, {
|
|
713
|
-
apiKeyPrivateKey: apiKey.apiKeyPrivateKey,
|
|
714
|
-
apiKeyIndex: apiKey.apiKeyIndex,
|
|
715
|
-
accountIndex: apiKey.accountIndex,
|
|
716
|
-
})
|
|
717
|
-
}
|
|
718
|
-
|
|
719
|
-
/**
|
|
720
|
-
* Mint a long-lived Lighter read-only token via Lighter's
|
|
721
|
-
* `tokens/create` endpoint and persist it through the configured
|
|
722
|
-
* `StorageAdapter`, keyed by `(L1 address, accountIndex)`.
|
|
723
|
-
*
|
|
724
|
-
* The user's connected wallet signs an EIP-191 message describing the
|
|
725
|
-
* mint request; the resulting `Authorization` header authenticates the
|
|
726
|
-
* Lighter HTTP call. The bearer string Lighter returns is persisted
|
|
727
|
-
* alongside its `expiry` and `scope`; subsequent calls to
|
|
728
|
-
* {@link createLighterAuthToken} prefer it over the 8h standard token.
|
|
729
|
-
*
|
|
730
|
-
* `expirySeconds` is the absolute unix-seconds expiry recorded on
|
|
731
|
-
* Lighter's row. Lighter enforces 1 day ≤ lifetime ≤ 10 years
|
|
732
|
-
* server-side; the SDK does NOT pre-validate and surfaces Lighter's 400
|
|
733
|
-
* verbatim. `scope` defaults to `'all'`; the `'single'` variant is wired
|
|
734
|
-
* through but only useful when the caller has a specific reason to scope
|
|
735
|
-
* the token to one account.
|
|
736
|
-
*
|
|
737
|
-
* Requires a USER wallet signer to be set via {@link setSigner} or
|
|
738
|
-
* passed at construction — the L1 signature is the user's consent.
|
|
739
|
-
*/
|
|
740
|
-
async approveReadOnlyToken(
|
|
223
|
+
async signProviderSetupAction(
|
|
224
|
+
provider: string,
|
|
741
225
|
address: Address,
|
|
742
|
-
|
|
743
|
-
): Promise<
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
'createPerpsClient or call setSigner(walletClient).'
|
|
749
|
-
)
|
|
750
|
-
}
|
|
751
|
-
const signer = walletClientSigner(this.sdkClient.signer)
|
|
752
|
-
return this.getLighterReadOnlyTokenManager().approve(signer, {
|
|
226
|
+
step: ActionStep
|
|
227
|
+
): Promise<SignedActionStep> {
|
|
228
|
+
const metadata = await this.getProviderMetadata(provider)
|
|
229
|
+
const descriptor = findActionDescriptor(metadata, step.action)
|
|
230
|
+
const [signed] = await this.delegateSignActions(
|
|
231
|
+
provider,
|
|
753
232
|
address,
|
|
754
|
-
|
|
755
|
-
|
|
233
|
+
descriptor,
|
|
234
|
+
[step]
|
|
235
|
+
)
|
|
236
|
+
return signed
|
|
756
237
|
}
|
|
757
238
|
|
|
758
239
|
/**
|
|
759
|
-
*
|
|
760
|
-
*
|
|
761
|
-
*
|
|
762
|
-
*
|
|
763
|
-
* banners (default threshold: 30 days).
|
|
240
|
+
* Build (but do not sign or submit) the unsigned action steps for `action`,
|
|
241
|
+
* letting the provider plugin contribute any signer-bearing request fields.
|
|
242
|
+
*
|
|
243
|
+
* @public
|
|
764
244
|
*/
|
|
765
|
-
async isLighterReadOnlyTokenExpiringSoon(
|
|
766
|
-
address: Address,
|
|
767
|
-
accountIndex: number,
|
|
768
|
-
thresholdDays?: number
|
|
769
|
-
): Promise<boolean> {
|
|
770
|
-
return this.getLighterReadOnlyTokenManager().isReadOnlyTokenExpiringSoon(
|
|
771
|
-
address,
|
|
772
|
-
accountIndex,
|
|
773
|
-
thresholdDays
|
|
774
|
-
)
|
|
775
|
-
}
|
|
776
|
-
|
|
777
|
-
// ---------------------------------------------------------------------------
|
|
778
|
-
// Generic action helpers
|
|
779
|
-
// ---------------------------------------------------------------------------
|
|
780
|
-
|
|
781
245
|
async buildAction<T extends ActionType>(
|
|
782
246
|
action: T,
|
|
783
247
|
params: { provider: string; address: Address; params: ActionParamsMap[T] }
|
|
784
248
|
): Promise<CreateActionResponse> {
|
|
785
|
-
const
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
249
|
+
const metadata = await this.getProviderMetadata(params.provider)
|
|
250
|
+
const descriptor = findActionDescriptor(metadata, action)
|
|
251
|
+
const { signerAddress, params: signerParams } =
|
|
252
|
+
await this.resolveActionRequest(
|
|
253
|
+
params.provider,
|
|
254
|
+
descriptor,
|
|
255
|
+
params.address
|
|
256
|
+
)
|
|
790
257
|
return createAction(this.sdkClient, {
|
|
791
258
|
provider: params.provider,
|
|
792
259
|
address: params.address,
|
|
793
260
|
signerAddress,
|
|
794
261
|
action,
|
|
795
|
-
params:
|
|
262
|
+
params: {
|
|
263
|
+
...params.params,
|
|
264
|
+
...signerParams,
|
|
265
|
+
} as ActionParamsMap[T],
|
|
796
266
|
})
|
|
797
267
|
}
|
|
798
268
|
|
|
799
|
-
// ---------------------------------------------------------------------------
|
|
800
|
-
// Signing mode management
|
|
801
|
-
// ---------------------------------------------------------------------------
|
|
802
|
-
|
|
803
|
-
async setSigningMode(
|
|
804
|
-
address: Address,
|
|
805
|
-
provider: string,
|
|
806
|
-
mode: SigningMode
|
|
807
|
-
): Promise<void> {
|
|
808
|
-
const key = this.modeKey(address, provider)
|
|
809
|
-
this.signingModes.set(key, mode)
|
|
810
|
-
await this.storage.set(this.signingModeStorageKey(address, provider), mode)
|
|
811
|
-
if (
|
|
812
|
-
mode === SigningMode.USER_AGENT &&
|
|
813
|
-
(await this.providerUsesAgent(provider))
|
|
814
|
-
) {
|
|
815
|
-
await this.sdkClient.agentManager.getOrCreateAgent(address, provider)
|
|
816
|
-
}
|
|
817
|
-
}
|
|
818
|
-
|
|
819
|
-
getSigningMode(address: Address, provider: string): SigningMode {
|
|
820
|
-
return (
|
|
821
|
-
this.signingModes.get(this.modeKey(address, provider)) ??
|
|
822
|
-
SigningMode.USER_AGENT
|
|
823
|
-
)
|
|
824
|
-
}
|
|
825
|
-
|
|
826
|
-
async loadSigningMode(
|
|
827
|
-
address: Address,
|
|
828
|
-
provider: string
|
|
829
|
-
): Promise<SigningMode> {
|
|
830
|
-
const key = this.modeKey(address, provider)
|
|
831
|
-
if (this.signingModes.has(key)) {
|
|
832
|
-
return this.signingModes.get(key)!
|
|
833
|
-
}
|
|
834
|
-
|
|
835
|
-
const stored = await this.storage.get(
|
|
836
|
-
this.signingModeStorageKey(address, provider)
|
|
837
|
-
)
|
|
838
|
-
const mode: SigningMode =
|
|
839
|
-
stored === SigningMode.USER_AGENT || stored === SigningMode.USER
|
|
840
|
-
? stored
|
|
841
|
-
: SigningMode.USER_AGENT
|
|
842
|
-
this.signingModes.set(key, mode)
|
|
843
|
-
return mode
|
|
844
|
-
}
|
|
845
|
-
|
|
846
|
-
async loadAgentMode(address: Address, provider: string): Promise<boolean> {
|
|
847
|
-
const mode = await this.loadSigningMode(address, provider)
|
|
848
|
-
return mode === SigningMode.USER_AGENT
|
|
849
|
-
}
|
|
850
|
-
|
|
851
|
-
async setAgentMode(
|
|
852
|
-
address: Address,
|
|
853
|
-
provider: string,
|
|
854
|
-
useAgent: boolean
|
|
855
|
-
): Promise<void> {
|
|
856
|
-
await this.setSigningMode(
|
|
857
|
-
address,
|
|
858
|
-
provider,
|
|
859
|
-
useAgent ? SigningMode.USER_AGENT : SigningMode.USER
|
|
860
|
-
)
|
|
861
|
-
}
|
|
862
|
-
|
|
863
|
-
async getAgentAddress(address: Address, provider: string): Promise<Address> {
|
|
864
|
-
const agent = await this.sdkClient.agentManager.getAgent(address, provider)
|
|
865
|
-
return agent.address
|
|
866
|
-
}
|
|
867
|
-
|
|
868
|
-
async hasAgent(address: Address, provider: string): Promise<boolean> {
|
|
869
|
-
return this.sdkClient.agentManager.hasAgent(address, provider)
|
|
870
|
-
}
|
|
871
|
-
|
|
872
|
-
async removeAgent(address: Address, provider: string): Promise<void> {
|
|
873
|
-
await this.sdkClient.agentManager.removeAgent(address, provider)
|
|
874
|
-
this.signingModes.delete(this.modeKey(address, provider))
|
|
875
|
-
await this.storage.remove(this.signingModeStorageKey(address, provider))
|
|
876
|
-
}
|
|
877
|
-
|
|
878
|
-
// ---------------------------------------------------------------------------
|
|
879
|
-
// Account
|
|
880
|
-
// ---------------------------------------------------------------------------
|
|
881
|
-
|
|
882
269
|
/**
|
|
883
270
|
* Fetch the user's account state from the backend and attach the
|
|
884
271
|
* SDK-projected `settings` array — one `AccountConfigSetting` per
|
|
885
272
|
* descriptor on `Provider.setup` + `Provider.options`. Callers read
|
|
886
273
|
* `result.settings` directly without re-deriving values from the typed
|
|
887
274
|
* `AccountConfig`.
|
|
275
|
+
*
|
|
276
|
+
* @throws {PerpsError} When the provider plugin is not registered, or the
|
|
277
|
+
* backend account fetch fails.
|
|
278
|
+
* @public
|
|
888
279
|
*/
|
|
889
280
|
async getAccount(params: {
|
|
890
281
|
provider: string
|
|
891
282
|
address: Address
|
|
892
283
|
}): Promise<GetAccountResult> {
|
|
284
|
+
const plugin = this.requireProvider(params.provider)
|
|
893
285
|
const [response, metadata] = await Promise.all([
|
|
894
|
-
|
|
286
|
+
fetchAccount(this.sdkClient, params),
|
|
895
287
|
this.getProviderMetadata(params.provider),
|
|
896
288
|
])
|
|
897
|
-
const settings =
|
|
289
|
+
const settings = plugin.projectConfig(
|
|
898
290
|
response.config,
|
|
899
291
|
metadata.setup,
|
|
900
292
|
metadata.options
|
|
@@ -902,15 +294,34 @@ export class PerpsClient {
|
|
|
902
294
|
return { ...response, settings }
|
|
903
295
|
}
|
|
904
296
|
|
|
297
|
+
/**
|
|
298
|
+
* Roll an already-fetched {@link AccountResponse} (plus its positions) up
|
|
299
|
+
* into an {@link AccountSummary}, delegating to the owning provider so the
|
|
300
|
+
* venue-specific collateral and margin semantics are applied correctly.
|
|
301
|
+
*/
|
|
302
|
+
getAccountSummary(
|
|
303
|
+
account: AccountResponse,
|
|
304
|
+
positions: Position[]
|
|
305
|
+
): AccountSummary {
|
|
306
|
+
return this.requireProvider(account.provider).getAccountSummary(
|
|
307
|
+
account,
|
|
308
|
+
positions
|
|
309
|
+
)
|
|
310
|
+
}
|
|
311
|
+
|
|
905
312
|
/**
|
|
906
313
|
* Thin existence check for a provider account at `address`. Returns
|
|
907
314
|
* `true` when `getAccount` resolves, `false` when the backend reports
|
|
908
315
|
* `PerpsErrorCode.AccountNotFound`, and re-throws on any other error
|
|
909
316
|
* (transport failures, validation errors, server errors).
|
|
317
|
+
*
|
|
318
|
+
* @throws {PerpsError} On any backend error other than
|
|
319
|
+
* `PerpsErrorCode.AccountNotFound`.
|
|
320
|
+
* @public
|
|
910
321
|
*/
|
|
911
322
|
async accountExists(provider: string, address: Address): Promise<boolean> {
|
|
912
323
|
try {
|
|
913
|
-
await
|
|
324
|
+
await fetchAccount(this.sdkClient, { provider, address })
|
|
914
325
|
return true
|
|
915
326
|
} catch (err) {
|
|
916
327
|
if (
|
|
@@ -923,113 +334,68 @@ export class PerpsClient {
|
|
|
923
334
|
}
|
|
924
335
|
}
|
|
925
336
|
|
|
926
|
-
// ---------------------------------------------------------------------------
|
|
927
|
-
// Setup
|
|
928
|
-
// ---------------------------------------------------------------------------
|
|
929
|
-
|
|
930
337
|
/**
|
|
931
|
-
* Return the unsatisfied entries on `Provider.setup` for this account
|
|
932
|
-
*
|
|
338
|
+
* Return the unsatisfied entries on `Provider.setup` for this account as a
|
|
339
|
+
* flat, self-describing list. Trading is gated on `isReady === true`.
|
|
933
340
|
*
|
|
934
341
|
* `Provider.options` descriptors are NEVER returned here — options are
|
|
935
342
|
* post-setup tunables and never gate trading. Option state is surfaced
|
|
936
343
|
* separately via `getAccount().settings`.
|
|
344
|
+
*
|
|
345
|
+
* @public
|
|
937
346
|
*/
|
|
938
|
-
async checkSetup(params: GetSetupParams): Promise<
|
|
347
|
+
async checkSetup(params: GetSetupParams): Promise<ProviderSetup> {
|
|
939
348
|
const { provider, address } = params
|
|
940
|
-
const mode = await this.loadSigningMode(address, provider)
|
|
941
|
-
|
|
942
|
-
const metadata = await this.getProviderMetadata(provider)
|
|
943
|
-
const usesAgent = [
|
|
944
|
-
...metadata.setup,
|
|
945
|
-
...metadata.options,
|
|
946
|
-
...metadata.actions,
|
|
947
|
-
].some((d) => d.signers.includes(PerpsSigner.AGENT))
|
|
948
349
|
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
provider
|
|
954
|
-
)
|
|
955
|
-
agentAddress = agent.address
|
|
956
|
-
}
|
|
957
|
-
|
|
958
|
-
const allInputs = this.buildPrerequisiteInputs(
|
|
959
|
-
metadata.setup,
|
|
960
|
-
mode,
|
|
961
|
-
agentAddress
|
|
962
|
-
)
|
|
963
|
-
|
|
964
|
-
if (allInputs.length === 0) {
|
|
965
|
-
return { userPrerequisites: [], agentPrerequisites: [], isReady: true }
|
|
966
|
-
}
|
|
967
|
-
|
|
968
|
-
// Build a signer lookup from setup descriptors.
|
|
969
|
-
const signersByAction = new Map<string, PerpsSigner[]>()
|
|
970
|
-
for (const desc of metadata.setup) {
|
|
971
|
-
signersByAction.set(desc.type, desc.signers)
|
|
972
|
-
}
|
|
973
|
-
|
|
974
|
-
// Send all to backend via createAction for the first prerequisite type
|
|
975
|
-
// The backend filters already-satisfied ones and returns typed data
|
|
976
|
-
const { actions } = await this.buildPrerequisites({
|
|
977
|
-
provider,
|
|
978
|
-
address,
|
|
979
|
-
signerAddress: agentAddress,
|
|
980
|
-
})
|
|
981
|
-
|
|
982
|
-
if (actions.length === 0) {
|
|
983
|
-
return { userPrerequisites: [], agentPrerequisites: [], isReady: true }
|
|
984
|
-
}
|
|
985
|
-
|
|
986
|
-
const userPrerequisites = actions.filter((a) => {
|
|
987
|
-
const signers = signersByAction.get(a.action) ?? []
|
|
988
|
-
return signers.includes(PerpsSigner.USER)
|
|
989
|
-
})
|
|
990
|
-
const agentPrerequisites = actions.filter((a) => {
|
|
991
|
-
const signers = signersByAction.get(a.action) ?? []
|
|
992
|
-
return signers.includes(PerpsSigner.AGENT)
|
|
993
|
-
})
|
|
350
|
+
// The backend filters already-satisfied setup actions and returns typed
|
|
351
|
+
// data for those still outstanding; each plugin contributes its own
|
|
352
|
+
// signer-bearing request fields.
|
|
353
|
+
const { actions } = await this.buildProviderSetup({ provider, address })
|
|
994
354
|
|
|
995
355
|
return {
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
isReady: false,
|
|
356
|
+
setup: actions,
|
|
357
|
+
isReady: actions.length === 0,
|
|
999
358
|
}
|
|
1000
359
|
}
|
|
1001
360
|
|
|
1002
|
-
|
|
1003
|
-
|
|
361
|
+
/**
|
|
362
|
+
* Build the unsigned setup `ActionStep`s still outstanding for an account,
|
|
363
|
+
* ordered by descriptor `sequence`. The backend filters already-satisfied
|
|
364
|
+
* setup; each plugin contributes its own signer-bearing request fields and
|
|
365
|
+
* any local-state params (e.g. Lighter's known pubkey).
|
|
366
|
+
*
|
|
367
|
+
* @public
|
|
368
|
+
*/
|
|
369
|
+
async buildProviderSetup(
|
|
370
|
+
params: BuildProviderSetupParams
|
|
1004
371
|
): Promise<CreateActionResponse> {
|
|
1005
|
-
const
|
|
1006
|
-
let { signerAddress } = params
|
|
1007
|
-
|
|
1008
|
-
if (mode === SigningMode.USER_AGENT && !signerAddress) {
|
|
1009
|
-
const agent = await this.sdkClient.agentManager.getAgent(
|
|
1010
|
-
params.address,
|
|
1011
|
-
params.provider
|
|
1012
|
-
)
|
|
1013
|
-
signerAddress = agent.address
|
|
1014
|
-
}
|
|
372
|
+
const { provider, address } = params
|
|
1015
373
|
|
|
1016
|
-
const metadata = await this.getProviderMetadata(
|
|
1017
|
-
const
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
374
|
+
const metadata = await this.getProviderMetadata(provider)
|
|
375
|
+
const orderedSetup = [...metadata.setup].sort(
|
|
376
|
+
(a, b) =>
|
|
377
|
+
(a.sequence ?? Number.MAX_SAFE_INTEGER) -
|
|
378
|
+
(b.sequence ?? Number.MAX_SAFE_INTEGER)
|
|
1021
379
|
)
|
|
1022
380
|
|
|
1023
|
-
|
|
1024
|
-
// The backend handles all prerequisites in a single createPrerequisite call
|
|
381
|
+
const plugin = this.sdkClient.getProvider(provider)
|
|
1025
382
|
const allActions: ActionStep[] = []
|
|
1026
|
-
for (const
|
|
383
|
+
for (const descriptor of orderedSetup) {
|
|
384
|
+
const action = descriptor.type
|
|
385
|
+
const { signerAddress, params: signerParams } =
|
|
386
|
+
await this.resolveActionRequest(provider, descriptor, address)
|
|
387
|
+
const localParams = plugin?.resolveSetupParams
|
|
388
|
+
? await plugin.resolveSetupParams(action, address)
|
|
389
|
+
: {}
|
|
1027
390
|
const { actions } = await createAction(this.sdkClient, {
|
|
1028
|
-
provider
|
|
1029
|
-
address
|
|
391
|
+
provider,
|
|
392
|
+
address,
|
|
1030
393
|
signerAddress,
|
|
1031
|
-
action
|
|
1032
|
-
params:
|
|
394
|
+
action,
|
|
395
|
+
params: {
|
|
396
|
+
...signerParams,
|
|
397
|
+
...localParams,
|
|
398
|
+
} as Record<string, never>,
|
|
1033
399
|
})
|
|
1034
400
|
allActions.push(...actions)
|
|
1035
401
|
}
|
|
@@ -1038,272 +404,157 @@ export class PerpsClient {
|
|
|
1038
404
|
}
|
|
1039
405
|
|
|
1040
406
|
/**
|
|
1041
|
-
*
|
|
1042
|
-
*
|
|
1043
|
-
*
|
|
1044
|
-
*
|
|
1045
|
-
*/
|
|
1046
|
-
private static readonly DEFAULT_ACCOUNT_MODE = 'unifiedAccount'
|
|
1047
|
-
|
|
1048
|
-
/**
|
|
1049
|
-
* Prepare an `ACCOUNT_MODE` change by proactively reading the account's
|
|
1050
|
-
* current `config.abstractionMode` and routing to the correct signer:
|
|
1051
|
-
*
|
|
1052
|
-
* - `abstractionMode == null` (never set, e.g. a fresh HL account):
|
|
1053
|
-
* the change MAY be performed by the agent signer. Build, sign with
|
|
1054
|
-
* the agent key, and dispatch. Returns `{ results }`.
|
|
1055
|
-
* - `abstractionMode === mode`: idempotent no-op. Returns an empty
|
|
1056
|
-
* results envelope without contacting `/createAction` or `/executeAction`.
|
|
1057
|
-
* - `abstractionMode` set to any other value: HL requires a user-wallet
|
|
1058
|
-
* signature to change the abstraction once it has been set. Build the
|
|
1059
|
-
* action unsigned and return it as `{ fallback }` so the caller can
|
|
1060
|
-
* surface a wallet prompt via `fallbackUserPrerequisites`.
|
|
407
|
+
* Submit the signed setup steps returned by `checkSetup` (and signed by the
|
|
408
|
+
* caller / `signProviderSetupAction`). Routes the batch on the first step's
|
|
409
|
+
* action and lets the plugin contribute that action's `signerAddress`.
|
|
410
|
+
* Throws on any per-step venue rejection.
|
|
1061
411
|
*
|
|
1062
|
-
*
|
|
1063
|
-
* `account.config.provider !== 'hyperliquid'` also throws: this helper
|
|
1064
|
-
* is HL-specific and the dispatcher should never reach it for another
|
|
1065
|
-
* provider (gated by `hasWritableAccountMode`).
|
|
412
|
+
* @public
|
|
1066
413
|
*/
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
): Promise<{
|
|
1072
|
-
results?: ExecuteActionResponse
|
|
1073
|
-
fallback?: ActionStep[]
|
|
1074
|
-
}> {
|
|
1075
|
-
const account = await getAccount(this.sdkClient, { provider, address })
|
|
1076
|
-
if (account.config.provider !== 'hyperliquid') {
|
|
1077
|
-
throw new PerpsError(
|
|
1078
|
-
PerpsErrorCode.SDKError,
|
|
1079
|
-
`prepareAccountModeChange is Hyperliquid-specific, but ` +
|
|
1080
|
-
`getAccount returned config for provider ` +
|
|
1081
|
-
`'${account.config.provider}'.`
|
|
1082
|
-
)
|
|
1083
|
-
}
|
|
1084
|
-
const currentStatus = account.config.abstractionMode
|
|
414
|
+
async executeProviderSetup(
|
|
415
|
+
params: ExecuteProviderSetupParams
|
|
416
|
+
): Promise<ExecuteProviderSetupResult> {
|
|
417
|
+
const { provider, address, setup, signedActions } = params
|
|
1085
418
|
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
return {}
|
|
419
|
+
if (signedActions.length === 0) {
|
|
420
|
+
return { results: { results: [] } }
|
|
1089
421
|
}
|
|
1090
422
|
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
provider,
|
|
1100
|
-
address,
|
|
1101
|
-
signerAddress: agent.address,
|
|
1102
|
-
action: ActionType.ACCOUNT_MODE,
|
|
1103
|
-
params: { mode } satisfies ActionParamsMap[ActionType.ACCOUNT_MODE],
|
|
1104
|
-
})
|
|
1105
|
-
|
|
1106
|
-
if (actions.length === 0) {
|
|
1107
|
-
// Backend's per-mode early-exit (defensive — shouldn't fire given
|
|
1108
|
-
// the short-circuit above, but covers a race between our /account
|
|
1109
|
-
// read and the backend's view of the current status).
|
|
1110
|
-
return { results: { results: [] } }
|
|
1111
|
-
}
|
|
1112
|
-
|
|
1113
|
-
const signedActions: SignedActionStep[] = await Promise.all(
|
|
1114
|
-
(actions as Eip712ActionStep[]).map(
|
|
1115
|
-
async (a): Promise<Eip712SignedActionStep> => ({
|
|
1116
|
-
action: a.action,
|
|
1117
|
-
typedData: a.typedData,
|
|
1118
|
-
signature: await signTypedData(agent.privateKey, a.typedData),
|
|
1119
|
-
})
|
|
1120
|
-
)
|
|
1121
|
-
)
|
|
1122
|
-
|
|
1123
|
-
const results = await executeAction(this.sdkClient, {
|
|
1124
|
-
provider,
|
|
1125
|
-
address,
|
|
1126
|
-
signerAddress: agent.address,
|
|
1127
|
-
action: ActionType.ACCOUNT_MODE,
|
|
1128
|
-
actions: signedActions,
|
|
1129
|
-
})
|
|
1130
|
-
|
|
1131
|
-
return { results }
|
|
1132
|
-
}
|
|
423
|
+
const action = setup[0]?.action ?? signedActions[0].action
|
|
424
|
+
const metadata = await this.getProviderMetadata(provider)
|
|
425
|
+
const descriptor = findActionDescriptor(metadata, action)
|
|
426
|
+
const { signerAddress } = await this.resolveActionRequest(
|
|
427
|
+
provider,
|
|
428
|
+
descriptor,
|
|
429
|
+
address
|
|
430
|
+
)
|
|
1133
431
|
|
|
1134
|
-
|
|
1135
|
-
// Build the action unsigned and surface it as a fallback to the caller.
|
|
1136
|
-
const { actions: fallbackActions } = await createAction(this.sdkClient, {
|
|
432
|
+
const results = await executeAction(this.sdkClient, {
|
|
1137
433
|
provider,
|
|
1138
434
|
address,
|
|
1139
|
-
|
|
1140
|
-
|
|
435
|
+
// The submitting account: the plugin-resolved signer (Hyperliquid's
|
|
436
|
+
// agent) when present, else the end-user's address.
|
|
437
|
+
signerAddress: signerAddress ?? address,
|
|
438
|
+
action,
|
|
439
|
+
actions: signedActions,
|
|
1141
440
|
})
|
|
1142
441
|
|
|
1143
|
-
|
|
1144
|
-
|
|
442
|
+
const failure = results.results.find((r) => !r.success)
|
|
443
|
+
if (failure) {
|
|
444
|
+
throw new PerpsError(PerpsErrorCode.ExchangeRejected, failure.error)
|
|
1145
445
|
}
|
|
1146
|
-
}
|
|
1147
446
|
|
|
1148
|
-
|
|
1149
|
-
* True when the provider exposes an `ACCOUNT_MODE` descriptor (in `setup`
|
|
1150
|
-
* or `options`) whose `mode` Param has a writable enumeration of values.
|
|
1151
|
-
* Providers that omit `ACCOUNT_MODE` or expose it as read-only / free-form
|
|
1152
|
-
* input return false.
|
|
1153
|
-
*/
|
|
1154
|
-
private static hasWritableAccountMode(metadata: Provider): boolean {
|
|
1155
|
-
const item = [...metadata.setup, ...metadata.options].find(
|
|
1156
|
-
(i) => i.type === ActionType.ACCOUNT_MODE
|
|
1157
|
-
)
|
|
1158
|
-
if (!item) {
|
|
1159
|
-
return false
|
|
1160
|
-
}
|
|
1161
|
-
const modeParam = item.params.find((p) => p.name === 'mode')
|
|
1162
|
-
if (!modeParam) {
|
|
1163
|
-
return false
|
|
1164
|
-
}
|
|
1165
|
-
// Writable multi-option: `values` enumerates choices and `readOnly`
|
|
1166
|
-
// is not set (treat absence as writable, matching the descriptor
|
|
1167
|
-
// contract in `Param`).
|
|
1168
|
-
if (!modeParam.values || modeParam.values.length === 0) {
|
|
1169
|
-
return false
|
|
1170
|
-
}
|
|
1171
|
-
return !modeParam.readOnly
|
|
447
|
+
return { results }
|
|
1172
448
|
}
|
|
1173
449
|
|
|
1174
450
|
/**
|
|
1175
|
-
*
|
|
1176
|
-
*
|
|
451
|
+
* Sign and submit one pre-staged setup `ActionStep` end-to-end.
|
|
452
|
+
*
|
|
453
|
+
* The caller is expected to have already obtained the step from a prior
|
|
454
|
+
* {@link checkSetup} call (typically cached by the widget's react-query) —
|
|
455
|
+
* we do NOT refetch. This avoids the double `createAction` round-trip and
|
|
456
|
+
* keeps the nonce that was allocated at staging time committed all the way
|
|
457
|
+
* through submit. If the cached step has gone stale (Lighter's `/nextNonce`
|
|
458
|
+
* advanced underneath us), `executeProviderSetup` will surface a nonce
|
|
459
|
+
* conflict that the caller invalidates on, refetches `checkSetup`, and
|
|
460
|
+
* retries with a fresh step.
|
|
1177
461
|
*
|
|
1178
|
-
*
|
|
1179
|
-
*
|
|
1180
|
-
*
|
|
1181
|
-
* `ACCOUNT_MODE` Param (Hyperliquid today). The SDK reads
|
|
1182
|
-
* `account.config.abstractionMode` to choose the signer: `null` →
|
|
1183
|
-
* agent dispatch; non-null → wallet fallback returned in
|
|
1184
|
-
* `fallbackUserPrerequisites`.
|
|
1185
|
-
* 3. Sign and submit any pre-staged agent-side setup actions the
|
|
1186
|
-
* backend returned alongside the user-signed ones.
|
|
462
|
+
* @throws {PerpsError} When the step's action is not in the provider's
|
|
463
|
+
* `setup` descriptors.
|
|
464
|
+
* @public
|
|
1187
465
|
*/
|
|
1188
|
-
async
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
if (userSignedActions.length > 0) {
|
|
1195
|
-
const signerAddress =
|
|
1196
|
-
mode === SigningMode.USER_AGENT
|
|
1197
|
-
? (await this.sdkClient.agentManager.getAgent(address, provider))
|
|
1198
|
-
.address
|
|
1199
|
-
: address
|
|
1200
|
-
|
|
1201
|
-
// Submit all user-signed actions — use first action's type for routing
|
|
1202
|
-
const firstAction = required.userPrerequisites[0]?.action as string
|
|
1203
|
-
userResults = await executeAction(this.sdkClient, {
|
|
1204
|
-
provider,
|
|
1205
|
-
address,
|
|
1206
|
-
signerAddress,
|
|
1207
|
-
action: (firstAction ?? ActionType.APPROVE_AGENT) as ActionType,
|
|
1208
|
-
actions: userSignedActions,
|
|
1209
|
-
})
|
|
1210
|
-
|
|
1211
|
-
const mandatoryFailure = userResults.results.find((r) => !r.success)
|
|
1212
|
-
if (mandatoryFailure) {
|
|
1213
|
-
return { userResults }
|
|
1214
|
-
}
|
|
1215
|
-
}
|
|
466
|
+
async executeProviderSetupAction(params: {
|
|
467
|
+
provider: string
|
|
468
|
+
address: Address
|
|
469
|
+
step: ActionStep
|
|
470
|
+
}): Promise<void> {
|
|
471
|
+
const { provider, address, step } = params
|
|
1216
472
|
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
// today), the SDK reads `account.config.abstractionMode` to decide
|
|
1224
|
-
// the signer: `null` → agent-dispatch silently to the SDK's preferred
|
|
1225
|
-
// default; non-null → return a wallet-signing fallback step. Either
|
|
1226
|
-
// way the chain does NOT abort onboarding — `ACCOUNT_MODE` lives on
|
|
1227
|
-
// `Provider.options`, not `Provider.setup`, and so does not gate
|
|
1228
|
-
// trading.
|
|
1229
|
-
let agentResults: ExecuteActionResponse | undefined
|
|
1230
|
-
let fallbackUserPrerequisites: ActionStep[] | undefined
|
|
1231
|
-
if (mode === SigningMode.USER_AGENT) {
|
|
1232
|
-
const justApprovedAgent = userResults.results.some(
|
|
1233
|
-
(r) => r.success && r.action === ActionType.APPROVE_AGENT
|
|
473
|
+
const metadata = await this.getProviderMetadata(provider)
|
|
474
|
+
const descriptor = metadata.setup.find((d) => d.type === step.action)
|
|
475
|
+
if (!descriptor) {
|
|
476
|
+
throw new PerpsError(
|
|
477
|
+
PerpsErrorCode.SDKError,
|
|
478
|
+
`Action '${step.action}' is not in '${provider}'.setup`
|
|
1234
479
|
)
|
|
1235
|
-
if (justApprovedAgent) {
|
|
1236
|
-
const metadata = await this.getProviderMetadata(provider)
|
|
1237
|
-
if (PerpsClient.hasWritableAccountMode(metadata)) {
|
|
1238
|
-
const upgrade = await this.prepareAccountModeChange(
|
|
1239
|
-
provider,
|
|
1240
|
-
address,
|
|
1241
|
-
PerpsClient.DEFAULT_ACCOUNT_MODE
|
|
1242
|
-
)
|
|
1243
|
-
agentResults = upgrade.results
|
|
1244
|
-
fallbackUserPrerequisites = upgrade.fallback
|
|
1245
|
-
}
|
|
1246
|
-
}
|
|
1247
480
|
}
|
|
1248
481
|
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
) {
|
|
1258
|
-
const agent = await this.sdkClient.agentManager.getAgent(
|
|
1259
|
-
address,
|
|
1260
|
-
provider
|
|
1261
|
-
)
|
|
1262
|
-
|
|
1263
|
-
const signedAgentActions: SignedActionStep[] = await Promise.all(
|
|
1264
|
-
(required.agentPrerequisites as Eip712ActionStep[]).map(
|
|
1265
|
-
async (action) =>
|
|
1266
|
-
({
|
|
1267
|
-
action: action.action,
|
|
1268
|
-
typedData: action.typedData,
|
|
1269
|
-
signature: await signTypedData(
|
|
1270
|
-
agent.privateKey,
|
|
1271
|
-
action.typedData
|
|
1272
|
-
),
|
|
1273
|
-
}) satisfies Eip712SignedActionStep
|
|
1274
|
-
)
|
|
1275
|
-
)
|
|
1276
|
-
|
|
1277
|
-
const firstAction = required.agentPrerequisites[0]?.action as string
|
|
1278
|
-
const stagedResults = await executeAction(this.sdkClient, {
|
|
1279
|
-
provider,
|
|
1280
|
-
address,
|
|
1281
|
-
signerAddress: agent.address,
|
|
1282
|
-
action: (firstAction ?? ActionType.ACCOUNT_MODE) as ActionType,
|
|
1283
|
-
actions: signedAgentActions,
|
|
1284
|
-
})
|
|
1285
|
-
|
|
1286
|
-
// Merge staged-prereq results with any auto-upgrade results from step 2.
|
|
1287
|
-
agentResults = {
|
|
1288
|
-
results: [...(agentResults?.results ?? []), ...stagedResults.results],
|
|
1289
|
-
}
|
|
1290
|
-
}
|
|
482
|
+
const signed = await this.signProviderSetupAction(provider, address, step)
|
|
483
|
+
await this.executeProviderSetup({
|
|
484
|
+
provider,
|
|
485
|
+
address,
|
|
486
|
+
setup: [step],
|
|
487
|
+
signedActions: [signed],
|
|
488
|
+
})
|
|
489
|
+
}
|
|
1291
490
|
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
491
|
+
/**
|
|
492
|
+
* Sign and submit a single provider-option change (a `Provider.options`
|
|
493
|
+
* tunable such as Lighter `ACCOUNT_TYPE` or Hyperliquid `ACCOUNT_MODE`)
|
|
494
|
+
* end-to-end, throwing on a venue rejection.
|
|
495
|
+
*
|
|
496
|
+
* Options are dispatched through the same {@link execute} pipeline as
|
|
497
|
+
* trades, but unlike a trade an option change is a single mandatory action:
|
|
498
|
+
* a per-action `success: false` (returned as a 200 OK) means the user's
|
|
499
|
+
* selection was rejected and must surface, not be silently dropped. This
|
|
500
|
+
* wrapper inspects the result and throws a {@link PerpsError} carrying the
|
|
501
|
+
* venue `error`, giving options the same throw contract that setup has via
|
|
502
|
+
* {@link executeProviderSetupAction}. The only structural difference is that
|
|
503
|
+
* an option carries `params` (the selected value) rather than a pre-staged
|
|
504
|
+
* step.
|
|
505
|
+
*
|
|
506
|
+
* `execute` itself is unchanged — it still returns results without throwing,
|
|
507
|
+
* which the trade hooks rely on for partial-fill handling.
|
|
508
|
+
*
|
|
509
|
+
* @throws {PerpsError} `PerpsErrorCode.ExchangeRejected` carrying the venue
|
|
510
|
+
* error when any returned result has `success: false`; also the errors
|
|
511
|
+
* `execute` itself can throw (unregistered provider, no signer, signing
|
|
512
|
+
* failure).
|
|
513
|
+
* @public
|
|
514
|
+
*/
|
|
515
|
+
async executeProviderOption<T extends ActionType>(params: {
|
|
516
|
+
provider: string
|
|
517
|
+
address: Address
|
|
518
|
+
action: T
|
|
519
|
+
params: ActionParamsMap[T]
|
|
520
|
+
}): Promise<void> {
|
|
521
|
+
const { results } = await this.execute(params)
|
|
522
|
+
const failure = results.find((r) => !r.success)
|
|
523
|
+
if (failure) {
|
|
524
|
+
throw new PerpsError(PerpsErrorCode.ExchangeRejected, failure.error)
|
|
1296
525
|
}
|
|
1297
526
|
}
|
|
1298
527
|
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
528
|
+
/**
|
|
529
|
+
* Place a market or limit order. Convenience wrapper over {@link execute}
|
|
530
|
+
* with `ActionType.PLACE_ORDER`.
|
|
531
|
+
*
|
|
532
|
+
* @throws {PerpsError} When the provider is unregistered or the action
|
|
533
|
+
* cannot be signed/submitted.
|
|
534
|
+
* @example
|
|
535
|
+
* ```ts
|
|
536
|
+
* await client.placeOrder({
|
|
537
|
+
* provider: 'hyperliquid',
|
|
538
|
+
* address: '0xUser',
|
|
539
|
+
* market: { symbol: 'ETH' },
|
|
540
|
+
* side: 'buy',
|
|
541
|
+
* size: '0.1',
|
|
542
|
+
* })
|
|
543
|
+
* ```
|
|
544
|
+
* @public
|
|
545
|
+
*/
|
|
1303
546
|
async placeOrder(params: PlaceOrderParams): Promise<ExecuteActionResponse> {
|
|
1304
547
|
return this.execute({ ...params, action: ActionType.PLACE_ORDER, params })
|
|
1305
548
|
}
|
|
1306
549
|
|
|
550
|
+
/**
|
|
551
|
+
* Place a trigger (take-profit / stop-loss) order. Convenience wrapper over
|
|
552
|
+
* {@link execute} with `ActionType.PLACE_TRIGGER_ORDER`.
|
|
553
|
+
*
|
|
554
|
+
* @throws {PerpsError} When the provider is unregistered or the action
|
|
555
|
+
* cannot be signed/submitted.
|
|
556
|
+
* @public
|
|
557
|
+
*/
|
|
1307
558
|
async placeTriggerOrder(
|
|
1308
559
|
params: PlaceTriggerOrderParams
|
|
1309
560
|
): Promise<ExecuteActionResponse> {
|
|
@@ -1314,22 +565,46 @@ export class PerpsClient {
|
|
|
1314
565
|
})
|
|
1315
566
|
}
|
|
1316
567
|
|
|
568
|
+
/**
|
|
569
|
+
* Cancel one or more open orders. Convenience wrapper over {@link execute}
|
|
570
|
+
* with `ActionType.CANCEL_ORDER`.
|
|
571
|
+
*
|
|
572
|
+
* @throws {PerpsError} When the provider is unregistered or the action
|
|
573
|
+
* cannot be signed/submitted.
|
|
574
|
+
* @public
|
|
575
|
+
*/
|
|
1317
576
|
async cancelOrders(
|
|
1318
577
|
params: CancelOrdersParams
|
|
1319
578
|
): Promise<ExecuteActionResponse> {
|
|
1320
579
|
return this.execute({ ...params, action: ActionType.CANCEL_ORDER, params })
|
|
1321
580
|
}
|
|
1322
581
|
|
|
582
|
+
/**
|
|
583
|
+
* Modify one or more open orders. Convenience wrapper over {@link execute}
|
|
584
|
+
* with `ActionType.MODIFY_ORDER`.
|
|
585
|
+
*
|
|
586
|
+
* @throws {PerpsError} When the provider is unregistered or the action
|
|
587
|
+
* cannot be signed/submitted.
|
|
588
|
+
* @public
|
|
589
|
+
*/
|
|
1323
590
|
async modifyOrders(
|
|
1324
591
|
params: ModifyOrdersParams
|
|
1325
592
|
): Promise<ExecuteActionResponse> {
|
|
1326
593
|
return this.execute({ ...params, action: ActionType.MODIFY_ORDER, params })
|
|
1327
594
|
}
|
|
1328
595
|
|
|
596
|
+
/**
|
|
597
|
+
* Add or remove isolated-position margin. Convenience wrapper over
|
|
598
|
+
* {@link execute} with `ActionType.UPDATE_POSITION_MARGIN`.
|
|
599
|
+
*
|
|
600
|
+
* @throws {PerpsError} When the provider is unregistered or the action
|
|
601
|
+
* cannot be signed/submitted.
|
|
602
|
+
* @public
|
|
603
|
+
*/
|
|
1329
604
|
async updatePositionMargin(params: {
|
|
1330
605
|
provider: string
|
|
1331
606
|
address: Address
|
|
1332
|
-
|
|
607
|
+
market: MarketRef
|
|
1333
608
|
action: 'add' | 'remove'
|
|
1334
609
|
amount: string
|
|
1335
610
|
}): Promise<ExecuteActionResponse> {
|
|
@@ -1340,6 +615,14 @@ export class PerpsClient {
|
|
|
1340
615
|
})
|
|
1341
616
|
}
|
|
1342
617
|
|
|
618
|
+
/**
|
|
619
|
+
* Withdraw funds from the provider account. Convenience wrapper over
|
|
620
|
+
* {@link execute} with `ActionType.WITHDRAWAL`.
|
|
621
|
+
*
|
|
622
|
+
* @throws {PerpsError} When the provider is unregistered or the action
|
|
623
|
+
* cannot be signed/submitted.
|
|
624
|
+
* @public
|
|
625
|
+
*/
|
|
1343
626
|
async withdraw(params: WithdrawParams): Promise<ExecuteActionResponse> {
|
|
1344
627
|
return this.execute({
|
|
1345
628
|
provider: params.provider,
|
|
@@ -1350,48 +633,54 @@ export class PerpsClient {
|
|
|
1350
633
|
}
|
|
1351
634
|
|
|
1352
635
|
/**
|
|
1353
|
-
* Execute any action through the SDK's signing pipeline
|
|
1354
|
-
*
|
|
1355
|
-
*
|
|
1356
|
-
* the
|
|
636
|
+
* Execute any action through the SDK's signing pipeline: fetch the unsigned
|
|
637
|
+
* steps, delegate signing to the provider plugin (which branches on the
|
|
638
|
+
* descriptor's scheme and signer internally), and submit. Core stays
|
|
639
|
+
* signer-agnostic — the plugin owns WHO signs and HOW.
|
|
640
|
+
*
|
|
641
|
+
* @throws {PerpsError} When the action is not declared by the provider,
|
|
642
|
+
* the plugin cannot sign it, or submission fails.
|
|
643
|
+
* @public
|
|
1357
644
|
*/
|
|
1358
645
|
async execute<T extends ActionType>(params: {
|
|
1359
646
|
provider: string
|
|
1360
647
|
address: Address
|
|
1361
|
-
signerAddress?: Address
|
|
1362
648
|
action: T
|
|
1363
649
|
params: ActionParamsMap[T]
|
|
1364
650
|
}): Promise<ExecuteActionResponse> {
|
|
1365
|
-
|
|
1366
|
-
const metadata = await this.getProviderMetadata(
|
|
1367
|
-
const descriptor = findActionDescriptor(metadata,
|
|
651
|
+
const { provider, address, action } = params
|
|
652
|
+
const metadata = await this.getProviderMetadata(provider)
|
|
653
|
+
const descriptor = findActionDescriptor(metadata, action)
|
|
1368
654
|
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
655
|
+
const { signerAddress, params: signerParams } =
|
|
656
|
+
await this.resolveActionRequest(provider, descriptor, address)
|
|
657
|
+
|
|
658
|
+
const { actions } = await createAction(this.sdkClient, {
|
|
659
|
+
provider,
|
|
660
|
+
address,
|
|
661
|
+
signerAddress,
|
|
662
|
+
action,
|
|
663
|
+
params: {
|
|
664
|
+
...params.params,
|
|
665
|
+
...signerParams,
|
|
666
|
+
} as ActionParamsMap[T],
|
|
667
|
+
})
|
|
668
|
+
|
|
669
|
+
const signedActions = await this.delegateSignActions(
|
|
670
|
+
provider,
|
|
671
|
+
address,
|
|
672
|
+
descriptor,
|
|
673
|
+
actions
|
|
674
|
+
)
|
|
675
|
+
|
|
676
|
+
return executeAction(this.sdkClient, {
|
|
677
|
+
provider,
|
|
678
|
+
address,
|
|
679
|
+
// The submitting account: the plugin-resolved signer (Hyperliquid's
|
|
680
|
+
// agent) when present, else the end-user's address.
|
|
681
|
+
signerAddress: signerAddress ?? address,
|
|
682
|
+
action,
|
|
683
|
+
actions: signedActions,
|
|
684
|
+
})
|
|
1396
685
|
}
|
|
1397
686
|
}
|