@lifi/perps-sdk-provider-lighter 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/LICENSE +201 -0
- package/README.md +176 -0
- package/dist/cjs/LighterProvider.d.ts +20 -0
- package/dist/cjs/LighterProvider.d.ts.map +1 -0
- package/dist/cjs/LighterProvider.js +592 -0
- package/dist/cjs/LighterProvider.js.map +1 -0
- package/dist/cjs/accountConfig.d.ts +3 -0
- package/dist/cjs/accountConfig.d.ts.map +1 -0
- package/dist/cjs/accountConfig.js +69 -0
- package/dist/cjs/accountConfig.js.map +1 -0
- package/dist/cjs/accountSummary.d.ts +3 -0
- package/dist/cjs/accountSummary.d.ts.map +1 -0
- package/dist/cjs/accountSummary.js +8 -0
- package/dist/cjs/accountSummary.js.map +1 -0
- package/dist/cjs/constants.d.ts +14 -0
- package/dist/cjs/constants.d.ts.map +1 -0
- package/dist/cjs/constants.js +18 -0
- package/dist/cjs/constants.js.map +1 -0
- package/dist/cjs/index.d.ts +11 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +35 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/signers/LighterKeyStore.d.ts +18 -0
- package/dist/cjs/signers/LighterKeyStore.d.ts.map +1 -0
- package/dist/cjs/signers/LighterKeyStore.js +54 -0
- package/dist/cjs/signers/LighterKeyStore.js.map +1 -0
- package/dist/cjs/signers/LighterReadOnlyTokenManager.d.ts +56 -0
- package/dist/cjs/signers/LighterReadOnlyTokenManager.d.ts.map +1 -0
- package/dist/cjs/signers/LighterReadOnlyTokenManager.js +127 -0
- package/dist/cjs/signers/LighterReadOnlyTokenManager.js.map +1 -0
- package/dist/cjs/signers/LighterSigner.d.ts +41 -0
- package/dist/cjs/signers/LighterSigner.d.ts.map +1 -0
- package/dist/cjs/signers/LighterSigner.js +175 -0
- package/dist/cjs/signers/LighterSigner.js.map +1 -0
- package/dist/cjs/signers/createAuthToken.d.ts +12 -0
- package/dist/cjs/signers/createAuthToken.d.ts.map +1 -0
- package/dist/cjs/signers/createAuthToken.js +28 -0
- package/dist/cjs/signers/createAuthToken.js.map +1 -0
- package/dist/cjs/signers/index.d.ts +11 -0
- package/dist/cjs/signers/index.d.ts.map +1 -0
- package/dist/cjs/signers/index.js +19 -0
- package/dist/cjs/signers/index.js.map +1 -0
- package/dist/cjs/signers/signActions.d.ts +15 -0
- package/dist/cjs/signers/signActions.d.ts.map +1 -0
- package/dist/cjs/signers/signActions.js +142 -0
- package/dist/cjs/signers/signActions.js.map +1 -0
- package/dist/cjs/signers/wasmLoader.d.ts +42 -0
- package/dist/cjs/signers/wasmLoader.d.ts.map +1 -0
- package/dist/cjs/signers/wasmLoader.js +166 -0
- package/dist/cjs/signers/wasmLoader.js.map +1 -0
- package/dist/cjs/types/account.d.ts +97 -0
- package/dist/cjs/types/account.d.ts.map +1 -0
- package/dist/cjs/types/account.js +3 -0
- package/dist/cjs/types/account.js.map +1 -0
- package/dist/cjs/types/action.d.ts +72 -0
- package/dist/cjs/types/action.d.ts.map +1 -0
- package/dist/cjs/types/action.js +23 -0
- package/dist/cjs/types/action.js.map +1 -0
- package/dist/cjs/types/activity.d.ts +73 -0
- package/dist/cjs/types/activity.d.ts.map +1 -0
- package/dist/cjs/types/activity.js +3 -0
- package/dist/cjs/types/activity.js.map +1 -0
- package/dist/cjs/types/asset.d.ts +122 -0
- package/dist/cjs/types/asset.d.ts.map +1 -0
- package/dist/cjs/types/asset.js +3 -0
- package/dist/cjs/types/asset.js.map +1 -0
- package/dist/cjs/types/fill.d.ts +29 -0
- package/dist/cjs/types/fill.d.ts.map +1 -0
- package/dist/cjs/types/fill.js +3 -0
- package/dist/cjs/types/fill.js.map +1 -0
- package/dist/cjs/types/index.d.ts +9 -0
- package/dist/cjs/types/index.d.ts.map +1 -0
- package/dist/cjs/types/index.js +25 -0
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/cjs/types/order.d.ts +57 -0
- package/dist/cjs/types/order.d.ts.map +1 -0
- package/dist/cjs/types/order.js +3 -0
- package/dist/cjs/types/order.js.map +1 -0
- package/dist/cjs/types/submit.d.ts +39 -0
- package/dist/cjs/types/submit.d.ts.map +1 -0
- package/dist/cjs/types/submit.js +3 -0
- package/dist/cjs/types/submit.js.map +1 -0
- package/dist/cjs/types/ws.d.ts +84 -0
- package/dist/cjs/types/ws.d.ts.map +1 -0
- package/dist/cjs/types/ws.js +3 -0
- package/dist/cjs/types/ws.js.map +1 -0
- package/dist/cjs/utils/activityCursor.d.ts +12 -0
- package/dist/cjs/utils/activityCursor.d.ts.map +1 -0
- package/dist/cjs/utils/activityCursor.js +85 -0
- package/dist/cjs/utils/activityCursor.js.map +1 -0
- package/dist/cjs/utils/apiClient.d.ts +26 -0
- package/dist/cjs/utils/apiClient.d.ts.map +1 -0
- package/dist/cjs/utils/apiClient.js +94 -0
- package/dist/cjs/utils/apiClient.js.map +1 -0
- package/dist/cjs/utils/fetchDetailedAccount.d.ts +5 -0
- package/dist/cjs/utils/fetchDetailedAccount.d.ts.map +1 -0
- package/dist/cjs/utils/fetchDetailedAccount.js +22 -0
- package/dist/cjs/utils/fetchDetailedAccount.js.map +1 -0
- package/dist/cjs/utils/index.d.ts +16 -0
- package/dist/cjs/utils/index.d.ts.map +1 -0
- package/dist/cjs/utils/index.js +45 -0
- package/dist/cjs/utils/index.js.map +1 -0
- package/dist/cjs/utils/lighterAsset.d.ts +3 -0
- package/dist/cjs/utils/lighterAsset.d.ts.map +1 -0
- package/dist/cjs/utils/lighterAsset.js +12 -0
- package/dist/cjs/utils/lighterAsset.js.map +1 -0
- package/dist/cjs/utils/liquidation.d.ts +4 -0
- package/dist/cjs/utils/liquidation.d.ts.map +1 -0
- package/dist/cjs/utils/liquidation.js +16 -0
- package/dist/cjs/utils/liquidation.js.map +1 -0
- package/dist/cjs/utils/mapFill.d.ts +4 -0
- package/dist/cjs/utils/mapFill.d.ts.map +1 -0
- package/dist/cjs/utils/mapFill.js +61 -0
- package/dist/cjs/utils/mapFill.js.map +1 -0
- package/dist/cjs/utils/mapOpenPositions.d.ts +4 -0
- package/dist/cjs/utils/mapOpenPositions.d.ts.map +1 -0
- package/dist/cjs/utils/mapOpenPositions.js +9 -0
- package/dist/cjs/utils/mapOpenPositions.js.map +1 -0
- package/dist/cjs/utils/mapOrder.d.ts +15 -0
- package/dist/cjs/utils/mapOrder.d.ts.map +1 -0
- package/dist/cjs/utils/mapOrder.js +164 -0
- package/dist/cjs/utils/mapOrder.js.map +1 -0
- package/dist/cjs/utils/mapPosition.d.ts +4 -0
- package/dist/cjs/utils/mapPosition.d.ts.map +1 -0
- package/dist/cjs/utils/mapPosition.js +30 -0
- package/dist/cjs/utils/mapPosition.js.map +1 -0
- package/dist/cjs/utils/ohlcvInterval.d.ts +2 -0
- package/dist/cjs/utils/ohlcvInterval.d.ts.map +1 -0
- package/dist/cjs/utils/ohlcvInterval.js +26 -0
- package/dist/cjs/utils/ohlcvInterval.js.map +1 -0
- package/dist/cjs/utils/orderFormatting.d.ts +4 -0
- package/dist/cjs/utils/orderFormatting.d.ts.map +1 -0
- package/dist/cjs/utils/orderFormatting.js +23 -0
- package/dist/cjs/utils/orderFormatting.js.map +1 -0
- package/dist/cjs/utils/time.d.ts +3 -0
- package/dist/cjs/utils/time.d.ts.map +1 -0
- package/dist/cjs/utils/time.js +8 -0
- package/dist/cjs/utils/time.js.map +1 -0
- package/dist/cjs/utils/wireEncoding.d.ts +9 -0
- package/dist/cjs/utils/wireEncoding.d.ts.map +1 -0
- package/dist/cjs/utils/wireEncoding.js +87 -0
- package/dist/cjs/utils/wireEncoding.js.map +1 -0
- package/dist/cjs/websocket/LighterWsProvider.d.ts +45 -0
- package/dist/cjs/websocket/LighterWsProvider.d.ts.map +1 -0
- package/dist/cjs/websocket/LighterWsProvider.js +396 -0
- package/dist/cjs/websocket/LighterWsProvider.js.map +1 -0
- package/dist/esm/LighterProvider.d.ts +105 -0
- package/dist/esm/LighterProvider.d.ts.map +1 -0
- package/dist/esm/LighterProvider.js +684 -0
- package/dist/esm/LighterProvider.js.map +1 -0
- package/dist/esm/accountConfig.d.ts +14 -0
- package/dist/esm/accountConfig.d.ts.map +1 -0
- package/dist/esm/accountConfig.js +135 -0
- package/dist/esm/accountConfig.js.map +1 -0
- package/dist/esm/accountSummary.d.ts +12 -0
- package/dist/esm/accountSummary.d.ts.map +1 -0
- package/dist/esm/accountSummary.js +14 -0
- package/dist/esm/accountSummary.js.map +1 -0
- package/dist/esm/constants.d.ts +74 -0
- package/dist/esm/constants.d.ts.map +1 -0
- package/dist/esm/constants.js +73 -0
- package/dist/esm/constants.js.map +1 -0
- package/dist/esm/index.d.ts +22 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +22 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/signers/LighterKeyStore.d.ts +24 -0
- package/dist/esm/signers/LighterKeyStore.d.ts.map +1 -0
- package/dist/esm/signers/LighterKeyStore.js +55 -0
- package/dist/esm/signers/LighterKeyStore.js.map +1 -0
- package/dist/esm/signers/LighterReadOnlyTokenManager.d.ts +157 -0
- package/dist/esm/signers/LighterReadOnlyTokenManager.d.ts.map +1 -0
- package/dist/esm/signers/LighterReadOnlyTokenManager.js +194 -0
- package/dist/esm/signers/LighterReadOnlyTokenManager.js.map +1 -0
- package/dist/esm/signers/LighterSigner.d.ts +94 -0
- package/dist/esm/signers/LighterSigner.d.ts.map +1 -0
- package/dist/esm/signers/LighterSigner.js +228 -0
- package/dist/esm/signers/LighterSigner.js.map +1 -0
- package/dist/esm/signers/createAuthToken.d.ts +36 -0
- package/dist/esm/signers/createAuthToken.d.ts.map +1 -0
- package/dist/esm/signers/createAuthToken.js +42 -0
- package/dist/esm/signers/createAuthToken.js.map +1 -0
- package/dist/esm/signers/index.d.ts +11 -0
- package/dist/esm/signers/index.d.ts.map +1 -0
- package/dist/esm/signers/index.js +7 -0
- package/dist/esm/signers/index.js.map +1 -0
- package/dist/esm/signers/signActions.d.ts +54 -0
- package/dist/esm/signers/signActions.d.ts.map +1 -0
- package/dist/esm/signers/signActions.js +193 -0
- package/dist/esm/signers/signActions.js.map +1 -0
- package/dist/esm/signers/wasmLoader.d.ts +79 -0
- package/dist/esm/signers/wasmLoader.d.ts.map +1 -0
- package/dist/esm/signers/wasmLoader.js +180 -0
- package/dist/esm/signers/wasmLoader.js.map +1 -0
- package/dist/esm/types/account.d.ts +113 -0
- package/dist/esm/types/account.d.ts.map +1 -0
- package/dist/esm/types/account.js +4 -0
- package/dist/esm/types/account.js.map +1 -0
- package/dist/esm/types/action.d.ts +146 -0
- package/dist/esm/types/action.d.ts.map +1 -0
- package/dist/esm/types/action.js +50 -0
- package/dist/esm/types/action.js.map +1 -0
- package/dist/esm/types/activity.d.ts +83 -0
- package/dist/esm/types/activity.d.ts.map +1 -0
- package/dist/esm/types/activity.js +4 -0
- package/dist/esm/types/activity.js.map +1 -0
- package/dist/esm/types/asset.d.ts +134 -0
- package/dist/esm/types/asset.d.ts.map +1 -0
- package/dist/esm/types/asset.js +3 -0
- package/dist/esm/types/asset.js.map +1 -0
- package/dist/esm/types/fill.d.ts +31 -0
- package/dist/esm/types/fill.d.ts.map +1 -0
- package/dist/esm/types/fill.js +3 -0
- package/dist/esm/types/fill.js.map +1 -0
- package/dist/esm/types/index.d.ts +9 -0
- package/dist/esm/types/index.d.ts.map +1 -0
- package/dist/esm/types/index.js +12 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/esm/types/order.d.ts +61 -0
- package/dist/esm/types/order.d.ts.map +1 -0
- package/dist/esm/types/order.js +3 -0
- package/dist/esm/types/order.js.map +1 -0
- package/dist/esm/types/submit.d.ts +76 -0
- package/dist/esm/types/submit.d.ts.map +1 -0
- package/dist/esm/types/submit.js +3 -0
- package/dist/esm/types/submit.js.map +1 -0
- package/dist/esm/types/ws.d.ts +124 -0
- package/dist/esm/types/ws.d.ts.map +1 -0
- package/dist/esm/types/ws.js +11 -0
- package/dist/esm/types/ws.js.map +1 -0
- package/dist/esm/utils/activityCursor.d.ts +51 -0
- package/dist/esm/utils/activityCursor.d.ts.map +1 -0
- package/dist/esm/utils/activityCursor.js +99 -0
- package/dist/esm/utils/activityCursor.js.map +1 -0
- package/dist/esm/utils/apiClient.d.ts +65 -0
- package/dist/esm/utils/apiClient.d.ts.map +1 -0
- package/dist/esm/utils/apiClient.js +131 -0
- package/dist/esm/utils/apiClient.js.map +1 -0
- package/dist/esm/utils/fetchDetailedAccount.d.ts +11 -0
- package/dist/esm/utils/fetchDetailedAccount.d.ts.map +1 -0
- package/dist/esm/utils/fetchDetailedAccount.js +24 -0
- package/dist/esm/utils/fetchDetailedAccount.js.map +1 -0
- package/dist/esm/utils/index.d.ts +16 -0
- package/dist/esm/utils/index.d.ts.map +1 -0
- package/dist/esm/utils/index.js +17 -0
- package/dist/esm/utils/index.js.map +1 -0
- package/dist/esm/utils/lighterAsset.d.ts +4 -0
- package/dist/esm/utils/lighterAsset.d.ts.map +1 -0
- package/dist/esm/utils/lighterAsset.js +9 -0
- package/dist/esm/utils/lighterAsset.js.map +1 -0
- package/dist/esm/utils/liquidation.d.ts +22 -0
- package/dist/esm/utils/liquidation.d.ts.map +1 -0
- package/dist/esm/utils/liquidation.js +31 -0
- package/dist/esm/utils/liquidation.js.map +1 -0
- package/dist/esm/utils/mapFill.d.ts +10 -0
- package/dist/esm/utils/mapFill.d.ts.map +1 -0
- package/dist/esm/utils/mapFill.js +72 -0
- package/dist/esm/utils/mapFill.js.map +1 -0
- package/dist/esm/utils/mapOpenPositions.d.ts +11 -0
- package/dist/esm/utils/mapOpenPositions.d.ts.map +1 -0
- package/dist/esm/utils/mapOpenPositions.js +12 -0
- package/dist/esm/utils/mapOpenPositions.js.map +1 -0
- package/dist/esm/utils/mapOrder.d.ts +72 -0
- package/dist/esm/utils/mapOrder.d.ts.map +1 -0
- package/dist/esm/utils/mapOrder.js +219 -0
- package/dist/esm/utils/mapOrder.js.map +1 -0
- package/dist/esm/utils/mapPosition.d.ts +9 -0
- package/dist/esm/utils/mapPosition.d.ts.map +1 -0
- package/dist/esm/utils/mapPosition.js +34 -0
- package/dist/esm/utils/mapPosition.js.map +1 -0
- package/dist/esm/utils/ohlcvInterval.d.ts +3 -0
- package/dist/esm/utils/ohlcvInterval.d.ts.map +1 -0
- package/dist/esm/utils/ohlcvInterval.js +30 -0
- package/dist/esm/utils/ohlcvInterval.js.map +1 -0
- package/dist/esm/utils/orderFormatting.d.ts +29 -0
- package/dist/esm/utils/orderFormatting.d.ts.map +1 -0
- package/dist/esm/utils/orderFormatting.js +41 -0
- package/dist/esm/utils/orderFormatting.js.map +1 -0
- package/dist/esm/utils/time.d.ts +5 -0
- package/dist/esm/utils/time.d.ts.map +1 -0
- package/dist/esm/utils/time.js +5 -0
- package/dist/esm/utils/time.js.map +1 -0
- package/dist/esm/utils/wireEncoding.d.ts +72 -0
- package/dist/esm/utils/wireEncoding.d.ts.map +1 -0
- package/dist/esm/utils/wireEncoding.js +129 -0
- package/dist/esm/utils/wireEncoding.js.map +1 -0
- package/dist/esm/websocket/LighterWsProvider.d.ts +97 -0
- package/dist/esm/websocket/LighterWsProvider.d.ts.map +1 -0
- package/dist/esm/websocket/LighterWsProvider.js +489 -0
- package/dist/esm/websocket/LighterWsProvider.js.map +1 -0
- package/dist/types/LighterProvider.d.ts +105 -0
- package/dist/types/LighterProvider.d.ts.map +1 -0
- package/dist/types/accountConfig.d.ts +14 -0
- package/dist/types/accountConfig.d.ts.map +1 -0
- package/dist/types/accountSummary.d.ts +12 -0
- package/dist/types/accountSummary.d.ts.map +1 -0
- package/dist/types/constants.d.ts +74 -0
- package/dist/types/constants.d.ts.map +1 -0
- package/dist/types/index.d.ts +22 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/signers/LighterKeyStore.d.ts +24 -0
- package/dist/types/signers/LighterKeyStore.d.ts.map +1 -0
- package/dist/types/signers/LighterReadOnlyTokenManager.d.ts +157 -0
- package/dist/types/signers/LighterReadOnlyTokenManager.d.ts.map +1 -0
- package/dist/types/signers/LighterSigner.d.ts +94 -0
- package/dist/types/signers/LighterSigner.d.ts.map +1 -0
- package/dist/types/signers/createAuthToken.d.ts +36 -0
- package/dist/types/signers/createAuthToken.d.ts.map +1 -0
- package/dist/types/signers/index.d.ts +11 -0
- package/dist/types/signers/index.d.ts.map +1 -0
- package/dist/types/signers/signActions.d.ts +54 -0
- package/dist/types/signers/signActions.d.ts.map +1 -0
- package/dist/types/signers/wasmLoader.d.ts +79 -0
- package/dist/types/signers/wasmLoader.d.ts.map +1 -0
- package/dist/types/types/account.d.ts +113 -0
- package/dist/types/types/account.d.ts.map +1 -0
- package/dist/types/types/action.d.ts +146 -0
- package/dist/types/types/action.d.ts.map +1 -0
- package/dist/types/types/activity.d.ts +83 -0
- package/dist/types/types/activity.d.ts.map +1 -0
- package/dist/types/types/asset.d.ts +134 -0
- package/dist/types/types/asset.d.ts.map +1 -0
- package/dist/types/types/fill.d.ts +31 -0
- package/dist/types/types/fill.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +9 -0
- package/dist/types/types/index.d.ts.map +1 -0
- package/dist/types/types/order.d.ts +61 -0
- package/dist/types/types/order.d.ts.map +1 -0
- package/dist/types/types/submit.d.ts +76 -0
- package/dist/types/types/submit.d.ts.map +1 -0
- package/dist/types/types/ws.d.ts +124 -0
- package/dist/types/types/ws.d.ts.map +1 -0
- package/dist/types/utils/activityCursor.d.ts +51 -0
- package/dist/types/utils/activityCursor.d.ts.map +1 -0
- package/dist/types/utils/apiClient.d.ts +65 -0
- package/dist/types/utils/apiClient.d.ts.map +1 -0
- package/dist/types/utils/fetchDetailedAccount.d.ts +11 -0
- package/dist/types/utils/fetchDetailedAccount.d.ts.map +1 -0
- package/dist/types/utils/index.d.ts +16 -0
- package/dist/types/utils/index.d.ts.map +1 -0
- package/dist/types/utils/lighterAsset.d.ts +4 -0
- package/dist/types/utils/lighterAsset.d.ts.map +1 -0
- package/dist/types/utils/liquidation.d.ts +22 -0
- package/dist/types/utils/liquidation.d.ts.map +1 -0
- package/dist/types/utils/mapFill.d.ts +10 -0
- package/dist/types/utils/mapFill.d.ts.map +1 -0
- package/dist/types/utils/mapOpenPositions.d.ts +11 -0
- package/dist/types/utils/mapOpenPositions.d.ts.map +1 -0
- package/dist/types/utils/mapOrder.d.ts +72 -0
- package/dist/types/utils/mapOrder.d.ts.map +1 -0
- package/dist/types/utils/mapPosition.d.ts +9 -0
- package/dist/types/utils/mapPosition.d.ts.map +1 -0
- package/dist/types/utils/ohlcvInterval.d.ts +3 -0
- package/dist/types/utils/ohlcvInterval.d.ts.map +1 -0
- package/dist/types/utils/orderFormatting.d.ts +29 -0
- package/dist/types/utils/orderFormatting.d.ts.map +1 -0
- package/dist/types/utils/time.d.ts +5 -0
- package/dist/types/utils/time.d.ts.map +1 -0
- package/dist/types/utils/wireEncoding.d.ts +72 -0
- package/dist/types/utils/wireEncoding.d.ts.map +1 -0
- package/dist/types/websocket/LighterWsProvider.d.ts +97 -0
- package/dist/types/websocket/LighterWsProvider.d.ts.map +1 -0
- package/dist/wasm/lighter-signer.wasm +0 -0
- package/dist/wasm/wasm_exec.js +575 -0
- package/package.json +67 -0
- package/src/LighterProvider.ts +1167 -0
- package/src/accountConfig.ts +162 -0
- package/src/accountSummary.ts +22 -0
- package/src/constants.ts +89 -0
- package/src/index.ts +37 -0
- package/src/signers/LighterKeyStore.ts +79 -0
- package/src/signers/LighterReadOnlyTokenManager.ts +340 -0
- package/src/signers/LighterSigner.ts +400 -0
- package/src/signers/createAuthToken.ts +69 -0
- package/src/signers/index.ts +36 -0
- package/src/signers/signActions.ts +311 -0
- package/src/signers/wasmLoader.ts +293 -0
- package/src/types/account.ts +123 -0
- package/src/types/action.ts +163 -0
- package/src/types/activity.ts +94 -0
- package/src/types/asset.ts +146 -0
- package/src/types/fill.ts +42 -0
- package/src/types/index.ts +12 -0
- package/src/types/order.ts +65 -0
- package/src/types/submit.ts +83 -0
- package/src/types/ws.ts +136 -0
- package/src/utils/activityCursor.ts +150 -0
- package/src/utils/apiClient.ts +185 -0
- package/src/utils/fetchDetailedAccount.ts +46 -0
- package/src/utils/index.ts +38 -0
- package/src/utils/lighterAsset.ts +10 -0
- package/src/utils/liquidation.ts +39 -0
- package/src/utils/mapFill.ts +108 -0
- package/src/utils/mapOpenPositions.ts +18 -0
- package/src/utils/mapOrder.ts +258 -0
- package/src/utils/mapPosition.ts +42 -0
- package/src/utils/ohlcvInterval.ts +34 -0
- package/src/utils/orderFormatting.ts +46 -0
- package/src/utils/time.ts +6 -0
- package/src/utils/wireEncoding.ts +179 -0
- package/src/websocket/LighterWsProvider.ts +725 -0
- package/wasm/lighter-signer.wasm +0 -0
- package/wasm/wasm_exec.js +575 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type ActivityItem } from '@lifi/perps-types';
|
|
2
|
+
/**
|
|
3
|
+
* Per-endpoint cursor envelope for Lighter activity pagination.
|
|
4
|
+
*
|
|
5
|
+
* Each key holds the upstream `cursor` / `next_cursor` returned by that
|
|
6
|
+
* endpoint on the previous call. When a key is **present** with a non-empty
|
|
7
|
+
* string the corresponding endpoint will be re-fetched at that cursor on the
|
|
8
|
+
* next call; when a key is **absent** the endpoint is treated as exhausted
|
|
9
|
+
* (or never paged because the type filter excluded it) and skipped.
|
|
10
|
+
*
|
|
11
|
+
* The envelope is round-tripped through `cursor` as base64url JSON so callers
|
|
12
|
+
* don't need to know the per-endpoint shape. The encoding mirrors the LI.FI
|
|
13
|
+
* backend's wire format so cursors created by the backend remain usable.
|
|
14
|
+
* @public
|
|
15
|
+
*/
|
|
16
|
+
export interface LighterActivityCursor {
|
|
17
|
+
deposits?: string;
|
|
18
|
+
withdraws?: string;
|
|
19
|
+
fundings?: string;
|
|
20
|
+
liquidations?: string;
|
|
21
|
+
transfers?: string;
|
|
22
|
+
/**
|
|
23
|
+
* Already-fetched, merged-and-sorted rows that did not fit under the page
|
|
24
|
+
* `limit`. The upstream cursors above have advanced past these rows, so they
|
|
25
|
+
* are replayed (prepended) on the next page before any fresh fetch — without
|
|
26
|
+
* them the tail would be lost forever.
|
|
27
|
+
*/
|
|
28
|
+
overflow?: ActivityItem[];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Encode a `LighterActivityCursor` as the base64url-of-JSON cursor string
|
|
32
|
+
* Lighter widgets persist between activity pages. Returns `undefined` when
|
|
33
|
+
* every per-endpoint key is empty and no `overflow` rows remain — the caller
|
|
34
|
+
* should report `hasMore: false` and omit `cursor` from `Pagination` then.
|
|
35
|
+
*
|
|
36
|
+
* Browser-direct: `Buffer` is Node-only. We use `btoa` over a Latin-1
|
|
37
|
+
* encoding of the UTF-8 bytes and then rewrite `+/=` to base64url. This is
|
|
38
|
+
* the same byte sequence Node's `Buffer.from(json, 'utf8').toString('base64url')`
|
|
39
|
+
* produces, so cursors round-trip across environments.
|
|
40
|
+
* @public
|
|
41
|
+
*/
|
|
42
|
+
export declare const encodeActivityCursor: (env: LighterActivityCursor) => string | undefined;
|
|
43
|
+
/**
|
|
44
|
+
* Decode a previously-encoded activity cursor. Returns `undefined` for an
|
|
45
|
+
* absent cursor (first page) and throws {@link PerpsError} with
|
|
46
|
+
* `ValidationError` if the string is malformed — we'd rather fail loudly than
|
|
47
|
+
* silently re-page from page 1 and re-deliver already-paginated rows.
|
|
48
|
+
* @public
|
|
49
|
+
*/
|
|
50
|
+
export declare const decodeActivityCursor: (cursor: string | undefined) => LighterActivityCursor | undefined;
|
|
51
|
+
//# sourceMappingURL=activityCursor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activityCursor.d.ts","sourceRoot":"","sources":["../../../src/utils/activityCursor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,YAAY,EAAkB,MAAM,mBAAmB,CAAA;AAErE;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAA;CAC1B;AAaD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,oBAAoB,GAC/B,KAAK,qBAAqB,KACzB,MAAM,GAAG,SAcX,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAC/B,QAAQ,MAAM,GAAG,SAAS,KACzB,qBAAqB,GAAG,SA6C1B,CAAA"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { PerpsError } from '@lifi/perps-sdk';
|
|
2
|
+
import { PerpsErrorCode } from '@lifi/perps-types';
|
|
3
|
+
const CURSOR_KEYS = [
|
|
4
|
+
'deposits',
|
|
5
|
+
'withdraws',
|
|
6
|
+
'fundings',
|
|
7
|
+
'liquidations',
|
|
8
|
+
'transfers',
|
|
9
|
+
];
|
|
10
|
+
const isNonEmpty = (v) => typeof v === 'string' && v.length > 0;
|
|
11
|
+
/**
|
|
12
|
+
* Encode a `LighterActivityCursor` as the base64url-of-JSON cursor string
|
|
13
|
+
* Lighter widgets persist between activity pages. Returns `undefined` when
|
|
14
|
+
* every per-endpoint key is empty and no `overflow` rows remain — the caller
|
|
15
|
+
* should report `hasMore: false` and omit `cursor` from `Pagination` then.
|
|
16
|
+
*
|
|
17
|
+
* Browser-direct: `Buffer` is Node-only. We use `btoa` over a Latin-1
|
|
18
|
+
* encoding of the UTF-8 bytes and then rewrite `+/=` to base64url. This is
|
|
19
|
+
* the same byte sequence Node's `Buffer.from(json, 'utf8').toString('base64url')`
|
|
20
|
+
* produces, so cursors round-trip across environments.
|
|
21
|
+
* @public
|
|
22
|
+
*/
|
|
23
|
+
export const encodeActivityCursor = (env) => {
|
|
24
|
+
const compact = {};
|
|
25
|
+
for (const key of CURSOR_KEYS) {
|
|
26
|
+
if (isNonEmpty(env[key])) {
|
|
27
|
+
compact[key] = env[key];
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (env.overflow !== undefined && env.overflow.length > 0) {
|
|
31
|
+
compact.overflow = env.overflow;
|
|
32
|
+
}
|
|
33
|
+
if (Object.keys(compact).length === 0) {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
return toBase64Url(JSON.stringify(compact));
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Decode a previously-encoded activity cursor. Returns `undefined` for an
|
|
40
|
+
* absent cursor (first page) and throws {@link PerpsError} with
|
|
41
|
+
* `ValidationError` if the string is malformed — we'd rather fail loudly than
|
|
42
|
+
* silently re-page from page 1 and re-deliver already-paginated rows.
|
|
43
|
+
* @public
|
|
44
|
+
*/
|
|
45
|
+
export const decodeActivityCursor = (cursor) => {
|
|
46
|
+
if (cursor === undefined) {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
let parsed;
|
|
50
|
+
try {
|
|
51
|
+
parsed = JSON.parse(fromBase64Url(cursor));
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
throw new PerpsError(PerpsErrorCode.ValidationError, 'Invalid Lighter activity cursor: not base64url-encoded JSON');
|
|
55
|
+
}
|
|
56
|
+
if (parsed === null || typeof parsed !== 'object') {
|
|
57
|
+
throw new PerpsError(PerpsErrorCode.ValidationError, 'Invalid Lighter activity cursor: expected JSON object');
|
|
58
|
+
}
|
|
59
|
+
const cursorRecord = parsed;
|
|
60
|
+
const env = {};
|
|
61
|
+
for (const key of CURSOR_KEYS) {
|
|
62
|
+
const v = cursorRecord[key];
|
|
63
|
+
if (v === undefined) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (typeof v !== 'string') {
|
|
67
|
+
throw new PerpsError(PerpsErrorCode.ValidationError, `Invalid Lighter activity cursor: ${key} must be a string`);
|
|
68
|
+
}
|
|
69
|
+
env[key] = v;
|
|
70
|
+
}
|
|
71
|
+
const overflow = cursorRecord.overflow;
|
|
72
|
+
if (overflow !== undefined) {
|
|
73
|
+
if (!Array.isArray(overflow)) {
|
|
74
|
+
throw new PerpsError(PerpsErrorCode.ValidationError, 'Invalid Lighter activity cursor: overflow must be an array');
|
|
75
|
+
}
|
|
76
|
+
env.overflow = overflow;
|
|
77
|
+
}
|
|
78
|
+
return env;
|
|
79
|
+
};
|
|
80
|
+
const toBase64Url = (s) => {
|
|
81
|
+
if (typeof Buffer !== 'undefined') {
|
|
82
|
+
return Buffer.from(s, 'utf8').toString('base64url');
|
|
83
|
+
}
|
|
84
|
+
const utf8 = unescape(encodeURIComponent(s));
|
|
85
|
+
return btoa(utf8).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
|
86
|
+
};
|
|
87
|
+
const fromBase64Url = (s) => {
|
|
88
|
+
if (typeof Buffer !== 'undefined') {
|
|
89
|
+
return Buffer.from(s, 'base64url').toString('utf8');
|
|
90
|
+
}
|
|
91
|
+
const padded = s.replace(/-/g, '+').replace(/_/g, '/') + padFor(s);
|
|
92
|
+
const decoded = atob(padded);
|
|
93
|
+
return decodeURIComponent(escape(decoded));
|
|
94
|
+
};
|
|
95
|
+
const padFor = (s) => {
|
|
96
|
+
const rem = s.length % 4;
|
|
97
|
+
return rem === 0 ? '' : '='.repeat(4 - rem);
|
|
98
|
+
};
|
|
99
|
+
//# sourceMappingURL=activityCursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activityCursor.js","sourceRoot":"","sources":["../../../src/utils/activityCursor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { PerpsError, type ResolvedRetryPolicy } from '@lifi/perps-sdk';
|
|
2
|
+
/** @internal */
|
|
3
|
+
export type ApiParams = Record<string, string | number | boolean>;
|
|
4
|
+
/**
|
|
5
|
+
* Auth-gated read whose token Lighter rejected. Distinct from a generic
|
|
6
|
+
* {@link PerpsError} so callers can evict the stored read-only token and retry
|
|
7
|
+
* with a freshly-created one. Lighter signals this on either channel: an HTTP
|
|
8
|
+
* 401/403, or an HTTP 200 carrying an error `code` in the body.
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
export declare class LighterAuthRejectedError extends PerpsError {
|
|
12
|
+
}
|
|
13
|
+
/** @internal */
|
|
14
|
+
export declare const LIGHTER_RETRY_DEFAULTS: ResolvedRetryPolicy;
|
|
15
|
+
/** @internal */
|
|
16
|
+
export interface LighterApiClientOptions {
|
|
17
|
+
signal?: AbortSignal;
|
|
18
|
+
policy?: ResolvedRetryPolicy;
|
|
19
|
+
fetchImpl?: typeof fetch;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* HTTP boundary against Lighter's REST API.
|
|
23
|
+
*
|
|
24
|
+
* Browser-direct by design: no LI.FI backend hop, no caching shim — caller
|
|
25
|
+
* supplies the REST base URL, the path, and any query params, and we return
|
|
26
|
+
* the parsed JSON body. Lighter advertises CORS headers on every public
|
|
27
|
+
* endpoint so a vanilla `fetch` from the widget works.
|
|
28
|
+
*
|
|
29
|
+
* Auth-gated endpoints (accountLimits, accountActiveOrders, deposit/history,
|
|
30
|
+
* withdraw/history, positionFunding, liquidations, transfer/history) take the
|
|
31
|
+
* Lighter read-only token as the `auth` query parameter — NOT as an
|
|
32
|
+
* `Authorization` header. This matches Lighter's OpenAPI spec and lets the
|
|
33
|
+
* same call work browser-direct and from server-side proxies.
|
|
34
|
+
*
|
|
35
|
+
* Lighter signals rate limiting via 429 OR 405 (documented behaviour) with a
|
|
36
|
+
* documented 60s firewall cooldown. The default {@link ResolvedRetryPolicy}
|
|
37
|
+
* waits long enough to avoid hammering through the cooldown.
|
|
38
|
+
* @public
|
|
39
|
+
*/
|
|
40
|
+
export declare class LighterApiClient {
|
|
41
|
+
private readonly baseUrl;
|
|
42
|
+
private readonly signal;
|
|
43
|
+
private readonly policy;
|
|
44
|
+
private readonly fetchImpl;
|
|
45
|
+
constructor(baseUrl: string, options?: LighterApiClientOptions);
|
|
46
|
+
private buildUrl;
|
|
47
|
+
get<T>(path: string, params?: ApiParams): Promise<T>;
|
|
48
|
+
/**
|
|
49
|
+
* Auth-gated GET. The token is appended as the `auth` query parameter (per
|
|
50
|
+
* Lighter's OpenAPI spec); the `Authorization` header is intentionally NOT
|
|
51
|
+
* used — Lighter rejects it.
|
|
52
|
+
*/
|
|
53
|
+
getAuthed<T>(path: string, authToken: string, params?: ApiParams): Promise<T>;
|
|
54
|
+
/**
|
|
55
|
+
* GET that surfaces the raw `{status, body}` pair without throwing on
|
|
56
|
+
* non-2xx — used for endpoints (account lookup by L1 address) where the
|
|
57
|
+
* caller distinguishes specific Lighter error codes from generic failures.
|
|
58
|
+
*/
|
|
59
|
+
getWithStatus<T>(path: string, params?: ApiParams): Promise<{
|
|
60
|
+
status: number;
|
|
61
|
+
data: T;
|
|
62
|
+
}>;
|
|
63
|
+
private getChecked;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=apiClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiClient.d.ts","sourceRoot":"","sources":["../../../src/utils/apiClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,EACV,KAAK,mBAAmB,EACzB,MAAM,iBAAiB,CAAA;AAOxB,gBAAgB;AAChB,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAA;AAejE;;;;;;GAMG;AACH,qBAAa,wBAAyB,SAAQ,UAAU;CAAG;AAO3D,gBAAgB;AAChB,eAAO,MAAM,sBAAsB,EAAE,mBAmBpC,CAAA;AAED,gBAAgB;AAChB,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,MAAM,CAAC,EAAE,mBAAmB,CAAA;IAC5B,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CACzB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;gBAExC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,uBAAuB;IAO9D,OAAO,CAAC,QAAQ;IAaV,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC;IAI1D;;;;OAIG;IACG,SAAS,CAAC,CAAC,EACf,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,SAAc,GACrB,OAAO,CAAC,CAAC,CAAC;IAoBb;;;;OAIG;IACG,aAAa,CAAC,CAAC,EACnB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,CAAC,CAAA;KAAE,CAAC;YAWzB,UAAU;CAiBzB"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { fetchWithRetry, PerpsError, } from '@lifi/perps-sdk';
|
|
2
|
+
import { PerpsErrorCode } from '@lifi/perps-types';
|
|
3
|
+
import { LIGHTER_INVALID_AUTH_CODE, LIGHTER_SUCCESS_CODES, } from '../constants.js';
|
|
4
|
+
/**
|
|
5
|
+
* Lighter signals errors on two channels: a non-2xx HTTP status, or an HTTP 200
|
|
6
|
+
* carrying an error `code` in the JSON body. Returns the body error `code` when
|
|
7
|
+
* the body advertises one that is not a success code, else `undefined`.
|
|
8
|
+
*/
|
|
9
|
+
const lighterBodyErrorCode = (data) => {
|
|
10
|
+
const code = data?.code;
|
|
11
|
+
if (code === undefined || LIGHTER_SUCCESS_CODES.has(code)) {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
return code;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Auth-gated read whose token Lighter rejected. Distinct from a generic
|
|
18
|
+
* {@link PerpsError} so callers can evict the stored read-only token and retry
|
|
19
|
+
* with a freshly-created one. Lighter signals this on either channel: an HTTP
|
|
20
|
+
* 401/403, or an HTTP 200 carrying an error `code` in the body.
|
|
21
|
+
* @internal
|
|
22
|
+
*/
|
|
23
|
+
export class LighterAuthRejectedError extends PerpsError {
|
|
24
|
+
}
|
|
25
|
+
const isLighterAuthRejection = (status, data) => status === 401 ||
|
|
26
|
+
status === 403 ||
|
|
27
|
+
lighterBodyErrorCode(data) === LIGHTER_INVALID_AUTH_CODE;
|
|
28
|
+
/** @internal */
|
|
29
|
+
export const LIGHTER_RETRY_DEFAULTS = {
|
|
30
|
+
enabled: true,
|
|
31
|
+
maxAttempts: 2,
|
|
32
|
+
baseDelayMs: 10_000,
|
|
33
|
+
maxDelayMs: 60_000,
|
|
34
|
+
respectRetryAfter: true,
|
|
35
|
+
classify: ({ response }) => {
|
|
36
|
+
if (response.status === 429 || response.status === 405) {
|
|
37
|
+
return 'retry-rate-limit';
|
|
38
|
+
}
|
|
39
|
+
if (response.status === 502 ||
|
|
40
|
+
response.status === 503 ||
|
|
41
|
+
response.status === 504) {
|
|
42
|
+
return 'retry-server';
|
|
43
|
+
}
|
|
44
|
+
return 'fail';
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* HTTP boundary against Lighter's REST API.
|
|
49
|
+
*
|
|
50
|
+
* Browser-direct by design: no LI.FI backend hop, no caching shim — caller
|
|
51
|
+
* supplies the REST base URL, the path, and any query params, and we return
|
|
52
|
+
* the parsed JSON body. Lighter advertises CORS headers on every public
|
|
53
|
+
* endpoint so a vanilla `fetch` from the widget works.
|
|
54
|
+
*
|
|
55
|
+
* Auth-gated endpoints (accountLimits, accountActiveOrders, deposit/history,
|
|
56
|
+
* withdraw/history, positionFunding, liquidations, transfer/history) take the
|
|
57
|
+
* Lighter read-only token as the `auth` query parameter — NOT as an
|
|
58
|
+
* `Authorization` header. This matches Lighter's OpenAPI spec and lets the
|
|
59
|
+
* same call work browser-direct and from server-side proxies.
|
|
60
|
+
*
|
|
61
|
+
* Lighter signals rate limiting via 429 OR 405 (documented behaviour) with a
|
|
62
|
+
* documented 60s firewall cooldown. The default {@link ResolvedRetryPolicy}
|
|
63
|
+
* waits long enough to avoid hammering through the cooldown.
|
|
64
|
+
* @public
|
|
65
|
+
*/
|
|
66
|
+
export class LighterApiClient {
|
|
67
|
+
baseUrl;
|
|
68
|
+
signal;
|
|
69
|
+
policy;
|
|
70
|
+
fetchImpl;
|
|
71
|
+
constructor(baseUrl, options) {
|
|
72
|
+
this.baseUrl = baseUrl.replace(/\/$/, '');
|
|
73
|
+
this.signal = options?.signal;
|
|
74
|
+
this.policy = options?.policy ?? LIGHTER_RETRY_DEFAULTS;
|
|
75
|
+
this.fetchImpl = options?.fetchImpl;
|
|
76
|
+
}
|
|
77
|
+
buildUrl(path, params) {
|
|
78
|
+
const url = `${this.baseUrl}${path}`;
|
|
79
|
+
if (!params || Object.keys(params).length === 0) {
|
|
80
|
+
return url;
|
|
81
|
+
}
|
|
82
|
+
const qs = Object.entries(params)
|
|
83
|
+
.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)
|
|
84
|
+
.join('&');
|
|
85
|
+
return `${url}?${qs}`;
|
|
86
|
+
}
|
|
87
|
+
async get(path, params) {
|
|
88
|
+
return this.getChecked(path, params);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Auth-gated GET. The token is appended as the `auth` query parameter (per
|
|
92
|
+
* Lighter's OpenAPI spec); the `Authorization` header is intentionally NOT
|
|
93
|
+
* used — Lighter rejects it.
|
|
94
|
+
*/
|
|
95
|
+
async getAuthed(path, authToken, params = {}) {
|
|
96
|
+
const { status, data } = await this.getWithStatus(path, {
|
|
97
|
+
...params,
|
|
98
|
+
auth: authToken,
|
|
99
|
+
});
|
|
100
|
+
if (isLighterAuthRejection(status, data)) {
|
|
101
|
+
throw new LighterAuthRejectedError(PerpsErrorCode.ThirdPartyError, `Lighter rejected the auth token for ${path}`);
|
|
102
|
+
}
|
|
103
|
+
if (status < 200 || status >= 300) {
|
|
104
|
+
throw new PerpsError(PerpsErrorCode.ThirdPartyError, `Lighter API request failed: ${status} — ${JSON.stringify(data).slice(0, 200)}`);
|
|
105
|
+
}
|
|
106
|
+
return data;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* GET that surfaces the raw `{status, body}` pair without throwing on
|
|
110
|
+
* non-2xx — used for endpoints (account lookup by L1 address) where the
|
|
111
|
+
* caller distinguishes specific Lighter error codes from generic failures.
|
|
112
|
+
*/
|
|
113
|
+
async getWithStatus(path, params) {
|
|
114
|
+
const url = this.buildUrl(path, params);
|
|
115
|
+
const response = await fetchWithRetry(url, {}, { policy: this.policy, fetchImpl: this.fetchImpl, signal: this.signal });
|
|
116
|
+
const data = (await response.json().catch(() => undefined));
|
|
117
|
+
return { status: response.status, data };
|
|
118
|
+
}
|
|
119
|
+
async getChecked(path, params) {
|
|
120
|
+
const { status, data } = await this.getWithStatus(path, params);
|
|
121
|
+
if (status < 200 || status >= 300) {
|
|
122
|
+
throw new PerpsError(PerpsErrorCode.ThirdPartyError, `Lighter API request failed: ${status} — ${JSON.stringify(data).slice(0, 200)}`);
|
|
123
|
+
}
|
|
124
|
+
const errorCode = lighterBodyErrorCode(data);
|
|
125
|
+
if (errorCode !== undefined) {
|
|
126
|
+
throw new PerpsError(PerpsErrorCode.ThirdPartyError, `Lighter API error for ${path}: code ${errorCode} — ${JSON.stringify(data).slice(0, 200)}`);
|
|
127
|
+
}
|
|
128
|
+
return data;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=apiClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiClient.js","sourceRoot":"","sources":["../../../src/utils/apiClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Address } from 'viem';
|
|
2
|
+
import type { LtDetailedAccount } from '../types/index.js';
|
|
3
|
+
import type { LighterApiClient } from './apiClient.js';
|
|
4
|
+
/**
|
|
5
|
+
* Look up the Lighter account for an L1 address via `/api/v1/account`,
|
|
6
|
+
* discriminating Lighter's account-not-found body code from generic failures.
|
|
7
|
+
*
|
|
8
|
+
* @public
|
|
9
|
+
*/
|
|
10
|
+
export declare const fetchDetailedAccount: (client: LighterApiClient, address: Address) => Promise<LtDetailedAccount>;
|
|
11
|
+
//# sourceMappingURL=fetchDetailedAccount.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetchDetailedAccount.d.ts","sourceRoot":"","sources":["../../../src/utils/fetchDetailedAccount.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAEnC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAEtD;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAC/B,QAAQ,gBAAgB,EACxB,SAAS,OAAO,KACf,OAAO,CAAC,iBAAiB,CA6B3B,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { PerpsError } from '@lifi/perps-sdk';
|
|
2
|
+
import { PerpsErrorCode } from '@lifi/perps-types';
|
|
3
|
+
import { LIGHTER_CODE_ACCOUNT_NOT_FOUND } from '../constants.js';
|
|
4
|
+
/**
|
|
5
|
+
* Look up the Lighter account for an L1 address via `/api/v1/account`,
|
|
6
|
+
* discriminating Lighter's account-not-found body code from generic failures.
|
|
7
|
+
*
|
|
8
|
+
* @public
|
|
9
|
+
*/
|
|
10
|
+
export const fetchDetailedAccount = async (client, address) => {
|
|
11
|
+
const { status, data } = await client.getWithStatus('/api/v1/account', { by: 'l1_address', value: address });
|
|
12
|
+
if (status === 400 && data?.code === LIGHTER_CODE_ACCOUNT_NOT_FOUND) {
|
|
13
|
+
throw new PerpsError(PerpsErrorCode.AccountNotFound, `No Lighter account found for address: ${address}`);
|
|
14
|
+
}
|
|
15
|
+
if (status < 200 || status >= 300) {
|
|
16
|
+
throw new PerpsError(PerpsErrorCode.ThirdPartyError, `Lighter account request failed: ${status} — ${JSON.stringify(data).slice(0, 200)}`);
|
|
17
|
+
}
|
|
18
|
+
const accounts = data?.accounts;
|
|
19
|
+
if (accounts === undefined || accounts.length === 0) {
|
|
20
|
+
throw new PerpsError(PerpsErrorCode.AccountNotFound, `No Lighter account found for address: ${address}`);
|
|
21
|
+
}
|
|
22
|
+
return accounts[0];
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=fetchDetailedAccount.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetchDetailedAccount.js","sourceRoot":"","sources":["../../../src/utils/fetchDetailedAccount.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAElD,OAAO,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAA;AAIhE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EACvC,MAAwB,EACxB,OAAgB,EACY,EAAE;IAC9B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAIhD,iBAAiB,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;IAE3D,IAAI,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,8BAA8B,EAAE,CAAC;QACpE,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,eAAe,EAC9B,yCAAyC,OAAO,EAAE,CACnD,CAAA;IACH,CAAC;IAED,IAAI,MAAM,GAAG,GAAG,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;QAClC,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,eAAe,EAC9B,mCAAmC,MAAM,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CACpF,CAAA;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,CAAA;IAC/B,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,eAAe,EAC9B,yCAAyC,OAAO,EAAE,CACnD,CAAA;IACH,CAAC;IACD,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAA;AACpB,CAAC,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type { LighterActivityCursor } from './activityCursor.js';
|
|
2
|
+
export { decodeActivityCursor, encodeActivityCursor, } from './activityCursor.js';
|
|
3
|
+
export { LighterApiClient } from './apiClient.js';
|
|
4
|
+
export { fetchDetailedAccount } from './fetchDetailedAccount.js';
|
|
5
|
+
export { lighterAsset } from './lighterAsset.js';
|
|
6
|
+
export { estimateLiquidationPrice } from './liquidation.js';
|
|
7
|
+
export { mapFill } from './mapFill.js';
|
|
8
|
+
export { mapOpenPositions } from './mapOpenPositions.js';
|
|
9
|
+
export { classifyAndMapOrders, isTriggerOrder, isTriggerType, mapOrder, mapOrderDetail, mapStatusReason, mapTriggerOrder, } from './mapOrder.js';
|
|
10
|
+
export { mapPosition } from './mapPosition.js';
|
|
11
|
+
export { mapInterval } from './ohlcvInterval.js';
|
|
12
|
+
export { formatOrderPrice, formatOrderSize } from './orderFormatting.js';
|
|
13
|
+
export { toIsoFromMs, toIsoFromSeconds } from './time.js';
|
|
14
|
+
export type { ScaleToIntegerPolicy } from './wireEncoding.js';
|
|
15
|
+
export { leverageToFraction, mapOrderTypeToInt, mapTimeInForceToInt, marginFractionToMaxLeverage, orderExpiryForTif, resolveTimeInForce, scaleToInteger, } from './wireEncoding.js';
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAIA,YAAY,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,EACL,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,aAAa,EACb,QAAQ,EACR,cAAc,EACd,eAAe,EACf,eAAe,GAChB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACxE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AACzD,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,2BAA2B,EAC3B,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,GACf,MAAM,mBAAmB,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// biome-ignore-all lint/performance/noBarrelFile: single re-export entry point
|
|
2
|
+
// for the package's utility surface. Internal modules import per-file paths
|
|
3
|
+
// (e.g. `./apiClient.js`, `./mapFill.js`) directly.
|
|
4
|
+
export { decodeActivityCursor, encodeActivityCursor, } from './activityCursor.js';
|
|
5
|
+
export { LighterApiClient } from './apiClient.js';
|
|
6
|
+
export { fetchDetailedAccount } from './fetchDetailedAccount.js';
|
|
7
|
+
export { lighterAsset } from './lighterAsset.js';
|
|
8
|
+
export { estimateLiquidationPrice } from './liquidation.js';
|
|
9
|
+
export { mapFill } from './mapFill.js';
|
|
10
|
+
export { mapOpenPositions } from './mapOpenPositions.js';
|
|
11
|
+
export { classifyAndMapOrders, isTriggerOrder, isTriggerType, mapOrder, mapOrderDetail, mapStatusReason, mapTriggerOrder, } from './mapOrder.js';
|
|
12
|
+
export { mapPosition } from './mapPosition.js';
|
|
13
|
+
export { mapInterval } from './ohlcvInterval.js';
|
|
14
|
+
export { formatOrderPrice, formatOrderSize } from './orderFormatting.js';
|
|
15
|
+
export { toIsoFromMs, toIsoFromSeconds } from './time.js';
|
|
16
|
+
export { leverageToFraction, mapOrderTypeToInt, mapTimeInForceToInt, marginFractionToMaxLeverage, orderExpiryForTif, resolveTimeInForce, scaleToInteger, } from './wireEncoding.js';
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,4EAA4E;AAC5E,oDAAoD;AAGpD,OAAO,EACL,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,aAAa,EACb,QAAQ,EACR,cAAc,EACd,eAAe,EACf,eAAe,GAChB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACxE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAEzD,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,2BAA2B,EAC3B,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,GACf,MAAM,mBAAmB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lighterAsset.d.ts","sourceRoot":"","sources":["../../../src/utils/lighterAsset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAG9C,cAAc;AACd,eAAO,MAAM,YAAY,GAAI,IAAI,MAAM,EAAE,eAAe,MAAM,KAAG,KAK/D,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lighterAsset.js","sourceRoot":"","sources":["../../../src/utils/lighterAsset.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAEtD,cAAc;AACd,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAU,EAAE,aAAqB,EAAS,EAAE,CAAC,CAAC;IACzE,UAAU,EAAE,oBAAoB;IAChC,EAAE;IACF,aAAa;IACb,OAAO,EAAE,EAAE;CACZ,CAAC,CAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lighter liquidation price estimation.
|
|
3
|
+
*
|
|
4
|
+
* Lighter publishes a flat per-market `maintenance_margin_fraction` on its
|
|
5
|
+
* order books, surfaced on the generic {@link PerpsMarket} as
|
|
6
|
+
* `maintenanceMarginRate`. The estimate is the standard isolated-margin
|
|
7
|
+
* model parameterised by that rate.
|
|
8
|
+
*/
|
|
9
|
+
import { type LiquidationEstimateParams } from '@lifi/perps-sdk';
|
|
10
|
+
import type { PerpsMarket } from '@lifi/perps-types';
|
|
11
|
+
/**
|
|
12
|
+
* Estimate the liquidation price of a new isolated position on a Lighter
|
|
13
|
+
* market.
|
|
14
|
+
*
|
|
15
|
+
* @returns The estimated liquidation price, or `undefined` when
|
|
16
|
+
* `market.maintenanceMarginRate` is absent (the model cannot be evaluated
|
|
17
|
+
* without the venue's maintenance margin rate) or the inputs are
|
|
18
|
+
* degenerate.
|
|
19
|
+
* @public
|
|
20
|
+
*/
|
|
21
|
+
export declare function estimateLiquidationPrice(market: PerpsMarket, params: LiquidationEstimateParams): number | undefined;
|
|
22
|
+
//# sourceMappingURL=liquidation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"liquidation.d.ts","sourceRoot":"","sources":["../../../src/utils/liquidation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAEL,KAAK,yBAAyB,EAC/B,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpD;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,yBAAyB,GAChC,MAAM,GAAG,SAAS,CAUpB"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lighter liquidation price estimation.
|
|
3
|
+
*
|
|
4
|
+
* Lighter publishes a flat per-market `maintenance_margin_fraction` on its
|
|
5
|
+
* order books, surfaced on the generic {@link PerpsMarket} as
|
|
6
|
+
* `maintenanceMarginRate`. The estimate is the standard isolated-margin
|
|
7
|
+
* model parameterised by that rate.
|
|
8
|
+
*/
|
|
9
|
+
import { estimateIsolatedLiquidationPrice, } from '@lifi/perps-sdk';
|
|
10
|
+
/**
|
|
11
|
+
* Estimate the liquidation price of a new isolated position on a Lighter
|
|
12
|
+
* market.
|
|
13
|
+
*
|
|
14
|
+
* @returns The estimated liquidation price, or `undefined` when
|
|
15
|
+
* `market.maintenanceMarginRate` is absent (the model cannot be evaluated
|
|
16
|
+
* without the venue's maintenance margin rate) or the inputs are
|
|
17
|
+
* degenerate.
|
|
18
|
+
* @public
|
|
19
|
+
*/
|
|
20
|
+
export function estimateLiquidationPrice(market, params) {
|
|
21
|
+
if (market.maintenanceMarginRate === undefined) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
return estimateIsolatedLiquidationPrice({
|
|
25
|
+
entryPrice: params.entryPrice,
|
|
26
|
+
leverage: params.leverage,
|
|
27
|
+
isLong: params.isLong,
|
|
28
|
+
maintenanceMarginRate: market.maintenanceMarginRate,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=liquidation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"liquidation.js","sourceRoot":"","sources":["../../../src/utils/liquidation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,gCAAgC,GAEjC,MAAM,iBAAiB,CAAA;AAGxB;;;;;;;;;GASG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAAmB,EACnB,MAAiC;IAEjC,IAAI,MAAM,CAAC,qBAAqB,KAAK,SAAS,EAAE,CAAC;QAC/C,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,OAAO,gCAAgC,CAAC;QACtC,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,qBAAqB,EAAE,MAAM,CAAC,qBAAqB;KACpD,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Fill, MarketDisplay } from '@lifi/perps-types';
|
|
2
|
+
import type { LtTrade } from '../types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Map a raw Lighter trade to the generic Fill type.
|
|
5
|
+
* @param accountIndex - The viewer's Lighter account index (selects buy/sell side and maker/taker role).
|
|
6
|
+
* @param market - Backend-resolved market identity for `trade.market_id`.
|
|
7
|
+
* @public
|
|
8
|
+
*/
|
|
9
|
+
export declare const mapFill: (trade: LtTrade, accountIndex: number, market: MarketDisplay) => Fill;
|
|
10
|
+
//# sourceMappingURL=mapFill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapFill.d.ts","sourceRoot":"","sources":["../../../src/utils/mapFill.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAQ5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAyChD;;;;;GAKG;AACH,eAAO,MAAM,OAAO,GAClB,OAAO,OAAO,EACd,cAAc,MAAM,EACpB,QAAQ,aAAa,KACpB,IA2CF,CAAA"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { classifyFillFromPosition, ExplorerChainId, explorerTxUrl, } from '@lifi/perps-sdk';
|
|
2
|
+
import { FillStatus, LiquidityRole, OrderSide, OrderType, } from '@lifi/perps-types';
|
|
3
|
+
import Big from 'big.js';
|
|
4
|
+
/**
|
|
5
|
+
* Realized PnL on a position-reducing fill, derived from the pre-trade entry
|
|
6
|
+
* basis. Returns `undefined` for opens/increases (nothing closes) or when the
|
|
7
|
+
* entry-quote snapshot is absent, and `null` when the closed portion realizes
|
|
8
|
+
* exactly zero — mirroring the Hyperliquid mapper's `null`-for-zero convention.
|
|
9
|
+
*/
|
|
10
|
+
const deriveRealizedPnl = (startPosition, entryQuoteBefore, fillSize, fillPrice, isBuyer) => {
|
|
11
|
+
if (entryQuoteBefore === undefined) {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
const start = new Big(startPosition);
|
|
15
|
+
if (start.eq(0)) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
const isLong = start.gt(0);
|
|
19
|
+
const reducing = isLong ? !isBuyer : isBuyer;
|
|
20
|
+
if (!reducing) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
const absStart = start.abs();
|
|
24
|
+
const fill = new Big(fillSize);
|
|
25
|
+
// A fill larger than the open size flips the position; only the portion that
|
|
26
|
+
// unwinds the existing position realizes PnL.
|
|
27
|
+
const closedSize = fill.gt(absStart) ? absStart : fill;
|
|
28
|
+
const avgEntry = new Big(entryQuoteBefore).abs().div(absStart);
|
|
29
|
+
const price = new Big(fillPrice);
|
|
30
|
+
const pnl = isLong
|
|
31
|
+
? price.minus(avgEntry).times(closedSize)
|
|
32
|
+
: avgEntry.minus(price).times(closedSize);
|
|
33
|
+
return pnl.eq(0) ? null : pnl.toString();
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Map a raw Lighter trade to the generic Fill type.
|
|
37
|
+
* @param accountIndex - The viewer's Lighter account index (selects buy/sell side and maker/taker role).
|
|
38
|
+
* @param market - Backend-resolved market identity for `trade.market_id`.
|
|
39
|
+
* @public
|
|
40
|
+
*/
|
|
41
|
+
export const mapFill = (trade, accountIndex, market) => {
|
|
42
|
+
const isBuyer = trade.bid_account_id === accountIndex;
|
|
43
|
+
const isMaker = (trade.is_maker_ask && !isBuyer) || (!trade.is_maker_ask && isBuyer);
|
|
44
|
+
// Lighter publishes both counterparties' position-before snapshots on every
|
|
45
|
+
// trade row; reading the wrong one mis-classifies when they differ.
|
|
46
|
+
const startPosition = isMaker
|
|
47
|
+
? trade.maker_position_size_before
|
|
48
|
+
: trade.taker_position_size_before;
|
|
49
|
+
const entryQuoteBefore = isMaker
|
|
50
|
+
? trade.maker_entry_quote_before
|
|
51
|
+
: trade.taker_entry_quote_before;
|
|
52
|
+
return {
|
|
53
|
+
id: trade.trade_id.toString(),
|
|
54
|
+
orderId: String(isBuyer ? trade.bid_id : trade.ask_id),
|
|
55
|
+
market,
|
|
56
|
+
side: isBuyer ? OrderSide.BUY : OrderSide.SELL,
|
|
57
|
+
type: OrderType.LIMIT,
|
|
58
|
+
size: trade.size,
|
|
59
|
+
price: trade.price,
|
|
60
|
+
status: FillStatus.FILLED,
|
|
61
|
+
liquidity: isMaker ? LiquidityRole.MAKER : LiquidityRole.TAKER,
|
|
62
|
+
fee: isMaker ? trade.maker_fee?.toString() : trade.taker_fee?.toString(),
|
|
63
|
+
realizedPnl: deriveRealizedPnl(startPosition, entryQuoteBefore, trade.size, trade.price, isBuyer),
|
|
64
|
+
startPosition,
|
|
65
|
+
// `classifyFillFromPosition` takes an HL-encoded side: `'B'` for buy,
|
|
66
|
+
// anything else for sell.
|
|
67
|
+
classification: classifyFillFromPosition(startPosition, isBuyer ? 'B' : 'A', trade.size),
|
|
68
|
+
createdAt: new Date(trade.timestamp).toISOString(),
|
|
69
|
+
explorerLink: explorerTxUrl(ExplorerChainId.LIGHTER, trade.tx_hash),
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=mapFill.js.map
|