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