@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,157 @@
|
|
|
1
|
+
import { type StorageAdapter } from '@lifi/perps-sdk';
|
|
2
|
+
import type { ApproveReadOnlyTokenParams, LighterAccountConfig } from '@lifi/perps-types';
|
|
3
|
+
import type { Address } from 'viem';
|
|
4
|
+
/**
|
|
5
|
+
* Default Lighter HTTP host the SDK posts the create request to. Callers
|
|
6
|
+
* pointing at testnet pass an override via {@link LighterReadOnlyTokenManagerOptions.lighterApiUrl}.
|
|
7
|
+
* @public
|
|
8
|
+
*/
|
|
9
|
+
export declare const DEFAULT_LIGHTER_API_URL = "https://mainnet.zklighter.elliot.ai";
|
|
10
|
+
/**
|
|
11
|
+
* Default token name persisted alongside Lighter's `tokens/create` row.
|
|
12
|
+
* Lighter requires a non-empty `name` form field; the literal here is what
|
|
13
|
+
* surfaces in Lighter's UI listing under `app.lighter.xyz/read-only-tokens`.
|
|
14
|
+
* @public
|
|
15
|
+
*/
|
|
16
|
+
export declare const DEFAULT_READ_ONLY_TOKEN_NAME = "LI.FI Perps";
|
|
17
|
+
/**
|
|
18
|
+
* Persisted shape of a Lighter read-only token. The `token` string is
|
|
19
|
+
* Lighter's opaque `ro:{accountIndex}:{scope}:{expiry}:{rand}` bearer; the
|
|
20
|
+
* SDK never parses it — `expiry`/`scope`/`accountIndex` are create-time inputs
|
|
21
|
+
* we keep alongside so consumers can render expiry UX without re-fetching.
|
|
22
|
+
* @public
|
|
23
|
+
*/
|
|
24
|
+
export interface LighterReadOnlyToken {
|
|
25
|
+
/** Opaque bearer string — never parse client-side. */
|
|
26
|
+
token: string;
|
|
27
|
+
/** Unix seconds. The SDK's source of truth for expiry. */
|
|
28
|
+
expiry: number;
|
|
29
|
+
/** Lighter's `single | all` scope literal recorded at create time. */
|
|
30
|
+
scope: 'single' | 'all';
|
|
31
|
+
/** Lighter L2 account index the token authorises. */
|
|
32
|
+
accountIndex: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Lighter `POST /api/v1/tokens/create` response shape (subset). Lighter's
|
|
36
|
+
* OpenAPI documents additional fields (`token_id`, `name`, `revoked`, etc.)
|
|
37
|
+
* we don't need client-side.
|
|
38
|
+
* @public
|
|
39
|
+
*/
|
|
40
|
+
export interface LighterCreateTokenResponse {
|
|
41
|
+
api_token: string;
|
|
42
|
+
account_index: number;
|
|
43
|
+
expiry: number;
|
|
44
|
+
scopes: string;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Function injected for the HTTP boundary against Lighter's `tokens/create`
|
|
48
|
+
* endpoint. Returning a parsed {@link LighterCreateTokenResponse} keeps the
|
|
49
|
+
* create code free of fetch/multipart plumbing and lets tests drop a fixture
|
|
50
|
+
* in without spinning a mock server.
|
|
51
|
+
* @public
|
|
52
|
+
*/
|
|
53
|
+
export type LighterTokenFetcher = (params: {
|
|
54
|
+
url: string;
|
|
55
|
+
authorization: string;
|
|
56
|
+
name: string;
|
|
57
|
+
accountIndex: number;
|
|
58
|
+
expiry: number;
|
|
59
|
+
subAccountAccess: boolean;
|
|
60
|
+
scopes: string;
|
|
61
|
+
}) => Promise<LighterCreateTokenResponse>;
|
|
62
|
+
/** @public */
|
|
63
|
+
export interface LighterReadOnlyTokenManagerOptions {
|
|
64
|
+
storage?: StorageAdapter;
|
|
65
|
+
/** Lighter API host. Defaults to {@link DEFAULT_LIGHTER_API_URL}. */
|
|
66
|
+
lighterApiUrl?: string;
|
|
67
|
+
/** Override the multipart POST. Defaults to a `fetch`-based implementation. */
|
|
68
|
+
fetcher?: LighterTokenFetcher;
|
|
69
|
+
/** Clock injection for testing expiry logic. Defaults to `Date.now`. */
|
|
70
|
+
now?: () => number;
|
|
71
|
+
}
|
|
72
|
+
/** @public */
|
|
73
|
+
export interface ApproveReadOnlyTokenInputs extends ApproveReadOnlyTokenParams {
|
|
74
|
+
/** L1 wallet address that signs the create message. */
|
|
75
|
+
address: Address;
|
|
76
|
+
}
|
|
77
|
+
/** @public */
|
|
78
|
+
export interface ApproveReadOnlyTokenResult {
|
|
79
|
+
token: LighterReadOnlyToken;
|
|
80
|
+
/** Projection of the post-create Lighter account state. */
|
|
81
|
+
config: Pick<LighterAccountConfig, 'provider' | 'accountIndex' | 'readOnlyTokenApproved' | 'readOnlyTokenExpiry' | 'readOnlyTokenScope'>;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Manage the per-account Lighter read-only token alongside the existing
|
|
85
|
+
* `(L1 address, account index)`-scoped storage adapter pattern. Takes an
|
|
86
|
+
* injectable `StorageAdapter` so callers can share one storage backend across
|
|
87
|
+
* the SDK's session stores. The token is opaque — never parsed client-side;
|
|
88
|
+
* `expiry`/`scope` recorded at create time are the source of truth.
|
|
89
|
+
*
|
|
90
|
+
* The L1 wallet signer and the HTTP fetcher are both injectable so unit
|
|
91
|
+
* tests don't need a real wallet or network.
|
|
92
|
+
* @public
|
|
93
|
+
*/
|
|
94
|
+
export declare class LighterReadOnlyTokenManager {
|
|
95
|
+
private readonly storage;
|
|
96
|
+
private readonly lighterApiUrl;
|
|
97
|
+
private readonly fetcher;
|
|
98
|
+
private readonly now;
|
|
99
|
+
private readonly cache;
|
|
100
|
+
constructor(options?: LighterReadOnlyTokenManagerOptions);
|
|
101
|
+
private storageKey;
|
|
102
|
+
private isExpired;
|
|
103
|
+
/**
|
|
104
|
+
* Return the stored token for the `(address, accountIndex)` pair, or
|
|
105
|
+
* `undefined` if absent or past its `expiry`. Never surfaces an expired
|
|
106
|
+
* token — consumers can rely on the return value being usable as-is.
|
|
107
|
+
*/
|
|
108
|
+
get(address: Address, accountIndex: number): Promise<LighterReadOnlyToken | undefined>;
|
|
109
|
+
/**
|
|
110
|
+
* `true` when a stored token exists AND its `expiry` falls within
|
|
111
|
+
* `thresholdDays` of now. `false` when no token exists, when the token is
|
|
112
|
+
* already expired (caller should treat that as "no token"), or when it
|
|
113
|
+
* has more than `thresholdDays` of life left.
|
|
114
|
+
*/
|
|
115
|
+
isReadOnlyTokenExpiringSoon(address: Address, accountIndex: number, thresholdDays?: number): Promise<boolean>;
|
|
116
|
+
/**
|
|
117
|
+
* Persist `token` for the `(address, accountIndex)` pair. Overwrites any
|
|
118
|
+
* prior stored token under the same key — used both by the approve flow
|
|
119
|
+
* and by the renewal flow.
|
|
120
|
+
*/
|
|
121
|
+
set(address: Address, accountIndex: number, token: LighterReadOnlyToken): Promise<void>;
|
|
122
|
+
remove(address: Address, accountIndex: number): Promise<void>;
|
|
123
|
+
/**
|
|
124
|
+
* Create and persist a new Lighter read-only token.
|
|
125
|
+
*
|
|
126
|
+
* POSTs to Lighter's `/api/v1/tokens/create` (via the injected `fetcher`)
|
|
127
|
+
* and persists the returned `ro:` bearer alongside its
|
|
128
|
+
* `expiry`/`scope`/`accountIndex`.
|
|
129
|
+
*
|
|
130
|
+
* `authorization` MUST be a **standard** Lighter auth token — one created by
|
|
131
|
+
* the account's API key (`createAuthToken` / the WASM signer), NOT an L1
|
|
132
|
+
* wallet signature. Lighter authenticates the create request with that token
|
|
133
|
+
* and rejects anything else as `invalid auth string` (code 20013).
|
|
134
|
+
*
|
|
135
|
+
* `expirySeconds` is the absolute unix-seconds expiry Lighter records on
|
|
136
|
+
* the row. Lighter enforces 1 day ≤ lifetime ≤ 10 years server-side; the
|
|
137
|
+
* SDK does NOT pre-validate and surfaces Lighter's 400 verbatim.
|
|
138
|
+
*
|
|
139
|
+
* `scope` selects sub-account coverage: `'all'` sets `sub_account_access`
|
|
140
|
+
* (read access to every sub-account of the owner); `'single'` scopes to the
|
|
141
|
+
* one account. The permission set (`scopes` form field) is always read-only
|
|
142
|
+
* (`read.*`).
|
|
143
|
+
*
|
|
144
|
+
* @param authorization Standard (API-key-signed) Lighter auth token.
|
|
145
|
+
* @param inputs Token-create parameters plus the owning `address`.
|
|
146
|
+
*/
|
|
147
|
+
approve(authorization: string, inputs: ApproveReadOnlyTokenInputs): Promise<ApproveReadOnlyTokenResult>;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Default fetcher: posts a multipart/form-data request to Lighter's
|
|
151
|
+
* `tokens/create` endpoint and returns the parsed response. Throws a
|
|
152
|
+
* {@link PerpsError} with the Lighter-side body when the response is
|
|
153
|
+
* non-2xx.
|
|
154
|
+
* @public
|
|
155
|
+
*/
|
|
156
|
+
export declare const defaultLighterTokenFetcher: LighterTokenFetcher;
|
|
157
|
+
//# sourceMappingURL=LighterReadOnlyTokenManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LighterReadOnlyTokenManager.d.ts","sourceRoot":"","sources":["../../../src/signers/LighterReadOnlyTokenManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { localStorageAdapter, PerpsError, readValidatedRecord, } from '@lifi/perps-sdk';
|
|
2
|
+
import { PerpsErrorCode } from '@lifi/perps-types';
|
|
3
|
+
const STORAGE_PREFIX = 'lifi:perps:lighter:rotoken';
|
|
4
|
+
/**
|
|
5
|
+
* Default Lighter HTTP host the SDK posts the create request to. Callers
|
|
6
|
+
* pointing at testnet pass an override via {@link LighterReadOnlyTokenManagerOptions.lighterApiUrl}.
|
|
7
|
+
* @public
|
|
8
|
+
*/
|
|
9
|
+
export const DEFAULT_LIGHTER_API_URL = 'https://mainnet.zklighter.elliot.ai';
|
|
10
|
+
/**
|
|
11
|
+
* Default token name persisted alongside Lighter's `tokens/create` row.
|
|
12
|
+
* Lighter requires a non-empty `name` form field; the literal here is what
|
|
13
|
+
* surfaces in Lighter's UI listing under `app.lighter.xyz/read-only-tokens`.
|
|
14
|
+
* @public
|
|
15
|
+
*/
|
|
16
|
+
export const DEFAULT_READ_ONLY_TOKEN_NAME = 'LI.FI Perps';
|
|
17
|
+
const SECONDS_PER_DAY = 86_400;
|
|
18
|
+
const isLighterReadOnlyToken = (value) => {
|
|
19
|
+
if (typeof value !== 'object' || value === null) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
const { token, expiry, scope, accountIndex } = value;
|
|
23
|
+
return (typeof token === 'string' &&
|
|
24
|
+
token.length > 0 &&
|
|
25
|
+
typeof expiry === 'number' &&
|
|
26
|
+
Number.isFinite(expiry) &&
|
|
27
|
+
(scope === 'single' || scope === 'all') &&
|
|
28
|
+
typeof accountIndex === 'number' &&
|
|
29
|
+
Number.isFinite(accountIndex));
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Manage the per-account Lighter read-only token alongside the existing
|
|
33
|
+
* `(L1 address, account index)`-scoped storage adapter pattern. Takes an
|
|
34
|
+
* injectable `StorageAdapter` so callers can share one storage backend across
|
|
35
|
+
* the SDK's session stores. The token is opaque — never parsed client-side;
|
|
36
|
+
* `expiry`/`scope` recorded at create time are the source of truth.
|
|
37
|
+
*
|
|
38
|
+
* The L1 wallet signer and the HTTP fetcher are both injectable so unit
|
|
39
|
+
* tests don't need a real wallet or network.
|
|
40
|
+
* @public
|
|
41
|
+
*/
|
|
42
|
+
export class LighterReadOnlyTokenManager {
|
|
43
|
+
storage;
|
|
44
|
+
lighterApiUrl;
|
|
45
|
+
fetcher;
|
|
46
|
+
now;
|
|
47
|
+
cache = new Map();
|
|
48
|
+
constructor(options = {}) {
|
|
49
|
+
this.storage = options.storage ?? localStorageAdapter;
|
|
50
|
+
this.lighterApiUrl = options.lighterApiUrl ?? DEFAULT_LIGHTER_API_URL;
|
|
51
|
+
this.fetcher = options.fetcher ?? defaultLighterTokenFetcher;
|
|
52
|
+
this.now = options.now ?? (() => Date.now());
|
|
53
|
+
}
|
|
54
|
+
storageKey(address, accountIndex) {
|
|
55
|
+
return `${STORAGE_PREFIX}:${address.toLowerCase()}:${accountIndex}`;
|
|
56
|
+
}
|
|
57
|
+
isExpired(token) {
|
|
58
|
+
return token.expiry * 1000 <= this.now();
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Return the stored token for the `(address, accountIndex)` pair, or
|
|
62
|
+
* `undefined` if absent or past its `expiry`. Never surfaces an expired
|
|
63
|
+
* token — consumers can rely on the return value being usable as-is.
|
|
64
|
+
*/
|
|
65
|
+
async get(address, accountIndex) {
|
|
66
|
+
const key = this.storageKey(address, accountIndex);
|
|
67
|
+
const cached = this.cache.get(key);
|
|
68
|
+
if (cached) {
|
|
69
|
+
return this.isExpired(cached) ? undefined : cached;
|
|
70
|
+
}
|
|
71
|
+
const parsed = await readValidatedRecord(this.storage, key, isLighterReadOnlyToken);
|
|
72
|
+
if (!parsed || this.isExpired(parsed)) {
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
this.cache.set(key, parsed);
|
|
76
|
+
return parsed;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* `true` when a stored token exists AND its `expiry` falls within
|
|
80
|
+
* `thresholdDays` of now. `false` when no token exists, when the token is
|
|
81
|
+
* already expired (caller should treat that as "no token"), or when it
|
|
82
|
+
* has more than `thresholdDays` of life left.
|
|
83
|
+
*/
|
|
84
|
+
async isReadOnlyTokenExpiringSoon(address, accountIndex, thresholdDays = 30) {
|
|
85
|
+
const key = this.storageKey(address, accountIndex);
|
|
86
|
+
const token = this.cache.get(key) ??
|
|
87
|
+
(await readValidatedRecord(this.storage, key, isLighterReadOnlyToken));
|
|
88
|
+
if (!token) {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
const remainingSeconds = token.expiry - Math.floor(this.now() / 1000);
|
|
92
|
+
if (remainingSeconds <= 0) {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
return remainingSeconds <= thresholdDays * SECONDS_PER_DAY;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Persist `token` for the `(address, accountIndex)` pair. Overwrites any
|
|
99
|
+
* prior stored token under the same key — used both by the approve flow
|
|
100
|
+
* and by the renewal flow.
|
|
101
|
+
*/
|
|
102
|
+
async set(address, accountIndex, token) {
|
|
103
|
+
const key = this.storageKey(address, accountIndex);
|
|
104
|
+
this.cache.set(key, token);
|
|
105
|
+
await this.storage.set(key, JSON.stringify(token));
|
|
106
|
+
}
|
|
107
|
+
async remove(address, accountIndex) {
|
|
108
|
+
const key = this.storageKey(address, accountIndex);
|
|
109
|
+
this.cache.delete(key);
|
|
110
|
+
await this.storage.remove(key);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Create and persist a new Lighter read-only token.
|
|
114
|
+
*
|
|
115
|
+
* POSTs to Lighter's `/api/v1/tokens/create` (via the injected `fetcher`)
|
|
116
|
+
* and persists the returned `ro:` bearer alongside its
|
|
117
|
+
* `expiry`/`scope`/`accountIndex`.
|
|
118
|
+
*
|
|
119
|
+
* `authorization` MUST be a **standard** Lighter auth token — one created by
|
|
120
|
+
* the account's API key (`createAuthToken` / the WASM signer), NOT an L1
|
|
121
|
+
* wallet signature. Lighter authenticates the create request with that token
|
|
122
|
+
* and rejects anything else as `invalid auth string` (code 20013).
|
|
123
|
+
*
|
|
124
|
+
* `expirySeconds` is the absolute unix-seconds expiry Lighter records on
|
|
125
|
+
* the row. Lighter enforces 1 day ≤ lifetime ≤ 10 years server-side; the
|
|
126
|
+
* SDK does NOT pre-validate and surfaces Lighter's 400 verbatim.
|
|
127
|
+
*
|
|
128
|
+
* `scope` selects sub-account coverage: `'all'` sets `sub_account_access`
|
|
129
|
+
* (read access to every sub-account of the owner); `'single'` scopes to the
|
|
130
|
+
* one account. The permission set (`scopes` form field) is always read-only
|
|
131
|
+
* (`read.*`).
|
|
132
|
+
*
|
|
133
|
+
* @param authorization Standard (API-key-signed) Lighter auth token.
|
|
134
|
+
* @param inputs Token-create parameters plus the owning `address`.
|
|
135
|
+
*/
|
|
136
|
+
async approve(authorization, inputs) {
|
|
137
|
+
const { address, accountIndex, expirySeconds, scope } = inputs;
|
|
138
|
+
const response = await this.fetcher({
|
|
139
|
+
url: `${this.lighterApiUrl}/api/v1/tokens/create`,
|
|
140
|
+
authorization,
|
|
141
|
+
name: DEFAULT_READ_ONLY_TOKEN_NAME,
|
|
142
|
+
accountIndex,
|
|
143
|
+
expiry: expirySeconds,
|
|
144
|
+
subAccountAccess: scope === 'all',
|
|
145
|
+
scopes: 'read.*',
|
|
146
|
+
});
|
|
147
|
+
const token = {
|
|
148
|
+
token: response.api_token,
|
|
149
|
+
expiry: response.expiry,
|
|
150
|
+
// Persist the values we requested, not Lighter's echoed ones: `scope`
|
|
151
|
+
// keeps the typed discriminator, and `accountIndex` must match the key
|
|
152
|
+
// `get()` looks up by, else a divergent echo orphans the token and re-creates every read.
|
|
153
|
+
scope,
|
|
154
|
+
accountIndex,
|
|
155
|
+
};
|
|
156
|
+
await this.set(address, token.accountIndex, token);
|
|
157
|
+
return {
|
|
158
|
+
token,
|
|
159
|
+
config: {
|
|
160
|
+
provider: 'lighter',
|
|
161
|
+
accountIndex: token.accountIndex,
|
|
162
|
+
readOnlyTokenApproved: true,
|
|
163
|
+
readOnlyTokenExpiry: token.expiry,
|
|
164
|
+
readOnlyTokenScope: token.scope,
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Default fetcher: posts a multipart/form-data request to Lighter's
|
|
171
|
+
* `tokens/create` endpoint and returns the parsed response. Throws a
|
|
172
|
+
* {@link PerpsError} with the Lighter-side body when the response is
|
|
173
|
+
* non-2xx.
|
|
174
|
+
* @public
|
|
175
|
+
*/
|
|
176
|
+
export const defaultLighterTokenFetcher = async ({ url, authorization, name, accountIndex, expiry, subAccountAccess, scopes, }) => {
|
|
177
|
+
const form = new FormData();
|
|
178
|
+
form.set('name', name);
|
|
179
|
+
form.set('account_index', String(accountIndex));
|
|
180
|
+
form.set('expiry', String(expiry));
|
|
181
|
+
form.set('sub_account_access', String(subAccountAccess));
|
|
182
|
+
form.set('scopes', scopes);
|
|
183
|
+
const response = await fetch(url, {
|
|
184
|
+
method: 'POST',
|
|
185
|
+
headers: { authorization },
|
|
186
|
+
body: form,
|
|
187
|
+
});
|
|
188
|
+
if (!response.ok) {
|
|
189
|
+
const body = await response.text();
|
|
190
|
+
throw new PerpsError(PerpsErrorCode.ServerError, `Lighter tokens/create returned ${response.status}: ${body || '<empty>'}`);
|
|
191
|
+
}
|
|
192
|
+
return (await response.json());
|
|
193
|
+
};
|
|
194
|
+
//# sourceMappingURL=LighterReadOnlyTokenManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LighterReadOnlyTokenManager.js","sourceRoot":"","sources":["../../../src/signers/LighterReadOnlyTokenManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { ActionType } from '@lifi/perps-types';
|
|
2
|
+
import { type LoadLighterWasmOptions } from './wasmLoader.js';
|
|
3
|
+
/** @public */
|
|
4
|
+
export interface LighterSignerContext {
|
|
5
|
+
/** Lighter-native private key (from GenerateAPIKey, NOT an Ethereum key). */
|
|
6
|
+
apiKeyPrivateKey: string;
|
|
7
|
+
/** API key slot registered on-chain (0-255). */
|
|
8
|
+
apiKeyIndex: number;
|
|
9
|
+
/** Lighter account index — looked up from the user's L1 Ethereum address. */
|
|
10
|
+
accountIndex: number;
|
|
11
|
+
}
|
|
12
|
+
/** @public */
|
|
13
|
+
export interface LighterSignerConfig extends LoadLighterWasmOptions {
|
|
14
|
+
/** Lighter REST API base URL. */
|
|
15
|
+
apiUrl?: string;
|
|
16
|
+
/** Lighter chain ID (304 = mainnet). */
|
|
17
|
+
chainId?: number;
|
|
18
|
+
}
|
|
19
|
+
/** @public */
|
|
20
|
+
export interface LighterSignedBlob {
|
|
21
|
+
txType: number;
|
|
22
|
+
txInfo: string;
|
|
23
|
+
txHash: string;
|
|
24
|
+
}
|
|
25
|
+
/** @public */
|
|
26
|
+
export interface ChangePubKeyResult extends LighterSignedBlob {
|
|
27
|
+
/** EIP-191 message the L1 Ethereum wallet must sign to authorize the key rotation. */
|
|
28
|
+
messageToSign: string;
|
|
29
|
+
}
|
|
30
|
+
/** @public */
|
|
31
|
+
export interface ApiKeyPair {
|
|
32
|
+
publicKey: string;
|
|
33
|
+
privateKey: string;
|
|
34
|
+
}
|
|
35
|
+
/** @public */
|
|
36
|
+
export declare class LighterSigner {
|
|
37
|
+
private readonly apiUrl;
|
|
38
|
+
private readonly chainId;
|
|
39
|
+
private readonly loaderOptions;
|
|
40
|
+
private wasm;
|
|
41
|
+
private readonly registeredClients;
|
|
42
|
+
constructor(config?: LighterSignerConfig);
|
|
43
|
+
initialize(): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Generate a fresh Lighter API keypair. Pass an optional 32-byte hex seed
|
|
46
|
+
* for deterministic generation (used in tests); omit for a random key.
|
|
47
|
+
*/
|
|
48
|
+
generateAPIKey(seed?: string): Promise<ApiKeyPair>;
|
|
49
|
+
/**
|
|
50
|
+
* Sign an action blob with the provided (apiKeyPrivateKey, apiKeyIndex,
|
|
51
|
+
* accountIndex) context. `wasmSignParams` comes straight from the backend's
|
|
52
|
+
* `WasmBlobActionStep`. Returns the signed `{ txType, txInfo, txHash }`
|
|
53
|
+
* triple the backend forwards to Lighter's `sendTx` endpoint.
|
|
54
|
+
*
|
|
55
|
+
* For REGISTER_API_KEY use `signChangePubKey` instead — it returns an
|
|
56
|
+
* additional `messageToSign` the L1 wallet must countersign.
|
|
57
|
+
*/
|
|
58
|
+
sign(action: ActionType, wasmSignParams: Record<string, unknown>, context: LighterSignerContext): Promise<LighterSignedBlob>;
|
|
59
|
+
/**
|
|
60
|
+
* Step 1 of the REGISTER_API_KEY flow. Generates the WASM blob for a
|
|
61
|
+
* ChangePubKey tx with `L1Sig` left empty, plus the canonical EIP-191
|
|
62
|
+
* message the L1 Ethereum wallet must sign next.
|
|
63
|
+
*
|
|
64
|
+
* Requires the freshly-generated `privateKey` (returned by
|
|
65
|
+
* {@link generateAPIKey}) — the Go WASM signer registers a per-slot client
|
|
66
|
+
* keyed on `(apiKeyIndex, accountIndex)` before it'll sign anything for
|
|
67
|
+
* that slot, including the ChangePubKey that's about to register the key
|
|
68
|
+
* on-chain. This is purely client-side bookkeeping; it does not touch the
|
|
69
|
+
* Lighter API.
|
|
70
|
+
*/
|
|
71
|
+
signChangePubKey(pubKeyHex: string, privateKey: string, nonce: number, apiKeyIndex: number, accountIndex: number, skipNonce?: 0 | 1): Promise<ChangePubKeyResult>;
|
|
72
|
+
/**
|
|
73
|
+
* Step 2 of REGISTER_API_KEY — inject the L1 signature produced by the
|
|
74
|
+
* user's Ethereum wallet into the ChangePubKey txInfo JSON. `L1Sig` is the
|
|
75
|
+
* only field in txInfo that depends on the L1 signature; txHash does NOT
|
|
76
|
+
* include it (so we do not recompute it).
|
|
77
|
+
*/
|
|
78
|
+
embedL1Signature(txInfo: string, l1Signature: string): string;
|
|
79
|
+
/**
|
|
80
|
+
* Create an auth token for authenticated WebSocket subscriptions.
|
|
81
|
+
* `deadline` is a Unix timestamp in seconds — tokens have an 8h hard cap.
|
|
82
|
+
*/
|
|
83
|
+
createAuthToken(deadline: number, context: LighterSignerContext): Promise<string>;
|
|
84
|
+
private ensureLoaded;
|
|
85
|
+
private ensureClient;
|
|
86
|
+
/**
|
|
87
|
+
* Map an ActionType + backend-provided params object to the positional-arg
|
|
88
|
+
* WASM call. The Go signer exports take primitives in order, not an object
|
|
89
|
+
* — so we pick fields in the exact order the Go side expects. Unknown
|
|
90
|
+
* fields (e.g. backend's integrator_* hints) are ignored.
|
|
91
|
+
*/
|
|
92
|
+
private dispatch;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=LighterSigner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LighterSigner.d.ts","sourceRoot":"","sources":["../../../src/signers/LighterSigner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAEL,KAAK,sBAAsB,EAG5B,MAAM,iBAAiB,CAAA;AAOxB,cAAc;AACd,MAAM,WAAW,oBAAoB;IACnC,6EAA6E;IAC7E,gBAAgB,EAAE,MAAM,CAAA;IACxB,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAA;IACnB,6EAA6E;IAC7E,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,cAAc;AACd,MAAM,WAAW,mBAAoB,SAAQ,sBAAsB;IACjE,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,cAAc;AACd,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf;AAED,cAAc;AACd,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAC3D,sFAAsF;IACtF,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,cAAc;AACd,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;CACnB;AAKD,cAAc;AACd,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwB;IACtD,OAAO,CAAC,IAAI,CAAgC;IAC5C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;gBAE1C,MAAM,GAAE,mBAAwB;IAUtC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAMjC;;;OAGG;IACG,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAYxD;;;;;;;;OAQG;IACG,IAAI,CACR,MAAM,EAAE,UAAU,EAClB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,iBAAiB,CAAC;IAa7B;;;;;;;;;;;OAWG;IACG,gBAAgB,CACpB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,SAAS,GAAE,CAAC,GAAG,CAAK,GACnB,OAAO,CAAC,kBAAkB,CAAC;IAsC9B;;;;;OAKG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IAa7D;;;OAGG;IACG,eAAe,CACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,MAAM,CAAC;YAiBJ,YAAY;YAOZ,YAAY;IAmB1B;;;;;OAKG;IACH,OAAO,CAAC,QAAQ;CAsGjB"}
|