@ledgerhq/device-signer-kit-hyperliquid 0.0.0-develop-20260604004249 → 0.0.0-develop-20260606003348
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/internal/app-binder/command/SendActionCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/SendActionCommand.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/SendActionCommand.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/SendActionCommand.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/SendActionsTask.js +1 -1
- package/lib/cjs/internal/app-binder/task/SendActionsTask.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/SendActionsTask.test.js +1 -1
- package/lib/cjs/internal/app-binder/task/SendActionsTask.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/utils/actionTlvSerializer.test.js +1 -1
- package/lib/cjs/internal/app-binder/utils/actionTlvSerializer.test.js.map +2 -2
- package/lib/cjs/package.json +1 -1
- package/lib/esm/internal/app-binder/command/SendActionCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/SendActionCommand.js.map +3 -3
- package/lib/esm/internal/app-binder/command/SendActionCommand.test.js +1 -1
- package/lib/esm/internal/app-binder/command/SendActionCommand.test.js.map +3 -3
- package/lib/esm/internal/app-binder/task/SendActionsTask.js +1 -1
- package/lib/esm/internal/app-binder/task/SendActionsTask.js.map +3 -3
- package/lib/esm/internal/app-binder/task/SendActionsTask.test.js +1 -1
- package/lib/esm/internal/app-binder/task/SendActionsTask.test.js.map +3 -3
- package/lib/esm/internal/app-binder/utils/actionTlvSerializer.test.js +1 -1
- package/lib/esm/internal/app-binder/utils/actionTlvSerializer.test.js.map +2 -2
- package/lib/esm/package.json +1 -1
- package/lib/types/internal/app-binder/command/SendActionCommand.d.ts +2 -4
- package/lib/types/internal/app-binder/command/SendActionCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/task/SendActionsTask.d.ts +8 -2
- package/lib/types/internal/app-binder/task/SendActionsTask.d.ts.map +1 -1
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +7 -7
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var s=Object.defineProperty;var
|
|
1
|
+
"use strict";var s=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var A=(o,e)=>{for(var r in e)s(o,r,{get:e[r],enumerable:!0})},c=(o,e,r,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let d of i(e))!u.call(o,d)&&d!==r&&s(o,d,{get:()=>e[d],enumerable:!(a=m(e,d))||a.enumerable});return o};var C=o=>c(s({},"__esModule",{value:!0}),o);var x={};A(x,{SendActionCommand:()=>S});module.exports=C(x);var n=require("@ledgerhq/device-management-kit"),p=require("@ledgerhq/signer-utils"),t=require("./utils/hyperliquidApplicationErrors");const l=224,y=3,R=1,g=0,H=0;class S{constructor(e){this.args=e}name="sendAction";errorHelper=new p.CommandErrorHelper(t.HYPERLIQUID_ERRORS,t.HyperliquidCommandErrorFactory);getApdu(){const e=this.args.extend?g:R,r={cla:l,ins:y,p1:e,p2:H};return new n.ApduBuilder(r).addBufferToData(this.args.chunkedData).build()}parseResponse(e){const r=this.errorHelper.getError(e);return r||(e.data.length!==0?(0,n.CommandResultFactory)({error:new n.InvalidResponseFormatError("Unexpected data in response")}):(0,n.CommandResultFactory)({data:void 0}))}}0&&(module.exports={SendActionCommand});
|
|
2
2
|
//# sourceMappingURL=SendActionCommand.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/command/SendActionCommand.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n type ApduBuilderArgs,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidResponseFormatError,\n} from \"@ledgerhq/device-management-kit\";\nimport { CommandErrorHelper
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,uBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EASO,2CACPC,
|
|
6
|
-
"names": ["SendActionCommand_exports", "__export", "SendActionCommand", "__toCommonJS", "import_device_management_kit", "import_signer_utils", "import_hyperliquidApplicationErrors", "CLA", "INS", "
|
|
4
|
+
"sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n type ApduBuilderArgs,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidResponseFormatError,\n} from \"@ledgerhq/device-management-kit\";\nimport {\n type ChunkableCommandArgs,\n CommandErrorHelper,\n} from \"@ledgerhq/signer-utils\";\n\nimport {\n HYPERLIQUID_ERRORS,\n HyperliquidCommandErrorFactory,\n type HyperliquidErrorCodes,\n} from \"./utils/hyperliquidApplicationErrors\";\n\n/** SET_ACTION \u2014 APDU framing per app-hyperliquid APP_SPECIFICATION.md */\nconst CLA = 0xe0;\nconst INS = 0x03;\nconst P1_FIRST_CHUNK = 0x01;\nconst P1_FOLLOWING_CHUNK = 0x00;\nconst P2 = 0x00;\n\nexport type SendActionCommandArgs = ChunkableCommandArgs;\n\nexport type SendActionCommandResponse = void;\n\nexport class SendActionCommand\n implements\n Command<\n SendActionCommandResponse,\n SendActionCommandArgs,\n HyperliquidErrorCodes\n >\n{\n readonly name = \"sendAction\";\n\n private readonly errorHelper = new CommandErrorHelper<\n SendActionCommandResponse,\n HyperliquidErrorCodes\n >(HYPERLIQUID_ERRORS, HyperliquidCommandErrorFactory);\n\n constructor(readonly args: SendActionCommandArgs) {}\n\n getApdu(): Apdu {\n const p1 = this.args.extend ? P1_FOLLOWING_CHUNK : P1_FIRST_CHUNK;\n\n const sendActionArgs: ApduBuilderArgs = {\n cla: CLA,\n ins: INS,\n p1,\n p2: P2,\n };\n\n return new ApduBuilder(sendActionArgs)\n .addBufferToData(this.args.chunkedData)\n .build();\n }\n\n parseResponse(\n response: ApduResponse,\n ): CommandResult<SendActionCommandResponse, HyperliquidErrorCodes> {\n const error = this.errorHelper.getError(response);\n if (error) {\n return error;\n }\n\n if (response.data.length !== 0) {\n return CommandResultFactory({\n error: new InvalidResponseFormatError(\"Unexpected data in response\"),\n });\n }\n\n return CommandResultFactory({ data: undefined });\n }\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,uBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EASO,2CACPC,EAGO,kCAEPC,EAIO,gDAGP,MAAMC,EAAM,IACNC,EAAM,EACNC,EAAiB,EACjBC,EAAqB,EACrBC,EAAK,EAMJ,MAAMT,CAOb,CAQE,YAAqBU,EAA6B,CAA7B,UAAAA,CAA8B,CAP1C,KAAO,aAEC,YAAc,IAAI,qBAGjC,qBAAoB,gCAA8B,EAIpD,SAAgB,CACd,MAAMC,EAAK,KAAK,KAAK,OAASH,EAAqBD,EAE7CK,EAAkC,CACtC,IAAKP,EACL,IAAKC,EACL,GAAAK,EACA,GAAIF,CACN,EAEA,OAAO,IAAI,cAAYG,CAAc,EAClC,gBAAgB,KAAK,KAAK,WAAW,EACrC,MAAM,CACX,CAEA,cACEC,EACiE,CACjE,MAAMC,EAAQ,KAAK,YAAY,SAASD,CAAQ,EAChD,OAAIC,IAIAD,EAAS,KAAK,SAAW,KACpB,wBAAqB,CAC1B,MAAO,IAAI,6BAA2B,6BAA6B,CACrE,CAAC,KAGI,wBAAqB,CAAE,KAAM,MAAU,CAAC,EACjD,CACF",
|
|
6
|
+
"names": ["SendActionCommand_exports", "__export", "SendActionCommand", "__toCommonJS", "import_device_management_kit", "import_signer_utils", "import_hyperliquidApplicationErrors", "CLA", "INS", "P1_FIRST_CHUNK", "P1_FOLLOWING_CHUNK", "P2", "args", "p1", "sendActionArgs", "response", "error"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var o=require("@ledgerhq/device-management-kit"),n=require("./SendActionCommand");const c=1,d=0,r=0;describe("SendActionCommand",()=>{const s=new Uint8Array([1,2,3,4]),a={chunkedData:s,more:!1,extend:!1};describe("name",()=>{it("should be 'sendAction'",()=>{const t=new n.SendActionCommand(a);expect(t.name).toBe("sendAction")})}),describe("getApdu",()=>{it("should build the first-chunk APDU (P1=0x01, P2=0x00) with chunkedData as raw data",()=>{const e=new n.SendActionCommand(a).getApdu();expect(e.cla).toBe(224),expect(e.ins).toBe(3),expect(e.p1).toBe(c),expect(e.p2).toBe(r),expect(e.data).toStrictEqual(s)}),it("should keep P1=0x01 on the first chunk regardless of the `more` flag",()=>{const e=new n.SendActionCommand({chunkedData:s,more:!0,extend:!1}).getApdu();expect(e.p1).toBe(c),expect(e.p2).toBe(r)}),it("should build a following-chunk APDU (P1=0x00, P2=0x00) when extend=true",()=>{const e=new n.SendActionCommand({chunkedData:s,more:!0,extend:!0}).getApdu();expect(e.p1).toBe(d),expect(e.p2).toBe(r),expect(e.data).toStrictEqual(s)}),it("should keep P1=0x00 on the last chunk of a multi-chunk stream (extend=true, more=false)",()=>{const e=new n.SendActionCommand({chunkedData:s,more:!1,extend:!0}).getApdu();expect(e.p1).toBe(d),expect(e.p2).toBe(r)})}),describe("parseResponse",()=>{it("should return success when status is 0x9000 and no data",()=>{const t={statusCode:Uint8Array.from([144,0]),data:new Uint8Array},e=new n.SendActionCommand(a).parseResponse(t);expect(e).toStrictEqual((0,o.CommandResultFactory)({data:void 0})),expect((0,o.isSuccessCommandResult)(e)).toBe(!0)}),it("should return an error if the status code is not 0x9000",()=>{const t={statusCode:Uint8Array.from([106,128]),data:new Uint8Array},e=new n.SendActionCommand(a).parseResponse(t);expect((0,o.isSuccessCommandResult)(e)).toBe(!1)}),it("should return an error if response contains unexpected data",()=>{const t={statusCode:Uint8Array.from([144,0]),data:Uint8Array.from([1])},e=new n.SendActionCommand(a).parseResponse(t);expect((0,o.isSuccessCommandResult)(e)).toBe(!1),expect(e.error).toBeInstanceOf(o.InvalidResponseFormatError)})})});
|
|
2
2
|
//# sourceMappingURL=SendActionCommand.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/command/SendActionCommand.test.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n CommandResultFactory,\n InvalidResponseFormatError,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport {\n SendActionCommand,\n type SendActionCommandArgs,\n} from \"./SendActionCommand\";\n\
|
|
5
|
-
"mappings": "aAAA,IAAAA,EAIO,2CAEPC,EAGO,+
|
|
6
|
-
"names": ["import_device_management_kit", "import_SendActionCommand", "
|
|
4
|
+
"sourcesContent": ["import {\n CommandResultFactory,\n InvalidResponseFormatError,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport {\n SendActionCommand,\n type SendActionCommandArgs,\n} from \"./SendActionCommand\";\n\n// Per APP_SPECIFICATION.md (SET_ACTION):\n// CLA = 0xE0, INS = 0x03, P2 = 0x00\n// P1 = 0x01 for the first chunk, 0x00 for following chunks\n// First chunk data: [lenH, lenL] (big-endian) + ACTION struct bytes\n// Following chunks: ACTION struct continuation only\nconst FIRST_CHUNK_P1 = 0x01;\nconst FOLLOWING_CHUNK_P1 = 0x00;\nconst APDU_P2 = 0x00;\n\ndescribe(\"SendActionCommand\", () => {\n const chunkedData = new Uint8Array([0x01, 0x02, 0x03, 0x04]);\n\n const firstChunkArgs: SendActionCommandArgs = {\n chunkedData,\n more: false,\n extend: false,\n };\n\n describe(\"name\", () => {\n it(\"should be 'sendAction'\", () => {\n const command = new SendActionCommand(firstChunkArgs);\n expect(command.name).toBe(\"sendAction\");\n });\n });\n\n describe(\"getApdu\", () => {\n it(\"should build the first-chunk APDU (P1=0x01, P2=0x00) with chunkedData as raw data\", () => {\n const command = new SendActionCommand(firstChunkArgs);\n\n const apdu = command.getApdu();\n\n expect(apdu.cla).toBe(0xe0);\n expect(apdu.ins).toBe(0x03);\n expect(apdu.p1).toBe(FIRST_CHUNK_P1);\n expect(apdu.p2).toBe(APDU_P2);\n expect(apdu.data).toStrictEqual(chunkedData);\n });\n\n it(\"should keep P1=0x01 on the first chunk regardless of the `more` flag\", () => {\n // The Hyperliquid spec does not use a `more` flag (the device knows the\n // total length from the 2-byte BE header in the first chunk). The\n // command should ignore it and only key off `extend`.\n const command = new SendActionCommand({\n chunkedData,\n more: true,\n extend: false,\n });\n\n const apdu = command.getApdu();\n\n expect(apdu.p1).toBe(FIRST_CHUNK_P1);\n expect(apdu.p2).toBe(APDU_P2);\n });\n\n it(\"should build a following-chunk APDU (P1=0x00, P2=0x00) when extend=true\", () => {\n const command = new SendActionCommand({\n chunkedData,\n more: true,\n extend: true,\n });\n\n const apdu = command.getApdu();\n\n expect(apdu.p1).toBe(FOLLOWING_CHUNK_P1);\n expect(apdu.p2).toBe(APDU_P2);\n expect(apdu.data).toStrictEqual(chunkedData);\n });\n\n it(\"should keep P1=0x00 on the last chunk of a multi-chunk stream (extend=true, more=false)\", () => {\n const command = new SendActionCommand({\n chunkedData,\n more: false,\n extend: true,\n });\n\n const apdu = command.getApdu();\n\n expect(apdu.p1).toBe(FOLLOWING_CHUNK_P1);\n expect(apdu.p2).toBe(APDU_P2);\n });\n });\n\n describe(\"parseResponse\", () => {\n it(\"should return success when status is 0x9000 and no data\", () => {\n const response = {\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: new Uint8Array(),\n };\n\n const parsed = new SendActionCommand(firstChunkArgs).parseResponse(\n response,\n );\n expect(parsed).toStrictEqual(CommandResultFactory({ data: undefined }));\n expect(isSuccessCommandResult(parsed)).toBe(true);\n });\n\n it(\"should return an error if the status code is not 0x9000\", () => {\n const response = {\n statusCode: Uint8Array.from([0x6a, 0x80]),\n data: new Uint8Array(),\n };\n\n const result = new SendActionCommand(firstChunkArgs).parseResponse(\n response,\n );\n expect(isSuccessCommandResult(result)).toBe(false);\n });\n\n it(\"should return an error if response contains unexpected data\", () => {\n const response = {\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: Uint8Array.from([0x01]),\n };\n\n const result = new SendActionCommand(firstChunkArgs).parseResponse(\n response,\n );\n expect(isSuccessCommandResult(result)).toBe(false);\n expect((result as { error: unknown }).error).toBeInstanceOf(\n InvalidResponseFormatError,\n );\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_device_management_kit", "import_SendActionCommand", "FIRST_CHUNK_P1", "FOLLOWING_CHUNK_P1", "APDU_P2", "chunkedData", "firstChunkArgs", "command", "apdu", "response", "parsed", "result"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var a=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var y=Object.prototype.hasOwnProperty;var A=(n,r)=>{for(var t in r)a(n,t,{get:r[t],enumerable:!0})},C=(n,r,t,e)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of u(r))!y.call(n,o)&&o!==t&&a(n,o,{get:()=>r[o],enumerable:!(e=l(r,o))||e.enumerable});return n};var g=n=>C(a({},"__esModule",{value:!0}),n);var S={};A(S,{SendActionsTask:()=>h,buildSendActionPayload:()=>c});module.exports=g(S);var i=require("@ledgerhq/device-management-kit"),d=require("@ledgerhq/signer-utils"),p=require("../../app-binder/command/SendActionCommand"),m=require("../../app-binder/utils/actionTlvSerializer");class h{constructor(r,t){this.api=r;this.args=t}async run(){const{actions:r}=this.args;for(const t of r){const e=(0,m.serializeActionToTlv)(t),o=c(e),s=await new d.SendCommandInChunksTask(this.api,{data:o,commandFactory:f=>new p.SendActionCommand(f)}).run();if(!(0,i.isSuccessCommandResult)(s))return s}return(0,i.CommandResultFactory)({data:void 0})}}function c(n){const r=n.length;if(r>65535)throw new RangeError(`Serialized action too large to frame with a 2-byte length prefix: ${r} bytes`);const t=new Uint8Array(2+r);return t[0]=r>>8&255,t[1]=r&255,t.set(n,2),t}0&&(module.exports={SendActionsTask,buildSendActionPayload});
|
|
2
2
|
//# sourceMappingURL=SendActionsTask.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/task/SendActionsTask.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type CommandResult,\n CommandResultFactory,\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { SendActionCommand } from \"@internal/app-binder/command/SendActionCommand\";\nimport { type HyperliquidErrorCodes } from \"@internal/app-binder/command/utils/hyperliquidApplicationErrors\";\nimport type { HyperliquidAction } from \"@internal/app-binder/di/appBinderTypes\";\nimport { serializeActionToTlv } from \"@internal/app-binder/utils/actionTlvSerializer\";\n\nexport type SendActionsTaskArgs = {\n actions: HyperliquidAction[];\n};\n\n/**\n * Sends a list of actions to the device by serializing each action to TLV
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,IAAA,eAAAC,
|
|
6
|
-
"names": ["SendActionsTask_exports", "__export", "SendActionsTask", "__toCommonJS", "import_device_management_kit", "import_SendActionCommand", "import_actionTlvSerializer", "api", "args", "actions", "action", "serialized", "result"]
|
|
4
|
+
"sourcesContent": ["import {\n type CommandResult,\n CommandResultFactory,\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\nimport { SendCommandInChunksTask } from \"@ledgerhq/signer-utils\";\n\nimport { SendActionCommand } from \"@internal/app-binder/command/SendActionCommand\";\nimport { type HyperliquidErrorCodes } from \"@internal/app-binder/command/utils/hyperliquidApplicationErrors\";\nimport type { HyperliquidAction } from \"@internal/app-binder/di/appBinderTypes\";\nimport { serializeActionToTlv } from \"@internal/app-binder/utils/actionTlvSerializer\";\n\nexport type SendActionsTaskArgs = {\n actions: HyperliquidAction[];\n};\n\n/**\n * Sends a list of actions to the device by serializing each action to TLV,\n * framing the result with a 2-byte big-endian length prefix and streaming it\n * to the device via the shared chunking task.\n */\nexport class SendActionsTask {\n constructor(\n private api: InternalApi,\n private args: SendActionsTaskArgs,\n ) {}\n\n async run(): Promise<CommandResult<void, HyperliquidErrorCodes>> {\n const { actions } = this.args;\n\n for (const action of actions) {\n const serialized = serializeActionToTlv(action);\n const framed = buildSendActionPayload(serialized);\n\n const result = await new SendCommandInChunksTask<\n void,\n HyperliquidErrorCodes\n >(this.api, {\n data: framed,\n commandFactory: (chunkArgs) => new SendActionCommand(chunkArgs),\n }).run();\n\n if (!isSuccessCommandResult(result)) {\n return result;\n }\n }\n\n return CommandResultFactory({ data: undefined });\n }\n}\n\n/**\n * Frames a TLV-serialized action with the 2-byte big-endian length prefix\n * expected by the SET_ACTION first chunk (see app-hyperliquid spec).\n */\nexport function buildSendActionPayload(serialized: Uint8Array): Uint8Array {\n const length = serialized.length;\n if (length > 0xffff) {\n throw new RangeError(\n `Serialized action too large to frame with a 2-byte length prefix: ${length} bytes`,\n );\n }\n const framed = new Uint8Array(2 + length);\n framed[0] = (length >> 8) & 0xff;\n framed[1] = length & 0xff;\n framed.set(serialized, 2);\n return framed;\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,EAAA,2BAAAC,IAAA,eAAAC,EAAAJ,GAAA,IAAAK,EAKO,2CACPC,EAAwC,kCAExCC,EAAkC,0DAGlCC,EAAqC,0DAW9B,MAAMN,CAAgB,CAC3B,YACUO,EACAC,EACR,CAFQ,SAAAD,EACA,UAAAC,CACP,CAEH,MAAM,KAA2D,CAC/D,KAAM,CAAE,QAAAC,CAAQ,EAAI,KAAK,KAEzB,UAAWC,KAAUD,EAAS,CAC5B,MAAME,KAAa,wBAAqBD,CAAM,EACxCE,EAASX,EAAuBU,CAAU,EAE1CE,EAAS,MAAM,IAAI,0BAGvB,KAAK,IAAK,CACV,KAAMD,EACN,eAAiBE,GAAc,IAAI,oBAAkBA,CAAS,CAChE,CAAC,EAAE,IAAI,EAEP,GAAI,IAAC,0BAAuBD,CAAM,EAChC,OAAOA,CAEX,CAEA,SAAO,wBAAqB,CAAE,KAAM,MAAU,CAAC,CACjD,CACF,CAMO,SAASZ,EAAuBU,EAAoC,CACzE,MAAMI,EAASJ,EAAW,OAC1B,GAAII,EAAS,MACX,MAAM,IAAI,WACR,qEAAqEA,CAAM,QAC7E,EAEF,MAAMH,EAAS,IAAI,WAAW,EAAIG,CAAM,EACxC,OAAAH,EAAO,CAAC,EAAKG,GAAU,EAAK,IAC5BH,EAAO,CAAC,EAAIG,EAAS,IACrBH,EAAO,IAAID,EAAY,CAAC,EACjBC,CACT",
|
|
6
|
+
"names": ["SendActionsTask_exports", "__export", "SendActionsTask", "buildSendActionPayload", "__toCommonJS", "import_device_management_kit", "import_signer_utils", "import_SendActionCommand", "import_actionTlvSerializer", "api", "args", "actions", "action", "serialized", "framed", "result", "chunkArgs", "length"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var t=require("@ledgerhq/device-management-kit"),e=require("vitest"),l=require("../../app-binder/command/SendActionCommand"),f=require("../../app-binder/device-action/__test-utils__/makeInternalApi"),o=require("./SendActionsTask");function m(a){const n=a.length,d=new Uint8Array(2+n);return d[0]=n>>8&255,d[1]=n&255,d.set(a,2),d}(0,e.describe)("SendActionsTask",()=>{const a=(0,f.makeDeviceActionInternalApiMock)();(0,e.beforeEach)(()=>{a.sendCommand.mockClear(),a.sendCommand.mockResolvedValue((0,t.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:n,expectedSerialization:d})=>{const s=await new o.SendActionsTask(a,{actions:[n]}).run();(0,e.expect)(s).toEqual((0,t.CommandResultFactory)({data:void 0})),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(1);const i=(0,t.hexaStringToBuffer)(d),c=m(i);(0,e.expect)(c.length).toBeLessThanOrEqual(t.APDU_MAX_PAYLOAD),(0,e.expect)(a.sendCommand).toHaveBeenCalledWith(new l.SendActionCommand({chunkedData:c,more:!1,extend:!1}))}),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,t.hexaStringToBuffer)("01012c02010181d0010081da010181db2681dd1f81e0010081d1010081e2010181e3013181e4013181e5010081d70481e6010281ea0100"),(0,t.hexaStringToBuffer)("01012c02010181d0010281da010281db1281d90f81d1010081dc08000000000000002a"),(0,t.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,t.hexaStringToBuffer)("01012c02010181d0010381da06019cf621c50081db1381d1010581de010081ed080000000000000003"),(0,t.hexaStringToBuffer)("01012c02010181d0010081da06019cf621c50181db818381dd2781e0010081d1010581e2010181e30639352e33303281e404302e313681e5010081d70481e6010181dd3481e0010181d1010581e2010081e3063130322e373881e404302e313681e5010181d71181e7010181e8063130322e373881e9010081ea010181eb1b81d314c0708cdd6cd166d51da264e3f49a0422be26e35b81ec0164")]}])("calls SendActionCommand multiple times in order when actions has several items",async({actions:n,expectedSerializations:d})=>{await new o.SendActionsTask(a,{actions:n}).run(),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(n.length),d.forEach((s,i)=>{const c=m(s);(0,e.expect)(c.length).toBeLessThanOrEqual(t.APDU_MAX_PAYLOAD),(0,e.expect)(a.sendCommand).toHaveBeenNthCalledWith(i+1,new l.SendActionCommand({chunkedData:c,more:!1,extend:!1}))})}),(0,e.it)("returns error result and stops on first SendActionCommand failure",async()=>{const n=(0,t.CommandResultFactory)({error:new t.UnknownDeviceExchangeError});a.sendCommand.mockResolvedValueOnce((0,t.CommandResultFactory)({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}],s=await new o.SendActionsTask(a,{actions:d}).run();(0,e.expect)(s).toStrictEqual(n),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(2)}),(0,e.it)("splits a real-world order action (3 orders with cloid + builder) into chunks with the proper EXTEND/MORE flags",async()=>{const n={type:"order",orders:[{a:0,b:!0,p:"77537",s:"0.00017",r:!1,t:{limit:{tif:"Ioc"}},c:"0x614cb6c28c875ff64c2237d3c3bba694"},{a:0,b:!1,p:"83614",s:"0.00017",r:!0,t:{trigger:{isMarket:!0,triggerPx:"83614",tpsl:"tp"}},c:"0xd4e9b848a55c745ad1f2c030630cff62"},{a:0,b:!1,p:"72212",s:"0.00017",r:!0,t:{trigger:{isMarket:!0,triggerPx:"72212",tpsl:"sl"}},c:"0xd0c4974ab1dce46c5508930a9a5db95d"}],grouping:"normalTpsl",builder:{b:"0x14c1cf26360f42681105a03137cf6951bddb1293",f:100},nonce:1779870545049};await new o.SendActionsTask(a,{actions:[n]}).run(),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(2);const r=a.sendCommand.mock.calls[0]?.[0];(0,e.expect)(r.args.extend).toBe(!1),(0,e.expect)(r.args.more).toBe(!0),(0,e.expect)(r.args.chunkedData.length).toBe(t.APDU_MAX_PAYLOAD);const s=a.sendCommand.mock.calls[1]?.[0];(0,e.expect)(s.args.extend).toBe(!0),(0,e.expect)(s.args.more).toBe(!1),(0,e.expect)(s.args.chunkedData.length).toBeLessThanOrEqual(t.APDU_MAX_PAYLOAD)}),(0,e.it)("returns success when actions is empty",async()=>{const d=await new o.SendActionsTask(a,{actions:[]}).run();(0,e.expect)(d).toEqual((0,t.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\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 },\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\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 },\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\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 },\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": "aAAA,IAAAA,
|
|
6
|
-
"names": ["import_device_management_kit", "import_vitest", "import_SendActionCommand", "import_makeInternalApi", "import_SendActionsTask", "apiMock", "action", "expectedSerialization", "result", "expectedBytes", "actions", "expectedSerializations", "errorResult"]
|
|
4
|
+
"sourcesContent": ["import {\n APDU_MAX_PAYLOAD,\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\n// Per APP_SPECIFICATION.md (SET_ACTION) the first chunk's data field is\n// [lenH, lenL] (big-endian length of the serialized ACTION struct) followed\n// by the start of the struct itself. Following chunks carry the rest of the\n// struct with no extra prefix.\nfunction frameAction(serialized: Uint8Array): Uint8Array {\n const length = serialized.length;\n const framed = new Uint8Array(2 + length);\n framed[0] = (length >> 8) & 0xff;\n framed[1] = length & 0xff;\n framed.set(serialized, 2);\n return framed;\n}\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\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 },\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\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 },\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\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 },\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 const framed = frameAction(expectedBytes);\n expect(framed.length).toBeLessThanOrEqual(APDU_MAX_PAYLOAD);\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendActionCommand({\n chunkedData: framed,\n more: false,\n extend: false,\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 expectedSerializations.forEach((serialized, index) => {\n const framed = frameAction(serialized);\n expect(framed.length).toBeLessThanOrEqual(APDU_MAX_PAYLOAD);\n expect(apiMock.sendCommand).toHaveBeenNthCalledWith(\n index + 1,\n new SendActionCommand({\n chunkedData: framed,\n more: false,\n extend: false,\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(\"splits a real-world order action (3 orders with cloid + builder) into chunks with the proper EXTEND/MORE flags\", async () => {\n // Same action as the original test case in SendActionCommand.test.ts \u2014\n // its TLV serialization is 270 bytes, so framed it exceeds APDU_MAX_PAYLOAD\n // and must be split into two chunks.\n const action: HyperliquidAction = {\n type: \"order\",\n orders: [\n {\n a: 0,\n b: true,\n p: \"77537\",\n s: \"0.00017\",\n r: false,\n t: { limit: { tif: \"Ioc\" } },\n c: \"0x614cb6c28c875ff64c2237d3c3bba694\",\n },\n {\n a: 0,\n b: false,\n p: \"83614\",\n s: \"0.00017\",\n r: true,\n t: {\n trigger: {\n isMarket: true,\n triggerPx: \"83614\",\n tpsl: \"tp\",\n },\n },\n c: \"0xd4e9b848a55c745ad1f2c030630cff62\",\n },\n {\n a: 0,\n b: false,\n p: \"72212\",\n s: \"0.00017\",\n r: true,\n t: {\n trigger: {\n isMarket: true,\n triggerPx: \"72212\",\n tpsl: \"sl\",\n },\n },\n c: \"0xd0c4974ab1dce46c5508930a9a5db95d\",\n },\n ],\n grouping: \"normalTpsl\",\n builder: {\n b: \"0x14c1cf26360f42681105a03137cf6951bddb1293\",\n f: 100,\n },\n nonce: 1779870545049,\n };\n\n const task = new SendActionsTask(apiMock, { actions: [action] });\n await task.run();\n\n // Framed payload is > APDU_MAX_PAYLOAD; expect exactly 2 chunks.\n expect(apiMock.sendCommand).toHaveBeenCalledTimes(2);\n\n const firstCall = apiMock.sendCommand.mock\n .calls[0]?.[0] as SendActionCommand;\n expect(firstCall.args.extend).toBe(false);\n expect(firstCall.args.more).toBe(true);\n expect(firstCall.args.chunkedData.length).toBe(APDU_MAX_PAYLOAD);\n\n const lastCall = apiMock.sendCommand.mock\n .calls[1]?.[0] as SendActionCommand;\n expect(lastCall.args.extend).toBe(true);\n expect(lastCall.args.more).toBe(false);\n expect(lastCall.args.chunkedData.length).toBeLessThanOrEqual(\n APDU_MAX_PAYLOAD,\n );\n });\n\n it(\"returns success when actions is empty\", async () => {\n // GIVEN empty actions\n // WHEN\n const task = new SendActionsTask(apiMock, { actions: [] });\n const result = await task.run();\n\n // THEN\n expect(result).toEqual(\n CommandResultFactory({\n data: undefined,\n }),\n );\n expect(apiMock.sendCommand).not.toHaveBeenCalled();\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_device_management_kit", "import_vitest", "import_SendActionCommand", "import_makeInternalApi", "import_SendActionsTask", "frameAction", "serialized", "length", "framed", "apiMock", "action", "expectedSerialization", "result", "expectedBytes", "actions", "expectedSerializations", "index", "errorResult", "firstCall", "lastCall"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var c=require("@ledgerhq/device-management-kit"),e=require("vitest"),d=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:
|
|
1
|
+
"use strict";var c=require("@ledgerhq/device-management-kit"),e=require("vitest"),d=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,d.serializeOrderToTlv)(a);(0,e.expect)(t).toBeInstanceOf(Uint8Array),(0,e.expect)(t.length).toBeGreaterThan(0);const i=(0,c.hexaStringToBuffer)(r);(0,e.expect)(t).toEqual(i)})});(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 order (create_order) with a cloid",action:{type:"order",orders:[{a:0,b:!0,p:"1",s:"1",r:!1,t:{limit:{tif:"Gtc"}},c:"0x278da11ed9db4f9cadb8b331488980a5"}],grouping:"na",nonce:1},expectedHex:"81dd3281e0010081d1010081e2010181e3013181e4013181e5010081d70481e6010281ee10278da11ed9db4f9cadb8b331488980a581ea0100"},{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 with multiple orders with a cloid",action:{type:"order",orders:[{a:5,b:!0,p:"95.302",s:"0.16",r:!1,t:{limit:{tif:"Ioc"}},c:"0x278da11ed9db4f9cadb8b331488980a5"},{a:5,b:!1,p:"102.78",s:"0.16",r:!0,t:{trigger:{isMarket:!0,triggerPx:"102.78",tpsl:"tp"}},c:"0x278da11ed9db4f9cadb8b331488980a5"}],grouping:"normalTpsl",builder:{b:"0xc0708cdd6cd166d51da264e3f49a0422be26e35b",f:100},nonce:1773655934209},expectedHex:"81dd3a81e0010081d1010581e2010181e30639352E33303281e404302E313681e5010081d70481e6010181ee10278da11ed9db4f9cadb8b331488980a581dd4781e0010181d1010581e2010081e3063130322E373881e404302E313681e5010181d71181e7010181e8063130322E373881e9010081ee10278da11ed9db4f9cadb8b331488980a581ea010181eb1b81d314c0708cdd6cd166d51da264e3f49a0422be26e35b81ec0164"},{name:"action type order with 3 orders (limit Ioc + trigger tp + trigger sl) with cloid and builder",action:{type:"order",orders:[{a:0,b:!0,p:"77537",s:"0.00017",r:!1,t:{limit:{tif:"Ioc"}},c:"0x614cb6c28c875ff64c2237d3c3bba694"},{a:0,b:!1,p:"83614",s:"0.00017",r:!0,t:{trigger:{isMarket:!0,triggerPx:"83614",tpsl:"tp"}},c:"0xd4e9b848a55c745ad1f2c030630cff62"},{a:0,b:!1,p:"72212",s:"0.00017",r:!0,t:{trigger:{isMarket:!0,triggerPx:"72212",tpsl:"sl"}},c:"0xd0c4974ab1dce46c5508930a9a5db95d"}],grouping:"normalTpsl",builder:{b:"0x14c1cf26360f42681105a03137cf6951bddb1293",f:100},nonce:1779870545049},expectedHex:"81dd3c81e0010081d1010081e2010181e305373735333781e407302E303030313781e5010081d70481e6010181ee10614cb6c28c875ff64c2237d3c3bba69481dd4881e0010181d1010081e2010081e305383336313481e407302E303030313781e5010181d71081e7010181e805383336313481e9010081ee10d4e9b848a55c745ad1f2c030630cff6281dd4881e0010181d1010081e2010081e305373232313281e407302E303030313781e5010181d71081e7010181e805373232313281e9010181ee10d0c4974ab1dce46c5508930a9a5db95d81ea010181eb1b81d31414c1cf26360f42681105a03137cf6951bddb129381ec0164"},{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 batchModify update_order with cloid",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"}},c:"0x278da11ed9db4f9cadb8b331488980a5"}}],nonce:1773050015814},expectedHex:"81d85581dd4781e0010181d1010081e2010081e305383531363981e406302E3030303581e5010181d71081e7010181e805383531363981e9010081ee10278da11ed9db4f9cadb8b331488980a581dc080000004FDF6BBE6F"},{name:"action type batchModify 2 update_orders",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"}}}},{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:"81d84281dd3481e0010181d1010081e2010081e305383531363981e406302E3030303581e5010181d71081e7010181e805383531363981e9010081dc080000004FDF6BBE6F81d84281dd3481e0010181d1010081e2010081e305383531363981e406302E3030303581e5010181d71081e7010181e805383531363981e9010081dc080000004FDF6BBE6F"},{name:"action type batchModify 2 update_orders with cloid",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"}},c:"0x278da11ed9db4f9cadb8b331488980a5"}},{oid:343050796655,order:{a:0,b:!1,p:"85169",s:"0.0005",r:!0,t:{trigger:{isMarket:!0,triggerPx:"85169",tpsl:"tp"}},c:"0x278da11ed9db4f9cadb8b331488980a5"}}],nonce:1773050015814},expectedHex:"81d85581dd4781e0010181d1010081e2010081e305383531363981e406302E3030303581e5010181d71081e7010181e805383531363981e9010081ee10278da11ed9db4f9cadb8b331488980a581dc080000004FDF6BBE6F81d85581dd4781e0010181d1010081e2010081e305383531363981e406302E3030303581e5010181d71081e7010181e805383531363981e9010081ee10278da11ed9db4f9cadb8b331488980a581dc080000004FDF6BBE6F"},{name:"action type cancel",action:{type:"cancel",cancels:[{a:0,o:340574409238}],nonce:1772813983827},expectedHex:"81d90f81d1010081dc080000004F4BD11216"},{name:"action type with 2 cancels",action:{type:"cancel",cancels:[{a:0,o:340574409238},{a:0,o:340574409238}],nonce:1772813983827},expectedHex:"81d90f81d1010081dc080000004F4BD1121681d90f81d1010081dc080000004F4BD11216"},{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,d.buildActionStructure)(a);(0,e.expect)(t).toBeInstanceOf(Uint8Array),(0,e.expect)(t.length).toBeGreaterThan(0);const i=(0,c.hexaStringToBuffer)(r);(0,e.expect)(t).toEqual(i)})});
|
|
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 function call\n } satisfies HyperliquidAction,\n expectedHex:\n // prettier-ignore\n\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 },\n {\n name: \"action type order (create_order) with a cloid\",\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 c: \"0x278da11ed9db4f9cadb8b331488980a5\",\n },\n ],\n grouping: \"na\",\n nonce: 1, // Not serialized with this function call\n } satisfies HyperliquidAction,\n expectedHex:\n // prettier-ignore\n\n \"81dd32\" + // 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 \"81ee10278da11ed9db4f9cadb8b331488980a5\" + // CLOID\n \"81ea0100\", // GROUPING\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\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 },\n {\n name: \"action type with multiple orders with a cloid\",\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 c: \"0x278da11ed9db4f9cadb8b331488980a5\",\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 c: \"0x278da11ed9db4f9cadb8b331488980a5\",\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\n \"81dd3a\" + // 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 \"81ee10278da11ed9db4f9cadb8b331488980a5\" + // CLOID\n\n\n \"81dd47\" + // 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 \"81ee10278da11ed9db4f9cadb8b331488980a5\" + // CLOID\n\n \"81ea0101\" + // GROUPING\n \"81eb1b\" + // BUILDER_INFO\n \"81d314c0708cdd6cd166d51da264e3f49a0422be26e35b\" + // BUILDER_ADDRESS\n \"81ec0164\", // BUILDER_FEE\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 function call\n } satisfies HyperliquidAction,\n expectedHex:\n // prettier-ignore\n\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 },\n {\n name: \"action type batchModify update_order with cloid\",\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 c: \"0x278da11ed9db4f9cadb8b331488980a5\",\n },\n },\n ],\n nonce: 1773050015814, // Not serialized with this function call\n } satisfies HyperliquidAction,\n expectedHex:\n // prettier-ignore\n\n \"81d855\" + // UPDATE_ORDERS\n \"81dd47\" + // 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 \"81ee10278da11ed9db4f9cadb8b331488980a5\" + // CLOID\n \"81dc080000004FDF6BBE6F\", // ORDER_ID\n },\n {\n name: \"action type batchModify 2 update_orders\",\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 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 function call\n } satisfies HyperliquidAction,\n expectedHex:\n // prettier-ignore\n\n \"81d842\" + // UPDATE_ORDER\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 \"81d842\" + // UPDATE_ORDER 2\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 },\n {\n name: \"action type batchModify 2 update_orders with cloid\",\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 c: \"0x278da11ed9db4f9cadb8b331488980a5\",\n },\n },\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 c: \"0x278da11ed9db4f9cadb8b331488980a5\",\n },\n },\n ],\n nonce: 1773050015814, // Not serialized with this function call\n } satisfies HyperliquidAction,\n expectedHex:\n // prettier-ignore\n\n \"81d855\" + // UPDATE_ORDER\n \"81dd47\" + // 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 \"81ee10278da11ed9db4f9cadb8b331488980a5\" + // CLOID\n \"81dc080000004FDF6BBE6F\" + // ORDER_ID\n \"81d855\" + // UPDATE_ORDER 2\n \"81dd47\" + // 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 \"81ee10278da11ed9db4f9cadb8b331488980a5\" + // CLOID\n \"81dc080000004FDF6BBE6F\", // ORDER_ID\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 function call\n } satisfies HyperliquidAction,\n expectedHex:\n // prettier-ignore\n\n \"81d90f\" + // CANCEL_ORDERS\n \"81d10100\" + // ASSET_ID\n \"81dc080000004F4BD11216\", // ORDER_ID\n },\n {\n name: \"action type with 2 cancels\",\n action: {\n type: \"cancel\",\n cancels: [\n { a: 0, o: 340574409238 },\n { a: 0, o: 340574409238 },\n ],\n nonce: 1772813983827, // Not serialized with this function call\n } satisfies HyperliquidAction,\n expectedHex:\n // prettier-ignore\n\n \"81d90f\" + // CANCEL_ORDERS\n \"81d10100\" + // ASSET_ID\n \"81dc080000004F4BD11216\" + // ORDER_ID\n \"81d90f\" + // CANCEL_ORDERS 2\n \"81d10100\" + // ASSET_ID\n \"81dc080000004F4BD11216\", // ORDER_ID\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 function call\n } satisfies HyperliquidAction,\n expectedHex:\n \"81d10100\" + // ASSET_ID\n \"81de0100\" + // IS_CROSS\n \"81ed08000000000000000a\", // LEVERAGE,\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 function 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,8EAUJ,EACA,CACE,KAAM,gDACN,OAAQ,CACN,KAAM,QACN,OAAQ,CACN,CACE,EAAG,EACH,EAAG,GACH,EAAG,IACH,EAAG,IACH,EAAG,GACH,EAAG,CAAE,MAAO,CAAE,IAAK,KAAe,CAAE,EACpC,EAAG,oCACL,CACF,EACA,SAAU,KACV,MAAO,CACT,EACA,YAGE,oHAWJ,EACA,CACE,KAAM,mCACN,OAAQ,CACN,KAAM,QACN,OAAQ,CACN,CACE,EAAG,EACH,EAAG,GACH,EAAG,SACH,EAAG,OACH,EAAG,GACH,EAAG,CACD,MAAO,CACL,IAAK,KACP,CACF,CACF,EACA,CACE,EAAG,EACH,EAAG,GACH,EAAG,SACH,EAAG,OACH,EAAG,GACH,EAAG,CACD,QAAS,CACP,SAAU,GACV,UAAW,SACX,KAAM,IACR,CACF,CACF,CACF,EACA,SAAU,aACV,QAAS,CACP,EAAG,6CACH,EAAG,GACL,EACA,MAAO,aACT,EACA,YAGE,wQA0BJ,EACA,CACE,KAAM,gDACN,OAAQ,CACN,KAAM,QACN,OAAQ,CACN,CACE,EAAG,EACH,EAAG,GACH,EAAG,SACH,EAAG,OACH,EAAG,GACH,EAAG,CACD,MAAO,CACL,IAAK,KACP,CACF,EACA,EAAG,oCACL,EACA,CACE,EAAG,EACH,EAAG,GACH,EAAG,SACH,EAAG,OACH,EAAG,GACH,EAAG,CACD,QAAS,CACP,SAAU,GACV,UAAW,SACX,KAAM,IACR,CACF,EACA,EAAG,oCACL,CACF,EACA,SAAU,aACV,QAAS,CACP,EAAG,6CACH,EAAG,GACL,EACA,MAAO,aACT,EACA,YAGE,oVA6BJ,EACA,CACE,KAAM,uCACN,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,4IAaJ,EACA,CACE,KAAM,kDACN,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,EACA,EAAG,oCACL,CACF,CACF,EACA,MAAO,aACT,EACA,YAGE,kLAcJ,EACA,CACE,KAAM,0CACN,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,EACA,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,sRA0BJ,EACA,CACE,KAAM,qDACN,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,EACA,EAAG,oCACL,CACF,EACA,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,EACA,EAAG,oCACL,CACF,CACF,EACA,MAAO,aACT,EACA,YAGE,kWA4BJ,EACA,CACE,KAAM,qBACN,OAAQ,CACN,KAAM,SACN,QAAS,CAAC,CAAE,EAAG,EAAG,EAAG,YAAa,CAAC,EACnC,MAAO,aACT,EACA,YAGE,sCAGJ,EACA,CACE,KAAM,6BACN,OAAQ,CACN,KAAM,SACN,QAAS,CACP,CAAE,EAAG,EAAG,EAAG,YAAa,EACxB,CAAE,EAAG,EAAG,EAAG,YAAa,CAC1B,EACA,MAAO,aACT,EACA,YAGE,0EAMJ,EACA,CACE,KAAM,6BACN,OAAQ,CACN,KAAM,iBACN,MAAO,EACP,QAAS,GACT,SAAU,GACV,MAAO,CACT,EACA,YACE,wCAGJ,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 function call\n } satisfies HyperliquidAction,\n expectedHex:\n // prettier-ignore\n\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 },\n {\n name: \"action type order (create_order) with a cloid\",\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 c: \"0x278da11ed9db4f9cadb8b331488980a5\",\n },\n ],\n grouping: \"na\",\n nonce: 1, // Not serialized with this function call\n } satisfies HyperliquidAction,\n expectedHex:\n // prettier-ignore\n\n \"81dd32\" + // 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 \"81ee10278da11ed9db4f9cadb8b331488980a5\" + // CLOID\n \"81ea0100\", // GROUPING\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\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 },\n {\n name: \"action type with multiple orders with a cloid\",\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 c: \"0x278da11ed9db4f9cadb8b331488980a5\",\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 c: \"0x278da11ed9db4f9cadb8b331488980a5\",\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\n \"81dd3a\" + // 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 \"81ee10278da11ed9db4f9cadb8b331488980a5\" + // CLOID\n\n\n \"81dd47\" + // 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 \"81ee10278da11ed9db4f9cadb8b331488980a5\" + // CLOID\n\n \"81ea0101\" + // GROUPING\n \"81eb1b\" + // BUILDER_INFO\n \"81d314c0708cdd6cd166d51da264e3f49a0422be26e35b\" + // BUILDER_ADDRESS\n \"81ec0164\", // BUILDER_FEE\n },\n {\n name: \"action type order with 3 orders (limit Ioc + trigger tp + trigger sl) with cloid and builder\",\n action: {\n type: \"order\",\n orders: [\n {\n a: 0,\n b: true,\n p: \"77537\",\n s: \"0.00017\",\n r: false,\n t: { limit: { tif: \"Ioc\" as const } },\n c: \"0x614cb6c28c875ff64c2237d3c3bba694\",\n },\n {\n a: 0,\n b: false,\n p: \"83614\",\n s: \"0.00017\",\n r: true,\n t: {\n trigger: {\n isMarket: true,\n triggerPx: \"83614\",\n tpsl: \"tp\" as const,\n },\n },\n c: \"0xd4e9b848a55c745ad1f2c030630cff62\",\n },\n {\n a: 0,\n b: false,\n p: \"72212\",\n s: \"0.00017\",\n r: true,\n t: {\n trigger: {\n isMarket: true,\n triggerPx: \"72212\",\n tpsl: \"sl\" as const,\n },\n },\n c: \"0xd0c4974ab1dce46c5508930a9a5db95d\",\n },\n ],\n grouping: \"normalTpsl\",\n builder: {\n b: \"0x14c1cf26360f42681105a03137cf6951bddb1293\",\n f: 100,\n },\n nonce: 1779870545049,\n } satisfies HyperliquidAction,\n expectedHex:\n // prettier-ignore\n\n \"81dd3c\" + // ORDER\n \"81e00100\" + // ORDER_TYPE\n \"81d10100\" + // ASSET_ID\n \"81e20101\" + // BUY_OR_NOT\n \"81e3053737353337\" + // PRICE\n \"81e407302E3030303137\" + // SIZE\n \"81e50100\" + // REDUCE_ONLY\n \"81d704\" + // ORDER_DETAIL\n \"81e60101\" + // TIF\n \"81ee10614cb6c28c875ff64c2237d3c3bba694\" + // CLOID\n\n \"81dd48\" + // ORDER 2\n \"81e00101\" + // ORDER_TYPE\n \"81d10100\" + // ASSET_ID\n \"81e20100\" + // BUY_OR_NOT\n \"81e3053833363134\" + // PRICE\n \"81e407302E3030303137\" + // SIZE\n \"81e50101\" + // REDUCE_ONLY\n \"81d710\" + // ORDER_DETAIL\n \"81e70101\" + // TRIGGER_MARKET\n \"81e8053833363134\" + // TRIGGER_PRICE\n \"81e90100\" + // TRIGGER_TYPE\n \"81ee10d4e9b848a55c745ad1f2c030630cff62\" + // CLOID\n\n \"81dd48\" + // ORDER 3\n \"81e00101\" + // ORDER_TYPE\n \"81d10100\" + // ASSET_ID\n \"81e20100\" + // BUY_OR_NOT\n \"81e3053732323132\" + // PRICE\n \"81e407302E3030303137\" + // SIZE\n \"81e50101\" + // REDUCE_ONLY\n \"81d710\" + // ORDER_DETAIL\n \"81e70101\" + // TRIGGER_MARKET\n \"81e8053732323132\" + // TRIGGER_PRICE\n \"81e90101\" + // TRIGGER_TYPE\n \"81ee10d0c4974ab1dce46c5508930a9a5db95d\" + // CLOID\n\n \"81ea0101\" + // GROUPING\n \"81eb1b\" + // BUILDER_INFO\n \"81d31414c1cf26360f42681105a03137cf6951bddb1293\" + // BUILDER_ADDRESS\n \"81ec0164\", // BUILDER_FEE\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 function call\n } satisfies HyperliquidAction,\n expectedHex:\n // prettier-ignore\n\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 },\n {\n name: \"action type batchModify update_order with cloid\",\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 c: \"0x278da11ed9db4f9cadb8b331488980a5\",\n },\n },\n ],\n nonce: 1773050015814, // Not serialized with this function call\n } satisfies HyperliquidAction,\n expectedHex:\n // prettier-ignore\n\n \"81d855\" + // UPDATE_ORDERS\n \"81dd47\" + // 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 \"81ee10278da11ed9db4f9cadb8b331488980a5\" + // CLOID\n \"81dc080000004FDF6BBE6F\", // ORDER_ID\n },\n {\n name: \"action type batchModify 2 update_orders\",\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 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 function call\n } satisfies HyperliquidAction,\n expectedHex:\n // prettier-ignore\n\n \"81d842\" + // UPDATE_ORDER\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 \"81d842\" + // UPDATE_ORDER 2\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 },\n {\n name: \"action type batchModify 2 update_orders with cloid\",\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 c: \"0x278da11ed9db4f9cadb8b331488980a5\",\n },\n },\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 c: \"0x278da11ed9db4f9cadb8b331488980a5\",\n },\n },\n ],\n nonce: 1773050015814, // Not serialized with this function call\n } satisfies HyperliquidAction,\n expectedHex:\n // prettier-ignore\n\n \"81d855\" + // UPDATE_ORDER\n \"81dd47\" + // 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 \"81ee10278da11ed9db4f9cadb8b331488980a5\" + // CLOID\n \"81dc080000004FDF6BBE6F\" + // ORDER_ID\n \"81d855\" + // UPDATE_ORDER 2\n \"81dd47\" + // 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 \"81ee10278da11ed9db4f9cadb8b331488980a5\" + // CLOID\n \"81dc080000004FDF6BBE6F\", // ORDER_ID\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 function call\n } satisfies HyperliquidAction,\n expectedHex:\n // prettier-ignore\n\n \"81d90f\" + // CANCEL_ORDERS\n \"81d10100\" + // ASSET_ID\n \"81dc080000004F4BD11216\", // ORDER_ID\n },\n {\n name: \"action type with 2 cancels\",\n action: {\n type: \"cancel\",\n cancels: [\n { a: 0, o: 340574409238 },\n { a: 0, o: 340574409238 },\n ],\n nonce: 1772813983827, // Not serialized with this function call\n } satisfies HyperliquidAction,\n expectedHex:\n // prettier-ignore\n\n \"81d90f\" + // CANCEL_ORDERS\n \"81d10100\" + // ASSET_ID\n \"81dc080000004F4BD11216\" + // ORDER_ID\n \"81d90f\" + // CANCEL_ORDERS 2\n \"81d10100\" + // ASSET_ID\n \"81dc080000004F4BD11216\", // ORDER_ID\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 function call\n } satisfies HyperliquidAction,\n expectedHex:\n \"81d10100\" + // ASSET_ID\n \"81de0100\" + // IS_CROSS\n \"81ed08000000000000000a\", // LEVERAGE,\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 function 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,8EAUJ,EACA,CACE,KAAM,gDACN,OAAQ,CACN,KAAM,QACN,OAAQ,CACN,CACE,EAAG,EACH,EAAG,GACH,EAAG,IACH,EAAG,IACH,EAAG,GACH,EAAG,CAAE,MAAO,CAAE,IAAK,KAAe,CAAE,EACpC,EAAG,oCACL,CACF,EACA,SAAU,KACV,MAAO,CACT,EACA,YAGE,oHAWJ,EACA,CACE,KAAM,mCACN,OAAQ,CACN,KAAM,QACN,OAAQ,CACN,CACE,EAAG,EACH,EAAG,GACH,EAAG,SACH,EAAG,OACH,EAAG,GACH,EAAG,CACD,MAAO,CACL,IAAK,KACP,CACF,CACF,EACA,CACE,EAAG,EACH,EAAG,GACH,EAAG,SACH,EAAG,OACH,EAAG,GACH,EAAG,CACD,QAAS,CACP,SAAU,GACV,UAAW,SACX,KAAM,IACR,CACF,CACF,CACF,EACA,SAAU,aACV,QAAS,CACP,EAAG,6CACH,EAAG,GACL,EACA,MAAO,aACT,EACA,YAGE,wQA0BJ,EACA,CACE,KAAM,gDACN,OAAQ,CACN,KAAM,QACN,OAAQ,CACN,CACE,EAAG,EACH,EAAG,GACH,EAAG,SACH,EAAG,OACH,EAAG,GACH,EAAG,CACD,MAAO,CACL,IAAK,KACP,CACF,EACA,EAAG,oCACL,EACA,CACE,EAAG,EACH,EAAG,GACH,EAAG,SACH,EAAG,OACH,EAAG,GACH,EAAG,CACD,QAAS,CACP,SAAU,GACV,UAAW,SACX,KAAM,IACR,CACF,EACA,EAAG,oCACL,CACF,EACA,SAAU,aACV,QAAS,CACP,EAAG,6CACH,EAAG,GACL,EACA,MAAO,aACT,EACA,YAGE,oVA6BJ,EACA,CACE,KAAM,+FACN,OAAQ,CACN,KAAM,QACN,OAAQ,CACN,CACE,EAAG,EACH,EAAG,GACH,EAAG,QACH,EAAG,UACH,EAAG,GACH,EAAG,CAAE,MAAO,CAAE,IAAK,KAAe,CAAE,EACpC,EAAG,oCACL,EACA,CACE,EAAG,EACH,EAAG,GACH,EAAG,QACH,EAAG,UACH,EAAG,GACH,EAAG,CACD,QAAS,CACP,SAAU,GACV,UAAW,QACX,KAAM,IACR,CACF,EACA,EAAG,oCACL,EACA,CACE,EAAG,EACH,EAAG,GACH,EAAG,QACH,EAAG,UACH,EAAG,GACH,EAAG,CACD,QAAS,CACP,SAAU,GACV,UAAW,QACX,KAAM,IACR,CACF,EACA,EAAG,oCACL,CACF,EACA,SAAU,aACV,QAAS,CACP,EAAG,6CACH,EAAG,GACL,EACA,MAAO,aACT,EACA,YAGE,gfAyCJ,EACA,CACE,KAAM,uCACN,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,4IAaJ,EACA,CACE,KAAM,kDACN,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,EACA,EAAG,oCACL,CACF,CACF,EACA,MAAO,aACT,EACA,YAGE,kLAcJ,EACA,CACE,KAAM,0CACN,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,EACA,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,sRA0BJ,EACA,CACE,KAAM,qDACN,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,EACA,EAAG,oCACL,CACF,EACA,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,EACA,EAAG,oCACL,CACF,CACF,EACA,MAAO,aACT,EACA,YAGE,kWA4BJ,EACA,CACE,KAAM,qBACN,OAAQ,CACN,KAAM,SACN,QAAS,CAAC,CAAE,EAAG,EAAG,EAAG,YAAa,CAAC,EACnC,MAAO,aACT,EACA,YAGE,sCAGJ,EACA,CACE,KAAM,6BACN,OAAQ,CACN,KAAM,SACN,QAAS,CACP,CAAE,EAAG,EAAG,EAAG,YAAa,EACxB,CAAE,EAAG,EAAG,EAAG,YAAa,CAC1B,EACA,MAAO,aACT,EACA,YAGE,0EAMJ,EACA,CACE,KAAM,6BACN,OAAQ,CACN,KAAM,iBACN,MAAO,EACP,QAAS,GACT,SAAU,GACV,MAAO,CACT,EACA,YACE,wCAGJ,EACA,CACE,KAAM,gCACN,OAAQ,CACN,KAAM,oBACN,iBAAkB,UAClB,iBAAkB,SAClB,WAAY,UACZ,QAAS,6CACT,MAAO,aACT,EACA,YACE,4EAGJ,EACA,CACE,KAAM,mCACN,OAAQ,CACN,KAAM,uBACN,MAAO,EACP,MAAO,GACP,KAAM,IACN,MAAO,aACT,EACA,YACE,wCAGJ,CACF,CAAC,EAAE,QAAS,CAAC,CAAE,OAAAC,EAAQ,YAAAH,CAAY,IAAM,CACvC,MAAMC,KAAS,wBAAqBE,CAAM,KAE1C,UAAOF,CAAM,EAAE,eAAe,UAAU,KACxC,UAAOA,EAAO,MAAM,EAAE,gBAAgB,CAAC,EACvC,MAAMC,KAAW,sBAAmBF,CAAW,KAC/C,UAAOC,CAAM,EAAE,QAAQC,CAAQ,CACjC,CAAC,CACH,CAAC",
|
|
6
6
|
"names": ["import_device_management_kit", "import_vitest", "import_actionTlvSerializer", "order", "expectedHex", "result", "expected", "action"]
|
|
7
7
|
}
|
package/lib/cjs/package.json
CHANGED
|
@@ -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": "0.0.0-develop-
|
|
62
|
+
"version": "0.0.0-develop-20260606003348"
|
|
63
63
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ApduBuilder as n,CommandResultFactory as o,InvalidResponseFormatError as d}from"@ledgerhq/device-management-kit";import{CommandErrorHelper as t}from"@ledgerhq/signer-utils";import{HYPERLIQUID_ERRORS as s,HyperliquidCommandErrorFactory as
|
|
1
|
+
import{ApduBuilder as n,CommandResultFactory as o,InvalidResponseFormatError as d}from"@ledgerhq/device-management-kit";import{CommandErrorHelper as t}from"@ledgerhq/signer-utils";import{HYPERLIQUID_ERRORS as s,HyperliquidCommandErrorFactory as a}from"./utils/hyperliquidApplicationErrors";const p=224,m=3,i=1,u=0,A=0;class R{constructor(e){this.args=e}name="sendAction";errorHelper=new t(s,a);getApdu(){const e=this.args.extend?u:i,r={cla:p,ins:m,p1:e,p2:A};return new n(r).addBufferToData(this.args.chunkedData).build()}parseResponse(e){const r=this.errorHelper.getError(e);return r||(e.data.length!==0?o({error:new d("Unexpected data in response")}):o({data:void 0}))}}export{R as SendActionCommand};
|
|
2
2
|
//# sourceMappingURL=SendActionCommand.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/command/SendActionCommand.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n type ApduBuilderArgs,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidResponseFormatError,\n} from \"@ledgerhq/device-management-kit\";\nimport { CommandErrorHelper
|
|
5
|
-
"mappings": "AAAA,OAEE,eAAAA,EAKA,wBAAAC,EACA,8BAAAC,MACK,kCACP,
|
|
6
|
-
"names": ["ApduBuilder", "CommandResultFactory", "InvalidResponseFormatError", "CommandErrorHelper", "HYPERLIQUID_ERRORS", "HyperliquidCommandErrorFactory", "CLA", "INS", "
|
|
4
|
+
"sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n type ApduBuilderArgs,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidResponseFormatError,\n} from \"@ledgerhq/device-management-kit\";\nimport {\n type ChunkableCommandArgs,\n CommandErrorHelper,\n} from \"@ledgerhq/signer-utils\";\n\nimport {\n HYPERLIQUID_ERRORS,\n HyperliquidCommandErrorFactory,\n type HyperliquidErrorCodes,\n} from \"./utils/hyperliquidApplicationErrors\";\n\n/** SET_ACTION \u2014 APDU framing per app-hyperliquid APP_SPECIFICATION.md */\nconst CLA = 0xe0;\nconst INS = 0x03;\nconst P1_FIRST_CHUNK = 0x01;\nconst P1_FOLLOWING_CHUNK = 0x00;\nconst P2 = 0x00;\n\nexport type SendActionCommandArgs = ChunkableCommandArgs;\n\nexport type SendActionCommandResponse = void;\n\nexport class SendActionCommand\n implements\n Command<\n SendActionCommandResponse,\n SendActionCommandArgs,\n HyperliquidErrorCodes\n >\n{\n readonly name = \"sendAction\";\n\n private readonly errorHelper = new CommandErrorHelper<\n SendActionCommandResponse,\n HyperliquidErrorCodes\n >(HYPERLIQUID_ERRORS, HyperliquidCommandErrorFactory);\n\n constructor(readonly args: SendActionCommandArgs) {}\n\n getApdu(): Apdu {\n const p1 = this.args.extend ? P1_FOLLOWING_CHUNK : P1_FIRST_CHUNK;\n\n const sendActionArgs: ApduBuilderArgs = {\n cla: CLA,\n ins: INS,\n p1,\n p2: P2,\n };\n\n return new ApduBuilder(sendActionArgs)\n .addBufferToData(this.args.chunkedData)\n .build();\n }\n\n parseResponse(\n response: ApduResponse,\n ): CommandResult<SendActionCommandResponse, HyperliquidErrorCodes> {\n const error = this.errorHelper.getError(response);\n if (error) {\n return error;\n }\n\n if (response.data.length !== 0) {\n return CommandResultFactory({\n error: new InvalidResponseFormatError(\"Unexpected data in response\"),\n });\n }\n\n return CommandResultFactory({ data: undefined });\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAEE,eAAAA,EAKA,wBAAAC,EACA,8BAAAC,MACK,kCACP,OAEE,sBAAAC,MACK,yBAEP,OACE,sBAAAC,EACA,kCAAAC,MAEK,uCAGP,MAAMC,EAAM,IACNC,EAAM,EACNC,EAAiB,EACjBC,EAAqB,EACrBC,EAAK,EAMJ,MAAMC,CAOb,CAQE,YAAqBC,EAA6B,CAA7B,UAAAA,CAA8B,CAP1C,KAAO,aAEC,YAAc,IAAIT,EAGjCC,EAAoBC,CAA8B,EAIpD,SAAgB,CACd,MAAMQ,EAAK,KAAK,KAAK,OAASJ,EAAqBD,EAE7CM,EAAkC,CACtC,IAAKR,EACL,IAAKC,EACL,GAAAM,EACA,GAAIH,CACN,EAEA,OAAO,IAAIV,EAAYc,CAAc,EAClC,gBAAgB,KAAK,KAAK,WAAW,EACrC,MAAM,CACX,CAEA,cACEC,EACiE,CACjE,MAAMC,EAAQ,KAAK,YAAY,SAASD,CAAQ,EAChD,OAAIC,IAIAD,EAAS,KAAK,SAAW,EACpBd,EAAqB,CAC1B,MAAO,IAAIC,EAA2B,6BAA6B,CACrE,CAAC,EAGID,EAAqB,CAAE,KAAM,MAAU,CAAC,EACjD,CACF",
|
|
6
|
+
"names": ["ApduBuilder", "CommandResultFactory", "InvalidResponseFormatError", "CommandErrorHelper", "HYPERLIQUID_ERRORS", "HyperliquidCommandErrorFactory", "CLA", "INS", "P1_FIRST_CHUNK", "P1_FOLLOWING_CHUNK", "P2", "SendActionCommand", "args", "p1", "sendActionArgs", "response", "error"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{CommandResultFactory as
|
|
1
|
+
import{CommandResultFactory as p,InvalidResponseFormatError as u,isSuccessCommandResult as r}from"@ledgerhq/device-management-kit";import{SendActionCommand as n}from"./SendActionCommand";const c=1,d=0,a=0;describe("SendActionCommand",()=>{const o=new Uint8Array([1,2,3,4]),s={chunkedData:o,more:!1,extend:!1};describe("name",()=>{it("should be 'sendAction'",()=>{const t=new n(s);expect(t.name).toBe("sendAction")})}),describe("getApdu",()=>{it("should build the first-chunk APDU (P1=0x01, P2=0x00) with chunkedData as raw data",()=>{const e=new n(s).getApdu();expect(e.cla).toBe(224),expect(e.ins).toBe(3),expect(e.p1).toBe(c),expect(e.p2).toBe(a),expect(e.data).toStrictEqual(o)}),it("should keep P1=0x01 on the first chunk regardless of the `more` flag",()=>{const e=new n({chunkedData:o,more:!0,extend:!1}).getApdu();expect(e.p1).toBe(c),expect(e.p2).toBe(a)}),it("should build a following-chunk APDU (P1=0x00, P2=0x00) when extend=true",()=>{const e=new n({chunkedData:o,more:!0,extend:!0}).getApdu();expect(e.p1).toBe(d),expect(e.p2).toBe(a),expect(e.data).toStrictEqual(o)}),it("should keep P1=0x00 on the last chunk of a multi-chunk stream (extend=true, more=false)",()=>{const e=new n({chunkedData:o,more:!1,extend:!0}).getApdu();expect(e.p1).toBe(d),expect(e.p2).toBe(a)})}),describe("parseResponse",()=>{it("should return success when status is 0x9000 and no data",()=>{const t={statusCode:Uint8Array.from([144,0]),data:new Uint8Array},e=new n(s).parseResponse(t);expect(e).toStrictEqual(p({data:void 0})),expect(r(e)).toBe(!0)}),it("should return an error if the status code is not 0x9000",()=>{const t={statusCode:Uint8Array.from([106,128]),data:new Uint8Array},e=new n(s).parseResponse(t);expect(r(e)).toBe(!1)}),it("should return an error if response contains unexpected data",()=>{const t={statusCode:Uint8Array.from([144,0]),data:Uint8Array.from([1])},e=new n(s).parseResponse(t);expect(r(e)).toBe(!1),expect(e.error).toBeInstanceOf(u)})})});
|
|
2
2
|
//# sourceMappingURL=SendActionCommand.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/command/SendActionCommand.test.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n CommandResultFactory,\n InvalidResponseFormatError,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport {\n SendActionCommand,\n type SendActionCommandArgs,\n} from \"./SendActionCommand\";\n\
|
|
5
|
-
"mappings": "AAAA,OACE,wBAAAA,EACA,8BAAAC,EACA,0BAAAC,MACK,kCAEP,OACE,qBAAAC,MAEK,
|
|
6
|
-
"names": ["CommandResultFactory", "InvalidResponseFormatError", "isSuccessCommandResult", "SendActionCommand", "
|
|
4
|
+
"sourcesContent": ["import {\n CommandResultFactory,\n InvalidResponseFormatError,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport {\n SendActionCommand,\n type SendActionCommandArgs,\n} from \"./SendActionCommand\";\n\n// Per APP_SPECIFICATION.md (SET_ACTION):\n// CLA = 0xE0, INS = 0x03, P2 = 0x00\n// P1 = 0x01 for the first chunk, 0x00 for following chunks\n// First chunk data: [lenH, lenL] (big-endian) + ACTION struct bytes\n// Following chunks: ACTION struct continuation only\nconst FIRST_CHUNK_P1 = 0x01;\nconst FOLLOWING_CHUNK_P1 = 0x00;\nconst APDU_P2 = 0x00;\n\ndescribe(\"SendActionCommand\", () => {\n const chunkedData = new Uint8Array([0x01, 0x02, 0x03, 0x04]);\n\n const firstChunkArgs: SendActionCommandArgs = {\n chunkedData,\n more: false,\n extend: false,\n };\n\n describe(\"name\", () => {\n it(\"should be 'sendAction'\", () => {\n const command = new SendActionCommand(firstChunkArgs);\n expect(command.name).toBe(\"sendAction\");\n });\n });\n\n describe(\"getApdu\", () => {\n it(\"should build the first-chunk APDU (P1=0x01, P2=0x00) with chunkedData as raw data\", () => {\n const command = new SendActionCommand(firstChunkArgs);\n\n const apdu = command.getApdu();\n\n expect(apdu.cla).toBe(0xe0);\n expect(apdu.ins).toBe(0x03);\n expect(apdu.p1).toBe(FIRST_CHUNK_P1);\n expect(apdu.p2).toBe(APDU_P2);\n expect(apdu.data).toStrictEqual(chunkedData);\n });\n\n it(\"should keep P1=0x01 on the first chunk regardless of the `more` flag\", () => {\n // The Hyperliquid spec does not use a `more` flag (the device knows the\n // total length from the 2-byte BE header in the first chunk). The\n // command should ignore it and only key off `extend`.\n const command = new SendActionCommand({\n chunkedData,\n more: true,\n extend: false,\n });\n\n const apdu = command.getApdu();\n\n expect(apdu.p1).toBe(FIRST_CHUNK_P1);\n expect(apdu.p2).toBe(APDU_P2);\n });\n\n it(\"should build a following-chunk APDU (P1=0x00, P2=0x00) when extend=true\", () => {\n const command = new SendActionCommand({\n chunkedData,\n more: true,\n extend: true,\n });\n\n const apdu = command.getApdu();\n\n expect(apdu.p1).toBe(FOLLOWING_CHUNK_P1);\n expect(apdu.p2).toBe(APDU_P2);\n expect(apdu.data).toStrictEqual(chunkedData);\n });\n\n it(\"should keep P1=0x00 on the last chunk of a multi-chunk stream (extend=true, more=false)\", () => {\n const command = new SendActionCommand({\n chunkedData,\n more: false,\n extend: true,\n });\n\n const apdu = command.getApdu();\n\n expect(apdu.p1).toBe(FOLLOWING_CHUNK_P1);\n expect(apdu.p2).toBe(APDU_P2);\n });\n });\n\n describe(\"parseResponse\", () => {\n it(\"should return success when status is 0x9000 and no data\", () => {\n const response = {\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: new Uint8Array(),\n };\n\n const parsed = new SendActionCommand(firstChunkArgs).parseResponse(\n response,\n );\n expect(parsed).toStrictEqual(CommandResultFactory({ data: undefined }));\n expect(isSuccessCommandResult(parsed)).toBe(true);\n });\n\n it(\"should return an error if the status code is not 0x9000\", () => {\n const response = {\n statusCode: Uint8Array.from([0x6a, 0x80]),\n data: new Uint8Array(),\n };\n\n const result = new SendActionCommand(firstChunkArgs).parseResponse(\n response,\n );\n expect(isSuccessCommandResult(result)).toBe(false);\n });\n\n it(\"should return an error if response contains unexpected data\", () => {\n const response = {\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: Uint8Array.from([0x01]),\n };\n\n const result = new SendActionCommand(firstChunkArgs).parseResponse(\n response,\n );\n expect(isSuccessCommandResult(result)).toBe(false);\n expect((result as { error: unknown }).error).toBeInstanceOf(\n InvalidResponseFormatError,\n );\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["CommandResultFactory", "InvalidResponseFormatError", "isSuccessCommandResult", "SendActionCommand", "FIRST_CHUNK_P1", "FOLLOWING_CHUNK_P1", "APDU_P2", "chunkedData", "firstChunkArgs", "command", "apdu", "response", "parsed", "result"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{CommandResultFactory as
|
|
1
|
+
import{CommandResultFactory as s,isSuccessCommandResult as d}from"@ledgerhq/device-management-kit";import{SendCommandInChunksTask as p}from"@ledgerhq/signer-utils";import{SendActionCommand as m}from"../../app-binder/command/SendActionCommand";import{serializeActionToTlv as c}from"../../app-binder/utils/actionTlvSerializer";class C{constructor(r,t){this.api=r;this.args=t}async run(){const{actions:r}=this.args;for(const t of r){const e=c(t),i=f(e),o=await new p(this.api,{data:i,commandFactory:a=>new m(a)}).run();if(!d(o))return o}return s({data:void 0})}}function f(n){const r=n.length;if(r>65535)throw new RangeError(`Serialized action too large to frame with a 2-byte length prefix: ${r} bytes`);const t=new Uint8Array(2+r);return t[0]=r>>8&255,t[1]=r&255,t.set(n,2),t}export{C as SendActionsTask,f as buildSendActionPayload};
|
|
2
2
|
//# sourceMappingURL=SendActionsTask.js.map
|