@ledgerhq/device-signer-kit-hyperliquid 1.0.0 → 1.0.1

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.
Files changed (28) hide show
  1. package/README.md +6 -4
  2. package/lib/cjs/api/index.js.map +2 -2
  3. package/lib/cjs/internal/app-binder/constants.js +2 -0
  4. package/lib/cjs/internal/app-binder/constants.js.map +7 -0
  5. package/lib/cjs/internal/app-binder/task/SendActionsTask.test.js +1 -1
  6. package/lib/cjs/internal/app-binder/task/SendActionsTask.test.js.map +2 -2
  7. package/lib/cjs/internal/app-binder/utils/actionTlvSerializer.js +1 -1
  8. package/lib/cjs/internal/app-binder/utils/actionTlvSerializer.js.map +3 -3
  9. package/lib/cjs/internal/app-binder/utils/actionTlvSerializer.test.js +1 -1
  10. package/lib/cjs/internal/app-binder/utils/actionTlvSerializer.test.js.map +2 -2
  11. package/lib/cjs/package.json +4 -4
  12. package/lib/esm/api/index.js.map +2 -2
  13. package/lib/esm/internal/app-binder/constants.js +2 -0
  14. package/lib/esm/internal/app-binder/constants.js.map +7 -0
  15. package/lib/esm/internal/app-binder/task/SendActionsTask.test.js +1 -1
  16. package/lib/esm/internal/app-binder/task/SendActionsTask.test.js.map +2 -2
  17. package/lib/esm/internal/app-binder/utils/actionTlvSerializer.js +1 -1
  18. package/lib/esm/internal/app-binder/utils/actionTlvSerializer.js.map +3 -3
  19. package/lib/esm/internal/app-binder/utils/actionTlvSerializer.test.js +1 -1
  20. package/lib/esm/internal/app-binder/utils/actionTlvSerializer.test.js.map +2 -2
  21. package/lib/esm/package.json +4 -4
  22. package/lib/types/api/index.d.ts +1 -1
  23. package/lib/types/api/index.d.ts.map +1 -1
  24. package/lib/types/internal/app-binder/constants.d.ts +2 -0
  25. package/lib/types/internal/app-binder/constants.d.ts.map +1 -0
  26. package/lib/types/internal/app-binder/utils/actionTlvSerializer.d.ts.map +1 -1
  27. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  28. package/package.json +6 -6
package/README.md CHANGED
@@ -16,10 +16,12 @@ import { SignerHyperliquidBuilder } from "@ledgerhq/device-signer-kit-hyperliqui
16
16
  const signer = new SignerHyperliquidBuilder({ dmk, sessionId }).build();
17
17
 
18
18
  // Sign transaction
19
- const signature = await signer.signTransaction(
20
- "m/44'/0'/0'/0/0",
21
- transactionBytes,
22
- );
19
+ const signature = await signer.signActions({
20
+ derivationPath: "m/44'/0'/0'/0/0",
21
+ certificate,
22
+ signedMetadata,
23
+ actions,
24
+ });
23
25
  ```
24
26
 
25
27
  ## Development
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/api/index.ts"],
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": "2dAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wEAAAE,EAAAF,GAAA,IAAAG,EASO,qDACPC,EAAAJ,EAAc,qCAVd,gBAWAI,EAAAJ,EAAc,gCAXd,gBAYAI,EAAAJ,EAAc,kCAZd,gBAaAI,EAAAJ,EAAc,yCAbd",
4
+ "sourcesContent": ["export {\n type SignActionsActionItem,\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": "2dAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wEAAAE,EAAAF,GAAA,IAAAG,EAUO,qDACPC,EAAAJ,EAAc,qCAXd,gBAYAI,EAAAJ,EAAc,gCAZd,gBAaAI,EAAAJ,EAAc,kCAbd,gBAcAI,EAAAJ,EAAc,yCAdd",
6
6
  "names": ["api_exports", "__export", "__toCommonJS", "import_SignActionsDeviceActionTypes", "__reExport"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ "use strict";var r=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var d=(i,e)=>{for(var p in e)r(i,p,{get:e[p],enumerable:!0})},l=(i,e,p,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of P(e))!c.call(i,o)&&o!==p&&r(i,o,{get:()=>e[o],enumerable:!(t=A(e,o))||t.enumerable});return i};var n=i=>l(r({},"__esModule",{value:!0}),i);var s={};d(s,{APP_NAME:()=>q});module.exports=n(s);const q="Hyperliquid";0&&(module.exports={APP_NAME});
2
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/internal/app-binder/constants.ts"],
4
+ "sourcesContent": ["export const APP_NAME = \"Hyperliquid\";\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,cAAAE,IAAA,eAAAC,EAAAH,GAAO,MAAME,EAAW",
6
+ "names": ["constants_exports", "__export", "APP_NAME", "__toCommonJS"]
7
+ }
@@ -1,2 +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()})});
1
+ "use strict";var d=require("@ledgerhq/device-management-kit"),e=require("vitest"),i=require("../../app-binder/command/SendActionCommand"),r=require("../../app-binder/device-action/__test-utils__/makeInternalApi"),o=require("./SendActionsTask");(0,e.describe)("SendActionsTask",()=>{const a=(0,r.makeDeviceActionInternalApiMock)();(0,e.beforeEach)(()=>{a.sendCommand.mockClear(),a.sendCommand.mockResolvedValue((0,d.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:t,expectedSerialization:n})=>{const s=await new o.SendActionsTask(a,{actions:[t]}).run();(0,e.expect)(s).toEqual((0,d.CommandResultFactory)({data:void 0})),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(1);const l=(0,d.hexaStringToBuffer)(n);(0,e.expect)(a.sendCommand).toHaveBeenCalledWith(new i.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,d.hexaStringToBuffer)("01012c02010181d0010081da010181db2681dd1f81e0010081d1010081e2010181e3013181e4013181e5010081d70481e6010281ea0100"),(0,d.hexaStringToBuffer)("01012c02010181d0010281da010281db1281d90f81d1010081dc08000000000000002a"),(0,d.hexaStringToBuffer)("01012c02010181d0010381da010381db1381d1010081de010081ed08000000000000000a")]},{actions:[{type:"updateLeverage",asset:5,isCross:!1,leverage:3,nonce:1773655934208},{type:"order",orders:[{a:5,b:!0,p:"95.302",s:"0.16",r:!1,t:{limit:{tif:"Ioc"}}},{a:5,b:!1,p:"102.78",s:"0.16",r:!0,t:{trigger:{isMarket:!0,triggerPx:"102.78",tpsl:"tp"}}}],grouping:"normalTpsl",builder:{b:"0xc0708cdd6cd166d51da264e3f49a0422be26e35b",f:100},nonce:1773655934209}],expectedSerializations:[(0,d.hexaStringToBuffer)("01012c02010181d0010381da06019cf621c50081db1381d1010581de010081ed080000000000000003"),(0,d.hexaStringToBuffer)("01012c02010181d0010081da06019cf621c50181db818381dd2781e0010081d1010581e2010181e30639352e33303281e404302e313681e5010081d70481e6010181dd3481e0010181d1010581e2010081e3063130322e373881e404302e313681e5010181d71181e7010181e8063130322e373881e9010081ea010181eb1b81d314c0708cdd6cd166d51da264e3f49a0422be26e35b81ec0164")]}])("calls SendActionCommand multiple times in order when actions has several items",async({actions:t,expectedSerializations:n})=>{await new o.SendActionsTask(a,{actions:t}).run(),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(t.length),(0,e.expect)(a.sendCommand).toHaveBeenNthCalledWith(1,new i.SendActionCommand({serializedAction:n[0]})),(0,e.expect)(a.sendCommand).toHaveBeenNthCalledWith(2,new i.SendActionCommand({serializedAction:n[1]})),n[2]&&(0,e.expect)(a.sendCommand).toHaveBeenNthCalledWith(3,new i.SendActionCommand({serializedAction:n[2]}))}),(0,e.it)("returns error result and stops on first SendActionCommand failure",async()=>{const t=(0,d.CommandResultFactory)({error:new d.UnknownDeviceExchangeError});a.sendCommand.mockResolvedValueOnce((0,d.CommandResultFactory)({data:void 0})).mockResolvedValueOnce(t);const n=[{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 o.SendActionsTask(a,{actions:n}).run();(0,e.expect)(s).toStrictEqual(t),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(2)}),(0,e.it)("returns success when actions is empty",async()=>{const n=await new o.SendActionsTask(a,{actions:[]}).run();(0,e.expect)(n).toEqual((0,d.CommandResultFactory)({data:void 0})),(0,e.expect)(a.sendCommand).not.toHaveBeenCalled()})});
2
2
  //# sourceMappingURL=SendActionsTask.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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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",
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 actions: [\n {\n type: \"updateLeverage\",\n asset: 5,\n isCross: false,\n leverage: 3,\n nonce: 1773655934208,\n },\n {\n type: \"order\",\n orders: [\n {\n a: 5,\n b: true,\n p: \"95.302\",\n s: \"0.16\",\n r: false,\n t: {\n limit: {\n tif: \"Ioc\",\n },\n },\n },\n {\n a: 5,\n b: false,\n p: \"102.78\",\n s: \"0.16\",\n r: true,\n t: {\n trigger: {\n isMarket: true,\n triggerPx: \"102.78\",\n tpsl: \"tp\",\n },\n },\n },\n ],\n grouping: \"normalTpsl\",\n builder: {\n b: \"0xc0708cdd6cd166d51da264e3f49a0422be26e35b\",\n f: 100,\n },\n nonce: 1773655934209,\n },\n ] satisfies HyperliquidAction[],\n expectedSerializations: [\n hexaStringToBuffer(\n \"01012c02010181d0010381da06019cf621c50081db1381d1010581de010081ed080000000000000003\",\n )!,\n hexaStringToBuffer(\n \"01012c02010181d0010081da06019cf621c50181db8183\" +\n \"81dd2781e0010081d1010581e2010181e30639352e33303281e404302e313681e5010081d70481e60101\" +\n \"81dd3481e0010181d1010581e2010081e3063130322e373881e404302e313681e5010181d71181e7010181e8063130322e373881e9010081ea010181eb1b81d314c0708cdd6cd166d51da264e3f49a0422be26e35b81ec0164\",\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(actions.length);\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 if (expectedSerializations[2]) {\n expect(apiMock.sendCommand).toHaveBeenNthCalledWith(\n 3,\n new SendActionCommand({\n serializedAction: expectedSerializations[2]!,\n }),\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
6
  "names": ["import_device_management_kit", "import_vitest", "import_SendActionCommand", "import_makeInternalApi", "import_SendActionsTask", "apiMock", "action", "expectedSerialization", "result", "expectedBytes", "actions", "expectedSerializations", "errorResult"]
7
7
  }
@@ -1,2 +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});
1
+ "use strict";var D=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var N=(e,t)=>{for(var n in t)D(e,n,{get:t[n],enumerable:!0})},L=(e,t,n,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of m(t))!S.call(e,o)&&o!==n&&D(e,o,{get:()=>t[o],enumerable:!(a=p(t,o))||a.enumerable});return e};var P=e=>L(D({},"__esModule",{value:!0}),e);var h={};N(h,{ACTION_TYPE:()=>T,STRUCTURE_TYPE_VALUE:()=>_,TLV_TAG:()=>r,VERSION_VALUE:()=>l,buildActionStructure:()=>y,serializeActionToTlv:()=>g,serializeOrderToTlv:()=>B});module.exports=P(h);var d=require("@ledgerhq/device-management-kit");const s=33024,r={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},_=44,l=1,T={ORDER:0,MODIFY:1,CANCEL:2,UPDATE_LEVERAGE:3,APPROVAL_BUILDER_FEE:4,UPDATE_ISOLATED_MARGIN:5},U={LIMIT:0,TRIGGER:1},c={ALO:0,IOC:1,GTC:2},x={TP:0,SL:1},R={NA:0,NORMAL_TPSL:1,POSITION_TPSL:2};function C(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 G(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 w(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 n=BigInt(e);if(n>0xffffffffffffffffn)throw new Error(`Value ${e} exceeds u64 range`);if(n===0n)return new Uint8Array([0]);const a=[];let o=n;for(;o>0n&&a.length<t;)a.unshift(Number(o&0xffn)),o>>=8n;return new Uint8Array(a)}function O(e,t){if(!Number.isInteger(t)||t<0)throw new Error(`Invalid DER length ${t}: expected non-negative integer`);if(!Number.isSafeInteger(t))throw new Error(`Invalid DER length ${t}: not a safe integer`);t<128?e.add8BitUIntToData(t):t<=255?(e.add8BitUIntToData(129),e.add8BitUIntToData(t)):(e.add8BitUIntToData(130),e.add16BitUIntToData(t))}function I(e,t,n,a=8){t>127?e.add16BitUIntToData(s+t):e.add8BitUIntToData(t);const o=w(n,a);e.add8BitUIntToData(o.length),e.addBufferToData(o)}function i(e,t,n){t>127?e.add16BitUIntToData(s+t):e.add8BitUIntToData(t),e.add8BitUIntToData(1),e.add8BitUIntToData(n)}function f(e,t,n){t>127?e.add16BitUIntToData(s+t):e.add8BitUIntToData(t),e.add8BitUIntToData(8),e.add64BitUIntToData(n)}function u(e,t,n){t>127?e.add16BitUIntToData(s+t):e.add8BitUIntToData(t);const a=new TextEncoder().encode(n);O(e,a.length),e.addBufferToData(a)}function E(e,t,n){t>127?e.add16BitUIntToData(s+t):e.add8BitUIntToData(t),O(e,n.length),e.addBufferToData(n)}function B(e){const t=new d.ByteArrayBuilder,n="limit"in e.t,a=e.t;i(t,r.ORDER_TYPE,n?U.LIMIT:U.TRIGGER),I(t,r.ASSET_ID,e.a),i(t,r.BUY_OR_NOT,e.b?1:0),u(t,r.PRICE,e.p),u(t,r.SIZE,e.s),i(t,r.REDUCE_ONLY,e.r?1:0);const o=new d.ByteArrayBuilder;return n&&"limit"in a?i(o,r.TIF,b(a.limit.tif)):"trigger"in a&&(i(o,r.TRIGGER_MARKET,a.trigger.isMarket?1:0),u(o,r.TRIGGER_PRICE,a.trigger.triggerPx),i(o,r.TRIGGER_TYPE,a.trigger.tpsl==="tp"?x.TP:x.SL)),E(t,r.ORDER_DETAIL,o.build()),t.build()}function A(e,t,n){t>127?e.add16BitUIntToData(s+t):e.add8BitUIntToData(t),e.encodeInLVFromHexa(n)}function y(e){const t=new d.ByteArrayBuilder;switch(e.type){case"order":{if(e.orders.length===0)throw new Error("order action must have at least one order");for(const n of e.orders){const a=B(n);E(t,r.ORDER,a)}if(i(t,r.GROUPING,G(e.grouping)),e.builder!==void 0){const n=new d.ByteArrayBuilder;A(n,r.BUILDER_ADDRESS,e.builder.b),I(n,r.BUILDER_FEE,e.builder.f),E(t,r.BUILDER_INFO,n.build())}break}case"modify":case"batchModify":{if(!e.modifies.length)throw new Error("modify action must have at least one modify");const n=new d.ByteArrayBuilder;for(const o of e.modifies)E(n,r.ORDER,B(o.order)),f(n,r.ORDER_ID,o.oid);const a=n.build();E(t,r.UPDATE_ORDERS,a);break}case"cancel":{if(!e.cancels.length)throw new Error("cancel action must have at least one cancel");const n=new d.ByteArrayBuilder;for(const o of e.cancels)I(n,r.ASSET_ID,o.a),f(n,r.ORDER_ID,o.o);const a=n.build();E(t,r.CANCEL_ORDERS,a);break}case"updateLeverage":{I(t,r.ASSET_ID,e.asset),i(t,r.IS_CROSS,e.isCross?1:0),f(t,r.LEVERAGE,e.leverage);break}case"approveBuilderFee":A(t,r.CHAIN_ID,e.signatureChainId),u(t,r.MAX_FEE,e.maxFeeRate),A(t,r.BUILDER_ADDRESS,e.builder);break;case"updateIsolatedMargin":I(t,r.ASSET_ID,e.asset),i(t,r.BUY_OR_NOT,e.isBuy?1:0),f(t,r.NTLI,e.ntli);break;default:break}return t.build()}function g(e){const t=new d.ByteArrayBuilder,n=C(e),a=y(e);return t.add8BitUIntToData(r.STRUCTURE_TYPE).add8BitUIntToData(1).add8BitUIntToData(_),t.add8BitUIntToData(r.VERSION).add8BitUIntToData(1).add8BitUIntToData(l),t.add16BitUIntToData(s+r.ACTION_TYPE).add8BitUIntToData(1).add8BitUIntToData(n),I(t,r.NONCE,e.nonce),E(t,r.ACTION_STRUCTURE,a),t.build()}0&&(module.exports={ACTION_TYPE,STRUCTURE_TYPE_VALUE,TLV_TAG,VERSION_VALUE,buildActionStructure,serializeActionToTlv,serializeOrderToTlv});
2
2
  //# sourceMappingURL=actionTlvSerializer.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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"]
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/**\n * DER-encode a length value: short form for < 0x80, long form otherwise.\n * Matches the Ledger SDK's lib_tlv expectations.\n */\nfunction encodeDerLength(builder: ByteArrayBuilder, length: number): void {\n if (!Number.isInteger(length) || length < 0) {\n throw new Error(\n `Invalid DER length ${length}: expected non-negative integer`,\n );\n }\n if (!Number.isSafeInteger(length)) {\n throw new Error(`Invalid DER length ${length}: not a safe integer`);\n }\n\n if (length < 0x80) {\n builder.add8BitUIntToData(length);\n } else if (length <= 0xff) {\n builder.add8BitUIntToData(0x81);\n builder.add8BitUIntToData(length);\n } else {\n builder.add8BitUIntToData(0x82);\n builder.add16BitUIntToData(length);\n }\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 const bytes = new TextEncoder().encode(value);\n encodeDerLength(builder, bytes.length);\n builder.addBufferToData(bytes);\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 encodeDerLength(builder, value.length);\n builder.addBufferToData(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 if (action.orders.length === 0) {\n throw new Error(\"order action must have at least one order\");\n }\n for (const order of action.orders) {\n const orderPayload = serializeOrderToTlv(order);\n encodeInTlvFromBuffer(b, TLV_TAG.ORDER, orderPayload);\n }\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", "encodeDerLength", "builder", "length", "encodeTlvVarNumber", "tag", "encodeInTlvFromUInt8", "encodeInTlvFromUInt64", "encodeInTlvFromAscii", "encodeInTlvFromBuffer", "order", "b", "isLimit", "orderType", "payloadBuilder", "encodeInTlvFromHexa", "orderPayload", "builderInfoBuilder", "mod", "updateOrderPayload", "cancel", "actionTypeByte", "actionStructure"]
7
7
  }
@@ -1,2 +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)})});
1
+ "use strict";var c=require("@ledgerhq/device-management-kit"),e=require("vitest"),r=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:i,expectedHex:a})=>{const t=(0,r.serializeOrderToTlv)(i);(0,e.expect)(t).toBeInstanceOf(Uint8Array),(0,e.expect)(t.length).toBeGreaterThan(0);const d=(0,c.hexaStringToBuffer)(a);(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 with multiple orders",action:{type:"order",orders:[{a:5,b:!0,p:"95.302",s:"0.16",r:!1,t:{limit:{tif:"Ioc"}}},{a:5,b:!1,p:"102.78",s:"0.16",r:!0,t:{trigger:{isMarket:!0,triggerPx:"102.78",tpsl:"tp"}}}],grouping:"normalTpsl",builder:{b:"0xc0708cdd6cd166d51da264e3f49a0422be26e35b",f:100},nonce:1773655934209},expectedHex:"81dd2781e0010081d1010581e2010181e30639352E33303281e404302E313681e5010081d70481e6010181dd3481e0010181d1010581e2010081e3063130322E373881e404302E313681e5010181d71181e7010181e8063130322E373881e9010081ea010181eb1b81d314c0708cdd6cd166d51da264e3f49a0422be26e35b81ec0164"},{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:i,expectedHex:a})=>{const t=(0,r.buildActionStructure)(i);(0,e.expect)(t).toBeInstanceOf(Uint8Array),(0,e.expect)(t.length).toBeGreaterThan(0);const d=(0,c.hexaStringToBuffer)(a);(0,e.expect)(t).toEqual(d)})});
2
2
  //# sourceMappingURL=actionTlvSerializer.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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",
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 with multiple orders\",\n action: {\n type: \"order\",\n orders: [\n {\n a: 5,\n b: true,\n p: \"95.302\",\n s: \"0.16\",\n r: false,\n t: {\n limit: {\n tif: \"Ioc\",\n },\n },\n },\n {\n a: 5,\n b: false,\n p: \"102.78\",\n s: \"0.16\",\n r: true,\n t: {\n trigger: {\n isMarket: true,\n triggerPx: \"102.78\",\n tpsl: \"tp\",\n },\n },\n },\n ],\n grouping: \"normalTpsl\",\n builder: {\n b: \"0xc0708cdd6cd166d51da264e3f49a0422be26e35b\",\n f: 100,\n },\n nonce: 1773655934209,\n } satisfies HyperliquidAction,\n expectedHex:\n // prettier-ignore\n /* eslint-disable prettier/prettier */\n \"81dd27\" + // ORDER\n \"81e00100\" + // ORDER_TYPE\n \"81d10105\" + // ASSET_ID\n \"81e20101\" + // BUY_OR_NOT\n \"81e30639352E333032\" + // PRICE\n \"81e404302E3136\" + // SIZE\n \"81e50100\" + // REDUCE_ONLY\n \"81d704\" + // ORDER_DETAIL\n \"81e60101\" + // TIF\n\n \"81dd34\" + // ORDER\n \"81e00101\" + // ORDER_TYPE\n \"81d10105\" + // ASSET_ID\n \"81e20100\" + // BUY_OR_NOT\n \"81e3063130322E3738\" + // PRICE\n \"81e404302E3136\" + // SIZE\n \"81e50101\" + // REDUCE_ONLY\n \"81d711\" + // ORDER_DETAIL\n \"81e70101\" + // TRIGGER_MARKET\n \"81e8063130322E3738\" + // TRIGGER_PRICE\n \"81e90100\" + // TRIGGER_TYPE\n\n \"81ea0101\" + // GROUPING\n \"81eb1b\" + // BUILDER_INFO\n \"81d314c0708cdd6cd166d51da264e3f49a0422be26e35b\" + // BUILDER_ADDRESS\n \"81ec0164\", // BUILDER_FEE\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": "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",
6
6
  "names": ["import_device_management_kit", "import_vitest", "import_actionTlvSerializer", "order", "expectedHex", "result", "expected", "action"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "dependencies": {
3
- "@ledgerhq/context-module": "workspace:^",
4
- "@ledgerhq/signer-utils": "workspace:^",
3
+ "@ledgerhq/context-module": "^1.15.0",
4
+ "@ledgerhq/signer-utils": "^1.1.3",
5
5
  "inversify": "catalog:",
6
6
  "purify-ts": "catalog:",
7
7
  "reflect-metadata": "catalog:",
@@ -35,7 +35,7 @@
35
35
  "license": "Apache-2.0",
36
36
  "name": "@ledgerhq/device-signer-kit-hyperliquid",
37
37
  "peerDependencies": {
38
- "@ledgerhq/device-management-kit": "workspace:^"
38
+ "@ledgerhq/device-management-kit": "^1.2.0"
39
39
  },
40
40
  "private": false,
41
41
  "repository": {
@@ -59,5 +59,5 @@
59
59
  "watch:builds": "pnpm ldmk-tool watch --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
60
60
  "watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
61
61
  },
62
- "version": "1.0.0"
62
+ "version": "1.0.1"
63
63
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/api/index.ts"],
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",
4
+ "sourcesContent": ["export {\n type SignActionsActionItem,\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,OASE,2BAAAA,MACK,4CACP,WAAc,4BACd,WAAc,uBACd,WAAc,yBACd,WAAc",
6
6
  "names": ["signActionsDAStateSteps"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ const e="Hyperliquid";export{e as APP_NAME};
2
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/internal/app-binder/constants.ts"],
4
+ "sourcesContent": ["export const APP_NAME = \"Hyperliquid\";\n"],
5
+ "mappings": "AAAO,MAAMA,EAAW",
6
+ "names": ["APP_NAME"]
7
+ }
@@ -1,2 +1,2 @@
1
- import{CommandResultFactory as d,hexaStringToBuffer as o,UnknownDeviceExchangeError as p}from"@ledgerhq/device-management-kit";import{beforeEach as u,describe as f,expect as n,it as i}from"vitest";import{SendActionCommand as s}from"../../app-binder/command/SendActionCommand";import{makeDeviceActionInternalApiMock as C}from"../../app-binder/device-action/__test-utils__/makeInternalApi";import{SendActionsTask as c}from"./SendActionsTask";f("SendActionsTask",()=>{const e=C();u(()=>{e.sendCommand.mockClear(),e.sendCommand.mockResolvedValue(d({data:void 0}))}),i.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:t,expectedSerialization:a})=>{const r=await new c(e,{actions:[t]}).run();n(r).toEqual(d({data:void 0})),n(e.sendCommand).toHaveBeenCalledTimes(1);const m=o(a);n(e.sendCommand).toHaveBeenCalledWith(new s({serializedAction:m}))}),i.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:[o("01012c02010181d0010081da010181db2681dd1f81e0010081d1010081e2010181e3013181e4013181e5010081d70481e6010281ea0100"),o("01012c02010181d0010281da010281db1281d90f81d1010081dc08000000000000002a"),o("01012c02010181d0010381da010381db1381d1010081de010081ed08000000000000000a")]}])("calls SendActionCommand multiple times in order when actions has several items",async({actions:t,expectedSerializations:a})=>{await new c(e,{actions:t}).run(),n(e.sendCommand).toHaveBeenCalledTimes(3),n(e.sendCommand).toHaveBeenNthCalledWith(1,new s({serializedAction:a[0]})),n(e.sendCommand).toHaveBeenNthCalledWith(2,new s({serializedAction:a[1]})),n(e.sendCommand).toHaveBeenNthCalledWith(3,new s({serializedAction:a[2]}))}),i("returns error result and stops on first SendActionCommand failure",async()=>{const t=d({error:new p});e.sendCommand.mockResolvedValueOnce(d({data:void 0})).mockResolvedValueOnce(t);const a=[{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}],r=await new c(e,{actions:a}).run();n(r).toStrictEqual(t),n(e.sendCommand).toHaveBeenCalledTimes(2)}),i("returns success when actions is empty",async()=>{const a=await new c(e,{actions:[]}).run();n(a).toEqual(d({data:void 0})),n(e.sendCommand).not.toHaveBeenCalled()})});
1
+ import{CommandResultFactory as i,hexaStringToBuffer as t,UnknownDeviceExchangeError as p}from"@ledgerhq/device-management-kit";import{beforeEach as f,describe as u,expect as a,it as o}from"vitest";import{SendActionCommand as s}from"../../app-binder/command/SendActionCommand";import{makeDeviceActionInternalApiMock as b}from"../../app-binder/device-action/__test-utils__/makeInternalApi";import{SendActionsTask as c}from"./SendActionsTask";u("SendActionsTask",()=>{const e=b();f(()=>{e.sendCommand.mockClear(),e.sendCommand.mockResolvedValue(i({data:void 0}))}),o.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:n,expectedSerialization:d})=>{const r=await new c(e,{actions:[n]}).run();a(r).toEqual(i({data:void 0})),a(e.sendCommand).toHaveBeenCalledTimes(1);const m=t(d);a(e.sendCommand).toHaveBeenCalledWith(new s({serializedAction:m}))}),o.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:[t("01012c02010181d0010081da010181db2681dd1f81e0010081d1010081e2010181e3013181e4013181e5010081d70481e6010281ea0100"),t("01012c02010181d0010281da010281db1281d90f81d1010081dc08000000000000002a"),t("01012c02010181d0010381da010381db1381d1010081de010081ed08000000000000000a")]},{actions:[{type:"updateLeverage",asset:5,isCross:!1,leverage:3,nonce:1773655934208},{type:"order",orders:[{a:5,b:!0,p:"95.302",s:"0.16",r:!1,t:{limit:{tif:"Ioc"}}},{a:5,b:!1,p:"102.78",s:"0.16",r:!0,t:{trigger:{isMarket:!0,triggerPx:"102.78",tpsl:"tp"}}}],grouping:"normalTpsl",builder:{b:"0xc0708cdd6cd166d51da264e3f49a0422be26e35b",f:100},nonce:1773655934209}],expectedSerializations:[t("01012c02010181d0010381da06019cf621c50081db1381d1010581de010081ed080000000000000003"),t("01012c02010181d0010081da06019cf621c50181db818381dd2781e0010081d1010581e2010181e30639352e33303281e404302e313681e5010081d70481e6010181dd3481e0010181d1010581e2010081e3063130322e373881e404302e313681e5010181d71181e7010181e8063130322e373881e9010081ea010181eb1b81d314c0708cdd6cd166d51da264e3f49a0422be26e35b81ec0164")]}])("calls SendActionCommand multiple times in order when actions has several items",async({actions:n,expectedSerializations:d})=>{await new c(e,{actions:n}).run(),a(e.sendCommand).toHaveBeenCalledTimes(n.length),a(e.sendCommand).toHaveBeenNthCalledWith(1,new s({serializedAction:d[0]})),a(e.sendCommand).toHaveBeenNthCalledWith(2,new s({serializedAction:d[1]})),d[2]&&a(e.sendCommand).toHaveBeenNthCalledWith(3,new s({serializedAction:d[2]}))}),o("returns error result and stops on first SendActionCommand failure",async()=>{const n=i({error:new p});e.sendCommand.mockResolvedValueOnce(i({data:void 0})).mockResolvedValueOnce(n);const d=[{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}],r=await new c(e,{actions:d}).run();a(r).toStrictEqual(n),a(e.sendCommand).toHaveBeenCalledTimes(2)}),o("returns success when actions is empty",async()=>{const d=await new c(e,{actions:[]}).run();a(d).toEqual(i({data:void 0})),a(e.sendCommand).not.toHaveBeenCalled()})});
2
2
  //# sourceMappingURL=SendActionsTask.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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": "AAAA,OACE,wBAAAA,EACA,sBAAAC,EACA,8BAAAC,MACK,kCACP,OAAS,cAAAC,EAAY,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,MAAmB,SAE1D,OAAS,qBAAAC,MAAyB,iDAClC,OAAS,mCAAAC,MAAuC,oEAGhD,OAAS,mBAAAC,MAAuB,oBAEhCL,EAAS,kBAAmB,IAAM,CAChC,MAAMM,EAAUF,EAAgC,EAEhDL,EAAW,IAAM,CACfO,EAAQ,YAAY,UAAU,EAC9BA,EAAQ,YAAY,kBAClBV,EAAqB,CAAE,KAAM,MAAU,CAAC,CAC1C,CACF,CAAC,EAEDM,EAAG,KAAK,CACN,CACE,OAAQ,CACN,KAAM,QACN,OAAQ,CACN,CACE,EAAG,GACH,EAAG,GACH,EAAG,OACH,EAAG,QACH,EAAG,CACD,MAAO,CACL,IAAK,KACP,CACF,EACA,EAAG,EACL,CACF,EACA,SAAU,KACV,QAAS,CACP,EAAG,6CACH,EAAG,GACL,EACA,MAAO,aACT,EACA,sBAGE,oMAmBJ,EACA,CACE,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,sBAGE,wLAmBJ,EACA,CACE,OAAQ,CACN,KAAM,SACN,QAAS,CACP,CACE,EAAG,EACH,EAAG,YACL,CACF,EACA,MAAO,aACT,EACA,sBAGE,kFASJ,CACF,CAAC,EACC,yDACA,MAAO,CAAE,OAAAK,EAAQ,sBAAAC,CAAsB,IAAM,CAI3C,MAAMC,EAAS,MADF,IAAIJ,EAAgBC,EAAS,CAAE,QAAS,CAACC,CAAM,CAAE,CAAC,EACrC,IAAI,EAG9BN,EAAOQ,CAAM,EAAE,QACbb,EAAqB,CACnB,KAAM,MACR,CAAC,CACH,EACAK,EAAOK,EAAQ,WAAW,EAAE,sBAAsB,CAAC,EAEnD,MAAMI,EAAgBb,EAAmBW,CAAqB,EAC9DP,EAAOK,EAAQ,WAAW,EAAE,qBAC1B,IAAIH,EAAkB,CACpB,iBAAkBO,CACpB,CAAC,CACH,CACF,CACF,EAEAR,EAAG,KAAK,CACN,CACE,QAAS,CACP,CACE,KAAM,QACN,OAAQ,CACN,CACE,EAAG,EACH,EAAG,GACH,EAAG,IACH,EAAG,IACH,EAAG,CAAE,MAAO,CAAE,IAAK,KAAM,CAAE,EAC3B,EAAG,EACL,CACF,EACA,SAAU,KACV,MAAO,CACT,EACA,CACE,KAAM,SACN,QAAS,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,CAAC,EACzB,MAAO,CACT,EACA,CACE,KAAM,iBACN,MAAO,EACP,QAAS,GACT,SAAU,GACV,MAAO,CACT,CACF,EACA,uBAAwB,CACtBL,EACE,gHACF,EACAA,EACE,wEACF,EACAA,EACE,0EACF,CACF,CACF,CACF,CAAC,EACC,iFACA,MAAO,CAAE,QAAAc,EAAS,uBAAAC,CAAuB,IAAM,CAI7C,MADa,IAAIP,EAAgBC,EAAS,CAAE,QAAAK,CAAQ,CAAC,EAC1C,IAAI,EAGfV,EAAOK,EAAQ,WAAW,EAAE,sBAAsB,CAAC,EAEnDL,EAAOK,EAAQ,WAAW,EAAE,wBAC1B,EACA,IAAIH,EAAkB,CACpB,iBAAkBS,EAAuB,CAAC,CAC5C,CAAC,CACH,EAEAX,EAAOK,EAAQ,WAAW,EAAE,wBAC1B,EACA,IAAIH,EAAkB,CACpB,iBAAkBS,EAAuB,CAAC,CAC5C,CAAC,CACH,EAEAX,EAAOK,EAAQ,WAAW,EAAE,wBAC1B,EACA,IAAIH,EAAkB,CACpB,iBAAkBS,EAAuB,CAAC,CAC5C,CAAC,CACH,CACF,CACF,EAEAV,EAAG,oEAAqE,SAAY,CAElF,MAAMW,EAAcjB,EAAqB,CACvC,MAAO,IAAIE,CACb,CAAC,EACAQ,EAAQ,YACN,sBAAsBV,EAAqB,CAAE,KAAM,MAAU,CAAC,CAAC,EAC/D,sBAAsBiB,CAAW,EAEpC,MAAMF,EAA+B,CACnC,CACE,KAAM,QACN,OAAQ,CACN,CACE,EAAG,EACH,EAAG,GACH,EAAG,IACH,EAAG,IACH,EAAG,CAAE,MAAO,CAAE,IAAK,KAAM,CAAE,EAC3B,EAAG,EACL,CACF,EACA,SAAU,KACV,MAAO,CACT,EACA,CACE,KAAM,SACN,QAAS,CAAC,CAAE,EAAG,EAAG,EAAG,CAAE,CAAC,EACxB,MAAO,CACT,CACF,EAIMF,EAAS,MADF,IAAIJ,EAAgBC,EAAS,CAAE,QAAAK,CAAQ,CAAC,EAC3B,IAAI,EAG9BV,EAAOQ,CAAM,EAAE,cAAcI,CAAW,EACxCZ,EAAOK,EAAQ,WAAW,EAAE,sBAAsB,CAAC,CACrD,CAAC,EAEDJ,EAAG,wCAAyC,SAAY,CAItD,MAAMO,EAAS,MADF,IAAIJ,EAAgBC,EAAS,CAAE,QAAS,CAAC,CAAE,CAAC,EAC/B,IAAI,EAG9BL,EAAOQ,CAAM,EAAE,QACbb,EAAqB,CACnB,KAAM,MACR,CAAC,CACH,EACAK,EAAOK,EAAQ,WAAW,EAAE,IAAI,iBAAiB,CACnD,CAAC,CACH,CAAC",
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 actions: [\n {\n type: \"updateLeverage\",\n asset: 5,\n isCross: false,\n leverage: 3,\n nonce: 1773655934208,\n },\n {\n type: \"order\",\n orders: [\n {\n a: 5,\n b: true,\n p: \"95.302\",\n s: \"0.16\",\n r: false,\n t: {\n limit: {\n tif: \"Ioc\",\n },\n },\n },\n {\n a: 5,\n b: false,\n p: \"102.78\",\n s: \"0.16\",\n r: true,\n t: {\n trigger: {\n isMarket: true,\n triggerPx: \"102.78\",\n tpsl: \"tp\",\n },\n },\n },\n ],\n grouping: \"normalTpsl\",\n builder: {\n b: \"0xc0708cdd6cd166d51da264e3f49a0422be26e35b\",\n f: 100,\n },\n nonce: 1773655934209,\n },\n ] satisfies HyperliquidAction[],\n expectedSerializations: [\n hexaStringToBuffer(\n \"01012c02010181d0010381da06019cf621c50081db1381d1010581de010081ed080000000000000003\",\n )!,\n hexaStringToBuffer(\n \"01012c02010181d0010081da06019cf621c50181db8183\" +\n \"81dd2781e0010081d1010581e2010181e30639352e33303281e404302e313681e5010081d70481e60101\" +\n \"81dd3481e0010181d1010581e2010081e3063130322e373881e404302e313681e5010181d71181e7010181e8063130322e373881e9010081ea010181eb1b81d314c0708cdd6cd166d51da264e3f49a0422be26e35b81ec0164\",\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(actions.length);\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 if (expectedSerializations[2]) {\n expect(apiMock.sendCommand).toHaveBeenNthCalledWith(\n 3,\n new SendActionCommand({\n serializedAction: expectedSerializations[2]!,\n }),\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
6
  "names": ["CommandResultFactory", "hexaStringToBuffer", "UnknownDeviceExchangeError", "beforeEach", "describe", "expect", "it", "SendActionCommand", "makeDeviceActionInternalApiMock", "SendActionsTask", "apiMock", "action", "expectedSerialization", "result", "expectedBytes", "actions", "expectedSerializations", "errorResult"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{ByteArrayBuilder as T}from"@ledgerhq/device-management-kit";const E=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},U=44,B=1,s={ORDER:0,MODIFY:1,CANCEL:2,UPDATE_LEVERAGE:3,APPROVAL_BUILDER_FEE:4,UPDATE_ISOLATED_MARGIN:5},D={LIMIT:0,TRIGGER:1},c={ALO:0,IOC:1,GTC:2},_={TP:0,SL:1},R={NA:0,NORMAL_TPSL:1,POSITION_TPSL:2};function x(e){switch(e.type){case"order":return s.ORDER;case"modify":case"batchModify":return s.MODIFY;case"cancel":return s.CANCEL;case"updateLeverage":return s.UPDATE_LEVERAGE;case"approveBuilderFee":return s.APPROVAL_BUILDER_FEE;case"updateIsolatedMargin":return s.UPDATE_ISOLATED_MARGIN;default:throw new Error(`Unknown action type: ${e.type}`)}}function O(e){switch(e){case"Alo":return c.ALO;case"Ioc":return c.IOC;case"Gtc":return c.GTC;default:return c.GTC}}function y(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 p(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(E+t):e.add8BitUIntToData(t);const a=p(r,o);e.add8BitUIntToData(a.length),e.addBufferToData(a)}function i(e,t,r){t>127?e.add16BitUIntToData(E+t):e.add8BitUIntToData(t),e.add8BitUIntToData(1),e.add8BitUIntToData(r)}function u(e,t,r){t>127?e.add16BitUIntToData(E+t):e.add8BitUIntToData(t),e.add8BitUIntToData(8),e.add64BitUIntToData(r)}function f(e,t,r){t>127?e.add16BitUIntToData(E+t):e.add8BitUIntToData(t),e.encodeInLVFromAscii(r)}function d(e,t,r){t>127?e.add16BitUIntToData(E+t):e.add8BitUIntToData(t),e.encodeInLVFromBuffer(r)}function l(e){const t=new T,r="limit"in e.t,o=e.t;i(t,n.ORDER_TYPE,r?D.LIMIT:D.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 T;return r&&"limit"in o?i(a,n.TIF,O(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"?_.TP:_.SL)),d(t,n.ORDER_DETAIL,a.build()),t.build()}function A(e,t,r){t>127?e.add16BitUIntToData(E+t):e.add8BitUIntToData(t),e.encodeInLVFromHexa(r)}function m(e){const t=new T;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=l(r);if(d(t,n.ORDER,o),i(t,n.GROUPING,y(e.grouping)),e.builder!==void 0){const a=new T;A(a,n.BUILDER_ADDRESS,e.builder.b),I(a,n.BUILDER_FEE,e.builder.f),d(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 T;for(const a of e.modifies)d(r,n.ORDER,l(a.order)),u(r,n.ORDER_ID,a.oid);const o=r.build();d(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 T;for(const a of e.cancels)I(r,n.ASSET_ID,a.a),u(r,n.ORDER_ID,a.o);const o=r.build();d(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":A(t,n.CHAIN_ID,e.signatureChainId),f(t,n.MAX_FEE,e.maxFeeRate),A(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 L(e){const t=new T,r=x(e),o=m(e);return t.add8BitUIntToData(n.STRUCTURE_TYPE).add8BitUIntToData(1).add8BitUIntToData(U),t.add8BitUIntToData(n.VERSION).add8BitUIntToData(1).add8BitUIntToData(B),t.add16BitUIntToData(E+n.ACTION_TYPE).add8BitUIntToData(1).add8BitUIntToData(r),I(t,n.NONCE,e.nonce),d(t,n.ACTION_STRUCTURE,o),t.build()}export{s as ACTION_TYPE,U as STRUCTURE_TYPE_VALUE,n as TLV_TAG,B as VERSION_VALUE,m as buildActionStructure,L as serializeActionToTlv,l as serializeOrderToTlv};
1
+ import{ByteArrayBuilder as T}from"@ledgerhq/device-management-kit";const E=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},_=44,l=1,s={ORDER:0,MODIFY:1,CANCEL:2,UPDATE_LEVERAGE:3,APPROVAL_BUILDER_FEE:4,UPDATE_ISOLATED_MARGIN:5},A={LIMIT:0,TRIGGER:1},c={ALO:0,IOC:1,GTC:2},B={TP:0,SL:1},R={NA:0,NORMAL_TPSL:1,POSITION_TPSL:2};function O(e){switch(e.type){case"order":return s.ORDER;case"modify":case"batchModify":return s.MODIFY;case"cancel":return s.CANCEL;case"updateLeverage":return s.UPDATE_LEVERAGE;case"approveBuilderFee":return s.APPROVAL_BUILDER_FEE;case"updateIsolatedMargin":return s.UPDATE_ISOLATED_MARGIN;default:throw new Error(`Unknown action type: ${e.type}`)}}function y(e){switch(e){case"Alo":return c.ALO;case"Ioc":return c.IOC;case"Gtc":return c.GTC;default:return c.GTC}}function p(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 m(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 a=[];let o=r;for(;o>0n&&a.length<t;)a.unshift(Number(o&0xffn)),o>>=8n;return new Uint8Array(a)}function x(e,t){if(!Number.isInteger(t)||t<0)throw new Error(`Invalid DER length ${t}: expected non-negative integer`);if(!Number.isSafeInteger(t))throw new Error(`Invalid DER length ${t}: not a safe integer`);t<128?e.add8BitUIntToData(t):t<=255?(e.add8BitUIntToData(129),e.add8BitUIntToData(t)):(e.add8BitUIntToData(130),e.add16BitUIntToData(t))}function I(e,t,r,a=8){t>127?e.add16BitUIntToData(E+t):e.add8BitUIntToData(t);const o=m(r,a);e.add8BitUIntToData(o.length),e.addBufferToData(o)}function i(e,t,r){t>127?e.add16BitUIntToData(E+t):e.add8BitUIntToData(t),e.add8BitUIntToData(1),e.add8BitUIntToData(r)}function f(e,t,r){t>127?e.add16BitUIntToData(E+t):e.add8BitUIntToData(t),e.add8BitUIntToData(8),e.add64BitUIntToData(r)}function u(e,t,r){t>127?e.add16BitUIntToData(E+t):e.add8BitUIntToData(t);const a=new TextEncoder().encode(r);x(e,a.length),e.addBufferToData(a)}function d(e,t,r){t>127?e.add16BitUIntToData(E+t):e.add8BitUIntToData(t),x(e,r.length),e.addBufferToData(r)}function U(e){const t=new T,r="limit"in e.t,a=e.t;i(t,n.ORDER_TYPE,r?A.LIMIT:A.TRIGGER),I(t,n.ASSET_ID,e.a),i(t,n.BUY_OR_NOT,e.b?1:0),u(t,n.PRICE,e.p),u(t,n.SIZE,e.s),i(t,n.REDUCE_ONLY,e.r?1:0);const o=new T;return r&&"limit"in a?i(o,n.TIF,y(a.limit.tif)):"trigger"in a&&(i(o,n.TRIGGER_MARKET,a.trigger.isMarket?1:0),u(o,n.TRIGGER_PRICE,a.trigger.triggerPx),i(o,n.TRIGGER_TYPE,a.trigger.tpsl==="tp"?B.TP:B.SL)),d(t,n.ORDER_DETAIL,o.build()),t.build()}function D(e,t,r){t>127?e.add16BitUIntToData(E+t):e.add8BitUIntToData(t),e.encodeInLVFromHexa(r)}function S(e){const t=new T;switch(e.type){case"order":{if(e.orders.length===0)throw new Error("order action must have at least one order");for(const r of e.orders){const a=U(r);d(t,n.ORDER,a)}if(i(t,n.GROUPING,p(e.grouping)),e.builder!==void 0){const r=new T;D(r,n.BUILDER_ADDRESS,e.builder.b),I(r,n.BUILDER_FEE,e.builder.f),d(t,n.BUILDER_INFO,r.build())}break}case"modify":case"batchModify":{if(!e.modifies.length)throw new Error("modify action must have at least one modify");const r=new T;for(const o of e.modifies)d(r,n.ORDER,U(o.order)),f(r,n.ORDER_ID,o.oid);const a=r.build();d(t,n.UPDATE_ORDERS,a);break}case"cancel":{if(!e.cancels.length)throw new Error("cancel action must have at least one cancel");const r=new T;for(const o of e.cancels)I(r,n.ASSET_ID,o.a),f(r,n.ORDER_ID,o.o);const a=r.build();d(t,n.CANCEL_ORDERS,a);break}case"updateLeverage":{I(t,n.ASSET_ID,e.asset),i(t,n.IS_CROSS,e.isCross?1:0),f(t,n.LEVERAGE,e.leverage);break}case"approveBuilderFee":D(t,n.CHAIN_ID,e.signatureChainId),u(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),f(t,n.NTLI,e.ntli);break;default:break}return t.build()}function L(e){const t=new T,r=O(e),a=S(e);return t.add8BitUIntToData(n.STRUCTURE_TYPE).add8BitUIntToData(1).add8BitUIntToData(_),t.add8BitUIntToData(n.VERSION).add8BitUIntToData(1).add8BitUIntToData(l),t.add16BitUIntToData(E+n.ACTION_TYPE).add8BitUIntToData(1).add8BitUIntToData(r),I(t,n.NONCE,e.nonce),d(t,n.ACTION_STRUCTURE,a),t.build()}export{s as ACTION_TYPE,_ as STRUCTURE_TYPE_VALUE,n as TLV_TAG,l as VERSION_VALUE,S as buildActionStructure,L as serializeActionToTlv,U as serializeOrderToTlv};
2
2
  //# sourceMappingURL=actionTlvSerializer.js.map