@lifi/perps-sdk 0.1.1-alpha.4 → 0.1.1-alpha.40
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 +38 -15
- package/dist/cjs/agent/AgentManager.d.ts +5 -5
- package/dist/cjs/agent/AgentManager.d.ts.map +1 -1
- package/dist/cjs/agent/AgentManager.js +16 -14
- package/dist/cjs/agent/AgentManager.js.map +1 -1
- package/dist/cjs/client/PerpsClient.d.ts +70 -21
- package/dist/cjs/client/PerpsClient.d.ts.map +1 -1
- package/dist/cjs/client/PerpsClient.js +323 -175
- package/dist/cjs/client/PerpsClient.js.map +1 -1
- package/dist/cjs/client/createPerpsClient.d.ts +12 -2
- package/dist/cjs/client/createPerpsClient.d.ts.map +1 -1
- package/dist/cjs/client/createPerpsClient.js +6 -5
- package/dist/cjs/client/createPerpsClient.js.map +1 -1
- package/dist/cjs/client/types.d.ts +42 -25
- package/dist/cjs/client/types.d.ts.map +1 -1
- package/dist/cjs/client/types.js +6 -0
- package/dist/cjs/client/types.js.map +1 -1
- package/dist/cjs/errors/PerpsError.d.ts +2 -3
- package/dist/cjs/errors/PerpsError.d.ts.map +1 -1
- package/dist/cjs/errors/PerpsError.js +3 -15
- package/dist/cjs/errors/PerpsError.js.map +1 -1
- package/dist/cjs/errors/constants.d.ts +0 -10
- package/dist/cjs/errors/constants.d.ts.map +1 -1
- package/dist/cjs/errors/constants.js +1 -12
- package/dist/cjs/errors/constants.js.map +1 -1
- package/dist/cjs/index.d.ts +31 -32
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +58 -42
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/realtime/PerpsWsClient.d.ts +1 -0
- package/dist/cjs/realtime/PerpsWsClient.d.ts.map +1 -1
- package/dist/cjs/realtime/PerpsWsClient.js +28 -23
- package/dist/cjs/realtime/PerpsWsClient.js.map +1 -1
- package/dist/cjs/realtime/hyperliquid/HyperliquidWsProvider.d.ts +9 -5
- package/dist/cjs/realtime/hyperliquid/HyperliquidWsProvider.d.ts.map +1 -1
- package/dist/cjs/realtime/hyperliquid/HyperliquidWsProvider.js +162 -52
- package/dist/cjs/realtime/hyperliquid/HyperliquidWsProvider.js.map +1 -1
- package/dist/cjs/realtime/hyperliquid/types.d.ts +11 -9
- package/dist/cjs/realtime/hyperliquid/types.d.ts.map +1 -1
- package/dist/cjs/services/createAction.d.ts +11 -0
- package/dist/cjs/services/createAction.d.ts.map +1 -0
- package/dist/cjs/services/{submitAuthorization.js → createAction.js} +7 -6
- package/dist/cjs/services/createAction.js.map +1 -0
- package/dist/cjs/services/executeAction.d.ts +11 -0
- package/dist/cjs/services/executeAction.d.ts.map +1 -0
- package/dist/cjs/services/{submitOrder.js → executeAction.js} +6 -5
- package/dist/cjs/services/executeAction.js.map +1 -0
- package/dist/cjs/services/getAccount.d.ts +1 -1
- package/dist/cjs/services/getAccount.d.ts.map +1 -1
- package/dist/cjs/services/getAccount.js +1 -1
- package/dist/cjs/services/getAccount.js.map +1 -1
- package/dist/cjs/services/getActivity.d.ts +13 -0
- package/dist/cjs/services/getActivity.d.ts.map +1 -0
- package/dist/cjs/services/getActivity.js +21 -0
- package/dist/cjs/services/getActivity.js.map +1 -0
- package/dist/cjs/services/getAsset.d.ts +8 -0
- package/dist/cjs/services/getAsset.d.ts.map +1 -0
- package/dist/cjs/services/{getMarkets.js → getAsset.js} +6 -4
- package/dist/cjs/services/getAsset.js.map +1 -0
- package/dist/cjs/services/getAssets.d.ts +7 -0
- package/dist/cjs/services/getAssets.d.ts.map +1 -0
- package/dist/cjs/services/{getMarket.js → getAssets.js} +5 -5
- package/dist/cjs/services/getAssets.js.map +1 -0
- package/dist/cjs/services/getFills.d.ts +12 -0
- package/dist/cjs/services/getFills.d.ts.map +1 -0
- package/dist/cjs/services/{getHistory.js → getFills.js} +7 -5
- package/dist/cjs/services/getFills.js.map +1 -0
- package/dist/cjs/services/getOhlcv.d.ts +1 -1
- package/dist/cjs/services/getOhlcv.d.ts.map +1 -1
- package/dist/cjs/services/getOhlcv.js +1 -1
- package/dist/cjs/services/getOhlcv.js.map +1 -1
- package/dist/cjs/services/getOrder.d.ts +1 -1
- package/dist/cjs/services/getOrder.d.ts.map +1 -1
- package/dist/cjs/services/getOrder.js +1 -1
- package/dist/cjs/services/getOrder.js.map +1 -1
- package/dist/cjs/services/getOrderbook.d.ts +1 -1
- package/dist/cjs/services/getOrderbook.d.ts.map +1 -1
- package/dist/cjs/services/getOrderbook.js +1 -1
- package/dist/cjs/services/getOrderbook.js.map +1 -1
- package/dist/cjs/services/getOrders.d.ts +11 -0
- package/dist/cjs/services/getOrders.d.ts.map +1 -0
- package/dist/cjs/services/getOrders.js +15 -0
- package/dist/cjs/services/getOrders.js.map +1 -0
- package/dist/cjs/services/getPositions.d.ts +11 -0
- package/dist/cjs/services/getPositions.d.ts.map +1 -0
- package/dist/cjs/services/getPositions.js +15 -0
- package/dist/cjs/services/getPositions.js.map +1 -0
- package/dist/cjs/services/getPrices.d.ts +1 -1
- package/dist/cjs/services/getPrices.d.ts.map +1 -1
- package/dist/cjs/services/getPrices.js +1 -1
- package/dist/cjs/services/getPrices.js.map +1 -1
- package/dist/cjs/services/getProviders.d.ts +4 -0
- package/dist/cjs/services/getProviders.d.ts.map +1 -0
- package/dist/cjs/services/{getDexes.js → getProviders.js} +4 -4
- package/dist/cjs/services/getProviders.js.map +1 -0
- package/dist/cjs/utils/accountSummary.d.ts +9 -0
- package/dist/cjs/utils/accountSummary.d.ts.map +1 -0
- package/dist/cjs/utils/accountSummary.js +81 -0
- package/dist/cjs/utils/accountSummary.js.map +1 -0
- package/dist/cjs/utils/calculations.d.ts +16 -0
- package/dist/cjs/utils/calculations.d.ts.map +1 -0
- package/dist/cjs/utils/calculations.js +71 -0
- package/dist/cjs/utils/calculations.js.map +1 -0
- package/dist/cjs/utils/hyperliquid/index.d.ts +3 -0
- package/dist/cjs/utils/hyperliquid/index.d.ts.map +1 -0
- package/dist/cjs/utils/hyperliquid/index.js +11 -0
- package/dist/cjs/utils/hyperliquid/index.js.map +1 -0
- package/dist/cjs/utils/hyperliquid/liquidation.d.ts +3 -0
- package/dist/cjs/utils/hyperliquid/liquidation.d.ts.map +1 -0
- package/dist/cjs/utils/hyperliquid/liquidation.js +24 -0
- package/dist/cjs/utils/hyperliquid/liquidation.js.map +1 -0
- package/dist/cjs/utils/hyperliquid/orderFormatting.d.ts +4 -0
- package/dist/cjs/utils/hyperliquid/orderFormatting.d.ts.map +1 -0
- package/dist/cjs/utils/hyperliquid/orderFormatting.js +33 -0
- package/dist/cjs/utils/hyperliquid/orderFormatting.js.map +1 -0
- package/dist/cjs/utils/orderClassification.d.ts +8 -0
- package/dist/cjs/utils/orderClassification.d.ts.map +1 -0
- package/dist/cjs/utils/orderClassification.js +39 -0
- package/dist/cjs/utils/orderClassification.js.map +1 -0
- package/dist/cjs/utils/parse.d.ts +2 -0
- package/dist/cjs/utils/parse.d.ts.map +1 -0
- package/dist/cjs/utils/parse.js +14 -0
- package/dist/cjs/utils/parse.js.map +1 -0
- package/dist/cjs/utils/request.d.ts.map +1 -1
- package/dist/cjs/utils/request.js +16 -4
- package/dist/cjs/utils/request.js.map +1 -1
- package/dist/cjs/utils/units.d.ts +3 -0
- package/dist/cjs/utils/units.d.ts.map +1 -0
- package/dist/cjs/utils/units.js +18 -0
- package/dist/cjs/utils/units.js.map +1 -0
- package/dist/cjs/utils/validation.d.ts +2 -0
- package/dist/cjs/utils/validation.d.ts.map +1 -0
- package/dist/cjs/utils/validation.js +16 -0
- package/dist/cjs/utils/validation.js.map +1 -0
- 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/esm/agent/AgentManager.d.ts +9 -9
- package/dist/esm/agent/AgentManager.d.ts.map +1 -1
- package/dist/esm/agent/AgentManager.js +20 -18
- package/dist/esm/agent/AgentManager.js.map +1 -1
- package/dist/esm/agent/storage.d.ts +1 -1
- package/dist/esm/agent/storage.js +1 -1
- package/dist/esm/client/PerpsClient.d.ts +70 -189
- package/dist/esm/client/PerpsClient.d.ts.map +1 -1
- package/dist/esm/client/PerpsClient.js +355 -361
- package/dist/esm/client/PerpsClient.js.map +1 -1
- package/dist/esm/client/createPerpsClient.d.ts +30 -7
- package/dist/esm/client/createPerpsClient.d.ts.map +1 -1
- package/dist/esm/client/createPerpsClient.js +6 -6
- package/dist/esm/client/createPerpsClient.js.map +1 -1
- package/dist/esm/client/types.d.ts +75 -48
- package/dist/esm/client/types.d.ts.map +1 -1
- package/dist/esm/client/types.js +11 -1
- package/dist/esm/client/types.js.map +1 -1
- package/dist/esm/errors/PerpsError.d.ts +2 -3
- package/dist/esm/errors/PerpsError.d.ts.map +1 -1
- package/dist/esm/errors/PerpsError.js +3 -15
- package/dist/esm/errors/PerpsError.js.map +1 -1
- package/dist/esm/errors/constants.d.ts +0 -10
- package/dist/esm/errors/constants.d.ts.map +1 -1
- package/dist/esm/errors/constants.js +0 -11
- package/dist/esm/errors/constants.js.map +1 -1
- package/dist/esm/index.d.ts +31 -32
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +22 -23
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/realtime/PerpsWsClient.d.ts +1 -0
- package/dist/esm/realtime/PerpsWsClient.d.ts.map +1 -1
- package/dist/esm/realtime/PerpsWsClient.js +30 -23
- package/dist/esm/realtime/PerpsWsClient.js.map +1 -1
- package/dist/esm/realtime/hyperliquid/HyperliquidWsProvider.d.ts +11 -5
- package/dist/esm/realtime/hyperliquid/HyperliquidWsProvider.d.ts.map +1 -1
- package/dist/esm/realtime/hyperliquid/HyperliquidWsProvider.js +174 -53
- package/dist/esm/realtime/hyperliquid/HyperliquidWsProvider.js.map +1 -1
- package/dist/esm/realtime/hyperliquid/types.d.ts +11 -9
- package/dist/esm/realtime/hyperliquid/types.d.ts.map +1 -1
- package/dist/esm/services/createAction.d.ts +11 -0
- package/dist/esm/services/createAction.d.ts.map +1 -0
- package/dist/esm/services/createAction.js +14 -0
- package/dist/esm/services/createAction.js.map +1 -0
- package/dist/esm/services/executeAction.d.ts +11 -0
- package/dist/esm/services/executeAction.d.ts.map +1 -0
- package/dist/esm/services/executeAction.js +14 -0
- package/dist/esm/services/executeAction.js.map +1 -0
- package/dist/esm/services/getAccount.d.ts +7 -7
- package/dist/esm/services/getAccount.d.ts.map +1 -1
- package/dist/esm/services/getAccount.js +6 -6
- package/dist/esm/services/getAccount.js.map +1 -1
- package/dist/esm/services/getActivity.d.ts +49 -0
- package/dist/esm/services/getActivity.d.ts.map +1 -0
- package/dist/esm/services/getActivity.js +47 -0
- package/dist/esm/services/getActivity.js.map +1 -0
- package/dist/esm/services/getAsset.d.ts +20 -0
- package/dist/esm/services/getAsset.d.ts.map +1 -0
- package/dist/esm/services/getAsset.js +18 -0
- package/dist/esm/services/getAsset.js.map +1 -0
- package/dist/esm/services/getAssets.d.ts +18 -0
- package/dist/esm/services/getAssets.d.ts.map +1 -0
- package/dist/esm/services/getAssets.js +18 -0
- package/dist/esm/services/getAssets.js.map +1 -0
- package/dist/{types/services/getHistory.d.ts → esm/services/getFills.d.ts} +17 -13
- package/dist/esm/services/getFills.d.ts.map +1 -0
- package/dist/esm/services/{getHistory.js → getFills.js} +13 -11
- package/dist/esm/services/getFills.js.map +1 -0
- package/dist/esm/services/getOhlcv.d.ts +4 -4
- package/dist/esm/services/getOhlcv.d.ts.map +1 -1
- package/dist/esm/services/getOhlcv.js +3 -3
- package/dist/esm/services/getOhlcv.js.map +1 -1
- package/dist/esm/services/getOrder.d.ts +4 -4
- package/dist/esm/services/getOrder.d.ts.map +1 -1
- package/dist/esm/services/getOrder.js +3 -3
- package/dist/esm/services/getOrder.js.map +1 -1
- package/dist/esm/services/getOrderbook.d.ts +4 -4
- package/dist/esm/services/getOrderbook.d.ts.map +1 -1
- package/dist/esm/services/getOrderbook.js +3 -3
- package/dist/esm/services/getOrderbook.js.map +1 -1
- package/dist/esm/services/getOrders.d.ts +27 -0
- package/dist/esm/services/getOrders.d.ts.map +1 -0
- package/dist/esm/services/getOrders.js +23 -0
- package/dist/esm/services/getOrders.js.map +1 -0
- package/dist/esm/services/getPositions.d.ts +27 -0
- package/dist/esm/services/getPositions.d.ts.map +1 -0
- package/dist/esm/services/getPositions.js +23 -0
- package/dist/esm/services/getPositions.js.map +1 -0
- package/dist/esm/services/getPrices.d.ts +5 -5
- package/dist/esm/services/getPrices.d.ts.map +1 -1
- package/dist/esm/services/getPrices.js +4 -4
- package/dist/esm/services/getPrices.js.map +1 -1
- package/dist/esm/services/getProviders.d.ts +20 -0
- package/dist/esm/services/getProviders.d.ts.map +1 -0
- package/dist/esm/services/getProviders.js +21 -0
- package/dist/esm/services/getProviders.js.map +1 -0
- package/dist/esm/utils/accountSummary.d.ts +13 -0
- package/dist/esm/utils/accountSummary.d.ts.map +1 -0
- package/dist/esm/utils/accountSummary.js +92 -0
- package/dist/esm/utils/accountSummary.js.map +1 -0
- package/dist/esm/utils/calculations.d.ts +109 -0
- package/dist/esm/utils/calculations.d.ts.map +1 -0
- package/dist/esm/utils/calculations.js +154 -0
- package/dist/esm/utils/calculations.js.map +1 -0
- package/dist/esm/utils/hyperliquid/index.d.ts +3 -0
- package/dist/esm/utils/hyperliquid/index.d.ts.map +1 -0
- package/dist/esm/utils/hyperliquid/index.js +3 -0
- package/dist/esm/utils/hyperliquid/index.js.map +1 -0
- package/dist/esm/utils/hyperliquid/liquidation.d.ts +46 -0
- package/dist/esm/utils/hyperliquid/liquidation.d.ts.map +1 -0
- package/dist/esm/utils/hyperliquid/liquidation.js +63 -0
- package/dist/esm/utils/hyperliquid/liquidation.js.map +1 -0
- package/dist/esm/utils/hyperliquid/orderFormatting.d.ts +44 -0
- package/dist/esm/utils/hyperliquid/orderFormatting.d.ts.map +1 -0
- package/dist/esm/utils/hyperliquid/orderFormatting.js +79 -0
- package/dist/esm/utils/hyperliquid/orderFormatting.js.map +1 -0
- package/dist/esm/utils/orderClassification.d.ts +29 -0
- package/dist/esm/utils/orderClassification.d.ts.map +1 -0
- package/dist/esm/utils/orderClassification.js +53 -0
- package/dist/esm/utils/orderClassification.js.map +1 -0
- package/dist/esm/utils/parse.d.ts +18 -0
- package/dist/esm/utils/parse.d.ts.map +1 -0
- package/dist/esm/utils/parse.js +28 -0
- package/dist/esm/utils/parse.js.map +1 -0
- package/dist/esm/utils/request.d.ts +1 -2
- package/dist/esm/utils/request.d.ts.map +1 -1
- package/dist/esm/utils/request.js +20 -7
- package/dist/esm/utils/request.js.map +1 -1
- package/dist/esm/utils/units.d.ts +20 -0
- package/dist/esm/utils/units.d.ts.map +1 -0
- package/dist/esm/utils/units.js +31 -0
- package/dist/esm/utils/units.js.map +1 -0
- package/dist/esm/utils/validation.d.ts +15 -0
- package/dist/esm/utils/validation.d.ts.map +1 -0
- package/dist/esm/utils/validation.js +26 -0
- package/dist/esm/utils/validation.js.map +1 -0
- 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/types/agent/AgentManager.d.ts +9 -9
- package/dist/types/agent/AgentManager.d.ts.map +1 -1
- package/dist/types/agent/storage.d.ts +1 -1
- package/dist/types/client/PerpsClient.d.ts +70 -189
- package/dist/types/client/PerpsClient.d.ts.map +1 -1
- package/dist/types/client/createPerpsClient.d.ts +30 -7
- package/dist/types/client/createPerpsClient.d.ts.map +1 -1
- package/dist/types/client/types.d.ts +75 -48
- package/dist/types/client/types.d.ts.map +1 -1
- package/dist/types/errors/PerpsError.d.ts +2 -3
- package/dist/types/errors/PerpsError.d.ts.map +1 -1
- package/dist/types/errors/constants.d.ts +0 -10
- package/dist/types/errors/constants.d.ts.map +1 -1
- package/dist/types/index.d.ts +31 -32
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/realtime/PerpsWsClient.d.ts +1 -0
- package/dist/types/realtime/PerpsWsClient.d.ts.map +1 -1
- package/dist/types/realtime/hyperliquid/HyperliquidWsProvider.d.ts +11 -5
- package/dist/types/realtime/hyperliquid/HyperliquidWsProvider.d.ts.map +1 -1
- package/dist/types/realtime/hyperliquid/types.d.ts +11 -9
- package/dist/types/realtime/hyperliquid/types.d.ts.map +1 -1
- package/dist/types/services/createAction.d.ts +11 -0
- package/dist/types/services/createAction.d.ts.map +1 -0
- package/dist/types/services/executeAction.d.ts +11 -0
- package/dist/types/services/executeAction.d.ts.map +1 -0
- package/dist/types/services/getAccount.d.ts +7 -7
- package/dist/types/services/getAccount.d.ts.map +1 -1
- package/dist/types/services/getActivity.d.ts +49 -0
- package/dist/types/services/getActivity.d.ts.map +1 -0
- package/dist/types/services/getAsset.d.ts +20 -0
- package/dist/types/services/getAsset.d.ts.map +1 -0
- package/dist/types/services/getAssets.d.ts +18 -0
- package/dist/types/services/getAssets.d.ts.map +1 -0
- package/dist/{esm/services/getHistory.d.ts → types/services/getFills.d.ts} +17 -13
- package/dist/types/services/getFills.d.ts.map +1 -0
- package/dist/types/services/getOhlcv.d.ts +4 -4
- package/dist/types/services/getOhlcv.d.ts.map +1 -1
- package/dist/types/services/getOrder.d.ts +4 -4
- package/dist/types/services/getOrder.d.ts.map +1 -1
- package/dist/types/services/getOrderbook.d.ts +4 -4
- package/dist/types/services/getOrderbook.d.ts.map +1 -1
- package/dist/types/services/getOrders.d.ts +27 -0
- package/dist/types/services/getOrders.d.ts.map +1 -0
- package/dist/types/services/getPositions.d.ts +27 -0
- package/dist/types/services/getPositions.d.ts.map +1 -0
- package/dist/types/services/getPrices.d.ts +5 -5
- package/dist/types/services/getPrices.d.ts.map +1 -1
- package/dist/types/services/getProviders.d.ts +20 -0
- package/dist/types/services/getProviders.d.ts.map +1 -0
- package/dist/types/utils/accountSummary.d.ts +13 -0
- package/dist/types/utils/accountSummary.d.ts.map +1 -0
- package/dist/types/utils/calculations.d.ts +109 -0
- package/dist/types/utils/calculations.d.ts.map +1 -0
- package/dist/types/utils/hyperliquid/index.d.ts +3 -0
- package/dist/types/utils/hyperliquid/index.d.ts.map +1 -0
- package/dist/types/utils/hyperliquid/liquidation.d.ts +46 -0
- package/dist/types/utils/hyperliquid/liquidation.d.ts.map +1 -0
- package/dist/types/utils/hyperliquid/orderFormatting.d.ts +44 -0
- package/dist/types/utils/hyperliquid/orderFormatting.d.ts.map +1 -0
- package/dist/types/utils/orderClassification.d.ts +29 -0
- package/dist/types/utils/orderClassification.d.ts.map +1 -0
- package/dist/types/utils/parse.d.ts +18 -0
- package/dist/types/utils/parse.d.ts.map +1 -0
- package/dist/types/utils/request.d.ts +1 -2
- package/dist/types/utils/request.d.ts.map +1 -1
- package/dist/types/utils/units.d.ts +20 -0
- package/dist/types/utils/units.d.ts.map +1 -0
- package/dist/types/utils/validation.d.ts +15 -0
- package/dist/types/utils/validation.d.ts.map +1 -0
- package/dist/types/version.d.ts +1 -1
- package/dist/types/version.d.ts.map +1 -1
- package/package.json +8 -4
- package/src/agent/AgentManager.ts +21 -19
- package/src/agent/storage.ts +1 -1
- package/src/client/PerpsClient.ts +569 -446
- package/src/client/createPerpsClient.ts +36 -11
- package/src/client/types.ts +84 -51
- package/src/errors/PerpsError.ts +3 -22
- package/src/errors/constants.ts +0 -11
- package/src/index.ts +70 -47
- package/src/realtime/PerpsWsClient.ts +47 -31
- package/src/realtime/hyperliquid/HyperliquidWsProvider.ts +203 -64
- package/src/realtime/hyperliquid/types.ts +8 -10
- package/src/services/createAction.ts +41 -0
- package/src/services/executeAction.ts +41 -0
- package/src/services/getAccount.ts +8 -8
- package/src/services/getActivity.ts +77 -0
- package/src/services/getAsset.ts +34 -0
- package/src/services/getAssets.ts +32 -0
- package/src/services/{getHistory.ts → getFills.ts} +23 -17
- package/src/services/getOhlcv.ts +5 -5
- package/src/services/getOrder.ts +5 -5
- package/src/services/getOrderbook.ts +5 -5
- package/src/services/getOrders.ts +45 -0
- package/src/services/getPositions.ts +45 -0
- package/src/services/getPrices.ts +6 -6
- package/src/services/{getDexes.ts → getProviders.ts} +10 -10
- package/src/utils/accountSummary.ts +124 -0
- package/src/utils/calculations.ts +209 -0
- package/src/utils/hyperliquid/index.ts +9 -0
- package/src/utils/hyperliquid/liquidation.ts +71 -0
- package/src/utils/hyperliquid/orderFormatting.ts +96 -0
- package/src/utils/orderClassification.ts +64 -0
- package/src/utils/parse.ts +28 -0
- package/src/utils/request.ts +22 -7
- package/src/utils/units.ts +32 -0
- package/src/utils/validation.ts +35 -0
- package/src/version.ts +1 -1
- package/dist/cjs/dex/hyperliquid.d.ts +0 -3
- package/dist/cjs/dex/hyperliquid.d.ts.map +0 -1
- package/dist/cjs/dex/hyperliquid.js +0 -21
- package/dist/cjs/dex/hyperliquid.js.map +0 -1
- package/dist/cjs/dex/registry.d.ts +0 -3
- package/dist/cjs/dex/registry.d.ts.map +0 -1
- package/dist/cjs/dex/registry.js +0 -16
- package/dist/cjs/dex/registry.js.map +0 -1
- package/dist/cjs/dex/types.d.ts +0 -13
- package/dist/cjs/dex/types.d.ts.map +0 -1
- package/dist/cjs/dex/types.js +0 -3
- package/dist/cjs/dex/types.js.map +0 -1
- package/dist/cjs/errors/AgentError.d.ts +0 -10
- package/dist/cjs/errors/AgentError.d.ts.map +0 -1
- package/dist/cjs/errors/AgentError.js +0 -23
- package/dist/cjs/errors/AgentError.js.map +0 -1
- package/dist/cjs/errors/HTTPError.d.ts +0 -11
- package/dist/cjs/errors/HTTPError.d.ts.map +0 -1
- package/dist/cjs/errors/HTTPError.js +0 -62
- package/dist/cjs/errors/HTTPError.js.map +0 -1
- package/dist/cjs/errors/PerpsSDKError.d.ts +0 -9
- package/dist/cjs/errors/PerpsSDKError.d.ts.map +0 -1
- package/dist/cjs/errors/PerpsSDKError.js +0 -36
- package/dist/cjs/errors/PerpsSDKError.js.map +0 -1
- package/dist/cjs/errors/ServerError.d.ts +0 -10
- package/dist/cjs/errors/ServerError.d.ts.map +0 -1
- package/dist/cjs/errors/ServerError.js +0 -24
- package/dist/cjs/errors/ServerError.js.map +0 -1
- package/dist/cjs/errors/ValidationError.d.ts +0 -9
- package/dist/cjs/errors/ValidationError.d.ts.map +0 -1
- package/dist/cjs/errors/ValidationError.js +0 -23
- package/dist/cjs/errors/ValidationError.js.map +0 -1
- package/dist/cjs/errors/utils/rootCause.d.ts +0 -6
- package/dist/cjs/errors/utils/rootCause.d.ts.map +0 -1
- package/dist/cjs/errors/utils/rootCause.js +0 -41
- package/dist/cjs/errors/utils/rootCause.js.map +0 -1
- package/dist/cjs/services/cancelOrder.d.ts +0 -10
- package/dist/cjs/services/cancelOrder.d.ts.map +0 -1
- package/dist/cjs/services/cancelOrder.js +0 -16
- package/dist/cjs/services/cancelOrder.js.map +0 -1
- package/dist/cjs/services/createAuthorization.d.ts +0 -10
- package/dist/cjs/services/createAuthorization.d.ts.map +0 -1
- package/dist/cjs/services/createAuthorization.js +0 -16
- package/dist/cjs/services/createAuthorization.js.map +0 -1
- package/dist/cjs/services/createOrder.d.ts +0 -21
- package/dist/cjs/services/createOrder.d.ts.map +0 -1
- package/dist/cjs/services/createOrder.js +0 -27
- package/dist/cjs/services/createOrder.js.map +0 -1
- package/dist/cjs/services/createWithdrawal.d.ts +0 -9
- package/dist/cjs/services/createWithdrawal.d.ts.map +0 -1
- package/dist/cjs/services/createWithdrawal.js +0 -15
- package/dist/cjs/services/createWithdrawal.js.map +0 -1
- package/dist/cjs/services/getDexes.d.ts +0 -4
- package/dist/cjs/services/getDexes.d.ts.map +0 -1
- package/dist/cjs/services/getDexes.js.map +0 -1
- package/dist/cjs/services/getHistory.d.ts +0 -10
- package/dist/cjs/services/getHistory.d.ts.map +0 -1
- package/dist/cjs/services/getHistory.js.map +0 -1
- package/dist/cjs/services/getMarket.d.ts +0 -8
- package/dist/cjs/services/getMarket.d.ts.map +0 -1
- package/dist/cjs/services/getMarket.js.map +0 -1
- package/dist/cjs/services/getMarkets.d.ts +0 -7
- package/dist/cjs/services/getMarkets.d.ts.map +0 -1
- package/dist/cjs/services/getMarkets.js.map +0 -1
- package/dist/cjs/services/submitAuthorization.d.ts +0 -10
- package/dist/cjs/services/submitAuthorization.d.ts.map +0 -1
- package/dist/cjs/services/submitAuthorization.js.map +0 -1
- package/dist/cjs/services/submitOrder.d.ts +0 -10
- package/dist/cjs/services/submitOrder.d.ts.map +0 -1
- package/dist/cjs/services/submitOrder.js.map +0 -1
- package/dist/cjs/services/submitWithdrawal.d.ts +0 -9
- package/dist/cjs/services/submitWithdrawal.d.ts.map +0 -1
- package/dist/cjs/services/submitWithdrawal.js +0 -15
- package/dist/cjs/services/submitWithdrawal.js.map +0 -1
- package/dist/esm/dex/hyperliquid.d.ts +0 -3
- package/dist/esm/dex/hyperliquid.d.ts.map +0 -1
- package/dist/esm/dex/hyperliquid.js +0 -19
- package/dist/esm/dex/hyperliquid.js.map +0 -1
- package/dist/esm/dex/registry.d.ts +0 -3
- package/dist/esm/dex/registry.d.ts.map +0 -1
- package/dist/esm/dex/registry.js +0 -13
- package/dist/esm/dex/registry.js.map +0 -1
- package/dist/esm/dex/types.d.ts +0 -15
- package/dist/esm/dex/types.d.ts.map +0 -1
- package/dist/esm/dex/types.js +0 -2
- package/dist/esm/dex/types.js.map +0 -1
- package/dist/esm/errors/AgentError.d.ts +0 -25
- package/dist/esm/errors/AgentError.d.ts.map +0 -1
- package/dist/esm/errors/AgentError.js +0 -35
- package/dist/esm/errors/AgentError.js.map +0 -1
- package/dist/esm/errors/HTTPError.d.ts +0 -11
- package/dist/esm/errors/HTTPError.d.ts.map +0 -1
- package/dist/esm/errors/HTTPError.js +0 -61
- package/dist/esm/errors/HTTPError.js.map +0 -1
- package/dist/esm/errors/PerpsSDKError.d.ts +0 -40
- package/dist/esm/errors/PerpsSDKError.d.ts.map +0 -1
- package/dist/esm/errors/PerpsSDKError.js +0 -67
- package/dist/esm/errors/PerpsSDKError.js.map +0 -1
- package/dist/esm/errors/ServerError.d.ts +0 -23
- package/dist/esm/errors/ServerError.d.ts.map +0 -1
- package/dist/esm/errors/ServerError.js +0 -34
- package/dist/esm/errors/ServerError.js.map +0 -1
- package/dist/esm/errors/ValidationError.d.ts +0 -23
- package/dist/esm/errors/ValidationError.d.ts.map +0 -1
- package/dist/esm/errors/ValidationError.js +0 -34
- package/dist/esm/errors/ValidationError.js.map +0 -1
- package/dist/esm/errors/utils/rootCause.d.ts +0 -71
- package/dist/esm/errors/utils/rootCause.d.ts.map +0 -1
- package/dist/esm/errors/utils/rootCause.js +0 -99
- package/dist/esm/errors/utils/rootCause.js.map +0 -1
- package/dist/esm/services/cancelOrder.d.ts +0 -51
- package/dist/esm/services/cancelOrder.d.ts.map +0 -1
- package/dist/esm/services/cancelOrder.js +0 -50
- package/dist/esm/services/cancelOrder.js.map +0 -1
- package/dist/esm/services/createAuthorization.d.ts +0 -51
- package/dist/esm/services/createAuthorization.d.ts.map +0 -1
- package/dist/esm/services/createAuthorization.js +0 -50
- package/dist/esm/services/createAuthorization.js.map +0 -1
- package/dist/esm/services/createOrder.d.ts +0 -74
- package/dist/esm/services/createOrder.d.ts.map +0 -1
- package/dist/esm/services/createOrder.js +0 -62
- package/dist/esm/services/createOrder.js.map +0 -1
- package/dist/esm/services/createWithdrawal.d.ts +0 -49
- package/dist/esm/services/createWithdrawal.d.ts.map +0 -1
- package/dist/esm/services/createWithdrawal.js +0 -49
- package/dist/esm/services/createWithdrawal.js.map +0 -1
- package/dist/esm/services/getDexes.d.ts +0 -20
- package/dist/esm/services/getDexes.d.ts.map +0 -1
- package/dist/esm/services/getDexes.js +0 -21
- package/dist/esm/services/getDexes.js.map +0 -1
- package/dist/esm/services/getHistory.d.ts.map +0 -1
- package/dist/esm/services/getHistory.js.map +0 -1
- package/dist/esm/services/getMarket.d.ts +0 -27
- package/dist/esm/services/getMarket.d.ts.map +0 -1
- package/dist/esm/services/getMarket.js +0 -25
- package/dist/esm/services/getMarket.js.map +0 -1
- package/dist/esm/services/getMarkets.d.ts +0 -25
- package/dist/esm/services/getMarkets.d.ts.map +0 -1
- package/dist/esm/services/getMarkets.js +0 -23
- package/dist/esm/services/getMarkets.js.map +0 -1
- package/dist/esm/services/submitAuthorization.d.ts +0 -42
- package/dist/esm/services/submitAuthorization.d.ts.map +0 -1
- package/dist/esm/services/submitAuthorization.js +0 -41
- package/dist/esm/services/submitAuthorization.js.map +0 -1
- package/dist/esm/services/submitOrder.d.ts +0 -44
- package/dist/esm/services/submitOrder.d.ts.map +0 -1
- package/dist/esm/services/submitOrder.js +0 -43
- package/dist/esm/services/submitOrder.js.map +0 -1
- package/dist/esm/services/submitWithdrawal.d.ts +0 -40
- package/dist/esm/services/submitWithdrawal.d.ts.map +0 -1
- package/dist/esm/services/submitWithdrawal.js +0 -40
- package/dist/esm/services/submitWithdrawal.js.map +0 -1
- package/dist/types/dex/hyperliquid.d.ts +0 -3
- package/dist/types/dex/hyperliquid.d.ts.map +0 -1
- package/dist/types/dex/registry.d.ts +0 -3
- package/dist/types/dex/registry.d.ts.map +0 -1
- package/dist/types/dex/types.d.ts +0 -15
- package/dist/types/dex/types.d.ts.map +0 -1
- package/dist/types/errors/AgentError.d.ts +0 -25
- package/dist/types/errors/AgentError.d.ts.map +0 -1
- package/dist/types/errors/HTTPError.d.ts +0 -11
- package/dist/types/errors/HTTPError.d.ts.map +0 -1
- package/dist/types/errors/PerpsSDKError.d.ts +0 -40
- package/dist/types/errors/PerpsSDKError.d.ts.map +0 -1
- package/dist/types/errors/ServerError.d.ts +0 -23
- package/dist/types/errors/ServerError.d.ts.map +0 -1
- package/dist/types/errors/ValidationError.d.ts +0 -23
- package/dist/types/errors/ValidationError.d.ts.map +0 -1
- package/dist/types/errors/utils/rootCause.d.ts +0 -71
- package/dist/types/errors/utils/rootCause.d.ts.map +0 -1
- package/dist/types/services/cancelOrder.d.ts +0 -51
- package/dist/types/services/cancelOrder.d.ts.map +0 -1
- package/dist/types/services/createAuthorization.d.ts +0 -51
- package/dist/types/services/createAuthorization.d.ts.map +0 -1
- package/dist/types/services/createOrder.d.ts +0 -74
- package/dist/types/services/createOrder.d.ts.map +0 -1
- package/dist/types/services/createWithdrawal.d.ts +0 -49
- package/dist/types/services/createWithdrawal.d.ts.map +0 -1
- package/dist/types/services/getDexes.d.ts +0 -20
- package/dist/types/services/getDexes.d.ts.map +0 -1
- package/dist/types/services/getHistory.d.ts.map +0 -1
- package/dist/types/services/getMarket.d.ts +0 -27
- package/dist/types/services/getMarket.d.ts.map +0 -1
- package/dist/types/services/getMarkets.d.ts +0 -25
- package/dist/types/services/getMarkets.d.ts.map +0 -1
- package/dist/types/services/submitAuthorization.d.ts +0 -42
- package/dist/types/services/submitAuthorization.d.ts.map +0 -1
- package/dist/types/services/submitOrder.d.ts +0 -44
- package/dist/types/services/submitOrder.d.ts.map +0 -1
- package/dist/types/services/submitWithdrawal.d.ts +0 -40
- package/dist/types/services/submitWithdrawal.d.ts.map +0 -1
- package/src/dex/hyperliquid.ts +0 -20
- package/src/dex/registry.ts +0 -15
- package/src/dex/types.ts +0 -16
- package/src/errors/AgentError.ts +0 -43
- package/src/errors/HTTPError.ts +0 -72
- package/src/errors/PerpsSDKError.ts +0 -79
- package/src/errors/ServerError.ts +0 -41
- package/src/errors/ValidationError.ts +0 -38
- package/src/errors/utils/rootCause.ts +0 -112
- package/src/services/cancelOrder.ts +0 -75
- package/src/services/createAuthorization.ts +0 -79
- package/src/services/createOrder.ts +0 -116
- package/src/services/createWithdrawal.ts +0 -76
- package/src/services/getMarket.ts +0 -41
- package/src/services/getMarkets.ts +0 -37
- package/src/services/submitAuthorization.ts +0 -70
- package/src/services/submitOrder.ts +0 -72
- package/src/services/submitWithdrawal.ts +0 -67
|
@@ -1,572 +1,695 @@
|
|
|
1
1
|
import type {
|
|
2
|
+
ActionDescriptor,
|
|
3
|
+
ActionParamsMap,
|
|
4
|
+
ActionStep,
|
|
2
5
|
Address,
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
OrderActionType,
|
|
9
|
-
SignedAuthorization,
|
|
10
|
-
SignedOrderAction,
|
|
11
|
-
SubmitOrderResponse,
|
|
12
|
-
SubmitWithdrawalResponse,
|
|
6
|
+
AssetIdentity,
|
|
7
|
+
CreateActionResponse,
|
|
8
|
+
ExecuteActionResponse,
|
|
9
|
+
Provider,
|
|
10
|
+
SignedActionStep,
|
|
13
11
|
} from '@lifi/perps-types'
|
|
14
|
-
import { PerpsErrorCode } from '@lifi/perps-types'
|
|
15
|
-
import {
|
|
12
|
+
import { ActionType, PerpsErrorCode, PerpsSigner } from '@lifi/perps-types'
|
|
13
|
+
import { localStorageAdapter } from '../agent/storage.js'
|
|
14
|
+
import type { StorageAdapter } from '../agent/types.js'
|
|
16
15
|
import { PerpsErrorMessage } from '../errors/constants.js'
|
|
17
16
|
import { PerpsError } from '../errors/PerpsError.js'
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import { createWithdrawal } from '../services/createWithdrawal.js'
|
|
22
|
-
import type { SubmitAuthorizationParams } from '../services/submitAuthorization.js'
|
|
23
|
-
import { submitAuthorization } from '../services/submitAuthorization.js'
|
|
24
|
-
import type { SubmitOrderParams } from '../services/submitOrder.js'
|
|
25
|
-
import { submitOrder } from '../services/submitOrder.js'
|
|
26
|
-
import type { SubmitWithdrawalParams } from '../services/submitWithdrawal.js'
|
|
27
|
-
import { submitWithdrawal } from '../services/submitWithdrawal.js'
|
|
17
|
+
import { createAction } from '../services/createAction.js'
|
|
18
|
+
import { executeAction } from '../services/executeAction.js'
|
|
19
|
+
import { getProviders } from '../services/getProviders.js'
|
|
28
20
|
import { signTypedData } from '../utils/signTypedData.js'
|
|
29
21
|
import { createPerpsClient, type PerpsSDKClient } from './createPerpsClient.js'
|
|
30
|
-
import
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
22
|
+
import {
|
|
23
|
+
type BuildWithdrawalParams,
|
|
24
|
+
type CancelOrdersParams,
|
|
25
|
+
type CheckPrerequisitesParams,
|
|
26
|
+
type ExecutePrerequisitesParams,
|
|
27
|
+
type ExecutePrerequisitesResult,
|
|
28
|
+
type GetPrerequisitesParams,
|
|
29
|
+
type ModifyOrdersParams,
|
|
30
|
+
type PerpsClientOptions,
|
|
31
|
+
type PlaceOrderParams,
|
|
32
|
+
type PlaceTriggerOrderParams,
|
|
33
|
+
type PrerequisitesResult,
|
|
40
34
|
SigningMode,
|
|
41
35
|
} from './types.js'
|
|
42
36
|
|
|
43
|
-
/**
|
|
44
|
-
* Stateful client for managing signing modes and trading operations.
|
|
45
|
-
*
|
|
46
|
-
* The PerpsClient provides two signing modes:
|
|
47
|
-
* - `USER`: User wallet signs each action (wallet popup per action)
|
|
48
|
-
* - `USER_AGENT`: SDK-generated agent signs actions (no popups after setup)
|
|
49
|
-
*
|
|
50
|
-
* In `USER_AGENT` mode, the client:
|
|
51
|
-
* - Generates an agent keypair stored in localStorage (or custom storage)
|
|
52
|
-
* - Auto-injects agent address into authorization requests
|
|
53
|
-
* - Auto-signs trading actions with the agent key
|
|
54
|
-
*
|
|
55
|
-
* @remarks
|
|
56
|
-
* The example below uses Hyperliquid. Authorization keys and parameters are DEX-specific.
|
|
57
|
-
*
|
|
58
|
-
* @example
|
|
59
|
-
* ```ts
|
|
60
|
-
* const perps = new PerpsClient({ integrator: 'my-app' })
|
|
61
|
-
*
|
|
62
|
-
* // Set up agent signing for a user + DEX pair
|
|
63
|
-
* await perps.setSigningMode(userAddress, 'hyperliquid', 'USER_AGENT')
|
|
64
|
-
*
|
|
65
|
-
* // Check and execute required authorizations
|
|
66
|
-
* const required = await perps.getRequiredAuthorizations({
|
|
67
|
-
* dex: 'hyperliquid',
|
|
68
|
-
* address: userAddress,
|
|
69
|
-
* })
|
|
70
|
-
*
|
|
71
|
-
* // ... sign actions with user wallet ...
|
|
72
|
-
*
|
|
73
|
-
* // Place orders (agent signs automatically)
|
|
74
|
-
* const result = await perps.placeOrder({
|
|
75
|
-
* address: userAddress,
|
|
76
|
-
* dex: 'hyperliquid',
|
|
77
|
-
* symbol: 'BTC',
|
|
78
|
-
* side: 'BUY',
|
|
79
|
-
* type: 'MARKET',
|
|
80
|
-
* size: '0.1',
|
|
81
|
-
* price: '95000.00'
|
|
82
|
-
* })
|
|
83
|
-
* ```
|
|
84
|
-
*/
|
|
85
37
|
export class PerpsClient {
|
|
86
38
|
private sdkClient: PerpsSDKClient
|
|
39
|
+
private storage: StorageAdapter
|
|
87
40
|
private signingModes: Map<string, SigningMode> = new Map()
|
|
41
|
+
private providerMetadataCache: Map<string, Provider> = new Map()
|
|
88
42
|
|
|
89
43
|
constructor(options: PerpsClientOptions) {
|
|
44
|
+
this.storage = options.storage ?? localStorageAdapter
|
|
90
45
|
this.sdkClient = createPerpsClient({
|
|
91
46
|
integrator: options.integrator,
|
|
92
47
|
apiKey: options.apiKey,
|
|
93
48
|
apiUrl: options.apiUrl,
|
|
94
|
-
storage:
|
|
49
|
+
storage: this.storage,
|
|
50
|
+
providers: options.providers,
|
|
95
51
|
})
|
|
96
52
|
}
|
|
97
53
|
|
|
98
|
-
/**
|
|
99
|
-
* Get the underlying SDK client for use with service functions.
|
|
100
|
-
*/
|
|
101
54
|
get client(): PerpsSDKClient {
|
|
102
55
|
return this.sdkClient
|
|
103
56
|
}
|
|
104
57
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
*/
|
|
108
|
-
private modeKey(address: Address, dex: string): string {
|
|
109
|
-
return `${address.toLowerCase()}:${dex.toLowerCase()}`
|
|
58
|
+
private modeKey(address: Address, provider: string): string {
|
|
59
|
+
return `${address.toLowerCase()}:${provider.toLowerCase()}`
|
|
110
60
|
}
|
|
111
61
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
* In `USER_AGENT` mode, generates an agent keypair if one doesn't exist.
|
|
116
|
-
*
|
|
117
|
-
* @param address - User wallet address
|
|
118
|
-
* @param dex - DEX identifier
|
|
119
|
-
* @param mode - Signing mode to set
|
|
120
|
-
*/
|
|
121
|
-
async setSigningMode(
|
|
122
|
-
address: Address,
|
|
123
|
-
dex: string,
|
|
124
|
-
mode: SigningMode
|
|
125
|
-
): Promise<void> {
|
|
126
|
-
const key = this.modeKey(address, dex)
|
|
127
|
-
this.signingModes.set(key, mode)
|
|
62
|
+
private signingModeStorageKey(address: Address, provider: string): string {
|
|
63
|
+
return `lifi-perps-mode:${address.toLowerCase()}:${provider.toLowerCase()}`
|
|
64
|
+
}
|
|
128
65
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
66
|
+
private async getProviderMetadata(provider: string): Promise<Provider> {
|
|
67
|
+
const cached = this.providerMetadataCache.get(provider)
|
|
68
|
+
if (cached) {
|
|
69
|
+
return cached
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const { providers } = await getProviders(this.sdkClient)
|
|
73
|
+
for (const d of providers) {
|
|
74
|
+
this.providerMetadataCache.set(d.key, d)
|
|
132
75
|
}
|
|
133
|
-
}
|
|
134
76
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
77
|
+
const metadata = this.providerMetadataCache.get(provider)
|
|
78
|
+
if (!metadata) {
|
|
79
|
+
const error = new PerpsError(
|
|
80
|
+
PerpsErrorCode.SDKError,
|
|
81
|
+
`Unsupported provider: ${provider}`
|
|
82
|
+
)
|
|
83
|
+
error.tool = '@lifi/perps-sdk'
|
|
84
|
+
throw error
|
|
85
|
+
}
|
|
86
|
+
return metadata
|
|
141
87
|
}
|
|
142
88
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
89
|
+
private buildPrerequisiteInputs(
|
|
90
|
+
prerequisites: ActionDescriptor[],
|
|
91
|
+
mode: SigningMode,
|
|
92
|
+
agentAddress?: Address
|
|
93
|
+
): Array<{ key: string; params?: Record<string, unknown> }> {
|
|
94
|
+
return prerequisites
|
|
95
|
+
.filter((p) => {
|
|
96
|
+
if (mode === SigningMode.USER) {
|
|
97
|
+
if (!p.signers.includes(PerpsSigner.USER)) {
|
|
98
|
+
return false
|
|
99
|
+
}
|
|
100
|
+
if (p.type === ActionType.APPROVE_AGENT) {
|
|
101
|
+
return false
|
|
102
|
+
}
|
|
103
|
+
return true
|
|
104
|
+
}
|
|
105
|
+
if (
|
|
106
|
+
p.signers.includes(PerpsSigner.USER) &&
|
|
107
|
+
!p.signers.includes(PerpsSigner.AGENT) &&
|
|
108
|
+
p.type === ActionType.USER_SET_ABSTRACTION
|
|
109
|
+
) {
|
|
110
|
+
return false
|
|
111
|
+
}
|
|
112
|
+
return true
|
|
113
|
+
})
|
|
114
|
+
.map((p) => {
|
|
115
|
+
const params: Record<string, unknown> = {}
|
|
116
|
+
if (p.type === ActionType.APPROVE_AGENT && agentAddress) {
|
|
117
|
+
params.agentAddress = agentAddress
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
key: p.type,
|
|
121
|
+
...(Object.keys(params).length > 0 ? { params } : {}),
|
|
122
|
+
}
|
|
123
|
+
})
|
|
151
124
|
}
|
|
152
125
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
* Also resets signing mode to USER.
|
|
163
|
-
*/
|
|
164
|
-
async removeAgent(address: Address, dex: string): Promise<void> {
|
|
165
|
-
await this.sdkClient.agentManager.removeAgent(address, dex)
|
|
166
|
-
this.signingModes.delete(this.modeKey(address, dex))
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* Build authorization payloads for signing.
|
|
171
|
-
*
|
|
172
|
-
* In `USER` mode, `signerAddress` is omitted (backend defaults to `address`).
|
|
173
|
-
* In `USER_AGENT` mode, auto-injects the agent address as `signerAddress`.
|
|
174
|
-
*
|
|
175
|
-
* @param params - Authorization parameters
|
|
176
|
-
* @returns Authorization actions with typed data for signing
|
|
177
|
-
*/
|
|
178
|
-
async buildAuthorization(
|
|
179
|
-
params: BuildAuthorizationParams
|
|
180
|
-
): Promise<CreateAuthorizationResponse> {
|
|
181
|
-
const mode = this.getSigningMode(params.address, params.dex)
|
|
182
|
-
let { signerAddress } = params
|
|
126
|
+
private async resolveSignerForAction(
|
|
127
|
+
action: ActionType,
|
|
128
|
+
address: Address,
|
|
129
|
+
provider: string
|
|
130
|
+
): Promise<Address | undefined> {
|
|
131
|
+
const mode = await this.loadSigningMode(address, provider)
|
|
132
|
+
if (mode !== SigningMode.USER_AGENT) {
|
|
133
|
+
return undefined
|
|
134
|
+
}
|
|
183
135
|
|
|
184
|
-
if
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
136
|
+
// Check if this action supports agent signing
|
|
137
|
+
const metadata = await this.getProviderMetadata(provider)
|
|
138
|
+
const allActions = [...metadata.prepareAccountActions, ...metadata.actions]
|
|
139
|
+
const descriptor = allActions.find((d) => d.type === action)
|
|
140
|
+
if (!descriptor?.signers.includes(PerpsSigner.AGENT)) {
|
|
141
|
+
return undefined
|
|
190
142
|
}
|
|
191
143
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
signerAddress,
|
|
195
|
-
})
|
|
144
|
+
const agent = await this.sdkClient.agentManager.getAgent(address, provider)
|
|
145
|
+
return agent.address
|
|
196
146
|
}
|
|
197
147
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
* @param params - Signed authorization parameters
|
|
205
|
-
*/
|
|
206
|
-
async submitAuthorizations(
|
|
207
|
-
params: SubmitAuthorizationParams
|
|
208
|
-
): Promise<AuthorizationsResponse> {
|
|
209
|
-
const mode = this.getSigningMode(params.address, params.dex)
|
|
210
|
-
let { signerAddress } = params
|
|
211
|
-
|
|
212
|
-
if (mode === 'USER_AGENT') {
|
|
213
|
-
const agent = await this.sdkClient.agentManager.getAgent(
|
|
214
|
-
params.address,
|
|
215
|
-
params.dex
|
|
148
|
+
private requireAgentMode(address: Address, provider: string, method: string) {
|
|
149
|
+
const mode = this.getSigningMode(address, provider)
|
|
150
|
+
if (mode !== SigningMode.USER_AGENT) {
|
|
151
|
+
const error = new PerpsError(
|
|
152
|
+
PerpsErrorCode.SDKError,
|
|
153
|
+
`${PerpsErrorMessage.InvalidSigningMode} ${method} requires USER_AGENT mode.`
|
|
216
154
|
)
|
|
217
|
-
|
|
155
|
+
error.tool = '@lifi/perps-sdk'
|
|
156
|
+
throw error
|
|
218
157
|
}
|
|
219
|
-
|
|
220
|
-
return submitAuthorization(this.sdkClient, { ...params, signerAddress })
|
|
221
158
|
}
|
|
222
159
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
* @returns Order actions with typed data for signing
|
|
231
|
-
*/
|
|
232
|
-
async buildOrder(params: PlaceOrderParams): Promise<CreateOrderResponse> {
|
|
233
|
-
const mode = this.getSigningMode(params.address, params.dex)
|
|
234
|
-
let signerAddress: Address | undefined
|
|
160
|
+
private async autoSignAndExecute(
|
|
161
|
+
provider: string,
|
|
162
|
+
address: Address,
|
|
163
|
+
action: ActionType,
|
|
164
|
+
actions: ActionStep[]
|
|
165
|
+
): Promise<ExecuteActionResponse> {
|
|
166
|
+
const agent = await this.sdkClient.agentManager.getAgent(address, provider)
|
|
235
167
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
168
|
+
const signedActions: SignedActionStep[] = await Promise.all(
|
|
169
|
+
actions.map(async (a) => ({
|
|
170
|
+
action: a.action,
|
|
171
|
+
typedData: a.typedData,
|
|
172
|
+
signature: await signTypedData(agent.privateKey, a.typedData),
|
|
173
|
+
}))
|
|
174
|
+
)
|
|
243
175
|
|
|
244
|
-
return
|
|
245
|
-
|
|
246
|
-
address
|
|
247
|
-
signerAddress,
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
side: params.side,
|
|
251
|
-
type: params.type,
|
|
252
|
-
size: params.size,
|
|
253
|
-
price: params.price,
|
|
254
|
-
leverage: params.leverage,
|
|
255
|
-
reduceOnly: params.reduceOnly,
|
|
256
|
-
timeInForce: params.timeInForce,
|
|
257
|
-
expiresAt: params.expiresAt,
|
|
258
|
-
takeProfit: params.takeProfit,
|
|
259
|
-
stopLoss: params.stopLoss,
|
|
176
|
+
return executeAction(this.sdkClient, {
|
|
177
|
+
provider,
|
|
178
|
+
address,
|
|
179
|
+
signerAddress: agent.address,
|
|
180
|
+
action,
|
|
181
|
+
actions: signedActions,
|
|
260
182
|
})
|
|
261
183
|
}
|
|
262
184
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
* In `USER` mode, `signerAddress` is omitted (backend defaults to `address`).
|
|
267
|
-
* In `USER_AGENT` mode, auto-injects the agent address as `signerAddress`.
|
|
268
|
-
*
|
|
269
|
-
* @param params - Cancel parameters
|
|
270
|
-
* @returns Cancel actions with typed data for signing
|
|
271
|
-
*/
|
|
272
|
-
async buildCancelOrder(
|
|
273
|
-
params: CancelOrdersParams
|
|
274
|
-
): Promise<CancelOrderPayloadResponse> {
|
|
275
|
-
const mode = this.getSigningMode(params.address, params.dex)
|
|
276
|
-
let signerAddress: Address | undefined
|
|
185
|
+
// ---------------------------------------------------------------------------
|
|
186
|
+
// Generic action helpers
|
|
187
|
+
// ---------------------------------------------------------------------------
|
|
277
188
|
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
189
|
+
async buildAction<T extends ActionType>(
|
|
190
|
+
action: T,
|
|
191
|
+
params: { provider: string; address: Address; params: ActionParamsMap[T] }
|
|
192
|
+
): Promise<CreateActionResponse> {
|
|
193
|
+
const signerAddress = await this.resolveSignerForAction(
|
|
194
|
+
action,
|
|
195
|
+
params.address,
|
|
196
|
+
params.provider
|
|
197
|
+
)
|
|
198
|
+
return createAction(this.sdkClient, {
|
|
199
|
+
provider: params.provider,
|
|
288
200
|
address: params.address,
|
|
289
201
|
signerAddress,
|
|
290
|
-
|
|
202
|
+
action,
|
|
203
|
+
params: params.params,
|
|
291
204
|
})
|
|
292
205
|
}
|
|
293
206
|
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
* @returns Order submission results
|
|
301
|
-
* @throws {PerpsError} If not in USER_AGENT mode
|
|
302
|
-
*/
|
|
303
|
-
async placeOrder(params: PlaceOrderParams): Promise<SubmitOrderResponse> {
|
|
304
|
-
const mode = this.getSigningMode(params.address, params.dex)
|
|
305
|
-
|
|
306
|
-
if (mode !== 'USER_AGENT') {
|
|
307
|
-
throw new PerpsError(
|
|
308
|
-
PerpsErrorCode.ValidationError,
|
|
309
|
-
`${PerpsErrorMessage.InvalidSigningMode} placeOrder() requires USER_AGENT mode. Use createOrder() + submitOrder() for USER mode.`
|
|
310
|
-
)
|
|
207
|
+
async submitSignedAction(
|
|
208
|
+
action: ActionType,
|
|
209
|
+
params: {
|
|
210
|
+
provider: string
|
|
211
|
+
address: Address
|
|
212
|
+
actions: SignedActionStep[]
|
|
311
213
|
}
|
|
214
|
+
): Promise<ExecuteActionResponse> {
|
|
215
|
+
return executeAction(this.sdkClient, { ...params, action })
|
|
216
|
+
}
|
|
312
217
|
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
)
|
|
218
|
+
// ---------------------------------------------------------------------------
|
|
219
|
+
// Signing mode management
|
|
220
|
+
// ---------------------------------------------------------------------------
|
|
317
221
|
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
reduceOnly: params.reduceOnly,
|
|
331
|
-
timeInForce: params.timeInForce,
|
|
332
|
-
expiresAt: params.expiresAt,
|
|
333
|
-
takeProfit: params.takeProfit,
|
|
334
|
-
stopLoss: params.stopLoss,
|
|
335
|
-
})
|
|
222
|
+
async setSigningMode(
|
|
223
|
+
address: Address,
|
|
224
|
+
provider: string,
|
|
225
|
+
mode: SigningMode
|
|
226
|
+
): Promise<void> {
|
|
227
|
+
const key = this.modeKey(address, provider)
|
|
228
|
+
this.signingModes.set(key, mode)
|
|
229
|
+
await this.storage.set(this.signingModeStorageKey(address, provider), mode)
|
|
230
|
+
if (mode === SigningMode.USER_AGENT) {
|
|
231
|
+
await this.sdkClient.agentManager.getOrCreateAgent(address, provider)
|
|
232
|
+
}
|
|
233
|
+
}
|
|
336
234
|
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
typedData: a.typedData,
|
|
342
|
-
signature: await signTypedData(agent.privateKey, a.typedData),
|
|
343
|
-
}))
|
|
235
|
+
getSigningMode(address: Address, provider: string): SigningMode {
|
|
236
|
+
return (
|
|
237
|
+
this.signingModes.get(this.modeKey(address, provider)) ??
|
|
238
|
+
SigningMode.USER_AGENT
|
|
344
239
|
)
|
|
345
|
-
|
|
346
|
-
// 3. Submit
|
|
347
|
-
return submitOrder(this.sdkClient, {
|
|
348
|
-
dex: params.dex,
|
|
349
|
-
address: params.address,
|
|
350
|
-
signerAddress: agent.address,
|
|
351
|
-
actions: signedActions,
|
|
352
|
-
})
|
|
353
240
|
}
|
|
354
241
|
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
* @throws {PerpsError} If not in USER_AGENT mode
|
|
363
|
-
*/
|
|
364
|
-
async cancelOrders(params: CancelOrdersParams): Promise<SubmitOrderResponse> {
|
|
365
|
-
const mode = this.getSigningMode(params.address, params.dex)
|
|
366
|
-
|
|
367
|
-
if (mode !== 'USER_AGENT') {
|
|
368
|
-
throw new PerpsError(
|
|
369
|
-
PerpsErrorCode.ValidationError,
|
|
370
|
-
`${PerpsErrorMessage.InvalidSigningMode} cancelOrders() requires USER_AGENT mode. Use cancelOrder() + submitOrder() for USER mode.`
|
|
371
|
-
)
|
|
242
|
+
async loadSigningMode(
|
|
243
|
+
address: Address,
|
|
244
|
+
provider: string
|
|
245
|
+
): Promise<SigningMode> {
|
|
246
|
+
const key = this.modeKey(address, provider)
|
|
247
|
+
if (this.signingModes.has(key)) {
|
|
248
|
+
return this.signingModes.get(key)!
|
|
372
249
|
}
|
|
373
250
|
|
|
374
|
-
const
|
|
375
|
-
|
|
376
|
-
params.dex
|
|
251
|
+
const stored = await this.storage.get(
|
|
252
|
+
this.signingModeStorageKey(address, provider)
|
|
377
253
|
)
|
|
254
|
+
const mode: SigningMode =
|
|
255
|
+
stored === SigningMode.USER_AGENT || stored === SigningMode.USER
|
|
256
|
+
? stored
|
|
257
|
+
: SigningMode.USER_AGENT
|
|
258
|
+
this.signingModes.set(key, mode)
|
|
259
|
+
return mode
|
|
260
|
+
}
|
|
378
261
|
|
|
379
|
-
|
|
380
|
-
const
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
signerAddress: agent.address,
|
|
384
|
-
ids: params.ids,
|
|
385
|
-
})
|
|
262
|
+
async loadAgentMode(address: Address, provider: string): Promise<boolean> {
|
|
263
|
+
const mode = await this.loadSigningMode(address, provider)
|
|
264
|
+
return mode === SigningMode.USER_AGENT
|
|
265
|
+
}
|
|
386
266
|
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
267
|
+
async setAgentMode(
|
|
268
|
+
address: Address,
|
|
269
|
+
provider: string,
|
|
270
|
+
useAgent: boolean
|
|
271
|
+
): Promise<void> {
|
|
272
|
+
await this.setSigningMode(
|
|
273
|
+
address,
|
|
274
|
+
provider,
|
|
275
|
+
useAgent ? SigningMode.USER_AGENT : SigningMode.USER
|
|
394
276
|
)
|
|
277
|
+
}
|
|
395
278
|
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
address: params.address,
|
|
400
|
-
signerAddress: agent.address,
|
|
401
|
-
actions: signedActions,
|
|
402
|
-
})
|
|
279
|
+
async getAgentAddress(address: Address, provider: string): Promise<Address> {
|
|
280
|
+
const agent = await this.sdkClient.agentManager.getAgent(address, provider)
|
|
281
|
+
return agent.address
|
|
403
282
|
}
|
|
404
283
|
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
async submitSignedOrder(
|
|
414
|
-
params: SubmitOrderParams
|
|
415
|
-
): Promise<SubmitOrderResponse> {
|
|
416
|
-
return submitOrder(this.sdkClient, params)
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
/**
|
|
420
|
-
* Build a withdrawal payload for the user to sign.
|
|
421
|
-
*
|
|
422
|
-
* Withdrawals are user-signed only — agents cannot initiate withdrawals.
|
|
423
|
-
* No agent injection is performed regardless of signing mode.
|
|
424
|
-
*
|
|
425
|
-
* @param params - Withdrawal parameters
|
|
426
|
-
* @returns Withdrawal action with typed data for signing
|
|
427
|
-
*/
|
|
428
|
-
async buildWithdrawal(
|
|
429
|
-
params: BuildWithdrawalParams
|
|
430
|
-
): Promise<CreateWithdrawalResponse> {
|
|
431
|
-
return createWithdrawal(this.sdkClient, {
|
|
432
|
-
dex: params.dex,
|
|
433
|
-
address: params.address,
|
|
434
|
-
withdrawal: params.withdrawal,
|
|
435
|
-
})
|
|
284
|
+
async hasAgent(address: Address, provider: string): Promise<boolean> {
|
|
285
|
+
return this.sdkClient.agentManager.hasAgent(address, provider)
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
async removeAgent(address: Address, provider: string): Promise<void> {
|
|
289
|
+
await this.sdkClient.agentManager.removeAgent(address, provider)
|
|
290
|
+
this.signingModes.delete(this.modeKey(address, provider))
|
|
291
|
+
await this.storage.remove(this.signingModeStorageKey(address, provider))
|
|
436
292
|
}
|
|
437
293
|
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
): Promise<SubmitWithdrawalResponse> {
|
|
449
|
-
return submitWithdrawal(this.sdkClient, params)
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
/**
|
|
453
|
-
* Determine which authorizations (if any) the user needs to sign before trading.
|
|
454
|
-
*
|
|
455
|
-
* Uses the dex auth provider to determine what authorizations to request,
|
|
456
|
-
* then calls buildAuthorization — the backend filters already-valid auths
|
|
457
|
-
* and returns only what's needed.
|
|
458
|
-
*
|
|
459
|
-
* @param params - Parameters including dex, address, and dex-specific config
|
|
460
|
-
* @returns Which authorizations are needed and whether the user is ready to trade
|
|
461
|
-
*/
|
|
462
|
-
async getRequiredAuthorizations(
|
|
463
|
-
params: GetRequiredAuthorizationsParams
|
|
464
|
-
): Promise<RequiredAuthorizationsResult> {
|
|
465
|
-
const { dex, address } = params
|
|
466
|
-
const mode = this.getSigningMode(address, dex)
|
|
467
|
-
const provider = getDexAuthProvider(dex)
|
|
468
|
-
|
|
469
|
-
// Ensure agent exists in USER_AGENT mode
|
|
294
|
+
// ---------------------------------------------------------------------------
|
|
295
|
+
// Prerequisites (was: authorizations)
|
|
296
|
+
// ---------------------------------------------------------------------------
|
|
297
|
+
|
|
298
|
+
async checkPrerequisites(
|
|
299
|
+
params: GetPrerequisitesParams
|
|
300
|
+
): Promise<PrerequisitesResult> {
|
|
301
|
+
const { provider, address } = params
|
|
302
|
+
const mode = await this.loadSigningMode(address, provider)
|
|
303
|
+
|
|
470
304
|
let agentAddress: Address | undefined
|
|
471
|
-
if (mode ===
|
|
305
|
+
if (mode === SigningMode.USER_AGENT) {
|
|
472
306
|
const agent = await this.sdkClient.agentManager.getOrCreateAgent(
|
|
473
307
|
address,
|
|
474
|
-
|
|
308
|
+
provider
|
|
475
309
|
)
|
|
476
310
|
agentAddress = agent.address
|
|
477
311
|
}
|
|
478
312
|
|
|
479
|
-
|
|
480
|
-
const
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
313
|
+
const metadata = await this.getProviderMetadata(provider)
|
|
314
|
+
const allInputs = this.buildPrerequisiteInputs(
|
|
315
|
+
metadata.prepareAccountActions,
|
|
316
|
+
mode,
|
|
317
|
+
agentAddress
|
|
318
|
+
)
|
|
484
319
|
|
|
485
|
-
const allInputs = [...authInputs.user, ...authInputs.agent]
|
|
486
320
|
if (allInputs.length === 0) {
|
|
487
|
-
return {
|
|
321
|
+
return { userPrerequisites: [], agentPrerequisites: [], isReady: true }
|
|
488
322
|
}
|
|
489
323
|
|
|
490
|
-
//
|
|
491
|
-
const
|
|
492
|
-
|
|
324
|
+
// Build a signer lookup from action descriptors
|
|
325
|
+
const signersByAction = new Map<string, PerpsSigner[]>()
|
|
326
|
+
for (const desc of metadata.prepareAccountActions) {
|
|
327
|
+
signersByAction.set(desc.type, desc.signers)
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// Send all to backend via createAction for the first prerequisite type
|
|
331
|
+
// The backend filters already-satisfied ones and returns typed data
|
|
332
|
+
const { actions } = await this.buildPrerequisites({
|
|
333
|
+
provider,
|
|
493
334
|
address,
|
|
494
|
-
|
|
335
|
+
signerAddress: agentAddress,
|
|
495
336
|
})
|
|
496
337
|
|
|
497
338
|
if (actions.length === 0) {
|
|
498
|
-
return {
|
|
339
|
+
return { userPrerequisites: [], agentPrerequisites: [], isReady: true }
|
|
499
340
|
}
|
|
500
341
|
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
342
|
+
const userPrerequisites = actions.filter((a) => {
|
|
343
|
+
const signers = signersByAction.get(a.action) ?? []
|
|
344
|
+
return signers.includes(PerpsSigner.USER)
|
|
345
|
+
})
|
|
346
|
+
const agentPrerequisites = actions.filter((a) => {
|
|
347
|
+
const signers = signersByAction.get(a.action) ?? []
|
|
348
|
+
return signers.includes(PerpsSigner.AGENT)
|
|
349
|
+
})
|
|
505
350
|
|
|
506
351
|
return {
|
|
507
|
-
|
|
508
|
-
|
|
352
|
+
userPrerequisites,
|
|
353
|
+
agentPrerequisites,
|
|
509
354
|
isReady: false,
|
|
510
355
|
}
|
|
511
356
|
}
|
|
512
357
|
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
358
|
+
async buildPrerequisites(
|
|
359
|
+
params: CheckPrerequisitesParams
|
|
360
|
+
): Promise<CreateActionResponse> {
|
|
361
|
+
const mode = await this.loadSigningMode(params.address, params.provider)
|
|
362
|
+
let { signerAddress } = params
|
|
363
|
+
|
|
364
|
+
if (mode === SigningMode.USER_AGENT && !signerAddress) {
|
|
365
|
+
const agent = await this.sdkClient.agentManager.getAgent(
|
|
366
|
+
params.address,
|
|
367
|
+
params.provider
|
|
368
|
+
)
|
|
369
|
+
signerAddress = agent.address
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
const metadata = await this.getProviderMetadata(params.provider)
|
|
373
|
+
const allInputs = this.buildPrerequisiteInputs(
|
|
374
|
+
metadata.prepareAccountActions,
|
|
375
|
+
mode,
|
|
376
|
+
signerAddress
|
|
377
|
+
)
|
|
378
|
+
|
|
379
|
+
// Use the first prerequisite type as the action type for the batch
|
|
380
|
+
// The backend handles all prerequisites in a single createPrerequisite call
|
|
381
|
+
const allActions: ActionStep[] = []
|
|
382
|
+
for (const input of allInputs) {
|
|
383
|
+
const { actions } = await createAction(this.sdkClient, {
|
|
384
|
+
provider: params.provider,
|
|
385
|
+
address: params.address,
|
|
386
|
+
signerAddress,
|
|
387
|
+
action: input.key as ActionType,
|
|
388
|
+
params: (input.params ?? {}) as Record<string, never>,
|
|
389
|
+
})
|
|
390
|
+
allActions.push(...actions)
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
return { actions: allActions }
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
async executePrerequisites(
|
|
397
|
+
params: ExecutePrerequisitesParams
|
|
398
|
+
): Promise<ExecutePrerequisitesResult> {
|
|
399
|
+
const { provider, address, required, userSignedActions } = params
|
|
400
|
+
const mode = await this.loadSigningMode(address, provider)
|
|
401
|
+
|
|
402
|
+
// 1. Submit user-signed prerequisites
|
|
403
|
+
let userResults: ExecuteActionResponse = { results: [] }
|
|
528
404
|
if (userSignedActions.length > 0) {
|
|
529
405
|
const signerAddress =
|
|
530
|
-
mode ===
|
|
531
|
-
? (await this.sdkClient.agentManager.getAgent(address,
|
|
406
|
+
mode === SigningMode.USER_AGENT
|
|
407
|
+
? (await this.sdkClient.agentManager.getAgent(address, provider))
|
|
408
|
+
.address
|
|
532
409
|
: address
|
|
533
|
-
|
|
534
|
-
|
|
410
|
+
|
|
411
|
+
// Submit all user-signed actions — use first action's type for routing
|
|
412
|
+
const firstAction = required.userPrerequisites[0]?.action as string
|
|
413
|
+
userResults = await executeAction(this.sdkClient, {
|
|
414
|
+
provider,
|
|
535
415
|
address,
|
|
536
416
|
signerAddress,
|
|
417
|
+
action: (firstAction ?? ActionType.APPROVE_AGENT) as ActionType,
|
|
537
418
|
actions: userSignedActions,
|
|
538
419
|
})
|
|
539
420
|
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
if (failed) {
|
|
421
|
+
const mandatoryFailure = userResults.results.find((r) => !r.success)
|
|
422
|
+
if (mandatoryFailure) {
|
|
543
423
|
return { userResults }
|
|
544
424
|
}
|
|
545
425
|
}
|
|
546
426
|
|
|
547
|
-
// 2. Auto-sign and submit agent
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
427
|
+
// 2. Auto-sign and submit agent prerequisites
|
|
428
|
+
if (
|
|
429
|
+
required.agentPrerequisites.length > 0 &&
|
|
430
|
+
mode === SigningMode.USER_AGENT
|
|
431
|
+
) {
|
|
432
|
+
const agent = await this.sdkClient.agentManager.getAgent(
|
|
433
|
+
address,
|
|
434
|
+
provider
|
|
435
|
+
)
|
|
551
436
|
|
|
552
|
-
const signedAgentActions:
|
|
553
|
-
required.
|
|
437
|
+
const signedAgentActions: SignedActionStep[] = await Promise.all(
|
|
438
|
+
required.agentPrerequisites.map(async (action) => ({
|
|
554
439
|
action: action.action,
|
|
555
440
|
typedData: action.typedData,
|
|
556
441
|
signature: await signTypedData(agent.privateKey, action.typedData),
|
|
557
442
|
}))
|
|
558
443
|
)
|
|
559
444
|
|
|
560
|
-
const
|
|
561
|
-
|
|
445
|
+
const firstAction = required.agentPrerequisites[0]?.action as string
|
|
446
|
+
const agentResults = await executeAction(this.sdkClient, {
|
|
447
|
+
provider,
|
|
562
448
|
address,
|
|
563
449
|
signerAddress: agent.address,
|
|
450
|
+
action: (firstAction ?? ActionType.AGENT_SET_ABSTRACTION) as ActionType,
|
|
564
451
|
actions: signedAgentActions,
|
|
565
452
|
})
|
|
566
453
|
|
|
454
|
+
// If AGENT_SET_ABSTRACTION failed (e.g. dexAbstraction → unified upgrade),
|
|
455
|
+
// fall back to USER_SET_ABSTRACTION so the user can sign it manually.
|
|
456
|
+
const abstractionFailed = agentResults.results.some(
|
|
457
|
+
(r) => !r.success && r.action === ActionType.AGENT_SET_ABSTRACTION
|
|
458
|
+
)
|
|
459
|
+
|
|
460
|
+
if (abstractionFailed) {
|
|
461
|
+
const { actions: fallbackActions } = await createAction(
|
|
462
|
+
this.sdkClient,
|
|
463
|
+
{
|
|
464
|
+
provider,
|
|
465
|
+
address,
|
|
466
|
+
action: ActionType.USER_SET_ABSTRACTION,
|
|
467
|
+
params: {} as ActionParamsMap[ActionType.USER_SET_ABSTRACTION],
|
|
468
|
+
}
|
|
469
|
+
)
|
|
470
|
+
|
|
471
|
+
if (fallbackActions.length > 0) {
|
|
472
|
+
return {
|
|
473
|
+
userResults,
|
|
474
|
+
agentResults,
|
|
475
|
+
fallbackUserPrerequisites: fallbackActions,
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
|
|
567
480
|
return { userResults, agentResults }
|
|
568
481
|
}
|
|
569
482
|
|
|
570
483
|
return { userResults }
|
|
571
484
|
}
|
|
485
|
+
|
|
486
|
+
// ---------------------------------------------------------------------------
|
|
487
|
+
// Trading — build (USER mode) methods
|
|
488
|
+
// ---------------------------------------------------------------------------
|
|
489
|
+
|
|
490
|
+
async buildOrder(params: PlaceOrderParams): Promise<CreateActionResponse> {
|
|
491
|
+
return this.buildAction(ActionType.PLACE_ORDER, {
|
|
492
|
+
provider: params.provider,
|
|
493
|
+
address: params.address,
|
|
494
|
+
params: {
|
|
495
|
+
asset: params.asset,
|
|
496
|
+
side: params.side,
|
|
497
|
+
type: params.type,
|
|
498
|
+
size: params.size,
|
|
499
|
+
price: params.price,
|
|
500
|
+
leverage: params.leverage,
|
|
501
|
+
reduceOnly: params.reduceOnly,
|
|
502
|
+
timeInForce: params.timeInForce,
|
|
503
|
+
expiresAt: params.expiresAt,
|
|
504
|
+
takeProfit: params.takeProfit,
|
|
505
|
+
stopLoss: params.stopLoss,
|
|
506
|
+
},
|
|
507
|
+
})
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
async buildTriggerOrder(
|
|
511
|
+
params: PlaceTriggerOrderParams
|
|
512
|
+
): Promise<CreateActionResponse> {
|
|
513
|
+
return this.buildAction(ActionType.PLACE_TRIGGER_ORDER, {
|
|
514
|
+
provider: params.provider,
|
|
515
|
+
address: params.address,
|
|
516
|
+
params: {
|
|
517
|
+
asset: params.asset,
|
|
518
|
+
side: params.side,
|
|
519
|
+
takeProfit: params.takeProfit,
|
|
520
|
+
stopLoss: params.stopLoss,
|
|
521
|
+
},
|
|
522
|
+
})
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
async buildCancelOrder(
|
|
526
|
+
params: CancelOrdersParams
|
|
527
|
+
): Promise<CreateActionResponse> {
|
|
528
|
+
return this.buildAction(ActionType.CANCEL_ORDER, {
|
|
529
|
+
provider: params.provider,
|
|
530
|
+
address: params.address,
|
|
531
|
+
params: { ids: params.ids },
|
|
532
|
+
})
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
async buildModifyOrder(
|
|
536
|
+
params: ModifyOrdersParams
|
|
537
|
+
): Promise<CreateActionResponse> {
|
|
538
|
+
return this.buildAction(ActionType.MODIFY_ORDER, {
|
|
539
|
+
provider: params.provider,
|
|
540
|
+
address: params.address,
|
|
541
|
+
params: {
|
|
542
|
+
modifications: params.modifications,
|
|
543
|
+
},
|
|
544
|
+
})
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
async buildPositionMargin(params: {
|
|
548
|
+
provider: string
|
|
549
|
+
address: Address
|
|
550
|
+
asset: AssetIdentity
|
|
551
|
+
action: 'add' | 'remove'
|
|
552
|
+
amount: string
|
|
553
|
+
}): Promise<CreateActionResponse> {
|
|
554
|
+
return this.buildAction(ActionType.UPDATE_POSITION_MARGIN, {
|
|
555
|
+
provider: params.provider,
|
|
556
|
+
address: params.address,
|
|
557
|
+
params: {
|
|
558
|
+
asset: params.asset,
|
|
559
|
+
action: params.action,
|
|
560
|
+
amount: params.amount,
|
|
561
|
+
},
|
|
562
|
+
})
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
async buildWithdrawal(
|
|
566
|
+
params: BuildWithdrawalParams
|
|
567
|
+
): Promise<CreateActionResponse> {
|
|
568
|
+
return this.buildAction(ActionType.WITHDRAWAL, {
|
|
569
|
+
provider: params.provider,
|
|
570
|
+
address: params.address,
|
|
571
|
+
params: params.withdrawal,
|
|
572
|
+
})
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
// ---------------------------------------------------------------------------
|
|
576
|
+
// Trading — submit signed actions (USER mode)
|
|
577
|
+
// ---------------------------------------------------------------------------
|
|
578
|
+
|
|
579
|
+
async submitSignedOrder(params: {
|
|
580
|
+
provider: string
|
|
581
|
+
address: Address
|
|
582
|
+
actions: SignedActionStep[]
|
|
583
|
+
}): Promise<ExecuteActionResponse> {
|
|
584
|
+
return this.submitSignedAction(ActionType.PLACE_ORDER, params)
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
async submitSignedPosition(params: {
|
|
588
|
+
provider: string
|
|
589
|
+
address: Address
|
|
590
|
+
actions: SignedActionStep[]
|
|
591
|
+
}): Promise<ExecuteActionResponse> {
|
|
592
|
+
return this.submitSignedAction(ActionType.UPDATE_POSITION_MARGIN, params)
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
async submitWithdrawal(params: {
|
|
596
|
+
provider: string
|
|
597
|
+
address: Address
|
|
598
|
+
action: SignedActionStep
|
|
599
|
+
}): Promise<ExecuteActionResponse> {
|
|
600
|
+
return this.submitSignedAction(ActionType.WITHDRAWAL, {
|
|
601
|
+
provider: params.provider,
|
|
602
|
+
address: params.address,
|
|
603
|
+
actions: [params.action],
|
|
604
|
+
})
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
// ---------------------------------------------------------------------------
|
|
608
|
+
// Trading — auto-sign (USER_AGENT mode)
|
|
609
|
+
// ---------------------------------------------------------------------------
|
|
610
|
+
|
|
611
|
+
async placeOrder(params: PlaceOrderParams): Promise<ExecuteActionResponse> {
|
|
612
|
+
await this.loadSigningMode(params.address, params.provider)
|
|
613
|
+
this.requireAgentMode(params.address, params.provider, 'placeOrder()')
|
|
614
|
+
|
|
615
|
+
const { actions } = await this.buildOrder(params)
|
|
616
|
+
return this.autoSignAndExecute(
|
|
617
|
+
params.provider,
|
|
618
|
+
params.address,
|
|
619
|
+
ActionType.PLACE_ORDER,
|
|
620
|
+
actions
|
|
621
|
+
)
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
async placeTriggerOrder(
|
|
625
|
+
params: PlaceTriggerOrderParams
|
|
626
|
+
): Promise<ExecuteActionResponse> {
|
|
627
|
+
await this.loadSigningMode(params.address, params.provider)
|
|
628
|
+
this.requireAgentMode(
|
|
629
|
+
params.address,
|
|
630
|
+
params.provider,
|
|
631
|
+
'placeTriggerOrder()'
|
|
632
|
+
)
|
|
633
|
+
|
|
634
|
+
const { actions } = await this.buildTriggerOrder(params)
|
|
635
|
+
return this.autoSignAndExecute(
|
|
636
|
+
params.provider,
|
|
637
|
+
params.address,
|
|
638
|
+
ActionType.PLACE_TRIGGER_ORDER,
|
|
639
|
+
actions
|
|
640
|
+
)
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
async cancelOrders(
|
|
644
|
+
params: CancelOrdersParams
|
|
645
|
+
): Promise<ExecuteActionResponse> {
|
|
646
|
+
await this.loadSigningMode(params.address, params.provider)
|
|
647
|
+
this.requireAgentMode(params.address, params.provider, 'cancelOrders()')
|
|
648
|
+
|
|
649
|
+
const { actions } = await this.buildCancelOrder(params)
|
|
650
|
+
return this.autoSignAndExecute(
|
|
651
|
+
params.provider,
|
|
652
|
+
params.address,
|
|
653
|
+
ActionType.CANCEL_ORDER,
|
|
654
|
+
actions
|
|
655
|
+
)
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
async modifyOrders(
|
|
659
|
+
params: ModifyOrdersParams
|
|
660
|
+
): Promise<ExecuteActionResponse> {
|
|
661
|
+
await this.loadSigningMode(params.address, params.provider)
|
|
662
|
+
this.requireAgentMode(params.address, params.provider, 'modifyOrders()')
|
|
663
|
+
|
|
664
|
+
const { actions } = await this.buildModifyOrder(params)
|
|
665
|
+
return this.autoSignAndExecute(
|
|
666
|
+
params.provider,
|
|
667
|
+
params.address,
|
|
668
|
+
ActionType.MODIFY_ORDER,
|
|
669
|
+
actions
|
|
670
|
+
)
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
async updatePositionMargin(params: {
|
|
674
|
+
provider: string
|
|
675
|
+
address: Address
|
|
676
|
+
asset: AssetIdentity
|
|
677
|
+
action: 'add' | 'remove'
|
|
678
|
+
amount: string
|
|
679
|
+
}): Promise<ExecuteActionResponse> {
|
|
680
|
+
await this.loadSigningMode(params.address, params.provider)
|
|
681
|
+
this.requireAgentMode(
|
|
682
|
+
params.address,
|
|
683
|
+
params.provider,
|
|
684
|
+
'updatePositionMargin()'
|
|
685
|
+
)
|
|
686
|
+
|
|
687
|
+
const { actions } = await this.buildPositionMargin(params)
|
|
688
|
+
return this.autoSignAndExecute(
|
|
689
|
+
params.provider,
|
|
690
|
+
params.address,
|
|
691
|
+
ActionType.UPDATE_POSITION_MARGIN,
|
|
692
|
+
actions
|
|
693
|
+
)
|
|
694
|
+
}
|
|
572
695
|
}
|