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