@ledgerhq/device-signer-kit-hyperliquid 0.0.0-develop-20260312001221 → 0.0.0-develop-20260313001318
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/lib/cjs/api/SignerHyperliquid.js +1 -1
- package/lib/cjs/api/SignerHyperliquid.js.map +1 -1
- package/lib/cjs/api/app-binder/SignActionsDeviceActionTypes.js +1 -1
- package/lib/cjs/api/app-binder/SignActionsDeviceActionTypes.js.map +3 -3
- package/lib/cjs/api/index.js +1 -1
- package/lib/cjs/api/index.js.map +3 -3
- package/lib/cjs/api/model/Signature.js.map +1 -1
- package/lib/cjs/internal/DefaultSignerHyperliquid.js +1 -1
- package/lib/cjs/internal/DefaultSignerHyperliquid.js.map +3 -3
- package/lib/cjs/internal/app-binder/HyperliquidAppBinder.js +1 -1
- package/lib/cjs/internal/app-binder/HyperliquidAppBinder.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/SendActionCommand.js +2 -0
- package/lib/cjs/internal/app-binder/command/SendActionCommand.js.map +7 -0
- package/lib/cjs/internal/app-binder/command/SendActionCommand.test.js +2 -0
- package/lib/cjs/internal/app-binder/command/SendActionCommand.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/command/SendMetadataCommand.js +2 -0
- package/lib/cjs/internal/app-binder/command/SendMetadataCommand.js.map +7 -0
- package/lib/cjs/internal/app-binder/command/SendMetadataCommand.test.js +2 -0
- package/lib/cjs/internal/app-binder/command/SendMetadataCommand.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/command/SignActionsCommand.js +2 -0
- package/lib/cjs/internal/app-binder/command/SignActionsCommand.js.map +7 -0
- package/lib/cjs/internal/app-binder/command/SignActionsCommand.test.js +2 -0
- package/lib/cjs/internal/app-binder/command/SignActionsCommand.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/command/utils/hyperliquidApplicationErrors.js +1 -1
- package/lib/cjs/internal/app-binder/command/utils/hyperliquidApplicationErrors.js.map +3 -3
- package/lib/cjs/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.js +1 -1
- package/lib/cjs/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.js.map +4 -4
- package/lib/cjs/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.test.js +2 -0
- package/lib/cjs/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +2 -0
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +7 -0
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js +2 -0
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js.map +7 -0
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js +2 -0
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js.map +7 -0
- package/lib/cjs/internal/app-binder/di/appBinderTypes.js +1 -1
- package/lib/cjs/internal/app-binder/di/appBinderTypes.js.map +2 -2
- package/lib/cjs/internal/app-binder/task/SendActionsTask.js +2 -0
- package/lib/cjs/internal/app-binder/task/SendActionsTask.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/SendActionsTask.test.js +2 -0
- package/lib/cjs/internal/app-binder/task/SendActionsTask.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/SignActionsTask.js +1 -1
- package/lib/cjs/internal/app-binder/task/SignActionsTask.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/SignActionsTask.test.js +2 -0
- package/lib/cjs/internal/app-binder/task/SignActionsTask.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/utils/actionTlvSerializer.js +2 -0
- package/lib/cjs/internal/app-binder/utils/actionTlvSerializer.js.map +7 -0
- package/lib/cjs/internal/app-binder/utils/actionTlvSerializer.test.js +2 -0
- package/lib/cjs/internal/app-binder/utils/actionTlvSerializer.test.js.map +7 -0
- package/lib/cjs/internal/use-cases/actions/SignActionsUseCase.js +1 -1
- package/lib/cjs/internal/use-cases/actions/SignActionsUseCase.js.map +3 -3
- package/lib/cjs/package.json +3 -1
- package/lib/esm/api/app-binder/SignActionsDeviceActionTypes.js +1 -0
- package/lib/esm/api/app-binder/SignActionsDeviceActionTypes.js.map +4 -4
- package/lib/esm/api/index.js +1 -1
- package/lib/esm/api/index.js.map +3 -3
- package/lib/esm/internal/DefaultSignerHyperliquid.js +1 -1
- package/lib/esm/internal/DefaultSignerHyperliquid.js.map +3 -3
- package/lib/esm/internal/app-binder/HyperliquidAppBinder.js +1 -1
- package/lib/esm/internal/app-binder/HyperliquidAppBinder.js.map +3 -3
- package/lib/esm/internal/app-binder/command/SendActionCommand.js +2 -0
- package/lib/esm/internal/app-binder/command/SendActionCommand.js.map +7 -0
- package/lib/esm/internal/app-binder/command/SendActionCommand.test.js +2 -0
- package/lib/esm/internal/app-binder/command/SendActionCommand.test.js.map +7 -0
- package/lib/esm/internal/app-binder/command/SendMetadataCommand.js +2 -0
- package/lib/esm/internal/app-binder/command/SendMetadataCommand.js.map +7 -0
- package/lib/esm/internal/app-binder/command/SendMetadataCommand.test.js +2 -0
- package/lib/esm/internal/app-binder/command/SendMetadataCommand.test.js.map +7 -0
- package/lib/esm/internal/app-binder/command/SignActionsCommand.js +2 -0
- package/lib/esm/internal/app-binder/command/SignActionsCommand.js.map +7 -0
- package/lib/esm/internal/app-binder/command/SignActionsCommand.test.js +2 -0
- package/lib/esm/internal/app-binder/command/SignActionsCommand.test.js.map +7 -0
- package/lib/esm/internal/app-binder/command/utils/hyperliquidApplicationErrors.js +1 -1
- package/lib/esm/internal/app-binder/command/utils/hyperliquidApplicationErrors.js.map +3 -3
- package/lib/esm/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.js +1 -0
- package/lib/esm/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.js.map +4 -4
- package/lib/esm/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.test.js +2 -0
- package/lib/esm/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.test.js.map +7 -0
- package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +2 -0
- package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +7 -0
- package/lib/esm/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js +2 -0
- package/lib/esm/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js.map +7 -0
- package/lib/esm/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js +2 -0
- package/lib/esm/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js.map +7 -0
- package/lib/esm/internal/app-binder/di/appBinderTypes.js +1 -1
- package/lib/esm/internal/app-binder/di/appBinderTypes.js.map +2 -2
- package/lib/esm/internal/app-binder/task/SendActionsTask.js +2 -0
- package/lib/esm/internal/app-binder/task/SendActionsTask.js.map +7 -0
- package/lib/esm/internal/app-binder/task/SendActionsTask.test.js +2 -0
- package/lib/esm/internal/app-binder/task/SendActionsTask.test.js.map +7 -0
- package/lib/esm/internal/app-binder/task/SignActionsTask.js +1 -1
- package/lib/esm/internal/app-binder/task/SignActionsTask.js.map +3 -3
- package/lib/esm/internal/app-binder/task/SignActionsTask.test.js +2 -0
- package/lib/esm/internal/app-binder/task/SignActionsTask.test.js.map +7 -0
- package/lib/esm/internal/app-binder/utils/actionTlvSerializer.js +2 -0
- package/lib/esm/internal/app-binder/utils/actionTlvSerializer.js.map +7 -0
- package/lib/esm/internal/app-binder/utils/actionTlvSerializer.test.js +2 -0
- package/lib/esm/internal/app-binder/utils/actionTlvSerializer.test.js.map +7 -0
- package/lib/esm/internal/use-cases/actions/SignActionsUseCase.js +1 -1
- package/lib/esm/internal/use-cases/actions/SignActionsUseCase.js.map +3 -3
- package/lib/esm/package.json +3 -1
- package/lib/types/api/SignerHyperliquid.d.ts +2 -3
- package/lib/types/api/SignerHyperliquid.d.ts.map +1 -1
- package/lib/types/api/app-binder/SignActionsDeviceActionTypes.d.ts +28 -3
- package/lib/types/api/app-binder/SignActionsDeviceActionTypes.d.ts.map +1 -1
- package/lib/types/api/index.d.ts +3 -1
- package/lib/types/api/index.d.ts.map +1 -1
- package/lib/types/api/model/Signature.d.ts +1 -1
- package/lib/types/api/model/Signature.d.ts.map +1 -1
- package/lib/types/internal/DefaultSignerHyperliquid.d.ts +1 -2
- package/lib/types/internal/DefaultSignerHyperliquid.d.ts.map +1 -1
- package/lib/types/internal/app-binder/HyperliquidAppBinder.d.ts +5 -2
- package/lib/types/internal/app-binder/HyperliquidAppBinder.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/SendActionCommand.d.ts +16 -0
- package/lib/types/internal/app-binder/command/SendActionCommand.d.ts.map +1 -0
- package/lib/types/internal/app-binder/command/SendActionCommand.test.d.ts +2 -0
- package/lib/types/internal/app-binder/command/SendActionCommand.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/command/SendMetadataCommand.d.ts +14 -0
- package/lib/types/internal/app-binder/command/SendMetadataCommand.d.ts.map +1 -0
- package/lib/types/internal/app-binder/command/SendMetadataCommand.test.d.ts +2 -0
- package/lib/types/internal/app-binder/command/SendMetadataCommand.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/command/SignActionsCommand.d.ts +22 -0
- package/lib/types/internal/app-binder/command/SignActionsCommand.d.ts.map +1 -0
- package/lib/types/internal/app-binder/command/SignActionsCommand.test.d.ts +2 -0
- package/lib/types/internal/app-binder/command/SignActionsCommand.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/command/utils/hyperliquidApplicationErrors.d.ts +8 -2
- package/lib/types/internal/app-binder/command/utils/hyperliquidApplicationErrors.d.ts.map +1 -1
- package/lib/types/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.d.ts +16 -0
- package/lib/types/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.d.ts.map +1 -1
- package/lib/types/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.test.d.ts +2 -0
- package/lib/types/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/device-action/__test-utils__/makeInternalApi.d.ts +4 -0
- package/lib/types/internal/app-binder/device-action/__test-utils__/makeInternalApi.d.ts.map +1 -0
- package/lib/types/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.d.ts +2 -0
- package/lib/types/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.d.ts.map +1 -0
- package/lib/types/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.d.ts +15 -0
- package/lib/types/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.d.ts.map +1 -0
- package/lib/types/internal/app-binder/di/appBinderTypes.d.ts +75 -0
- package/lib/types/internal/app-binder/di/appBinderTypes.d.ts.map +1 -1
- package/lib/types/internal/app-binder/task/SendActionsTask.d.ts +17 -0
- package/lib/types/internal/app-binder/task/SendActionsTask.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/SendActionsTask.test.d.ts +2 -0
- package/lib/types/internal/app-binder/task/SendActionsTask.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/SignActionsTask.d.ts +3 -4
- package/lib/types/internal/app-binder/task/SignActionsTask.d.ts.map +1 -1
- package/lib/types/internal/app-binder/task/SignActionsTask.test.d.ts +2 -0
- package/lib/types/internal/app-binder/task/SignActionsTask.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/utils/actionTlvSerializer.d.ts +59 -0
- package/lib/types/internal/app-binder/utils/actionTlvSerializer.d.ts.map +1 -0
- package/lib/types/internal/app-binder/utils/actionTlvSerializer.test.d.ts +2 -0
- package/lib/types/internal/app-binder/utils/actionTlvSerializer.test.d.ts.map +1 -0
- package/lib/types/internal/use-cases/actions/SignActionsUseCase.d.ts +3 -2
- package/lib/types/internal/use-cases/actions/SignActionsUseCase.d.ts.map +1 -1
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +9 -7
- package/lib/cjs/internal/app-binder/command/SignActionCommand.js +0 -2
- package/lib/cjs/internal/app-binder/command/SignActionCommand.js.map +0 -7
- package/lib/cjs/internal/app-binder/command/SignActionCommand.test.js +0 -2
- package/lib/cjs/internal/app-binder/command/SignActionCommand.test.js.map +0 -7
- package/lib/esm/internal/app-binder/command/SignActionCommand.js +0 -2
- package/lib/esm/internal/app-binder/command/SignActionCommand.js.map +0 -7
- package/lib/esm/internal/app-binder/command/SignActionCommand.test.js +0 -2
- package/lib/esm/internal/app-binder/command/SignActionCommand.test.js.map +0 -7
- package/lib/types/internal/app-binder/command/SignActionCommand.d.ts +0 -21
- package/lib/types/internal/app-binder/command/SignActionCommand.d.ts.map +0 -1
- package/lib/types/internal/app-binder/command/SignActionCommand.test.d.ts +0 -2
- package/lib/types/internal/app-binder/command/SignActionCommand.test.d.ts.map +0 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/task/SendActionsTask.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n type CommandResult,\n CommandResultFactory,\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { SendActionCommand } from \"@internal/app-binder/command/SendActionCommand\";\nimport { type HyperliquidErrorCodes } from \"@internal/app-binder/command/utils/hyperliquidApplicationErrors\";\nimport type { HyperliquidAction } from \"@internal/app-binder/di/appBinderTypes\";\nimport { serializeActionToTlv } from \"@internal/app-binder/utils/actionTlvSerializer\";\n\nexport type SendActionsTaskArgs = {\n actions: HyperliquidAction[];\n};\n\n/**\n * Sends a list of actions to the device by serializing each action to TLV\n * and calling SendActionCommand in sequence.\n */\nexport class SendActionsTask {\n constructor(\n private api: InternalApi,\n private args: SendActionsTaskArgs,\n ) {}\n\n async run(): Promise<CommandResult<void, HyperliquidErrorCodes>> {\n const { actions } = this.args;\n\n for (const action of actions) {\n const serialized = serializeActionToTlv(action);\n const result = await this.api.sendCommand(\n new SendActionCommand({ serializedAction: serialized }),\n );\n\n if (!isSuccessCommandResult(result)) {\n return result;\n }\n }\n\n return CommandResultFactory({ data: undefined });\n }\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAKO,2CAEPC,EAAkC,0DAGlCC,EAAqC,0DAU9B,MAAMJ,CAAgB,CAC3B,YACUK,EACAC,EACR,CAFQ,SAAAD,EACA,UAAAC,CACP,CAEH,MAAM,KAA2D,CAC/D,KAAM,CAAE,QAAAC,CAAQ,EAAI,KAAK,KAEzB,UAAWC,KAAUD,EAAS,CAC5B,MAAME,KAAa,wBAAqBD,CAAM,EACxCE,EAAS,MAAM,KAAK,IAAI,YAC5B,IAAI,oBAAkB,CAAE,iBAAkBD,CAAW,CAAC,CACxD,EAEA,GAAI,IAAC,0BAAuBC,CAAM,EAChC,OAAOA,CAEX,CAEA,SAAO,wBAAqB,CAAE,KAAM,MAAU,CAAC,CACjD,CACF",
|
|
6
|
+
"names": ["SendActionsTask_exports", "__export", "SendActionsTask", "__toCommonJS", "import_device_management_kit", "import_SendActionCommand", "import_actionTlvSerializer", "api", "args", "actions", "action", "serialized", "result"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var a=require("@ledgerhq/device-management-kit"),e=require("vitest"),o=require("../../app-binder/command/SendActionCommand"),r=require("../../app-binder/device-action/__test-utils__/makeInternalApi"),i=require("./SendActionsTask");(0,e.describe)("SendActionsTask",()=>{const n=(0,r.makeDeviceActionInternalApiMock)();(0,e.beforeEach)(()=>{n.sendCommand.mockClear(),n.sendCommand.mockResolvedValue((0,a.CommandResultFactory)({data:void 0}))}),e.it.each([{action:{type:"order",orders:[{a:42,b:!0,p:"1992",s:"0.512",t:{limit:{tif:"Ioc"}},r:!1}],grouping:"na",builder:{b:"0xc0708cdd6cd166d51da264e3f49a0422be26e35b",f:100},nonce:1770816625873},expectedSerialization:"01012c02010181d0010081da06019c4ce55cd181db4b81dd2681e0010081d1012a81e2010181e3043139393281e405302e35313281e5010081d70481e6010181ea010081eb1b81d314c0708cdd6cd166d51da264e3f49a0422be26e35b81ec0164"},{action:{type:"batchModify",modifies:[{oid:343050796655,order:{a:0,b:!1,p:"85169",s:"0.0005",r:!0,t:{trigger:{isMarket:!0,triggerPx:"85169",tpsl:"tp"}}}}],nonce:1773050015814},expectedSerialization:"01012c02010181d0010181da06019CD204304681db4581d84281dd3481e0010181d1010081e2010081e305383531363981e406302E3030303581e5010181d71081e7010181e805383531363981e9010081dc080000004FDF6BBE6F"},{action:{type:"cancel",cancels:[{a:0,o:340574409238}],nonce:1772813983827},expectedSerialization:"01012c02010181d0010281da06019CC3F2A05381db1281d90f81d1010081dc080000004F4BD11216"}])("calls SendActionCommand once when actions has one item",async({action:d,expectedSerialization:t})=>{const s=await new i.SendActionsTask(n,{actions:[d]}).run();(0,e.expect)(s).toEqual((0,a.CommandResultFactory)({data:void 0})),(0,e.expect)(n.sendCommand).toHaveBeenCalledTimes(1);const l=(0,a.hexaStringToBuffer)(t);(0,e.expect)(n.sendCommand).toHaveBeenCalledWith(new o.SendActionCommand({serializedAction:l}))}),e.it.each([{actions:[{type:"order",orders:[{a:0,b:!0,p:"1",s:"1",t:{limit:{tif:"Gtc"}},r:!1}],grouping:"na",nonce:1},{type:"cancel",cancels:[{a:0,o:42}],nonce:2},{type:"updateLeverage",asset:0,isCross:!1,leverage:10,nonce:3}],expectedSerializations:[(0,a.hexaStringToBuffer)("01012c02010181d0010081da010181db2681dd1f81e0010081d1010081e2010181e3013181e4013181e5010081d70481e6010281ea0100"),(0,a.hexaStringToBuffer)("01012c02010181d0010281da010281db1281d90f81d1010081dc08000000000000002a"),(0,a.hexaStringToBuffer)("01012c02010181d0010381da010381db1381d1010081de010081ed08000000000000000a")]}])("calls SendActionCommand multiple times in order when actions has several items",async({actions:d,expectedSerializations:t})=>{await new i.SendActionsTask(n,{actions:d}).run(),(0,e.expect)(n.sendCommand).toHaveBeenCalledTimes(3),(0,e.expect)(n.sendCommand).toHaveBeenNthCalledWith(1,new o.SendActionCommand({serializedAction:t[0]})),(0,e.expect)(n.sendCommand).toHaveBeenNthCalledWith(2,new o.SendActionCommand({serializedAction:t[1]})),(0,e.expect)(n.sendCommand).toHaveBeenNthCalledWith(3,new o.SendActionCommand({serializedAction:t[2]}))}),(0,e.it)("returns error result and stops on first SendActionCommand failure",async()=>{const d=(0,a.CommandResultFactory)({error:new a.UnknownDeviceExchangeError});n.sendCommand.mockResolvedValueOnce((0,a.CommandResultFactory)({data:void 0})).mockResolvedValueOnce(d);const t=[{type:"order",orders:[{a:0,b:!1,p:"1",s:"1",t:{limit:{tif:"Gtc"}},r:!1}],grouping:"na",nonce:1},{type:"cancel",cancels:[{a:0,o:1}],nonce:2}],s=await new i.SendActionsTask(n,{actions:t}).run();(0,e.expect)(s).toStrictEqual(d),(0,e.expect)(n.sendCommand).toHaveBeenCalledTimes(2)}),(0,e.it)("returns success when actions is empty",async()=>{const t=await new i.SendActionsTask(n,{actions:[]}).run();(0,e.expect)(t).toEqual((0,a.CommandResultFactory)({data:void 0})),(0,e.expect)(n.sendCommand).not.toHaveBeenCalled()})});
|
|
2
|
+
//# sourceMappingURL=SendActionsTask.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/task/SendActionsTask.test.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n CommandResultFactory,\n hexaStringToBuffer,\n UnknownDeviceExchangeError,\n} from \"@ledgerhq/device-management-kit\";\nimport { beforeEach, describe, expect, it, type vi } from \"vitest\";\n\nimport { SendActionCommand } from \"@internal/app-binder/command/SendActionCommand\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport type { HyperliquidAction } from \"@internal/app-binder/di/appBinderTypes\";\n\nimport { SendActionsTask } from \"./SendActionsTask\";\n\ndescribe(\"SendActionsTask\", () => {\n const apiMock = makeDeviceActionInternalApiMock();\n\n beforeEach(() => {\n apiMock.sendCommand.mockClear();\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n });\n\n it.each([\n {\n action: {\n type: \"order\",\n orders: [\n {\n a: 42,\n b: true,\n p: \"1992\",\n s: \"0.512\",\n t: {\n limit: {\n tif: \"Ioc\",\n },\n },\n r: false,\n },\n ],\n grouping: \"na\",\n builder: {\n b: \"0xc0708cdd6cd166d51da264e3f49a0422be26e35b\",\n f: 100,\n },\n nonce: 1770816625873,\n } satisfies HyperliquidAction,\n expectedSerialization:\n // prettier-ignore\n /* eslint-disable prettier/prettier */\n \"01012c\" +\n \"020101\" +\n \"81d00100\" +\n \"81da06019c4ce55cd1\" +\n \"81db4b\" +\n \"81dd26\" +\n \"81e00100\" +\n \"81d1012a\" +\n \"81e20101\" +\n \"81e30431393932\" +\n \"81e405302e353132\" +\n \"81e50100\" +\n \"81d704\" + // ORDER_DETAIL\n \"81e60101\" + // TIF\n \"81ea0100\" + // GROUPING\n \"81eb1b\" + //BUILDER\n \"81d314c0708cdd6cd166d51da264e3f49a0422be26e35b\" + // BUILDER_ADDRESS\n \"81ec0164\", // BUILDER_FEE\n /* eslint-enable prettier/prettier */\n },\n {\n action: {\n type: \"batchModify\",\n modifies: [\n {\n oid: 343050796655,\n order: {\n a: 0,\n b: false,\n p: \"85169\",\n s: \"0.0005\",\n r: true,\n t: {\n trigger: {\n isMarket: true,\n triggerPx: \"85169\",\n tpsl: \"tp\",\n },\n },\n },\n },\n ],\n nonce: 1773050015814,\n } satisfies HyperliquidAction,\n expectedSerialization:\n // prettier-ignore\n /* eslint-disable prettier/prettier */\n \"01012c\" + // STRUCTURE_TYPE\n \"020101\" + // VERSION\n \"81d00101\" + // ACTION_TYPE\n \"81da06019CD2043046\" + // NONCE\n \"81db45\" + // ACTION_STRUCTURE\n \"81d842\" + // UPDATE_ORDERS\n \"81dd34\" + // ORDER\n \"81e00101\" + // ORDER_TYPE\n \"81d10100\" + // ASSET_ID\n \"81e20100\" + // BUY_OR_NOT\n \"81e3053835313639\" + // PRICE\n \"81e406302E30303035\" + // SIZE\n \"81e50101\" + // REDUCE_ONLY\n \"81d710\" + // ORDER_DETAIL\n \"81e70101\" + // TRIGGER_MARKET\n \"81e8053835313639\" + // TRIGGER_PRICE\n \"81e90100\" + // TRIGGER_TYPE\n \"81dc080000004FDF6BBE6F\", // ORDER_ID\n /* eslint-enable prettier/prettier */\n },\n {\n action: {\n type: \"cancel\",\n cancels: [\n {\n a: 0,\n o: 340574409238,\n },\n ],\n nonce: 1772813983827,\n } satisfies HyperliquidAction,\n expectedSerialization:\n // prettier-ignore\n /* eslint-disable prettier/prettier */\n \"01012c\" + // STRUCTURE_TYPE\n \"020101\" + // VERSION\n \"81d00102\" + // ACTION_TYPE\n \"81da06019CC3F2A053\" + // NONCE\n \"81db12\" + // ACTION_STRUCTURE\n \"81d90f\" + // CANCEL_ORDERS\n \"81d10100\" + // ASSET_ID\n \"81dc080000004F4BD11216\", // ORDER_ID\n /* eslint-enable prettier/prettier */\n },\n ])(\n \"calls SendActionCommand once when actions has one item\",\n async ({ action, expectedSerialization }) => {\n // GIVEN one action\n // WHEN\n const task = new SendActionsTask(apiMock, { actions: [action] });\n const result = await task.run();\n\n // THEN\n expect(result).toEqual(\n CommandResultFactory({\n data: undefined,\n }),\n );\n expect(apiMock.sendCommand).toHaveBeenCalledTimes(1);\n\n const expectedBytes = hexaStringToBuffer(expectedSerialization)!;\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendActionCommand({\n serializedAction: expectedBytes,\n }),\n );\n },\n );\n\n it.each([\n {\n actions: [\n {\n type: \"order\",\n orders: [\n {\n a: 0,\n b: true,\n p: \"1\",\n s: \"1\",\n t: { limit: { tif: \"Gtc\" } },\n r: false,\n },\n ],\n grouping: \"na\",\n nonce: 1,\n },\n {\n type: \"cancel\",\n cancels: [{ a: 0, o: 42 }],\n nonce: 2,\n },\n {\n type: \"updateLeverage\",\n asset: 0,\n isCross: false,\n leverage: 10,\n nonce: 3,\n },\n ] satisfies HyperliquidAction[],\n expectedSerializations: [\n hexaStringToBuffer(\n \"01012c02010181d0010081da010181db2681dd1f81e0010081d1010081e2010181e3013181e4013181e5010081d70481e6010281ea0100\",\n )!,\n hexaStringToBuffer(\n \"01012c02010181d0010281da010281db1281d90f81d1010081dc08000000000000002a\",\n )!,\n hexaStringToBuffer(\n \"01012c02010181d0010381da010381db1381d1010081de010081ed08000000000000000a\",\n )!,\n ],\n },\n ])(\n \"calls SendActionCommand multiple times in order when actions has several items\",\n async ({ actions, expectedSerializations }) => {\n // GIVEN several actions\n // WHEN\n const task = new SendActionsTask(apiMock, { actions });\n await task.run();\n\n // THEN\n expect(apiMock.sendCommand).toHaveBeenCalledTimes(3);\n\n expect(apiMock.sendCommand).toHaveBeenNthCalledWith(\n 1,\n new SendActionCommand({\n serializedAction: expectedSerializations[0]!,\n }),\n );\n\n expect(apiMock.sendCommand).toHaveBeenNthCalledWith(\n 2,\n new SendActionCommand({\n serializedAction: expectedSerializations[1]!,\n }),\n );\n\n expect(apiMock.sendCommand).toHaveBeenNthCalledWith(\n 3,\n new SendActionCommand({\n serializedAction: expectedSerializations[2]!,\n }),\n );\n },\n );\n\n it(\"returns error result and stops on first SendActionCommand failure\", async () => {\n // GIVEN api returns success for first command then error for second\n const errorResult = CommandResultFactory({\n error: new UnknownDeviceExchangeError(),\n });\n (apiMock.sendCommand as ReturnType<typeof vi.fn>)\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(errorResult);\n\n const actions: HyperliquidAction[] = [\n {\n type: \"order\",\n orders: [\n {\n a: 0,\n b: false,\n p: \"1\",\n s: \"1\",\n t: { limit: { tif: \"Gtc\" } },\n r: false,\n },\n ],\n grouping: \"na\",\n nonce: 1,\n },\n {\n type: \"cancel\",\n cancels: [{ a: 0, o: 1 }],\n nonce: 2,\n },\n ];\n\n // WHEN\n const task = new SendActionsTask(apiMock, { actions });\n const result = await task.run();\n\n // THEN\n expect(result).toStrictEqual(errorResult);\n expect(apiMock.sendCommand).toHaveBeenCalledTimes(2);\n });\n\n it(\"returns success when actions is empty\", async () => {\n // GIVEN empty actions\n // WHEN\n const task = new SendActionsTask(apiMock, { actions: [] });\n const result = await task.run();\n\n // THEN\n expect(result).toEqual(\n CommandResultFactory({\n data: undefined,\n }),\n );\n expect(apiMock.sendCommand).not.toHaveBeenCalled();\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_device_management_kit", "import_vitest", "import_SendActionCommand", "import_makeInternalApi", "import_SendActionsTask", "apiMock", "action", "expectedSerialization", "result", "expectedBytes", "actions", "expectedSerializations", "errorResult"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var a=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var d=(i,t)=>{for(var r in t)a(i,r,{get:t[r],enumerable:!0})},g=(i,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of m(t))!p.call(i,s)&&s!==r&&a(i,s,{get:()=>t[s],enumerable:!(n=u(t,s))||n.enumerable});return i};var c=i=>g(a({},"__esModule",{value:!0}),i);var y={};d(y,{SignActionsTask:()=>l});module.exports=c(y);var e=require("@ledgerhq/device-management-kit"),o=require("../../app-binder/command/SignActionsCommand");class l{constructor(t,r){this.api=t;this.args=r}async run(){return await this.signAction()}async signAction(t){const r=await this.api.sendCommand(new o.SignActionsCommand(this.args));if(!(0,e.isSuccessCommandResult)(r))return r;const n=t?[...t,r.data.signature]:[r.data.signature];return r.data.signaturesLeft!==0?await this.signAction(n):(0,e.CommandResultFactory)({data:n})}}0&&(module.exports={SignActionsTask});
|
|
2
2
|
//# sourceMappingURL=SignActionsTask.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/task/SignActionsTask.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type CommandResult,\n CommandResultFactory,\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type Signature } from \"@api/model/Signature\";\nimport {
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAKO,2CAGPC,
|
|
6
|
-
"names": ["SignActionsTask_exports", "__export", "SignActionsTask", "__toCommonJS", "import_device_management_kit", "
|
|
4
|
+
"sourcesContent": ["import {\n type CommandResult,\n CommandResultFactory,\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type Signature } from \"@api/model/Signature\";\nimport { SignActionsCommand } from \"@internal/app-binder/command/SignActionsCommand\";\nimport { type HyperliquidErrorCodes } from \"@internal/app-binder/command/utils/hyperliquidApplicationErrors\";\n\nexport type SignActionsTaskArgs = {\n derivationPath: string;\n};\n\nexport class SignActionsTask {\n constructor(\n private api: InternalApi,\n private args: SignActionsTaskArgs,\n ) {}\n\n async run(): Promise<CommandResult<Signature[], HyperliquidErrorCodes>> {\n const result = await this.signAction();\n\n return result;\n }\n\n private async signAction(\n signatures?: Signature[],\n ): Promise<CommandResult<Signature[], HyperliquidErrorCodes>> {\n const result = await this.api.sendCommand(\n new SignActionsCommand(this.args),\n );\n\n if (!isSuccessCommandResult(result)) {\n return result;\n }\n\n const nextSignatures = signatures\n ? [...signatures, result.data.signature]\n : [result.data.signature];\n\n if (result.data.signaturesLeft !== 0) {\n return await this.signAction(nextSignatures);\n } else {\n return CommandResultFactory({\n data: nextSignatures,\n });\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAKO,2CAGPC,EAAmC,2DAO5B,MAAMH,CAAgB,CAC3B,YACUI,EACAC,EACR,CAFQ,SAAAD,EACA,UAAAC,CACP,CAEH,MAAM,KAAkE,CAGtE,OAFe,MAAM,KAAK,WAAW,CAGvC,CAEA,MAAc,WACZC,EAC4D,CAC5D,MAAMC,EAAS,MAAM,KAAK,IAAI,YAC5B,IAAI,qBAAmB,KAAK,IAAI,CAClC,EAEA,GAAI,IAAC,0BAAuBA,CAAM,EAChC,OAAOA,EAGT,MAAMC,EAAiBF,EACnB,CAAC,GAAGA,EAAYC,EAAO,KAAK,SAAS,EACrC,CAACA,EAAO,KAAK,SAAS,EAE1B,OAAIA,EAAO,KAAK,iBAAmB,EAC1B,MAAM,KAAK,WAAWC,CAAc,KAEpC,wBAAqB,CAC1B,KAAMA,CACR,CAAC,CAEL,CACF",
|
|
6
|
+
"names": ["SignActionsTask_exports", "__export", "SignActionsTask", "__toCommonJS", "import_device_management_kit", "import_SignActionsCommand", "api", "args", "signatures", "result", "nextSignatures"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var n=require("@ledgerhq/device-management-kit"),e=require("vitest"),r=require("../../app-binder/command/SignActionsCommand"),m=require("../../app-binder/device-action/__test-utils__/makeInternalApi"),d=require("./SignActionsTask");const s="44'/637'/0'/0'",i=a=>(0,n.CommandResultFactory)({data:{signaturesLeft:a.signaturesLeft,signature:{r:a.r??"1a7718eede70393bbc640a649ee65401748953a1b671ffa15fea9cb7e2092898",s:a.s??"37e2621d96135f05f54fe891bb5850a94003717dfe228c270fba5d8e7f35b590",v:a.v??28}}});(0,e.describe)("SignActionsTask",()=>{const a=(0,m.makeDeviceActionInternalApiMock)();(0,e.beforeEach)(()=>{a.sendCommand.mockClear()}),(0,e.it)("returns error when sendCommand returns an error",async()=>{const o=(0,n.CommandResultFactory)({error:new n.UnknownDeviceExchangeError});a.sendCommand.mockResolvedValue(o);const c=await new d.SignActionsTask(a,{derivationPath:s}).run();(0,e.expect)((0,n.isSuccessCommandResult)(c)).toBe(!1),(0,e.expect)(c).toEqual(o),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(1),(0,e.expect)(a.sendCommand).toHaveBeenCalledWith(new r.SignActionsCommand({derivationPath:s}))}),(0,e.it)("returns one signature when device returns signaturesLeft 0 on first call",async()=>{a.sendCommand.mockResolvedValue(i({signaturesLeft:0}));const t=await new d.SignActionsTask(a,{derivationPath:s}).run();if((0,e.expect)((0,n.isSuccessCommandResult)(t)).toBe(!0),!(0,n.isSuccessCommandResult)(t))throw new Error("Unexpected");(0,e.expect)(t.data).toHaveLength(1),(0,e.expect)(t.data[0]).toEqual({r:"1a7718eede70393bbc640a649ee65401748953a1b671ffa15fea9cb7e2092898",s:"37e2621d96135f05f54fe891bb5850a94003717dfe228c270fba5d8e7f35b590",v:28}),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(1)}),(0,e.it)("returns three signatures when device returns signaturesLeft 2, 1, 0 across three calls",async()=>{a.sendCommand.mockResolvedValueOnce(i({signaturesLeft:2,r:"sig1_r",s:"sig1_s",v:27})).mockResolvedValueOnce(i({signaturesLeft:1,r:"sig2_r",s:"sig2_s",v:28})).mockResolvedValueOnce(i({signaturesLeft:0,r:"sig3_r",s:"sig3_s",v:27}));const t=await new d.SignActionsTask(a,{derivationPath:s}).run();if((0,e.expect)((0,n.isSuccessCommandResult)(t)).toBe(!0),!(0,n.isSuccessCommandResult)(t))throw new Error("Unexpected");(0,e.expect)(t.data).toHaveLength(3),(0,e.expect)(t.data[0]).toEqual({r:"sig1_r",s:"sig1_s",v:27}),(0,e.expect)(t.data[1]).toEqual({r:"sig2_r",s:"sig2_s",v:28}),(0,e.expect)(t.data[2]).toEqual({r:"sig3_r",s:"sig3_s",v:27}),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(3),(0,e.expect)(a.sendCommand).toHaveBeenNthCalledWith(1,new r.SignActionsCommand({derivationPath:s})),(0,e.expect)(a.sendCommand).toHaveBeenNthCalledWith(2,new r.SignActionsCommand({derivationPath:s})),(0,e.expect)(a.sendCommand).toHaveBeenNthCalledWith(3,new r.SignActionsCommand({derivationPath:s}))})});
|
|
2
|
+
//# sourceMappingURL=SignActionsTask.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/task/SignActionsTask.test.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n CommandResultFactory,\n isSuccessCommandResult,\n UnknownDeviceExchangeError,\n} from \"@ledgerhq/device-management-kit\";\nimport { beforeEach, describe, expect, it } from \"vitest\";\n\nimport { SignActionsCommand } from \"@internal/app-binder/command/SignActionsCommand\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\n\nimport { SignActionsTask } from \"./SignActionsTask\";\n\nconst DEFAULT_DERIVATION_PATH = \"44'/637'/0'/0'\";\n\nconst createSignatureResponse = (overrides: {\n signaturesLeft: number;\n r?: string;\n s?: string;\n v?: number;\n}) =>\n CommandResultFactory({\n data: {\n signaturesLeft: overrides.signaturesLeft,\n signature: {\n r:\n overrides.r ??\n \"1a7718eede70393bbc640a649ee65401748953a1b671ffa15fea9cb7e2092898\",\n s:\n overrides.s ??\n \"37e2621d96135f05f54fe891bb5850a94003717dfe228c270fba5d8e7f35b590\",\n v: overrides.v ?? 0x1c,\n },\n },\n });\n\ndescribe(\"SignActionsTask\", () => {\n const apiMock = makeDeviceActionInternalApiMock();\n\n beforeEach(() => {\n apiMock.sendCommand.mockClear();\n });\n\n it(\"returns error when sendCommand returns an error\", async () => {\n // GIVEN\n const error = CommandResultFactory({\n error: new UnknownDeviceExchangeError(),\n });\n apiMock.sendCommand.mockResolvedValue(error);\n\n // WHEN\n const task = new SignActionsTask(apiMock, {\n derivationPath: DEFAULT_DERIVATION_PATH,\n });\n const result = await task.run();\n\n // THEN\n expect(isSuccessCommandResult(result)).toBe(false);\n expect(result).toEqual(error);\n expect(apiMock.sendCommand).toHaveBeenCalledTimes(1);\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SignActionsCommand({ derivationPath: DEFAULT_DERIVATION_PATH }),\n );\n });\n\n it(\"returns one signature when device returns signaturesLeft 0 on first call\", async () => {\n // GIVEN\n apiMock.sendCommand.mockResolvedValue(\n createSignatureResponse({ signaturesLeft: 0 }),\n );\n\n // WHEN\n const task = new SignActionsTask(apiMock, {\n derivationPath: DEFAULT_DERIVATION_PATH,\n });\n const result = await task.run();\n\n // THEN\n expect(isSuccessCommandResult(result)).toBe(true);\n if (!isSuccessCommandResult(result)) {\n throw new Error(\"Unexpected\");\n }\n expect(result.data).toHaveLength(1);\n expect(result.data[0]).toEqual({\n r: \"1a7718eede70393bbc640a649ee65401748953a1b671ffa15fea9cb7e2092898\",\n s: \"37e2621d96135f05f54fe891bb5850a94003717dfe228c270fba5d8e7f35b590\",\n v: 0x1c,\n });\n expect(apiMock.sendCommand).toHaveBeenCalledTimes(1);\n });\n\n it(\"returns three signatures when device returns signaturesLeft 2, 1, 0 across three calls\", async () => {\n // GIVEN\n apiMock.sendCommand\n .mockResolvedValueOnce(\n createSignatureResponse({\n signaturesLeft: 2,\n r: \"sig1_r\",\n s: \"sig1_s\",\n v: 27,\n }),\n )\n .mockResolvedValueOnce(\n createSignatureResponse({\n signaturesLeft: 1,\n r: \"sig2_r\",\n s: \"sig2_s\",\n v: 28,\n }),\n )\n .mockResolvedValueOnce(\n createSignatureResponse({\n signaturesLeft: 0,\n r: \"sig3_r\",\n s: \"sig3_s\",\n v: 27,\n }),\n );\n\n // WHEN\n const task = new SignActionsTask(apiMock, {\n derivationPath: DEFAULT_DERIVATION_PATH,\n });\n const result = await task.run();\n\n // THEN\n expect(isSuccessCommandResult(result)).toBe(true);\n if (!isSuccessCommandResult(result)) {\n throw new Error(\"Unexpected\");\n }\n expect(result.data).toHaveLength(3);\n expect(result.data[0]).toEqual({ r: \"sig1_r\", s: \"sig1_s\", v: 27 });\n expect(result.data[1]).toEqual({ r: \"sig2_r\", s: \"sig2_s\", v: 28 });\n expect(result.data[2]).toEqual({ r: \"sig3_r\", s: \"sig3_s\", v: 27 });\n expect(apiMock.sendCommand).toHaveBeenCalledTimes(3);\n expect(apiMock.sendCommand).toHaveBeenNthCalledWith(\n 1,\n new SignActionsCommand({ derivationPath: DEFAULT_DERIVATION_PATH }),\n );\n expect(apiMock.sendCommand).toHaveBeenNthCalledWith(\n 2,\n new SignActionsCommand({ derivationPath: DEFAULT_DERIVATION_PATH }),\n );\n expect(apiMock.sendCommand).toHaveBeenNthCalledWith(\n 3,\n new SignActionsCommand({ derivationPath: DEFAULT_DERIVATION_PATH }),\n );\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_device_management_kit", "import_vitest", "import_SignActionsCommand", "import_makeInternalApi", "import_SignActionsTask", "DEFAULT_DERIVATION_PATH", "createSignatureResponse", "overrides", "apiMock", "error", "result"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var A=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var S=(e,t)=>{for(var r in t)A(e,r,{get:t[r],enumerable:!0})},L=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of p(t))!m.call(e,a)&&a!==r&&A(e,a,{get:()=>t[a],enumerable:!(o=y(t,a))||o.enumerable});return e};var N=e=>L(A({},"__esModule",{value:!0}),e);var g={};S(g,{ACTION_TYPE:()=>T,STRUCTURE_TYPE_VALUE:()=>B,TLV_TAG:()=>n,VERSION_VALUE:()=>x,buildActionStructure:()=>O,serializeActionToTlv:()=>w,serializeOrderToTlv:()=>_});module.exports=N(g);var d=require("@ledgerhq/device-management-kit");const s=33024,n={STRUCTURE_TYPE:1,VERSION:2,CHAIN_ID:35,MAX_FEE:176,ACTION_TYPE:208,ASSET_ID:209,BUILDER_ADDRESS:211,NONCE:218,ACTION_STRUCTURE:219,ORDER_ID:220,ORDER:221,IS_CROSS:222,ORDER_TYPE:224,BUY_OR_NOT:226,PRICE:227,SIZE:228,REDUCE_ONLY:229,TIF:230,TRIGGER_MARKET:231,TRIGGER_PRICE:232,TRIGGER_TYPE:233,GROUPING:234,BUILDER_INFO:235,BUILDER_FEE:236,LEVERAGE:237,UPDATE_ORDERS:216,CANCEL_ORDERS:217,ORDER_DETAIL:215,NTLI:214},B=44,x=1,T={ORDER:0,MODIFY:1,CANCEL:2,UPDATE_LEVERAGE:3,APPROVAL_BUILDER_FEE:4,UPDATE_ISOLATED_MARGIN:5},l={LIMIT:0,TRIGGER:1},c={ALO:0,IOC:1,GTC:2},U={TP:0,SL:1},R={NA:0,NORMAL_TPSL:1,POSITION_TPSL:2};function P(e){switch(e.type){case"order":return T.ORDER;case"modify":case"batchModify":return T.MODIFY;case"cancel":return T.CANCEL;case"updateLeverage":return T.UPDATE_LEVERAGE;case"approveBuilderFee":return T.APPROVAL_BUILDER_FEE;case"updateIsolatedMargin":return T.UPDATE_ISOLATED_MARGIN;default:throw new Error(`Unknown action type: ${e.type}`)}}function b(e){switch(e){case"Alo":return c.ALO;case"Ioc":return c.IOC;case"Gtc":return c.GTC;default:return c.GTC}}function C(e){switch(e){case"na":return R.NA;case"normalTpsl":return R.NORMAL_TPSL;case"positionTpsl":return R.POSITION_TPSL;default:return R.NA}}function G(e,t=8){if(e<0||!Number.isInteger(e))throw new Error(`Expected non-negative integer, got ${e}`);if(!Number.isSafeInteger(e))throw new Error(`Value ${e} is not a safe integer`);const r=BigInt(e);if(r>0xffffffffffffffffn)throw new Error(`Value ${e} exceeds u64 range`);if(r===0n)return new Uint8Array([0]);const o=[];let a=r;for(;a>0n&&o.length<t;)o.unshift(Number(a&0xffn)),a>>=8n;return new Uint8Array(o)}function I(e,t,r,o=8){t>127?e.add16BitUIntToData(s+t):e.add8BitUIntToData(t);const a=G(r,o);e.add8BitUIntToData(a.length),e.addBufferToData(a)}function i(e,t,r){t>127?e.add16BitUIntToData(s+t):e.add8BitUIntToData(t),e.add8BitUIntToData(1),e.add8BitUIntToData(r)}function u(e,t,r){t>127?e.add16BitUIntToData(s+t):e.add8BitUIntToData(t),e.add8BitUIntToData(8),e.add64BitUIntToData(r)}function f(e,t,r){t>127?e.add16BitUIntToData(s+t):e.add8BitUIntToData(t),e.encodeInLVFromAscii(r)}function E(e,t,r){t>127?e.add16BitUIntToData(s+t):e.add8BitUIntToData(t),e.encodeInLVFromBuffer(r)}function _(e){const t=new d.ByteArrayBuilder,r="limit"in e.t,o=e.t;i(t,n.ORDER_TYPE,r?l.LIMIT:l.TRIGGER),I(t,n.ASSET_ID,e.a),i(t,n.BUY_OR_NOT,e.b?1:0),f(t,n.PRICE,e.p),f(t,n.SIZE,e.s),i(t,n.REDUCE_ONLY,e.r?1:0);const a=new d.ByteArrayBuilder;return r&&"limit"in o?i(a,n.TIF,b(o.limit.tif)):"trigger"in o&&(i(a,n.TRIGGER_MARKET,o.trigger.isMarket?1:0),f(a,n.TRIGGER_PRICE,o.trigger.triggerPx),i(a,n.TRIGGER_TYPE,o.trigger.tpsl==="tp"?U.TP:U.SL)),E(t,n.ORDER_DETAIL,a.build()),t.build()}function D(e,t,r){t>127?e.add16BitUIntToData(s+t):e.add8BitUIntToData(t),e.encodeInLVFromHexa(r)}function O(e){const t=new d.ByteArrayBuilder;switch(e.type){case"order":{const r=e.orders[0];if(!r)throw new Error("order action must have at least one order");const o=_(r);if(E(t,n.ORDER,o),i(t,n.GROUPING,C(e.grouping)),e.builder!==void 0){const a=new d.ByteArrayBuilder;D(a,n.BUILDER_ADDRESS,e.builder.b),I(a,n.BUILDER_FEE,e.builder.f),E(t,n.BUILDER_INFO,a.build())}break}case"modify":case"batchModify":{if(!e.modifies.length)throw new Error("modify action must have at least one modify");const r=new d.ByteArrayBuilder;for(const a of e.modifies)E(r,n.ORDER,_(a.order)),u(r,n.ORDER_ID,a.oid);const o=r.build();E(t,n.UPDATE_ORDERS,o);break}case"cancel":{if(!e.cancels.length)throw new Error("cancel action must have at least one cancel");const r=new d.ByteArrayBuilder;for(const a of e.cancels)I(r,n.ASSET_ID,a.a),u(r,n.ORDER_ID,a.o);const o=r.build();E(t,n.CANCEL_ORDERS,o);break}case"updateLeverage":{I(t,n.ASSET_ID,e.asset),i(t,n.IS_CROSS,e.isCross?1:0),u(t,n.LEVERAGE,e.leverage);break}case"approveBuilderFee":D(t,n.CHAIN_ID,e.signatureChainId),f(t,n.MAX_FEE,e.maxFeeRate),D(t,n.BUILDER_ADDRESS,e.builder);break;case"updateIsolatedMargin":I(t,n.ASSET_ID,e.asset),i(t,n.BUY_OR_NOT,e.isBuy?1:0),u(t,n.NTLI,e.ntli);break;default:break}return t.build()}function w(e){const t=new d.ByteArrayBuilder,r=P(e),o=O(e);return t.add8BitUIntToData(n.STRUCTURE_TYPE).add8BitUIntToData(1).add8BitUIntToData(B),t.add8BitUIntToData(n.VERSION).add8BitUIntToData(1).add8BitUIntToData(x),t.add16BitUIntToData(s+n.ACTION_TYPE).add8BitUIntToData(1).add8BitUIntToData(r),I(t,n.NONCE,e.nonce),E(t,n.ACTION_STRUCTURE,o),t.build()}0&&(module.exports={ACTION_TYPE,STRUCTURE_TYPE_VALUE,TLV_TAG,VERSION_VALUE,buildActionStructure,serializeActionToTlv,serializeOrderToTlv});
|
|
2
|
+
//# sourceMappingURL=actionTlvSerializer.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/utils/actionTlvSerializer.ts"],
|
|
4
|
+
"sourcesContent": ["import { ByteArrayBuilder } from \"@ledgerhq/device-management-kit\";\n\nimport type {\n HyperliquidAction,\n Order,\n} from \"@internal/app-binder/di/appBinderTypes\";\n\nconst LONG_NUMBER_MAX_BYTES = 0x81 << 8;\n\n/**\n * TLV tags for \"Set action to sign\" (specs.md \u00A7 Set action to sign).\n */\nexport const TLV_TAG = {\n STRUCTURE_TYPE: 0x01,\n VERSION: 0x02,\n CHAIN_ID: 0x23,\n MAX_FEE: 0xb0,\n ACTION_TYPE: 0xd0,\n ASSET_ID: 0xd1,\n BUILDER_ADDRESS: 0xd3,\n NONCE: 0xda,\n ACTION_STRUCTURE: 0xdb,\n ORDER_ID: 0xdc,\n ORDER: 0xdd,\n IS_CROSS: 0xde,\n ORDER_TYPE: 0xe0,\n BUY_OR_NOT: 0xe2,\n PRICE: 0xe3,\n SIZE: 0xe4,\n REDUCE_ONLY: 0xe5,\n TIF: 0xe6,\n TRIGGER_MARKET: 0xe7,\n TRIGGER_PRICE: 0xe8,\n TRIGGER_TYPE: 0xe9,\n GROUPING: 0xea,\n BUILDER_INFO: 0xeb,\n BUILDER_FEE: 0xec,\n LEVERAGE: 0xed,\n UPDATE_ORDERS: 0xd8,\n CANCEL_ORDERS: 0xd9,\n ORDER_DETAIL: 0xd7,\n NTLI: 0xd6,\n} as const;\n\n/** Required structure_type value per specs */\nexport const STRUCTURE_TYPE_VALUE = 0x2c;\n\n/** Required version value per specs */\nexport const VERSION_VALUE = 0x01;\n\n/** action_type enum: order, modify, cancel, updateLeverage, approvalBuilderFee */\nexport const ACTION_TYPE = {\n ORDER: 0x00,\n MODIFY: 0x01,\n CANCEL: 0x02,\n UPDATE_LEVERAGE: 0x03,\n APPROVAL_BUILDER_FEE: 0x04,\n UPDATE_ISOLATED_MARGIN: 0x05,\n} as const;\n\n/** order_type: limit, trigger (specs Order structure) */\nconst ORDER_TYPE = {\n LIMIT: 0x00,\n TRIGGER: 0x01,\n} as const;\n\n/** TIF: ALO, IOC, GTC (specs) */\nconst TIF = {\n ALO: 0x00,\n IOC: 0x01,\n GTC: 0x02,\n} as const;\n\n/** trigger_type: TP, SL (specs) */\nconst TRIGGER_TYPE = {\n TP: 0x00,\n SL: 0x01,\n} as const;\n\n/** grouping (specs create_order) */\nconst GROUPING = {\n NA: 0x00,\n NORMAL_TPSL: 0x01,\n POSITION_TPSL: 0x02,\n} as const;\n\nexport type ActionTypeValue = (typeof ACTION_TYPE)[keyof typeof ACTION_TYPE];\n\nfunction getActionTypeByte(action: HyperliquidAction): number {\n switch (action.type) {\n case \"order\":\n return ACTION_TYPE.ORDER;\n case \"modify\":\n case \"batchModify\":\n return ACTION_TYPE.MODIFY;\n case \"cancel\":\n return ACTION_TYPE.CANCEL;\n case \"updateLeverage\":\n return ACTION_TYPE.UPDATE_LEVERAGE;\n case \"approveBuilderFee\":\n return ACTION_TYPE.APPROVAL_BUILDER_FEE;\n case \"updateIsolatedMargin\":\n return ACTION_TYPE.UPDATE_ISOLATED_MARGIN;\n default:\n throw new Error(\n `Unknown action type: ${(action as HyperliquidAction).type}`,\n );\n }\n}\n\nfunction tifToByte(tif: \"Alo\" | \"Ioc\" | \"Gtc\"): number {\n switch (tif) {\n case \"Alo\":\n return TIF.ALO;\n case \"Ioc\":\n return TIF.IOC;\n case \"Gtc\":\n return TIF.GTC;\n default:\n return TIF.GTC;\n }\n}\n\nfunction groupingToByte(g: \"na\" | \"normalTpsl\" | \"positionTpsl\"): number {\n switch (g) {\n case \"na\":\n return GROUPING.NA;\n case \"normalTpsl\":\n return GROUPING.NORMAL_TPSL;\n case \"positionTpsl\":\n return GROUPING.POSITION_TPSL;\n default:\n return GROUPING.NA;\n }\n}\n\n/**\n * Encode a non-negative integer as 1\u20138 bytes big-endian (minimal length).\n * 0 \u2192 1 byte (0x00), 1..255 \u2192 1 byte, 256..65535 \u2192 2 bytes, etc.\n */\nfunction numberToVarBytes(value: number, maxBytes: number = 8): Uint8Array {\n if (value < 0 || !Number.isInteger(value)) {\n throw new Error(`Expected non-negative integer, got ${value}`);\n }\n if (!Number.isSafeInteger(value)) {\n throw new Error(`Value ${value} is not a safe integer`);\n }\n const big = BigInt(value);\n if (big > 0xffffffffffffffffn) {\n throw new Error(`Value ${value} exceeds u64 range`);\n }\n if (big === 0n) {\n return new Uint8Array([0]);\n }\n const bytes: number[] = [];\n let n = big;\n while (n > 0n && bytes.length < maxBytes) {\n bytes.unshift(Number(n & 0xffn));\n n >>= 8n;\n }\n return new Uint8Array(bytes);\n}\n\n/** Append a TLV field with variable-length number (tag + length 1..8 + value bytes). */\nfunction encodeTlvVarNumber(\n builder: ByteArrayBuilder,\n tag: number,\n value: number,\n maxBytes: number = 8,\n): void {\n if (tag > 0x7f) {\n builder.add16BitUIntToData(LONG_NUMBER_MAX_BYTES + tag);\n } else {\n builder.add8BitUIntToData(tag);\n }\n const bytes = numberToVarBytes(value, maxBytes);\n builder.add8BitUIntToData(bytes.length);\n builder.addBufferToData(bytes);\n}\n\nfunction encodeInTlvFromUInt8(\n builder: ByteArrayBuilder,\n tag: number,\n value: number,\n): void {\n if (tag > 0x7f) {\n builder.add16BitUIntToData(LONG_NUMBER_MAX_BYTES + tag);\n } else {\n builder.add8BitUIntToData(tag);\n }\n builder.add8BitUIntToData(1);\n builder.add8BitUIntToData(value);\n}\n\nfunction encodeInTlvFromUInt64(\n builder: ByteArrayBuilder,\n tag: number,\n value: number,\n): void {\n if (tag > 0x7f) {\n builder.add16BitUIntToData(LONG_NUMBER_MAX_BYTES + tag);\n } else {\n builder.add8BitUIntToData(tag);\n }\n builder.add8BitUIntToData(8);\n builder.add64BitUIntToData(value);\n}\n\nfunction encodeInTlvFromAscii(\n builder: ByteArrayBuilder,\n tag: number,\n value: string,\n): void {\n if (tag > 0x7f) {\n builder.add16BitUIntToData(LONG_NUMBER_MAX_BYTES + tag);\n } else {\n builder.add8BitUIntToData(tag);\n }\n builder.encodeInLVFromAscii(value);\n}\n\nfunction encodeInTlvFromBuffer(\n builder: ByteArrayBuilder,\n tag: number,\n value: Uint8Array,\n): void {\n if (tag > 0x7f) {\n builder.add16BitUIntToData(LONG_NUMBER_MAX_BYTES + tag);\n } else {\n builder.add8BitUIntToData(tag);\n }\n builder.encodeInLVFromBuffer(value);\n}\n\n/** Serialize a single Order to TLV (specs Order structure: 0xe0\u20130xe9). */\nexport function serializeOrderToTlv(order: Order): Uint8Array {\n const b = new ByteArrayBuilder();\n const isLimit = \"limit\" in order.t;\n const orderType = order.t;\n\n // 0xe0 ORDER_TYPE: limit 0x00, trigger 0x01\n encodeInTlvFromUInt8(\n b,\n TLV_TAG.ORDER_TYPE,\n isLimit ? ORDER_TYPE.LIMIT : ORDER_TYPE.TRIGGER,\n );\n // 0xe1 ASSET_ID (var number: 1\u20138 bytes)\n encodeTlvVarNumber(b, TLV_TAG.ASSET_ID, order.a);\n // 0xe2 BUY_OR_NOT: 1 byte boolean\n encodeInTlvFromUInt8(b, TLV_TAG.BUY_OR_NOT, order.b ? 1 : 0);\n // 0xe3 PRICE, 0xe4 SIZE\n encodeInTlvFromAscii(b, TLV_TAG.PRICE, order.p);\n encodeInTlvFromAscii(b, TLV_TAG.SIZE, order.s);\n // 0xe5 REDUCE_ONLY\n encodeInTlvFromUInt8(b, TLV_TAG.REDUCE_ONLY, order.r ? 1 : 0);\n\n const payloadBuilder = new ByteArrayBuilder();\n if (isLimit && \"limit\" in orderType) {\n encodeInTlvFromUInt8(\n payloadBuilder,\n TLV_TAG.TIF,\n tifToByte(orderType.limit.tif),\n );\n } else if (\"trigger\" in orderType) {\n encodeInTlvFromUInt8(\n payloadBuilder,\n TLV_TAG.TRIGGER_MARKET,\n orderType.trigger.isMarket ? 1 : 0,\n );\n encodeInTlvFromAscii(\n payloadBuilder,\n TLV_TAG.TRIGGER_PRICE,\n orderType.trigger.triggerPx,\n );\n encodeInTlvFromUInt8(\n payloadBuilder,\n TLV_TAG.TRIGGER_TYPE,\n orderType.trigger.tpsl === \"tp\" ? TRIGGER_TYPE.TP : TRIGGER_TYPE.SL,\n );\n }\n encodeInTlvFromBuffer(b, TLV_TAG.ORDER_DETAIL, payloadBuilder.build());\n\n return b.build();\n}\n\nfunction encodeInTlvFromHexa(\n builder: ByteArrayBuilder,\n tag: number,\n value: string,\n): void {\n if (tag > 0x7f) {\n builder.add16BitUIntToData(LONG_NUMBER_MAX_BYTES + tag);\n } else {\n builder.add8BitUIntToData(tag);\n }\n builder.encodeInLVFromHexa(value);\n}\n\n/** Build action_structure (value for tag 0xdb) per specs create_order / update_order / cancel_order / leverage. */\nexport function buildActionStructure(action: HyperliquidAction): Uint8Array {\n const b = new ByteArrayBuilder();\n\n switch (action.type) {\n case \"order\": {\n // create_order: order (0xdd), grouping (0xea), optional builder_address (0xeb), builder_fee (0xec)\n const order = action.orders[0];\n if (!order) throw new Error(\"order action must have at least one order\");\n const orderPayload = serializeOrderToTlv(order);\n encodeInTlvFromBuffer(b, TLV_TAG.ORDER, orderPayload);\n encodeInTlvFromUInt8(\n b,\n TLV_TAG.GROUPING,\n groupingToByte(action.grouping),\n );\n if (action.builder !== undefined) {\n const builderInfoBuilder = new ByteArrayBuilder();\n encodeInTlvFromHexa(\n builderInfoBuilder,\n TLV_TAG.BUILDER_ADDRESS,\n action.builder.b,\n );\n encodeTlvVarNumber(\n builderInfoBuilder,\n TLV_TAG.BUILDER_FEE,\n action.builder.f,\n );\n\n encodeInTlvFromBuffer(\n b,\n TLV_TAG.BUILDER_INFO,\n builderInfoBuilder.build(),\n );\n }\n break;\n }\n case \"modify\":\n case \"batchModify\": {\n // update_order: tag UPDATE_ORDER (0xd8) once, then length of buffer, then buffer of [order (0xdd), oid (0xdc)] per modify\n if (!action.modifies.length) {\n throw new Error(\"modify action must have at least one modify\");\n }\n const payloadBuilder = new ByteArrayBuilder();\n for (const mod of action.modifies) {\n encodeInTlvFromBuffer(\n payloadBuilder,\n TLV_TAG.ORDER,\n serializeOrderToTlv(mod.order),\n );\n encodeInTlvFromUInt64(payloadBuilder, TLV_TAG.ORDER_ID, mod.oid);\n }\n const updateOrderPayload = payloadBuilder.build();\n encodeInTlvFromBuffer(b, TLV_TAG.UPDATE_ORDERS, updateOrderPayload);\n break;\n }\n case \"cancel\": {\n // cancel_order: asset_id (0xd1), oid (0xdc)\n if (!action.cancels.length) {\n throw new Error(\"cancel action must have at least one cancel\");\n }\n const payloadBuilder = new ByteArrayBuilder();\n for (const cancel of action.cancels) {\n encodeTlvVarNumber(payloadBuilder, TLV_TAG.ASSET_ID, cancel.a);\n encodeInTlvFromUInt64(payloadBuilder, TLV_TAG.ORDER_ID, cancel.o);\n }\n const updateOrderPayload = payloadBuilder.build();\n encodeInTlvFromBuffer(b, TLV_TAG.CANCEL_ORDERS, updateOrderPayload);\n\n break;\n }\n case \"updateLeverage\": {\n // leverage: asset_id (0xd1), is_cross (0xde), leverage (0xed)\n encodeTlvVarNumber(b, TLV_TAG.ASSET_ID, action.asset);\n encodeInTlvFromUInt8(b, TLV_TAG.IS_CROSS, action.isCross ? 1 : 0);\n encodeInTlvFromUInt64(b, TLV_TAG.LEVERAGE, action.leverage);\n break;\n }\n case \"approveBuilderFee\":\n encodeInTlvFromHexa(b, TLV_TAG.CHAIN_ID, action.signatureChainId);\n encodeInTlvFromAscii(b, TLV_TAG.MAX_FEE, action.maxFeeRate);\n encodeInTlvFromHexa(b, TLV_TAG.BUILDER_ADDRESS, action.builder);\n break;\n case \"updateIsolatedMargin\":\n encodeTlvVarNumber(b, TLV_TAG.ASSET_ID, action.asset);\n encodeInTlvFromUInt8(b, TLV_TAG.BUY_OR_NOT, action.isBuy ? 1 : 0);\n encodeInTlvFromUInt64(b, TLV_TAG.NTLI, action.ntli);\n break;\n default:\n break;\n }\n\n return b.build();\n}\n\n/**\n * Serialize a single action to the TLV format defined in specs.md \"Set action to sign\".\n * Data fields: structure_type (0x01), version (0x02), action_type (0xd0), nonce (0xda), action_structure (0xdb).\n */\nexport function serializeActionToTlv(action: HyperliquidAction): Uint8Array {\n const builder = new ByteArrayBuilder();\n const actionTypeByte = getActionTypeByte(action);\n const actionStructure = buildActionStructure(action);\n\n // structure_type (0x01): required u8, value 0x2c\n builder\n .add8BitUIntToData(TLV_TAG.STRUCTURE_TYPE)\n .add8BitUIntToData(1)\n .add8BitUIntToData(STRUCTURE_TYPE_VALUE);\n\n // version (0x02): required u8, value 0x01\n builder\n .add8BitUIntToData(TLV_TAG.VERSION)\n .add8BitUIntToData(1)\n .add8BitUIntToData(VERSION_VALUE);\n\n // action_type (0xd0): 1 byte, required u8\n builder\n .add16BitUIntToData(LONG_NUMBER_MAX_BYTES + TLV_TAG.ACTION_TYPE)\n .add8BitUIntToData(1)\n .add8BitUIntToData(actionTypeByte);\n\n // nonce (0xda): var, required number \u2014 1\u20138 bytes\n encodeTlvVarNumber(builder, TLV_TAG.NONCE, action.nonce);\n\n // action_structure (0xdb): var\n encodeInTlvFromBuffer(builder, TLV_TAG.ACTION_STRUCTURE, actionStructure);\n\n return builder.build();\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["actionTlvSerializer_exports", "__export", "ACTION_TYPE", "STRUCTURE_TYPE_VALUE", "TLV_TAG", "VERSION_VALUE", "buildActionStructure", "serializeActionToTlv", "serializeOrderToTlv", "__toCommonJS", "import_device_management_kit", "LONG_NUMBER_MAX_BYTES", "ORDER_TYPE", "TIF", "TRIGGER_TYPE", "GROUPING", "getActionTypeByte", "action", "tifToByte", "tif", "groupingToByte", "g", "numberToVarBytes", "value", "maxBytes", "big", "bytes", "n", "encodeTlvVarNumber", "builder", "tag", "encodeInTlvFromUInt8", "encodeInTlvFromUInt64", "encodeInTlvFromAscii", "encodeInTlvFromBuffer", "order", "b", "isLimit", "orderType", "payloadBuilder", "encodeInTlvFromHexa", "orderPayload", "builderInfoBuilder", "mod", "updateOrderPayload", "cancel", "actionTypeByte", "actionStructure"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var n=require("@ledgerhq/device-management-kit"),e=require("vitest"),i=require("./actionTlvSerializer");(0,e.describe)("serializeOrderToTlv",()=>{e.it.each([{name:"order limit (Gtc)",order:{a:0,b:!0,p:"100",s:"1",r:!1,t:{limit:{tif:"Gtc"}}},expectedHex:"81e0010081d1010081e2010181e30331303081e4013181e5010081d70481e60102"},{name:"order trigger (tp, isMarket)",order:{a:0,b:!1,p:"85169",s:"0.0005",r:!0,t:{trigger:{isMarket:!0,triggerPx:"85169",tpsl:"tp"}}},expectedHex:"81e0010181d1010081e2010081e305383531363981e406302E3030303581e5010181d71081e7010181e805383531363981e90100"},{name:"order limit (Ioc)",order:{a:42,b:!1,p:"1992",s:"0.512",r:!1,t:{limit:{tif:"Ioc"}}},expectedHex:"81e0010081d1012a81e2010081e3043139393281e405302E35313281e5010081d70481e60101"}])("$name",({order:a,expectedHex:r})=>{const t=(0,i.serializeOrderToTlv)(a);(0,e.expect)(t).toBeInstanceOf(Uint8Array),(0,e.expect)(t.length).toBeGreaterThan(0);const d=(0,n.hexaStringToBuffer)(r);(0,e.expect)(t).toEqual(d)})});(0,e.describe)("buildActionStructure",()=>{e.it.each([{name:"action type order (create_order)",action:{type:"order",orders:[{a:0,b:!0,p:"1",s:"1",r:!1,t:{limit:{tif:"Gtc"}}}],grouping:"na",nonce:1},expectedHex:"81dd1f81e0010081d1010081e2010181e3013181e4013181e5010081d70481e6010281ea0100"},{name:"action type batchModify (update_order)",action:{type:"batchModify",modifies:[{oid:343050796655,order:{a:0,b:!1,p:"85169",s:"0.0005",r:!0,t:{trigger:{isMarket:!0,triggerPx:"85169",tpsl:"tp"}}}}],nonce:1773050015814},expectedHex:"81d84281dd3481e0010181d1010081e2010081e305383531363981e406302E3030303581e5010181d71081e7010181e805383531363981e9010081dc080000004FDF6BBE6F"},{name:"action type cancel",action:{type:"cancel",cancels:[{a:0,o:340574409238}],nonce:1772813983827},expectedHex:"81d90f81d1010081dc080000004F4BD11216"},{name:"action type updateLeverage",action:{type:"updateLeverage",asset:0,isCross:!1,leverage:10,nonce:3},expectedHex:"81d1010081de010081ed08000000000000000a"},{name:"action type approveBuilderFee",action:{type:"approveBuilderFee",hyperliquidChain:"Mainnet",signatureChainId:"0xa4b1",maxFeeRate:"0.1000%",builder:"0xc0708cdd6cd166d51da264e3f49a0422be26e35b",nonce:1772440978175},expectedHex:"2302a4b181b007302E313030302581d314c0708cdd6cd166d51da264e3f49a0422be26e35b"},{name:"action type updateIsolatedMargin",action:{type:"updateIsolatedMargin",asset:0,isBuy:!0,ntli:1e7,nonce:1772440978175},expectedHex:"81d1010081e2010181d6080000000000989680"}])("$name",({action:a,expectedHex:r})=>{const t=(0,i.buildActionStructure)(a);(0,e.expect)(t).toBeInstanceOf(Uint8Array),(0,e.expect)(t.length).toBeGreaterThan(0);const d=(0,n.hexaStringToBuffer)(r);(0,e.expect)(t).toEqual(d)})});
|
|
2
|
+
//# sourceMappingURL=actionTlvSerializer.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/utils/actionTlvSerializer.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { hexaStringToBuffer } from \"@ledgerhq/device-management-kit\";\nimport { describe, expect, it } from \"vitest\";\n\nimport type { HyperliquidAction } from \"@internal/app-binder/di/appBinderTypes\";\n\nimport {\n buildActionStructure,\n serializeOrderToTlv,\n} from \"./actionTlvSerializer\";\n\ndescribe(\"serializeOrderToTlv\", () => {\n it.each([\n {\n name: \"order limit (Gtc)\",\n order: {\n a: 0,\n b: true,\n p: \"100\",\n s: \"1\",\n r: false,\n t: { limit: { tif: \"Gtc\" as const } },\n },\n expectedHex:\n \"81e00100\" + // ORDER_TYPE\n \"81d10100\" + // ASSET_ID\n \"81e20101\" + // BUY_OR_NOT\n \"81e303313030\" + // PRICE\n \"81e40131\" + // SIZE\n \"81e50100\" + // REDUCE_ONLY\n \"81d704\" + // ORDER_DETAIL\n \"81e60102\", // TIF\n },\n {\n name: \"order trigger (tp, isMarket)\",\n order: {\n a: 0,\n b: false,\n p: \"85169\",\n s: \"0.0005\",\n r: true,\n t: {\n trigger: {\n isMarket: true,\n triggerPx: \"85169\",\n tpsl: \"tp\" as const,\n },\n },\n },\n expectedHex:\n \"81e00101\" + // ORDER_TYPE\n \"81d10100\" + // ASSET_ID\n \"81e20100\" + // BUY_OR_NOT\n \"81e3053835313639\" + // PRICE\n \"81e406302E30303035\" + // SIZE\n \"81e50101\" + // REDUCE_ONLY\n \"81d710\" + // ORDER_DETAIL\n \"81e70101\" + // TRIGGER_MARKET\n \"81e8053835313639\" + // TRIGGER_PRICE\n \"81e90100\", // TRIGGER_TYPE\n },\n {\n name: \"order limit (Ioc)\",\n order: {\n a: 42,\n b: false,\n p: \"1992\",\n s: \"0.512\",\n r: false,\n t: { limit: { tif: \"Ioc\" as const } },\n },\n expectedHex:\n \"81e00100\" + // ORDER_TYPE\n \"81d1012a\" + // ASSET_ID\n \"81e20100\" + // BUY_OR_NOT\n \"81e30431393932\" + // PRICE\n \"81e405302E353132\" + // SIZE\n \"81e50100\" + // REDUCE_ONLY\n \"81d704\" + // ORDER_DETAIL\n \"81e60101\", // TIF\n },\n ])(\"$name\", ({ order, expectedHex }) => {\n const result = serializeOrderToTlv(order);\n\n expect(result).toBeInstanceOf(Uint8Array);\n expect(result.length).toBeGreaterThan(0);\n const expected = hexaStringToBuffer(expectedHex);\n expect(result).toEqual(expected);\n });\n});\n\ndescribe(\"buildActionStructure\", () => {\n it.each([\n {\n name: \"action type order (create_order)\",\n action: {\n type: \"order\",\n orders: [\n {\n a: 0,\n b: true,\n p: \"1\",\n s: \"1\",\n r: false,\n t: { limit: { tif: \"Gtc\" as const } },\n },\n ],\n grouping: \"na\",\n nonce: 1, // Not serialized with this fuction call\n } satisfies HyperliquidAction,\n expectedHex:\n // prettier-ignore\n /* eslint-disable prettier/prettier */\n \"81dd1f\" + // ORDER\n \"81e00100\" + // ORDER_TYPE\n \"81d10100\" + // ASSET_ID\n \"81e20101\" + // BUY_OR_NOT\n \"81e30131\" + // PRICE\n \"81e40131\" + // SIZE\n \"81e50100\" + // REDUCE_ONLY\n \"81d704\" + // ORDER_DETAIL\n \"81e60102\" + // TIF\n \"81ea0100\", // GROUPING\n /* eslint-enable prettier/prettier */\n },\n {\n name: \"action type batchModify (update_order)\",\n action: {\n type: \"batchModify\",\n modifies: [\n {\n oid: 343050796655,\n order: {\n a: 0,\n b: false,\n p: \"85169\",\n s: \"0.0005\",\n r: true,\n t: {\n trigger: {\n isMarket: true,\n triggerPx: \"85169\",\n tpsl: \"tp\" as const,\n },\n },\n },\n },\n ],\n nonce: 1773050015814, // Not serialized with this fuction call // Not serialized with this fuction call\n } satisfies HyperliquidAction,\n expectedHex:\n // prettier-ignore\n /* eslint-disable prettier/prettier */\n \"81d842\" + // UPDATE_ORDERS\n \"81dd34\" + // ORDER\n \"81e00101\" + // ORDER_TYPE\n \"81d10100\" + // ASSET_ID\n \"81e20100\" + // BUY_OR_NOT\n \"81e3053835313639\" + // PRICE\n \"81e406302E30303035\" + // SIZE\n \"81e50101\" + // REDUCE_ONLY\n \"81d710\" + // ORDER_DETAIL\n \"81e70101\" + // TRIGGER_MARKET\n \"81e8053835313639\" + // TRIGGER_PRICE\n \"81e90100\" + // TRIGGER_TYPE\n \"81dc080000004FDF6BBE6F\", // ORDER_ID\n /* eslint-enable prettier/prettier */\n },\n {\n name: \"action type cancel\",\n action: {\n type: \"cancel\",\n cancels: [{ a: 0, o: 340574409238 }],\n nonce: 1772813983827, // Not serialized with this fuction call\n } satisfies HyperliquidAction,\n expectedHex:\n // prettier-ignore\n /* eslint-disable prettier/prettier */\n \"81d90f\" + // CANCEL_ORDERS\n \"81d10100\" + // ASSET_ID\n \"81dc080000004F4BD11216\", // ORDER_ID\n /* eslint-enable prettier/prettier */\n },\n {\n name: \"action type updateLeverage\",\n action: {\n type: \"updateLeverage\",\n asset: 0,\n isCross: false,\n leverage: 10,\n nonce: 3, // Not serialized with this fuction call\n } satisfies HyperliquidAction,\n expectedHex:\n /* eslint-disable prettier/prettier */\n \"81d10100\" + // ASSET_ID\n \"81de0100\" + // IS_CROSS\n \"81ed08000000000000000a\", // LEVERAGE,\n /* eslint-enable prettier/prettier */\n },\n {\n name: \"action type approveBuilderFee\",\n action: {\n type: \"approveBuilderFee\",\n hyperliquidChain: \"Mainnet\",\n signatureChainId: \"0xa4b1\",\n maxFeeRate: \"0.1000%\",\n builder: \"0xc0708cdd6cd166d51da264e3f49a0422be26e35b\",\n nonce: 1772440978175, // Not serialized with this fuction call\n } satisfies HyperliquidAction,\n expectedHex:\n \"2302a4b1\" + // CHAIN_ID\n \"81b007302E3130303025\" + // MAX_FEE\n \"81d314c0708cdd6cd166d51da264e3f49a0422be26e35b\", // APPROVE_BUILDER_ADDRESS\n },\n {\n name: \"action type updateIsolatedMargin\",\n action: {\n type: \"updateIsolatedMargin\",\n asset: 0,\n isBuy: true,\n ntli: 10000000,\n nonce: 1772440978175,\n } satisfies HyperliquidAction,\n expectedHex:\n \"81d10100\" + // ASSET_ID\n \"81e20101\" + // BUY_OR_NOT\n \"81d6080000000000989680\", // NTLI\n },\n ])(\"$name\", ({ action, expectedHex }) => {\n const result = buildActionStructure(action);\n\n expect(result).toBeInstanceOf(Uint8Array);\n expect(result.length).toBeGreaterThan(0);\n const expected = hexaStringToBuffer(expectedHex);\n expect(result).toEqual(expected);\n });\n});\n"],
|
|
5
|
+
"mappings": "aAAA,IAAAA,EAAmC,2CACnCC,EAAqC,kBAIrCC,EAGO,oCAEP,YAAS,sBAAuB,IAAM,CACpC,KAAG,KAAK,CACN,CACE,KAAM,oBACN,MAAO,CACL,EAAG,EACH,EAAG,GACH,EAAG,MACH,EAAG,IACH,EAAG,GACH,EAAG,CAAE,MAAO,CAAE,IAAK,KAAe,CAAE,CACtC,EACA,YACE,oEAQJ,EACA,CACE,KAAM,+BACN,MAAO,CACL,EAAG,EACH,EAAG,GACH,EAAG,QACH,EAAG,SACH,EAAG,GACH,EAAG,CACD,QAAS,CACP,SAAU,GACV,UAAW,QACX,KAAM,IACR,CACF,CACF,EACA,YACE,0GAUJ,EACA,CACE,KAAM,oBACN,MAAO,CACL,EAAG,GACH,EAAG,GACH,EAAG,OACH,EAAG,QACH,EAAG,GACH,EAAG,CAAE,MAAO,CAAE,IAAK,KAAe,CAAE,CACtC,EACA,YACE,8EAQJ,CACF,CAAC,EAAE,QAAS,CAAC,CAAE,MAAAC,EAAO,YAAAC,CAAY,IAAM,CACtC,MAAMC,KAAS,uBAAoBF,CAAK,KAExC,UAAOE,CAAM,EAAE,eAAe,UAAU,KACxC,UAAOA,EAAO,MAAM,EAAE,gBAAgB,CAAC,EACvC,MAAMC,KAAW,sBAAmBF,CAAW,KAC/C,UAAOC,CAAM,EAAE,QAAQC,CAAQ,CACjC,CAAC,CACH,CAAC,KAED,YAAS,uBAAwB,IAAM,CACrC,KAAG,KAAK,CACN,CACE,KAAM,mCACN,OAAQ,CACN,KAAM,QACN,OAAQ,CACN,CACE,EAAG,EACH,EAAG,GACH,EAAG,IACH,EAAG,IACH,EAAG,GACH,EAAG,CAAE,MAAO,CAAE,IAAK,KAAe,CAAE,CACtC,CACF,EACA,SAAU,KACV,MAAO,CACT,EACA,YAGE,8EAWJ,EACA,CACE,KAAM,yCACN,OAAQ,CACN,KAAM,cACN,SAAU,CACR,CACE,IAAK,aACL,MAAO,CACL,EAAG,EACH,EAAG,GACH,EAAG,QACH,EAAG,SACH,EAAG,GACH,EAAG,CACD,QAAS,CACP,SAAU,GACV,UAAW,QACX,KAAM,IACR,CACF,CACF,CACF,CACF,EACA,MAAO,aACT,EACA,YAGE,4IAcJ,EACA,CACE,KAAM,qBACN,OAAQ,CACN,KAAM,SACN,QAAS,CAAC,CAAE,EAAG,EAAG,EAAG,YAAa,CAAC,EACnC,MAAO,aACT,EACA,YAGE,sCAIJ,EACA,CACE,KAAM,6BACN,OAAQ,CACN,KAAM,iBACN,MAAO,EACP,QAAS,GACT,SAAU,GACV,MAAO,CACT,EACA,YAEE,wCAIJ,EACA,CACE,KAAM,gCACN,OAAQ,CACN,KAAM,oBACN,iBAAkB,UAClB,iBAAkB,SAClB,WAAY,UACZ,QAAS,6CACT,MAAO,aACT,EACA,YACE,4EAGJ,EACA,CACE,KAAM,mCACN,OAAQ,CACN,KAAM,uBACN,MAAO,EACP,MAAO,GACP,KAAM,IACN,MAAO,aACT,EACA,YACE,wCAGJ,CACF,CAAC,EAAE,QAAS,CAAC,CAAE,OAAAC,EAAQ,YAAAH,CAAY,IAAM,CACvC,MAAMC,KAAS,wBAAqBE,CAAM,KAE1C,UAAOF,CAAM,EAAE,eAAe,UAAU,KACxC,UAAOA,EAAO,MAAM,EAAE,gBAAgB,CAAC,EACvC,MAAMC,KAAW,sBAAmBF,CAAW,KAC/C,UAAOC,CAAM,EAAE,QAAQC,CAAQ,CACjC,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["import_device_management_kit", "import_vitest", "import_actionTlvSerializer", "order", "expectedHex", "result", "expected", "action"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var o=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var
|
|
1
|
+
"use strict";var o=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var l=(p,i)=>{for(var e in i)o(p,e,{get:i[e],enumerable:!0})},f=(p,i,e,n)=>{if(i&&typeof i=="object"||typeof i=="function")for(let r of B(i))!s.call(p,r)&&r!==e&&o(p,r,{get:()=>i[r],enumerable:!(n=y(i,r))||n.enumerable});return p};var g=p=>f(o({},"__esModule",{value:!0}),p),A=(p,i,e,n)=>{for(var r=n>1?void 0:n?y(i,e):i,a=p.length-1,m;a>=0;a--)(m=p[a])&&(r=(n?m(i,e,r):m(r))||r);return n&&r&&o(i,e,r),r},c=(p,i)=>(e,n)=>i(e,n,p);var q={};l(q,{SignActionsUseCase:()=>t});module.exports=g(q);var d=require("inversify"),u=require("../../app-binder/di/appBinderTypes");let t=class{_appBinder;constructor(i){this._appBinder=i}execute(i){return this._appBinder.signActions(i)}};t=A([(0,d.injectable)(),c(0,(0,d.inject)(u.appBinderTypes.AppBinding))],t);0&&(module.exports={SignActionsUseCase});
|
|
2
2
|
//# sourceMappingURL=SignActionsUseCase.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/use-cases/actions/SignActionsUseCase.ts"],
|
|
4
|
-
"sourcesContent": ["import { inject, injectable } from \"inversify\";\n\nimport { type SignActionsDAReturnType } from \"@api/app-binder/SignActionsDeviceActionTypes\";\nimport {
|
|
5
|
-
"mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAmC,
|
|
6
|
-
"names": ["SignActionsUseCase_exports", "__export", "SignActionsUseCase", "__toCommonJS", "import_inversify", "import_appBinderTypes", "SignActionsUseCase", "appBinder", "
|
|
4
|
+
"sourcesContent": ["import { inject, injectable } from \"inversify\";\n\nimport { type SignActionsDAReturnType } from \"@api/app-binder/SignActionsDeviceActionTypes\";\nimport { appBinderTypes } from \"@internal/app-binder/di/appBinderTypes\";\nimport { HyperliquidAppBinder } from \"@internal/app-binder/HyperliquidAppBinder\";\n\ntype SignActionsParams = Parameters<HyperliquidAppBinder[\"signActions\"]>[0];\n\n@injectable()\nexport class SignActionsUseCase {\n private readonly _appBinder: HyperliquidAppBinder;\n\n constructor(\n @inject(appBinderTypes.AppBinding) appBinder: HyperliquidAppBinder,\n ) {\n this._appBinder = appBinder;\n }\n\n execute(params: SignActionsParams): SignActionsDAReturnType {\n return this._appBinder.signActions(params);\n }\n}\n"],
|
|
5
|
+
"mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAmC,qBAGnCC,EAA+B,kDAMxB,IAAMC,EAAN,KAAyB,CACb,WAEjB,YACqCC,EACnC,CACA,KAAK,WAAaA,CACpB,CAEA,QAAQC,EAAoD,CAC1D,OAAO,KAAK,WAAW,YAAYA,CAAM,CAC3C,CACF,EAZaF,EAANG,EAAA,IADN,cAAW,EAKPC,EAAA,eAAO,iBAAe,UAAU,IAJxBJ",
|
|
6
|
+
"names": ["SignActionsUseCase_exports", "__export", "SignActionsUseCase", "__toCommonJS", "import_inversify", "import_appBinderTypes", "SignActionsUseCase", "appBinder", "params", "__decorateClass", "__decorateParam"]
|
|
7
7
|
}
|
package/lib/cjs/package.json
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"dependencies": {
|
|
3
|
+
"@ledgerhq/context-module": "workspace:*",
|
|
3
4
|
"@ledgerhq/signer-utils": "workspace:*",
|
|
4
5
|
"inversify": "catalog:",
|
|
5
6
|
"purify-ts": "catalog:",
|
|
@@ -52,10 +53,11 @@
|
|
|
52
53
|
"prettier:fix": "prettier . --write",
|
|
53
54
|
"test": "vitest run",
|
|
54
55
|
"test:coverage": "vitest run --coverage",
|
|
56
|
+
"test:file": "vitest run --",
|
|
55
57
|
"test:watch": "vitest",
|
|
56
58
|
"typecheck": "tsc --noEmit",
|
|
57
59
|
"watch:builds": "pnpm ldmk-tool watch --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
|
|
58
60
|
"watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
|
|
59
61
|
},
|
|
60
|
-
"version": "0.0.0-develop-
|
|
62
|
+
"version": "0.0.0-develop-20260313001318"
|
|
61
63
|
}
|
|
@@ -1 +1,2 @@
|
|
|
1
|
+
const e=Object.freeze({OPEN_APP:"signer.hl.steps.openApp",SET_CERTIFICATE:"signer.hl.steps.setCertificate",SEND_METADATA:"signer.hl.steps.sendMetadata",SEND_ACTION:"signer.hl.steps.sendAction",SIGN_ACTIONS:"signer.hl.steps.signActions"});export{e as signActionsDAStateSteps};
|
|
1
2
|
//# sourceMappingURL=SignActionsDeviceActionTypes.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": [],
|
|
4
|
-
"sourcesContent": [],
|
|
5
|
-
"mappings": "",
|
|
6
|
-
"names": []
|
|
3
|
+
"sources": ["../../../../src/api/app-binder/SignActionsDeviceActionTypes.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n type CommandErrorResult,\n type DeviceActionState,\n type ExecuteDeviceActionReturnType,\n type LoadCertificateErrorCodes,\n type OpenAppDAError,\n type OpenAppDARequiredInteraction,\n type UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type Signature } from \"@api/model/Signature\";\nimport { type HyperliquidErrorCodes } from \"@internal/app-binder/command/utils/hyperliquidApplicationErrors\";\nimport type { HyperliquidAction } from \"@internal/app-binder/di/appBinderTypes\";\n\nexport const signActionsDAStateSteps = Object.freeze({\n OPEN_APP: \"signer.hl.steps.openApp\",\n SET_CERTIFICATE: \"signer.hl.steps.setCertificate\",\n SEND_METADATA: \"signer.hl.steps.sendMetadata\",\n SEND_ACTION: \"signer.hl.steps.sendAction\",\n SIGN_ACTIONS: \"signer.hl.steps.signActions\",\n} as const);\n\nexport type SignActionsDAStateStep =\n (typeof signActionsDAStateSteps)[keyof typeof signActionsDAStateSteps];\n\nexport type SignActionsDAOutput = Signature[];\n\n/** One action to sign (TLV format per specs \"Set action to sign\") */\nexport type SignActionsActionItem = HyperliquidAction;\n\nexport type SignActionsDAInput = {\n readonly derivationPath: string;\n readonly certificate: Uint8Array;\n readonly signedMetadata: Uint8Array;\n readonly actions: SignActionsActionItem[];\n readonly skipOpenApp?: boolean;\n};\n\nexport type SignActionsDAError =\n | OpenAppDAError\n | CommandErrorResult<HyperliquidErrorCodes>[\"error\"]\n | CommandErrorResult<LoadCertificateErrorCodes>[\"error\"];\n\ntype SignActionsDARequiredInteraction =\n | OpenAppDARequiredInteraction\n | UserInteractionRequired.SignTransaction;\n\nexport type SignActionsDAIntermediateValue = {\n requiredUserInteraction: SignActionsDARequiredInteraction;\n step: SignActionsDAStateStep;\n};\n\nexport type SignActionsDAState = DeviceActionState<\n SignActionsDAOutput,\n SignActionsDAError,\n SignActionsDAIntermediateValue\n>;\n\nexport type SignActionsDAInternalState = {\n readonly error: SignActionsDAError | null;\n readonly signature: SignActionsDAOutput | null;\n readonly actionIndex: number;\n};\n\nexport type SignActionsDAReturnType = ExecuteDeviceActionReturnType<\n SignActionsDAOutput,\n SignActionsDAError,\n SignActionsDAIntermediateValue\n>;\n"],
|
|
5
|
+
"mappings": "AAcO,MAAMA,EAA0B,OAAO,OAAO,CACnD,SAAU,0BACV,gBAAiB,iCACjB,cAAe,+BACf,YAAa,6BACb,aAAc,6BAChB,CAAU",
|
|
6
|
+
"names": ["signActionsDAStateSteps"]
|
|
7
7
|
}
|
package/lib/esm/api/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export*from"./SignerHyperliquid";export*from"./SignerHyperliquidBuilder";
|
|
1
|
+
import{signActionsDAStateSteps as n}from"./app-binder/SignActionsDeviceActionTypes";export*from"./model/ActionsOptions";export*from"./model/Signature";export*from"./SignerHyperliquid";export*from"./SignerHyperliquidBuilder";export{n as signActionsDAStateSteps};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/lib/esm/api/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/api/index.ts"],
|
|
4
|
-
"sourcesContent": ["export
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": []
|
|
4
|
+
"sourcesContent": ["export {\n type SignActionsDAError,\n type SignActionsDAInput,\n type SignActionsDAIntermediateValue,\n type SignActionsDAOutput,\n type SignActionsDAReturnType,\n type SignActionsDAState,\n type SignActionsDAStateStep,\n signActionsDAStateSteps,\n} from \"./app-binder/SignActionsDeviceActionTypes\";\nexport * from \"@api/model/ActionsOptions\";\nexport * from \"@api/model/Signature\";\nexport * from \"@api/SignerHyperliquid\";\nexport * from \"@api/SignerHyperliquidBuilder\";\n"],
|
|
5
|
+
"mappings": "AAAA,OAQE,2BAAAA,MACK,4CACP,WAAc,4BACd,WAAc,uBACd,WAAc,yBACd,WAAc",
|
|
6
|
+
"names": ["signActionsDAStateSteps"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{makeContainer as
|
|
1
|
+
import{makeContainer as t}from"./di";import{actionsTypes as r}from"./use-cases/actions/di/actionsTypes";class p{_container;constructor({dmk:e,sessionId:i}){this._container=t({dmk:e,sessionId:i})}signActions(e){return this._container.get(r.SignActionsUseCase).execute(e)}}export{p as DefaultSignerHyperliquid};
|
|
2
2
|
//# sourceMappingURL=DefaultSignerHyperliquid.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/internal/DefaultSignerHyperliquid.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type DeviceManagementKit,\n type DeviceSessionId,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Container } from \"inversify\";\n\nimport { type SignActionsDAReturnType } from \"@api/app-binder/SignActionsDeviceActionTypes\";\nimport { type
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["makeContainer", "actionsTypes", "DefaultSignerHyperliquid", "dmk", "sessionId", "
|
|
4
|
+
"sourcesContent": ["import {\n type DeviceManagementKit,\n type DeviceSessionId,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Container } from \"inversify\";\n\nimport { type SignActionsDAReturnType } from \"@api/app-binder/SignActionsDeviceActionTypes\";\nimport { type SignerHyperliquid } from \"@api/SignerHyperliquid\";\nimport { makeContainer } from \"@internal/di\";\nimport { actionsTypes } from \"@internal/use-cases/actions/di/actionsTypes\";\nimport { type SignActionsUseCase } from \"@internal/use-cases/actions/SignActionsUseCase\";\n\ntype DefaultSignerHyperliquidConstructorArgs = {\n dmk: DeviceManagementKit;\n sessionId: DeviceSessionId;\n};\n\nexport class DefaultSignerHyperliquid implements SignerHyperliquid {\n private readonly _container: Container;\n\n constructor({ dmk, sessionId }: DefaultSignerHyperliquidConstructorArgs) {\n this._container = makeContainer({ dmk, sessionId });\n }\n\n signActions(\n params: Parameters<SignerHyperliquid[\"signActions\"]>[0],\n ): SignActionsDAReturnType {\n return this._container\n .get<SignActionsUseCase>(actionsTypes.SignActionsUseCase)\n .execute(params);\n }\n}\n"],
|
|
5
|
+
"mappings": "AAQA,OAAS,iBAAAA,MAAqB,eAC9B,OAAS,gBAAAC,MAAoB,8CAQtB,MAAMC,CAAsD,CAChD,WAEjB,YAAY,CAAE,IAAAC,EAAK,UAAAC,CAAU,EAA4C,CACvE,KAAK,WAAaJ,EAAc,CAAE,IAAAG,EAAK,UAAAC,CAAU,CAAC,CACpD,CAEA,YACEC,EACyB,CACzB,OAAO,KAAK,WACT,IAAwBJ,EAAa,kBAAkB,EACvD,QAAQI,CAAM,CACnB,CACF",
|
|
6
|
+
"names": ["makeContainer", "actionsTypes", "DefaultSignerHyperliquid", "dmk", "sessionId", "params"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var v=Object.defineProperty;var
|
|
1
|
+
var v=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var p=(o,e,t,n)=>{for(var i=n>1?void 0:n?A(e,t):e,a=o.length-1,c;a>=0;a--)(c=o[a])&&(i=(n?c(e,t,i):c(i))||i);return n&&i&&v(e,t,i),i},r=(o,e)=>(t,n)=>e(t,n,o);import{inject as m,injectable as f}from"inversify";import{externalTypes as d}from"../externalTypes";import{SignActionsDeviceAction as D}from"./device-action/SignActions/SignActionsDeviceAction";let s=class{constructor(e,t){this.dmk=e;this.sessionId=t}signActions(e){return this.dmk.executeDeviceAction({sessionId:this.sessionId,deviceAction:new D({input:{derivationPath:e.derivationPath,certificate:e.certificate,signedMetadata:e.signedMetadata,actions:e.actions,skipOpenApp:e.skipOpenApp??!1}})})}};s=p([f(),r(0,m(d.Dmk)),r(1,m(d.SessionId))],s);export{s as HyperliquidAppBinder};
|
|
2
2
|
//# sourceMappingURL=HyperliquidAppBinder.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/internal/app-binder/HyperliquidAppBinder.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["
|
|
4
|
+
"sourcesContent": ["import type {\n DeviceManagementKit,\n DeviceSessionId,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { type SignActionsDAReturnType } from \"@api/app-binder/SignActionsDeviceActionTypes\";\nimport { externalTypes } from \"@internal/externalTypes\";\n\nimport { SignActionsDeviceAction } from \"./device-action/SignActions/SignActionsDeviceAction\";\nimport type { HyperliquidAction } from \"./di/appBinderTypes\";\n\n@injectable()\nexport class HyperliquidAppBinder {\n constructor(\n @inject(externalTypes.Dmk) private dmk: DeviceManagementKit,\n @inject(externalTypes.SessionId) private sessionId: DeviceSessionId,\n ) {}\n\n signActions(args: {\n derivationPath: string;\n certificate: Uint8Array;\n signedMetadata: Uint8Array;\n actions: HyperliquidAction[];\n skipOpenApp?: boolean;\n }): SignActionsDAReturnType {\n return this.dmk.executeDeviceAction({\n sessionId: this.sessionId,\n deviceAction: new SignActionsDeviceAction({\n input: {\n derivationPath: args.derivationPath,\n certificate: args.certificate,\n signedMetadata: args.signedMetadata,\n actions: args.actions,\n skipOpenApp: args.skipOpenApp ?? false,\n },\n }),\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "iOAIA,OAAS,UAAAA,EAAQ,cAAAC,MAAkB,YAGnC,OAAS,iBAAAC,MAAqB,0BAE9B,OAAS,2BAAAC,MAA+B,sDAIjC,IAAMC,EAAN,KAA2B,CAChC,YACqCC,EACMC,EACzC,CAFmC,SAAAD,EACM,eAAAC,CACxC,CAEH,YAAYC,EAMgB,CAC1B,OAAO,KAAK,IAAI,oBAAoB,CAClC,UAAW,KAAK,UAChB,aAAc,IAAIC,EAAwB,CACxC,MAAO,CACL,eAAgBD,EAAK,eACrB,YAAaA,EAAK,YAClB,eAAgBA,EAAK,eACrB,QAASA,EAAK,QACd,YAAaA,EAAK,aAAe,EACnC,CACF,CAAC,CACH,CAAC,CACH,CACF,EA1BaH,EAANK,EAAA,CADNC,EAAW,EAGPC,EAAA,EAAAC,EAAOC,EAAc,GAAG,GACxBF,EAAA,EAAAC,EAAOC,EAAc,SAAS,IAHtBT",
|
|
6
|
+
"names": ["inject", "injectable", "externalTypes", "SignActionsDeviceAction", "HyperliquidAppBinder", "dmk", "sessionId", "args", "SignActionsDeviceAction", "__decorateClass", "injectable", "__decorateParam", "inject", "externalTypes"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{ApduBuilder as n,CommandResultFactory as o,InvalidResponseFormatError as d}from"@ledgerhq/device-management-kit";import{CommandErrorHelper as t}from"@ledgerhq/signer-utils";import{HYPERLIQUID_ERRORS as s,HyperliquidCommandErrorFactory as i}from"./utils/hyperliquidApplicationErrors";const p=224,a=3,m=1,A=0;class y{constructor(e){this.args=e}name="sendAction";errorHelper=new t(s,i);getApdu(){const e={cla:p,ins:a,p1:m,p2:A};return new n(e).add8BitUIntToData(0).encodeInLVFromBuffer(this.args.serializedAction).build()}parseResponse(e){const r=this.errorHelper.getError(e);return r||(e.data.length!==0?o({error:new d("Unexpected data in response")}):o({data:void 0}))}}export{y as SendActionCommand};
|
|
2
|
+
//# sourceMappingURL=SendActionCommand.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/command/SendActionCommand.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n type ApduBuilderArgs,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidResponseFormatError,\n} from \"@ledgerhq/device-management-kit\";\nimport { CommandErrorHelper } from \"@ledgerhq/signer-utils\";\n\nimport {\n HYPERLIQUID_ERRORS,\n HyperliquidCommandErrorFactory,\n type HyperliquidErrorCodes,\n} from \"./utils/hyperliquidApplicationErrors\";\n\n/** Set action to sign \u2014 APDU CLA/INS per specs.md */\nconst CLA = 0xe0;\nconst INS = 0x03;\nconst P1 = 0x01;\nconst P2 = 0x00;\n\nexport type SendActionCommandArgs = {\n /** TLV-serialized action (specs.md \"Set action to sign\" data format) */\n serializedAction: Uint8Array;\n};\n\nexport type SendActionCommandResponse = void;\n\nexport class SendActionCommand\n implements\n Command<\n SendActionCommandResponse,\n SendActionCommandArgs,\n HyperliquidErrorCodes\n >\n{\n readonly name = \"sendAction\";\n\n private readonly errorHelper = new CommandErrorHelper<\n SendActionCommandResponse,\n HyperliquidErrorCodes\n >(HYPERLIQUID_ERRORS, HyperliquidCommandErrorFactory);\n\n constructor(readonly args: SendActionCommandArgs) {}\n\n getApdu(): Apdu {\n const sendActionArgs: ApduBuilderArgs = {\n cla: CLA,\n ins: INS,\n p1: P1,\n p2: P2,\n };\n\n return new ApduBuilder(sendActionArgs)\n .add8BitUIntToData(0x00)\n .encodeInLVFromBuffer(this.args.serializedAction)\n .build();\n }\n\n parseResponse(\n response: ApduResponse,\n ): CommandResult<SendActionCommandResponse, HyperliquidErrorCodes> {\n const error = this.errorHelper.getError(response);\n if (error) {\n return error;\n }\n\n if (response.data.length !== 0) {\n return CommandResultFactory({\n error: new InvalidResponseFormatError(\"Unexpected data in response\"),\n });\n }\n\n return CommandResultFactory({ data: undefined });\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAEE,eAAAA,EAKA,wBAAAC,EACA,8BAAAC,MACK,kCACP,OAAS,sBAAAC,MAA0B,yBAEnC,OACE,sBAAAC,EACA,kCAAAC,MAEK,uCAGP,MAAMC,EAAM,IACNC,EAAM,EACNC,EAAK,EACLC,EAAK,EASJ,MAAMC,CAOb,CAQE,YAAqBC,EAA6B,CAA7B,UAAAA,CAA8B,CAP1C,KAAO,aAEC,YAAc,IAAIR,EAGjCC,EAAoBC,CAA8B,EAIpD,SAAgB,CACd,MAAMO,EAAkC,CACtC,IAAKN,EACL,IAAKC,EACL,GAAIC,EACJ,GAAIC,CACN,EAEA,OAAO,IAAIT,EAAYY,CAAc,EAClC,kBAAkB,CAAI,EACtB,qBAAqB,KAAK,KAAK,gBAAgB,EAC/C,MAAM,CACX,CAEA,cACEC,EACiE,CACjE,MAAMC,EAAQ,KAAK,YAAY,SAASD,CAAQ,EAChD,OAAIC,IAIAD,EAAS,KAAK,SAAW,EACpBZ,EAAqB,CAC1B,MAAO,IAAIC,EAA2B,6BAA6B,CACrE,CAAC,EAGID,EAAqB,CAAE,KAAM,MAAU,CAAC,EACjD,CACF",
|
|
6
|
+
"names": ["ApduBuilder", "CommandResultFactory", "InvalidResponseFormatError", "CommandErrorHelper", "HYPERLIQUID_ERRORS", "HyperliquidCommandErrorFactory", "CLA", "INS", "P1", "P2", "SendActionCommand", "args", "sendActionArgs", "response", "error"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{CommandResultFactory as c,InvalidResponseFormatError as d,isSuccessCommandResult as o}from"@ledgerhq/device-management-kit";import{SendActionCommand as n}from"./SendActionCommand";describe("SendActionCommand",()=>{const r=new Uint8Array([1,1,44,2,1,1,208,1,0,218,8,0,0,0,0,0,0,0,42,219,3,221,1,0]),s={serializedAction:r};describe("name",()=>{it("should be 'sendAction'",()=>{const t=new n(s);expect(t.name).toBe("sendAction")})}),describe("getApdu",()=>{it("should return the correct APDU with cla 0x0E and ins 0x03 per specs",()=>{const e=new n(s).getApdu();expect(e.cla).toBe(224),expect(e.ins).toBe(3),expect(e.p1).toBe(1),expect(e.p2).toBe(0),expect(e.data).toStrictEqual(new Uint8Array([0,24,...r]))}),it("should use serializedAction as APDU data",()=>{const t=new Uint8Array([1,2,3]),a=new n({serializedAction:t}).getApdu();expect(a.data).toStrictEqual(new Uint8Array([0,3,...t]))})}),describe("parseResponse",()=>{it("should return success when status is 0x9000 and no data",()=>{const t={statusCode:Uint8Array.from([144,0]),data:new Uint8Array},e=new n(s).parseResponse(t);expect(e).toStrictEqual(c({data:void 0})),expect(o(e)).toBe(!0)}),it("should return an error if the status code is not 0x9000",()=>{const t={statusCode:Uint8Array.from([106,128]),data:new Uint8Array},e=new n(s).parseResponse(t);expect(o(e)).toBe(!1)}),it("should return an error if response contains unexpected data",()=>{const t={statusCode:Uint8Array.from([144,0]),data:Uint8Array.from([1])},e=new n(s).parseResponse(t);expect(o(e)).toBe(!1),expect(e.error).toBeInstanceOf(d)})})});
|
|
2
|
+
//# sourceMappingURL=SendActionCommand.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/command/SendActionCommand.test.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n CommandResultFactory,\n InvalidResponseFormatError,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport {\n SendActionCommand,\n type SendActionCommandArgs,\n} from \"./SendActionCommand\";\n\ndescribe(\"SendActionCommand\", () => {\n const serializedAction = new Uint8Array([\n 0x01, 0x01, 0x2c, 0x02, 0x01, 0x01, 0xd0, 0x01, 0x00, 0xda, 0x08, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0xdb, 0x03, 0xdd, 0x01, 0x00,\n ]);\n\n const defaultArgs: SendActionCommandArgs = {\n serializedAction,\n };\n\n describe(\"name\", () => {\n it(\"should be 'sendAction'\", () => {\n const command = new SendActionCommand(defaultArgs);\n expect(command.name).toBe(\"sendAction\");\n });\n });\n\n describe(\"getApdu\", () => {\n it(\"should return the correct APDU with cla 0x0E and ins 0x03 per specs\", () => {\n const command = new SendActionCommand(defaultArgs);\n\n const apdu = command.getApdu();\n\n expect(apdu.cla).toBe(0xe0);\n expect(apdu.ins).toBe(0x03);\n expect(apdu.p1).toBe(0x01);\n expect(apdu.p2).toBe(0x00);\n expect(apdu.data).toStrictEqual(\n new Uint8Array([0x00, 0x18, ...serializedAction]),\n );\n });\n\n it(\"should use serializedAction as APDU data\", () => {\n const customTlv = new Uint8Array([0x01, 0x02, 0x03]);\n const command = new SendActionCommand({\n serializedAction: customTlv,\n });\n\n const apdu = command.getApdu();\n\n expect(apdu.data).toStrictEqual(\n new Uint8Array([0x00, 0x03, ...customTlv]),\n );\n });\n });\n\n describe(\"parseResponse\", () => {\n it(\"should return success when status is 0x9000 and no data\", () => {\n const response = {\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: new Uint8Array(),\n };\n\n const parsed = new SendActionCommand(defaultArgs).parseResponse(response);\n expect(parsed).toStrictEqual(CommandResultFactory({ data: undefined }));\n expect(isSuccessCommandResult(parsed)).toBe(true);\n });\n\n it(\"should return an error if the status code is not 0x9000\", () => {\n const response = {\n statusCode: Uint8Array.from([0x6a, 0x80]),\n data: new Uint8Array(),\n };\n\n const result = new SendActionCommand(defaultArgs).parseResponse(response);\n expect(isSuccessCommandResult(result)).toBe(false);\n });\n\n it(\"should return an error if response contains unexpected data\", () => {\n const response = {\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: Uint8Array.from([0x01]),\n };\n\n const result = new SendActionCommand(defaultArgs).parseResponse(response);\n expect(isSuccessCommandResult(result)).toBe(false);\n expect((result as { error: unknown }).error).toBeInstanceOf(\n InvalidResponseFormatError,\n );\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "AAAA,OACE,wBAAAA,EACA,8BAAAC,EACA,0BAAAC,MACK,kCAEP,OACE,qBAAAC,MAEK,sBAEP,SAAS,oBAAqB,IAAM,CAClC,MAAMC,EAAmB,IAAI,WAAW,CACtC,EAAM,EAAM,GAAM,EAAM,EAAM,EAAM,IAAM,EAAM,EAAM,IAAM,EAAM,EAClE,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,GAAM,IAAM,EAAM,IAAM,EAAM,CACpE,CAAC,EAEKC,EAAqC,CACzC,iBAAAD,CACF,EAEA,SAAS,OAAQ,IAAM,CACrB,GAAG,yBAA0B,IAAM,CACjC,MAAME,EAAU,IAAIH,EAAkBE,CAAW,EACjD,OAAOC,EAAQ,IAAI,EAAE,KAAK,YAAY,CACxC,CAAC,CACH,CAAC,EAED,SAAS,UAAW,IAAM,CACxB,GAAG,sEAAuE,IAAM,CAG9E,MAAMC,EAFU,IAAIJ,EAAkBE,CAAW,EAE5B,QAAQ,EAE7B,OAAOE,EAAK,GAAG,EAAE,KAAK,GAAI,EAC1B,OAAOA,EAAK,GAAG,EAAE,KAAK,CAAI,EAC1B,OAAOA,EAAK,EAAE,EAAE,KAAK,CAAI,EACzB,OAAOA,EAAK,EAAE,EAAE,KAAK,CAAI,EACzB,OAAOA,EAAK,IAAI,EAAE,cAChB,IAAI,WAAW,CAAC,EAAM,GAAM,GAAGH,CAAgB,CAAC,CAClD,CACF,CAAC,EAED,GAAG,2CAA4C,IAAM,CACnD,MAAMI,EAAY,IAAI,WAAW,CAAC,EAAM,EAAM,CAAI,CAAC,EAK7CD,EAJU,IAAIJ,EAAkB,CACpC,iBAAkBK,CACpB,CAAC,EAEoB,QAAQ,EAE7B,OAAOD,EAAK,IAAI,EAAE,cAChB,IAAI,WAAW,CAAC,EAAM,EAAM,GAAGC,CAAS,CAAC,CAC3C,CACF,CAAC,CACH,CAAC,EAED,SAAS,gBAAiB,IAAM,CAC9B,GAAG,0DAA2D,IAAM,CAClE,MAAMC,EAAW,CACf,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAM,IAAI,UACZ,EAEMC,EAAS,IAAIP,EAAkBE,CAAW,EAAE,cAAcI,CAAQ,EACxE,OAAOC,CAAM,EAAE,cAAcV,EAAqB,CAAE,KAAM,MAAU,CAAC,CAAC,EACtE,OAAOE,EAAuBQ,CAAM,CAAC,EAAE,KAAK,EAAI,CAClD,CAAC,EAED,GAAG,0DAA2D,IAAM,CAClE,MAAMD,EAAW,CACf,WAAY,WAAW,KAAK,CAAC,IAAM,GAAI,CAAC,EACxC,KAAM,IAAI,UACZ,EAEME,EAAS,IAAIR,EAAkBE,CAAW,EAAE,cAAcI,CAAQ,EACxE,OAAOP,EAAuBS,CAAM,CAAC,EAAE,KAAK,EAAK,CACnD,CAAC,EAED,GAAG,8DAA+D,IAAM,CACtE,MAAMF,EAAW,CACf,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAM,WAAW,KAAK,CAAC,CAAI,CAAC,CAC9B,EAEME,EAAS,IAAIR,EAAkBE,CAAW,EAAE,cAAcI,CAAQ,EACxE,OAAOP,EAAuBS,CAAM,CAAC,EAAE,KAAK,EAAK,EACjD,OAAQA,EAA8B,KAAK,EAAE,eAC3CV,CACF,CACF,CAAC,CACH,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["CommandResultFactory", "InvalidResponseFormatError", "isSuccessCommandResult", "SendActionCommand", "serializedAction", "defaultArgs", "command", "apdu", "customTlv", "response", "parsed", "result"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{ApduBuilder as t,CommandResultFactory as d,InvalidResponseFormatError as a}from"@ledgerhq/device-management-kit";import{CommandErrorHelper as o}from"@ledgerhq/signer-utils";import{HYPERLIQUID_ERRORS as n,HyperliquidCommandErrorFactory as s}from"./utils/hyperliquidApplicationErrors";const p=224,i=2,m=1,u=0;class c{constructor(e){this.args=e}name="sendMetadata";errorHelper=new o(n,s);getApdu(){const e={cla:p,ins:i,p1:m,p2:u};return new t(e).add8BitUIntToData(0).encodeInLVFromBuffer(this.args.signedMetadata).build()}parseResponse(e){const r=this.errorHelper.getError(e);return r||(e.data.length!==0?d({error:new a("Unexpected data in response")}):d({data:void 0}))}}export{c as SendMetadataCommand};
|
|
2
|
+
//# sourceMappingURL=SendMetadataCommand.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/command/SendMetadataCommand.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n type ApduBuilderArgs,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidResponseFormatError,\n} from \"@ledgerhq/device-management-kit\";\nimport { CommandErrorHelper } from \"@ledgerhq/signer-utils\";\n\nimport {\n HYPERLIQUID_ERRORS,\n HyperliquidCommandErrorFactory,\n type HyperliquidErrorCodes,\n} from \"./utils/hyperliquidApplicationErrors\";\n\nconst CLA = 0xe0;\nconst INS = 0x02;\nconst P1 = 0x01;\nconst P2 = 0x00;\n\nexport type SendMetadataCommandArgs = {\n signedMetadata: Uint8Array;\n};\n\nexport class SendMetadataCommand\n implements Command<void, SendMetadataCommandArgs, HyperliquidErrorCodes>\n{\n readonly name = \"sendMetadata\";\n private readonly errorHelper = new CommandErrorHelper<\n void,\n HyperliquidErrorCodes\n >(HYPERLIQUID_ERRORS, HyperliquidCommandErrorFactory);\n\n constructor(readonly args: SendMetadataCommandArgs) {}\n\n getApdu(): Apdu {\n const sendMetadataArgs: ApduBuilderArgs = {\n cla: CLA,\n ins: INS,\n p1: P1,\n p2: P2,\n };\n\n return new ApduBuilder(sendMetadataArgs)\n .add8BitUIntToData(0x00)\n .encodeInLVFromBuffer(this.args.signedMetadata)\n .build();\n }\n\n parseResponse(\n response: ApduResponse,\n ): CommandResult<void, HyperliquidErrorCodes> {\n const error = this.errorHelper.getError(response);\n if (error) {\n return error;\n }\n\n if (response.data.length !== 0) {\n return CommandResultFactory({\n error: new InvalidResponseFormatError(\"Unexpected data in response\"),\n });\n }\n\n return CommandResultFactory({ data: undefined });\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAEE,eAAAA,EAKA,wBAAAC,EACA,8BAAAC,MACK,kCACP,OAAS,sBAAAC,MAA0B,yBAEnC,OACE,sBAAAC,EACA,kCAAAC,MAEK,uCAEP,MAAMC,EAAM,IACNC,EAAM,EACNC,EAAK,EACLC,EAAK,EAMJ,MAAMC,CAEb,CAOE,YAAqBC,EAA+B,CAA/B,UAAAA,CAAgC,CAN5C,KAAO,eACC,YAAc,IAAIR,EAGjCC,EAAoBC,CAA8B,EAIpD,SAAgB,CACd,MAAMO,EAAoC,CACxC,IAAKN,EACL,IAAKC,EACL,GAAIC,EACJ,GAAIC,CACN,EAEA,OAAO,IAAIT,EAAYY,CAAgB,EACpC,kBAAkB,CAAI,EACtB,qBAAqB,KAAK,KAAK,cAAc,EAC7C,MAAM,CACX,CAEA,cACEC,EAC4C,CAC5C,MAAMC,EAAQ,KAAK,YAAY,SAASD,CAAQ,EAChD,OAAIC,IAIAD,EAAS,KAAK,SAAW,EACpBZ,EAAqB,CAC1B,MAAO,IAAIC,EAA2B,6BAA6B,CACrE,CAAC,EAGID,EAAqB,CAAE,KAAM,MAAU,CAAC,EACjD,CACF",
|
|
6
|
+
"names": ["ApduBuilder", "CommandResultFactory", "InvalidResponseFormatError", "CommandErrorHelper", "HYPERLIQUID_ERRORS", "HyperliquidCommandErrorFactory", "CLA", "INS", "P1", "P2", "SendMetadataCommand", "args", "sendMetadataArgs", "response", "error"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{CommandResultFactory as n,hexaStringToBuffer as c,isSuccessCommandResult as s}from"@ledgerhq/device-management-kit";import{SendMetadataCommand as o}from"./SendMetadataCommand";describe("SendMetadataCommand",()=>{const t={signedMetadata:c("01012b02010181d0010081d10400000001240345544881d20100154730450220346b19f3cdae6aea7eb88c1afe416274f635dd494cf5a8add57856d2429a9f7d022100f4202dc04ed2ca3ab65b6518aa7dae1899191278cc7f97e28a2fd0a1aaf18d45")};let a;beforeEach(()=>{a=new o(t)}),describe("name",()=>{it("should be 'sendMetadata'",()=>{expect(a.name).toBe("sendMetadata")})}),describe("getApdu",()=>{it("should return the correct APDU with actionsCount in data",()=>{const e=a.getApdu();expect(e.data).toStrictEqual(new Uint8Array([0,99,...t.signedMetadata])),expect(e.cla).toBe(224),expect(e.ins).toBe(2),expect(e.p1).toBe(1),expect(e.p2).toBe(0),expect(e.getRawApdu()).toStrictEqual(c("e002010065006301012b02010181d0010081d10400000001240345544881d20100154730450220346b19f3cdae6aea7eb88c1afe416274f635dd494cf5a8add57856d2429a9f7d022100f4202dc04ed2ca3ab65b6518aa7dae1899191278cc7f97e28a2fd0a1aaf18d45"))})}),describe("parseResponse",()=>{it("should return success when status is 0x9000 and no data",()=>{const e={statusCode:Uint8Array.from([144,0]),data:new Uint8Array},d=a.parseResponse(e);expect(d).toStrictEqual(n({data:void 0})),expect(s(d)).toBe(!0)})})});
|
|
2
|
+
//# sourceMappingURL=SendMetadataCommand.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/command/SendMetadataCommand.test.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n CommandResultFactory,\n hexaStringToBuffer,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport {\n SendMetadataCommand,\n type SendMetadataCommandArgs,\n} from \"./SendMetadataCommand\";\n\ndescribe(\"SendMetadataCommand\", () => {\n const defaultArgs: SendMetadataCommandArgs = {\n // signedMetadata: new Uint8Array([0x01, 0x02, 0x03]),\n signedMetadata: hexaStringToBuffer(\n \"01012b02010181d0010081d10400000001240345544881d20100154730450220346b19f3cdae6aea7eb88c1afe416274f635dd494cf5a8add57856d2429a9f7d022100f4202dc04ed2ca3ab65b6518aa7dae1899191278cc7f97e28a2fd0a1aaf18d45\",\n )!,\n };\n let command: SendMetadataCommand;\n\n beforeEach(() => {\n command = new SendMetadataCommand(defaultArgs);\n });\n\n describe(\"name\", () => {\n it(\"should be 'sendMetadata'\", () => {\n expect(command.name).toBe(\"sendMetadata\");\n });\n });\n\n describe(\"getApdu\", () => {\n it(\"should return the correct APDU with actionsCount in data\", () => {\n // WHEN\n const apdu = command.getApdu();\n\n // THEN\n expect(apdu.data).toStrictEqual(\n new Uint8Array([0x00, 0x63, ...defaultArgs.signedMetadata]),\n );\n expect(apdu.cla).toBe(0xe0);\n expect(apdu.ins).toBe(0x02);\n expect(apdu.p1).toBe(0x01);\n expect(apdu.p2).toBe(0x00);\n expect(apdu.getRawApdu()).toStrictEqual(\n hexaStringToBuffer(\n \"e002010065006301012b02010181d0010081d10400000001240345544881d20100154730450220346b19f3cdae6aea7eb88c1afe416274f635dd494cf5a8add57856d2429a9f7d022100f4202dc04ed2ca3ab65b6518aa7dae1899191278cc7f97e28a2fd0a1aaf18d45\",\n )!,\n );\n });\n });\n\n describe(\"parseResponse\", () => {\n it(\"should return success when status is 0x9000 and no data\", () => {\n const LNX_RESPONSE_GOOD = {\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: new Uint8Array(),\n };\n\n const parsed = command.parseResponse(LNX_RESPONSE_GOOD);\n expect(parsed).toStrictEqual(CommandResultFactory({ data: undefined }));\n expect(isSuccessCommandResult(parsed)).toBe(true);\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "AAAA,OACE,wBAAAA,EACA,sBAAAC,EACA,0BAAAC,MACK,kCAEP,OACE,uBAAAC,MAEK,wBAEP,SAAS,sBAAuB,IAAM,CACpC,MAAMC,EAAuC,CAE3C,eAAgBH,EACd,wMACF,CACF,EACA,IAAII,EAEJ,WAAW,IAAM,CACfA,EAAU,IAAIF,EAAoBC,CAAW,CAC/C,CAAC,EAED,SAAS,OAAQ,IAAM,CACrB,GAAG,2BAA4B,IAAM,CACnC,OAAOC,EAAQ,IAAI,EAAE,KAAK,cAAc,CAC1C,CAAC,CACH,CAAC,EAED,SAAS,UAAW,IAAM,CACxB,GAAG,2DAA4D,IAAM,CAEnE,MAAMC,EAAOD,EAAQ,QAAQ,EAG7B,OAAOC,EAAK,IAAI,EAAE,cAChB,IAAI,WAAW,CAAC,EAAM,GAAM,GAAGF,EAAY,cAAc,CAAC,CAC5D,EACA,OAAOE,EAAK,GAAG,EAAE,KAAK,GAAI,EAC1B,OAAOA,EAAK,GAAG,EAAE,KAAK,CAAI,EAC1B,OAAOA,EAAK,EAAE,EAAE,KAAK,CAAI,EACzB,OAAOA,EAAK,EAAE,EAAE,KAAK,CAAI,EACzB,OAAOA,EAAK,WAAW,CAAC,EAAE,cACxBL,EACE,sNACF,CACF,CACF,CAAC,CACH,CAAC,EAED,SAAS,gBAAiB,IAAM,CAC9B,GAAG,0DAA2D,IAAM,CAClE,MAAMM,EAAoB,CACxB,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAM,IAAI,UACZ,EAEMC,EAASH,EAAQ,cAAcE,CAAiB,EACtD,OAAOC,CAAM,EAAE,cAAcR,EAAqB,CAAE,KAAM,MAAU,CAAC,CAAC,EACtE,OAAOE,EAAuBM,CAAM,CAAC,EAAE,KAAK,EAAI,CAClD,CAAC,CACH,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["CommandResultFactory", "hexaStringToBuffer", "isSuccessCommandResult", "SendMetadataCommand", "defaultArgs", "command", "apdu", "LNX_RESPONSE_GOOD", "parsed"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{ApduBuilder as s,bufferToHexaString as n,CommandResultFactory as o,InvalidResponseFormatError as d}from"@ledgerhq/device-management-kit";import{CommandErrorHelper as m,DerivationPathUtils as p}from"@ledgerhq/signer-utils";import{HYPERLIQUID_ERRORS as u,HyperliquidCommandErrorFactory as l}from"./utils/hyperliquidApplicationErrors";const i=66;class y{constructor(r){this.args=r;this.args=r}name="signActions";errorHelper=new m(u,l);getApdu(){const r={cla:224,ins:4,p1:0,p2:0},t=new s(r),e=p.splitPath(this.args.derivationPath);return t.add8BitUIntToData(e.length),e.forEach(a=>{t.add32BitUIntToData(a)}),t.build()}parseResponse(r){const t=this.errorHelper.getError(r);return t||(r.data.length===0||r.data.length!==i?o({error:new d("Unexpected data in response")}):o({data:{signaturesLeft:r.data[0],signature:{v:r.data[1],r:n(r.data.slice(2,34),!1),s:n(r.data.slice(34,i),!1)}}}))}}export{y as SignActionsCommand};
|
|
2
|
+
//# sourceMappingURL=SignActionsCommand.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/command/SignActionsCommand.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n type ApduBuilderArgs,\n type ApduResponse,\n bufferToHexaString,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidResponseFormatError,\n} from \"@ledgerhq/device-management-kit\";\nimport {\n CommandErrorHelper,\n DerivationPathUtils,\n} from \"@ledgerhq/signer-utils\";\n\nimport {\n HYPERLIQUID_ERRORS,\n HyperliquidCommandErrorFactory,\n type HyperliquidErrorCodes,\n} from \"./utils/hyperliquidApplicationErrors\";\n\nexport type SignActionsCommandArgs = {\n derivationPath: string;\n};\n\nexport type SignActionsCommandResponse = {\n signaturesLeft: number;\n signature: {\n r: string;\n s: string;\n v: number;\n };\n};\n\nconst SIGNATURE_LENGTH = 66;\n\nexport class SignActionsCommand\n implements\n Command<\n SignActionsCommandResponse,\n SignActionsCommandArgs,\n HyperliquidErrorCodes\n >\n{\n readonly name = \"signActions\";\n private readonly errorHelper = new CommandErrorHelper<\n SignActionsCommandResponse,\n HyperliquidErrorCodes\n >(HYPERLIQUID_ERRORS, HyperliquidCommandErrorFactory);\n\n constructor(readonly args: SignActionsCommandArgs) {\n this.args = args;\n }\n\n getApdu(): Apdu {\n const signActionsArgs: ApduBuilderArgs = {\n cla: 0xe0,\n ins: 0x04,\n p1: 0x00,\n p2: 0x00,\n };\n\n const builder = new ApduBuilder(signActionsArgs);\n\n const path = DerivationPathUtils.splitPath(this.args.derivationPath);\n builder.add8BitUIntToData(path.length);\n path.forEach((element) => {\n builder.add32BitUIntToData(element);\n });\n\n return builder.build();\n }\n\n parseResponse(\n response: ApduResponse,\n ): CommandResult<SignActionsCommandResponse, HyperliquidErrorCodes> {\n const error = this.errorHelper.getError(response);\n if (error) {\n return error;\n }\n\n if (\n response.data.length === 0 ||\n response.data.length !== SIGNATURE_LENGTH\n ) {\n return CommandResultFactory({\n error: new InvalidResponseFormatError(\"Unexpected data in response\"),\n });\n }\n\n return CommandResultFactory({\n data: {\n signaturesLeft: response.data[0]!,\n signature: {\n v: response.data[1]!,\n r: bufferToHexaString(response.data.slice(2, 34), false),\n s: bufferToHexaString(\n response.data.slice(34, SIGNATURE_LENGTH),\n false,\n ),\n },\n },\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAEE,eAAAA,EAGA,sBAAAC,EAGA,wBAAAC,EACA,8BAAAC,MACK,kCACP,OACE,sBAAAC,EACA,uBAAAC,MACK,yBAEP,OACE,sBAAAC,EACA,kCAAAC,MAEK,uCAeP,MAAMC,EAAmB,GAElB,MAAMC,CAOb,CAOE,YAAqBC,EAA8B,CAA9B,UAAAA,EACnB,KAAK,KAAOA,CACd,CARS,KAAO,cACC,YAAc,IAAIN,EAGjCE,EAAoBC,CAA8B,EAMpD,SAAgB,CACd,MAAMI,EAAmC,CACvC,IAAK,IACL,IAAK,EACL,GAAI,EACJ,GAAI,CACN,EAEMC,EAAU,IAAIZ,EAAYW,CAAe,EAEzCE,EAAOR,EAAoB,UAAU,KAAK,KAAK,cAAc,EACnE,OAAAO,EAAQ,kBAAkBC,EAAK,MAAM,EACrCA,EAAK,QAASC,GAAY,CACxBF,EAAQ,mBAAmBE,CAAO,CACpC,CAAC,EAEMF,EAAQ,MAAM,CACvB,CAEA,cACEG,EACkE,CAClE,MAAMC,EAAQ,KAAK,YAAY,SAASD,CAAQ,EAChD,OAAIC,IAKFD,EAAS,KAAK,SAAW,GACzBA,EAAS,KAAK,SAAWP,EAElBN,EAAqB,CAC1B,MAAO,IAAIC,EAA2B,6BAA6B,CACrE,CAAC,EAGID,EAAqB,CAC1B,KAAM,CACJ,eAAgBa,EAAS,KAAK,CAAC,EAC/B,UAAW,CACT,EAAGA,EAAS,KAAK,CAAC,EAClB,EAAGd,EAAmBc,EAAS,KAAK,MAAM,EAAG,EAAE,EAAG,EAAK,EACvD,EAAGd,EACDc,EAAS,KAAK,MAAM,GAAIP,CAAgB,EACxC,EACF,CACF,CACF,CACF,CAAC,EACH,CACF",
|
|
6
|
+
"names": ["ApduBuilder", "bufferToHexaString", "CommandResultFactory", "InvalidResponseFormatError", "CommandErrorHelper", "DerivationPathUtils", "HYPERLIQUID_ERRORS", "HyperliquidCommandErrorFactory", "SIGNATURE_LENGTH", "SignActionsCommand", "args", "signActionsArgs", "builder", "path", "element", "response", "error"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{CommandResultFactory as o,hexaStringToBuffer as r,InvalidResponseFormatError as n,isSuccessCommandResult as a}from"@ledgerhq/device-management-kit";import{SignActionsCommand as c}from"./SignActionsCommand";describe("SignActionsCommand",()=>{let t;beforeEach(()=>{t=new c({derivationPath:"44'/637'/0'/0'"})}),describe("name",()=>{it("should be 'signActions'",()=>{expect(t.name).toBe("signActions")})}),describe("getApdu",()=>{it("should return the correct APDU",()=>{const e=t.getApdu();expect(e.cla).toBe(224),expect(e.ins).toBe(4),expect(e.p1).toBe(0),expect(e.p2).toBe(0),expect(e.data.length).toBe(17)})}),describe("parseResponse",()=>{it("should parse the response",()=>{const e={statusCode:Uint8Array.from([144,0]),data:r("021c1a7718eede70393bbc640a649ee65401748953a1b671ffa15fea9cb7e209289837e2621d96135f05f54fe891bb5850a94003717dfe228c270fba5d8e7f35b590")},s=t.parseResponse(e);expect(s).toStrictEqual(o({data:{signaturesLeft:2,signature:{r:"1a7718eede70393bbc640a649ee65401748953a1b671ffa15fea9cb7e2092898",s:"37e2621d96135f05f54fe891bb5850a94003717dfe228c270fba5d8e7f35b590",v:28}}}))}),it("should return an error if the status code is not 0x9000",()=>{const e={statusCode:Uint8Array.from([106,128]),data:new Uint8Array},s=t.parseResponse(e);expect(a(s)).toBe(!1)}),it("should return an error if response contains unexpected data",()=>{const e={statusCode:Uint8Array.from([144,0]),data:Uint8Array.from([1])},s=t.parseResponse(e);expect(a(s)).toBe(!1),expect(s.error).toBeInstanceOf(n)})})});
|
|
2
|
+
//# sourceMappingURL=SignActionsCommand.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/command/SignActionsCommand.test.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n CommandResultFactory,\n hexaStringToBuffer,\n InvalidResponseFormatError,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { SignActionsCommand } from \"./SignActionsCommand\";\n\ndescribe(\"SignActionsCommand\", () => {\n let command: SignActionsCommand;\n\n beforeEach(() => {\n command = new SignActionsCommand({ derivationPath: \"44'/637'/0'/0'\" });\n });\n\n describe(\"name\", () => {\n it(\"should be 'signActions'\", () => {\n expect(command.name).toBe(\"signActions\");\n });\n });\n\n describe(\"getApdu\", () => {\n it(\"should return the correct APDU\", () => {\n // WHEN\n const apdu = command.getApdu();\n\n // THEN\n expect(apdu.cla).toBe(0xe0);\n expect(apdu.ins).toBe(0x04);\n expect(apdu.p1).toBe(0x00);\n expect(apdu.p2).toBe(0x00);\n expect(apdu.data.length).toBe(0x11);\n });\n });\n\n describe(\"parseResponse\", () => {\n it(\"should parse the response\", () => {\n const LNX_RESPONSE_GOOD = {\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: hexaStringToBuffer(\n \"021c1a7718eede70393bbc640a649ee65401748953a1b671ffa15fea9cb7e209289837e2621d96135f05f54fe891bb5850a94003717dfe228c270fba5d8e7f35b590\",\n )!,\n };\n\n const parsedResponse = command.parseResponse(LNX_RESPONSE_GOOD);\n expect(parsedResponse).toStrictEqual(\n CommandResultFactory({\n data: {\n signaturesLeft: 2,\n signature: {\n r: \"1a7718eede70393bbc640a649ee65401748953a1b671ffa15fea9cb7e2092898\",\n s: \"37e2621d96135f05f54fe891bb5850a94003717dfe228c270fba5d8e7f35b590\",\n v: 0x1c,\n },\n },\n }),\n );\n });\n\n it(\"should return an error if the status code is not 0x9000\", () => {\n const LNX_RESPONSE_ERROR = {\n statusCode: Uint8Array.from([0x6a, 0x80]),\n data: new Uint8Array(),\n };\n\n const result = command.parseResponse(LNX_RESPONSE_ERROR);\n expect(isSuccessCommandResult(result)).toBe(false);\n });\n\n it(\"should return an error if response contains unexpected data\", () => {\n const LNX_RESPONSE_EXTRA = {\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: Uint8Array.from([0x01]),\n };\n\n const result = command.parseResponse(LNX_RESPONSE_EXTRA);\n expect(isSuccessCommandResult(result)).toBe(false);\n // @ts-expect-error response is not typed\n expect(result.error).toBeInstanceOf(InvalidResponseFormatError);\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "AAAA,OACE,wBAAAA,EACA,sBAAAC,EACA,8BAAAC,EACA,0BAAAC,MACK,kCAEP,OAAS,sBAAAC,MAA0B,uBAEnC,SAAS,qBAAsB,IAAM,CACnC,IAAIC,EAEJ,WAAW,IAAM,CACfA,EAAU,IAAID,EAAmB,CAAE,eAAgB,gBAAiB,CAAC,CACvE,CAAC,EAED,SAAS,OAAQ,IAAM,CACrB,GAAG,0BAA2B,IAAM,CAClC,OAAOC,EAAQ,IAAI,EAAE,KAAK,aAAa,CACzC,CAAC,CACH,CAAC,EAED,SAAS,UAAW,IAAM,CACxB,GAAG,iCAAkC,IAAM,CAEzC,MAAMC,EAAOD,EAAQ,QAAQ,EAG7B,OAAOC,EAAK,GAAG,EAAE,KAAK,GAAI,EAC1B,OAAOA,EAAK,GAAG,EAAE,KAAK,CAAI,EAC1B,OAAOA,EAAK,EAAE,EAAE,KAAK,CAAI,EACzB,OAAOA,EAAK,EAAE,EAAE,KAAK,CAAI,EACzB,OAAOA,EAAK,KAAK,MAAM,EAAE,KAAK,EAAI,CACpC,CAAC,CACH,CAAC,EAED,SAAS,gBAAiB,IAAM,CAC9B,GAAG,4BAA6B,IAAM,CACpC,MAAMC,EAAoB,CACxB,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAMN,EACJ,sIACF,CACF,EAEMO,EAAiBH,EAAQ,cAAcE,CAAiB,EAC9D,OAAOC,CAAc,EAAE,cACrBR,EAAqB,CACnB,KAAM,CACJ,eAAgB,EAChB,UAAW,CACT,EAAG,mEACH,EAAG,mEACH,EAAG,EACL,CACF,CACF,CAAC,CACH,CACF,CAAC,EAED,GAAG,0DAA2D,IAAM,CAClE,MAAMS,EAAqB,CACzB,WAAY,WAAW,KAAK,CAAC,IAAM,GAAI,CAAC,EACxC,KAAM,IAAI,UACZ,EAEMC,EAASL,EAAQ,cAAcI,CAAkB,EACvD,OAAON,EAAuBO,CAAM,CAAC,EAAE,KAAK,EAAK,CACnD,CAAC,EAED,GAAG,8DAA+D,IAAM,CACtE,MAAMC,EAAqB,CACzB,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAM,WAAW,KAAK,CAAC,CAAI,CAAC,CAC9B,EAEMD,EAASL,EAAQ,cAAcM,CAAkB,EACvD,OAAOR,EAAuBO,CAAM,CAAC,EAAE,KAAK,EAAK,EAEjD,OAAOA,EAAO,KAAK,EAAE,eAAeR,CAA0B,CAChE,CAAC,CACH,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["CommandResultFactory", "hexaStringToBuffer", "InvalidResponseFormatError", "isSuccessCommandResult", "SignActionsCommand", "command", "apdu", "LNX_RESPONSE_GOOD", "parsedResponse", "LNX_RESPONSE_ERROR", "result", "LNX_RESPONSE_EXTRA"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
1
|
+
import{DeviceExchangeError as a}from"@ledgerhq/device-management-kit";var m=(o=>(o.INVALID_DERIVATION_PATH="6a80",o.ACTION_PARSING_ERROR="6a81",o))(m||{});const d={"6a80":{message:"Invalid derivation path"},"6a81":{message:"Action parsing error"}};class n extends a{constructor(e){super({tag:"HyperliquidCommandError",...e})}}const i=r=>new n(r);export{d as HYPERLIQUID_ERRORS,n as HyperliquidCommandError,i as HyperliquidCommandErrorFactory,m as HyperliquidErrorCodes};
|
|
2
2
|
//# sourceMappingURL=hyperliquidApplicationErrors.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/internal/app-binder/command/utils/hyperliquidApplicationErrors.ts"],
|
|
4
|
-
"sourcesContent": ["
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["HyperliquidErrorCodes"]
|
|
4
|
+
"sourcesContent": ["import {\n type CommandErrorArgs,\n type CommandErrors,\n DeviceExchangeError,\n} from \"@ledgerhq/device-management-kit\";\n\nexport enum HyperliquidErrorCodes {\n INVALID_DERIVATION_PATH = \"6a80\",\n ACTION_PARSING_ERROR = \"6a81\",\n}\n\nexport const HYPERLIQUID_ERRORS: CommandErrors<`${HyperliquidErrorCodes}`> = {\n \"6a80\": { message: \"Invalid derivation path\" },\n \"6a81\": { message: \"Action parsing error\" },\n};\n\nexport class HyperliquidCommandError extends DeviceExchangeError<HyperliquidErrorCodes> {\n constructor(args: CommandErrorArgs<HyperliquidErrorCodes>) {\n super({ tag: \"HyperliquidCommandError\", ...args });\n }\n}\n\nexport const HyperliquidCommandErrorFactory = (\n args: CommandErrorArgs<HyperliquidErrorCodes>,\n) => new HyperliquidCommandError(args);\n"],
|
|
5
|
+
"mappings": "AAAA,OAGE,uBAAAA,MACK,kCAEA,IAAKC,OACVA,EAAA,wBAA0B,OAC1BA,EAAA,qBAAuB,OAFbA,OAAA,IAKL,MAAMC,EAAgE,CAC3E,OAAQ,CAAE,QAAS,yBAA0B,EAC7C,OAAQ,CAAE,QAAS,sBAAuB,CAC5C,EAEO,MAAMC,UAAgCH,CAA2C,CACtF,YAAYI,EAA+C,CACzD,MAAM,CAAE,IAAK,0BAA2B,GAAGA,CAAK,CAAC,CACnD,CACF,CAEO,MAAMC,EACXD,GACG,IAAID,EAAwBC,CAAI",
|
|
6
|
+
"names": ["DeviceExchangeError", "HyperliquidErrorCodes", "HYPERLIQUID_ERRORS", "HyperliquidCommandError", "args", "HyperliquidCommandErrorFactory"]
|
|
7
7
|
}
|