@ledgerhq/device-signer-kit-hyperliquid 0.0.0-develop-20260312001221 → 0.0.0-develop-20260313001318

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/lib/cjs/api/SignerHyperliquid.js +1 -1
  2. package/lib/cjs/api/SignerHyperliquid.js.map +1 -1
  3. package/lib/cjs/api/app-binder/SignActionsDeviceActionTypes.js +1 -1
  4. package/lib/cjs/api/app-binder/SignActionsDeviceActionTypes.js.map +3 -3
  5. package/lib/cjs/api/index.js +1 -1
  6. package/lib/cjs/api/index.js.map +3 -3
  7. package/lib/cjs/api/model/Signature.js.map +1 -1
  8. package/lib/cjs/internal/DefaultSignerHyperliquid.js +1 -1
  9. package/lib/cjs/internal/DefaultSignerHyperliquid.js.map +3 -3
  10. package/lib/cjs/internal/app-binder/HyperliquidAppBinder.js +1 -1
  11. package/lib/cjs/internal/app-binder/HyperliquidAppBinder.js.map +3 -3
  12. package/lib/cjs/internal/app-binder/command/SendActionCommand.js +2 -0
  13. package/lib/cjs/internal/app-binder/command/SendActionCommand.js.map +7 -0
  14. package/lib/cjs/internal/app-binder/command/SendActionCommand.test.js +2 -0
  15. package/lib/cjs/internal/app-binder/command/SendActionCommand.test.js.map +7 -0
  16. package/lib/cjs/internal/app-binder/command/SendMetadataCommand.js +2 -0
  17. package/lib/cjs/internal/app-binder/command/SendMetadataCommand.js.map +7 -0
  18. package/lib/cjs/internal/app-binder/command/SendMetadataCommand.test.js +2 -0
  19. package/lib/cjs/internal/app-binder/command/SendMetadataCommand.test.js.map +7 -0
  20. package/lib/cjs/internal/app-binder/command/SignActionsCommand.js +2 -0
  21. package/lib/cjs/internal/app-binder/command/SignActionsCommand.js.map +7 -0
  22. package/lib/cjs/internal/app-binder/command/SignActionsCommand.test.js +2 -0
  23. package/lib/cjs/internal/app-binder/command/SignActionsCommand.test.js.map +7 -0
  24. package/lib/cjs/internal/app-binder/command/utils/hyperliquidApplicationErrors.js +1 -1
  25. package/lib/cjs/internal/app-binder/command/utils/hyperliquidApplicationErrors.js.map +3 -3
  26. package/lib/cjs/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.js +1 -1
  27. package/lib/cjs/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.js.map +4 -4
  28. package/lib/cjs/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.test.js +2 -0
  29. package/lib/cjs/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.test.js.map +7 -0
  30. package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +2 -0
  31. package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +7 -0
  32. package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js +2 -0
  33. package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js.map +7 -0
  34. package/lib/cjs/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js +2 -0
  35. package/lib/cjs/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js.map +7 -0
  36. package/lib/cjs/internal/app-binder/di/appBinderTypes.js +1 -1
  37. package/lib/cjs/internal/app-binder/di/appBinderTypes.js.map +2 -2
  38. package/lib/cjs/internal/app-binder/task/SendActionsTask.js +2 -0
  39. package/lib/cjs/internal/app-binder/task/SendActionsTask.js.map +7 -0
  40. package/lib/cjs/internal/app-binder/task/SendActionsTask.test.js +2 -0
  41. package/lib/cjs/internal/app-binder/task/SendActionsTask.test.js.map +7 -0
  42. package/lib/cjs/internal/app-binder/task/SignActionsTask.js +1 -1
  43. package/lib/cjs/internal/app-binder/task/SignActionsTask.js.map +3 -3
  44. package/lib/cjs/internal/app-binder/task/SignActionsTask.test.js +2 -0
  45. package/lib/cjs/internal/app-binder/task/SignActionsTask.test.js.map +7 -0
  46. package/lib/cjs/internal/app-binder/utils/actionTlvSerializer.js +2 -0
  47. package/lib/cjs/internal/app-binder/utils/actionTlvSerializer.js.map +7 -0
  48. package/lib/cjs/internal/app-binder/utils/actionTlvSerializer.test.js +2 -0
  49. package/lib/cjs/internal/app-binder/utils/actionTlvSerializer.test.js.map +7 -0
  50. package/lib/cjs/internal/use-cases/actions/SignActionsUseCase.js +1 -1
  51. package/lib/cjs/internal/use-cases/actions/SignActionsUseCase.js.map +3 -3
  52. package/lib/cjs/package.json +3 -1
  53. package/lib/esm/api/app-binder/SignActionsDeviceActionTypes.js +1 -0
  54. package/lib/esm/api/app-binder/SignActionsDeviceActionTypes.js.map +4 -4
  55. package/lib/esm/api/index.js +1 -1
  56. package/lib/esm/api/index.js.map +3 -3
  57. package/lib/esm/internal/DefaultSignerHyperliquid.js +1 -1
  58. package/lib/esm/internal/DefaultSignerHyperliquid.js.map +3 -3
  59. package/lib/esm/internal/app-binder/HyperliquidAppBinder.js +1 -1
  60. package/lib/esm/internal/app-binder/HyperliquidAppBinder.js.map +3 -3
  61. package/lib/esm/internal/app-binder/command/SendActionCommand.js +2 -0
  62. package/lib/esm/internal/app-binder/command/SendActionCommand.js.map +7 -0
  63. package/lib/esm/internal/app-binder/command/SendActionCommand.test.js +2 -0
  64. package/lib/esm/internal/app-binder/command/SendActionCommand.test.js.map +7 -0
  65. package/lib/esm/internal/app-binder/command/SendMetadataCommand.js +2 -0
  66. package/lib/esm/internal/app-binder/command/SendMetadataCommand.js.map +7 -0
  67. package/lib/esm/internal/app-binder/command/SendMetadataCommand.test.js +2 -0
  68. package/lib/esm/internal/app-binder/command/SendMetadataCommand.test.js.map +7 -0
  69. package/lib/esm/internal/app-binder/command/SignActionsCommand.js +2 -0
  70. package/lib/esm/internal/app-binder/command/SignActionsCommand.js.map +7 -0
  71. package/lib/esm/internal/app-binder/command/SignActionsCommand.test.js +2 -0
  72. package/lib/esm/internal/app-binder/command/SignActionsCommand.test.js.map +7 -0
  73. package/lib/esm/internal/app-binder/command/utils/hyperliquidApplicationErrors.js +1 -1
  74. package/lib/esm/internal/app-binder/command/utils/hyperliquidApplicationErrors.js.map +3 -3
  75. package/lib/esm/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.js +1 -0
  76. package/lib/esm/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.js.map +4 -4
  77. package/lib/esm/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.test.js +2 -0
  78. package/lib/esm/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.test.js.map +7 -0
  79. package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +2 -0
  80. package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +7 -0
  81. package/lib/esm/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js +2 -0
  82. package/lib/esm/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js.map +7 -0
  83. package/lib/esm/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js +2 -0
  84. package/lib/esm/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js.map +7 -0
  85. package/lib/esm/internal/app-binder/di/appBinderTypes.js +1 -1
  86. package/lib/esm/internal/app-binder/di/appBinderTypes.js.map +2 -2
  87. package/lib/esm/internal/app-binder/task/SendActionsTask.js +2 -0
  88. package/lib/esm/internal/app-binder/task/SendActionsTask.js.map +7 -0
  89. package/lib/esm/internal/app-binder/task/SendActionsTask.test.js +2 -0
  90. package/lib/esm/internal/app-binder/task/SendActionsTask.test.js.map +7 -0
  91. package/lib/esm/internal/app-binder/task/SignActionsTask.js +1 -1
  92. package/lib/esm/internal/app-binder/task/SignActionsTask.js.map +3 -3
  93. package/lib/esm/internal/app-binder/task/SignActionsTask.test.js +2 -0
  94. package/lib/esm/internal/app-binder/task/SignActionsTask.test.js.map +7 -0
  95. package/lib/esm/internal/app-binder/utils/actionTlvSerializer.js +2 -0
  96. package/lib/esm/internal/app-binder/utils/actionTlvSerializer.js.map +7 -0
  97. package/lib/esm/internal/app-binder/utils/actionTlvSerializer.test.js +2 -0
  98. package/lib/esm/internal/app-binder/utils/actionTlvSerializer.test.js.map +7 -0
  99. package/lib/esm/internal/use-cases/actions/SignActionsUseCase.js +1 -1
  100. package/lib/esm/internal/use-cases/actions/SignActionsUseCase.js.map +3 -3
  101. package/lib/esm/package.json +3 -1
  102. package/lib/types/api/SignerHyperliquid.d.ts +2 -3
  103. package/lib/types/api/SignerHyperliquid.d.ts.map +1 -1
  104. package/lib/types/api/app-binder/SignActionsDeviceActionTypes.d.ts +28 -3
  105. package/lib/types/api/app-binder/SignActionsDeviceActionTypes.d.ts.map +1 -1
  106. package/lib/types/api/index.d.ts +3 -1
  107. package/lib/types/api/index.d.ts.map +1 -1
  108. package/lib/types/api/model/Signature.d.ts +1 -1
  109. package/lib/types/api/model/Signature.d.ts.map +1 -1
  110. package/lib/types/internal/DefaultSignerHyperliquid.d.ts +1 -2
  111. package/lib/types/internal/DefaultSignerHyperliquid.d.ts.map +1 -1
  112. package/lib/types/internal/app-binder/HyperliquidAppBinder.d.ts +5 -2
  113. package/lib/types/internal/app-binder/HyperliquidAppBinder.d.ts.map +1 -1
  114. package/lib/types/internal/app-binder/command/SendActionCommand.d.ts +16 -0
  115. package/lib/types/internal/app-binder/command/SendActionCommand.d.ts.map +1 -0
  116. package/lib/types/internal/app-binder/command/SendActionCommand.test.d.ts +2 -0
  117. package/lib/types/internal/app-binder/command/SendActionCommand.test.d.ts.map +1 -0
  118. package/lib/types/internal/app-binder/command/SendMetadataCommand.d.ts +14 -0
  119. package/lib/types/internal/app-binder/command/SendMetadataCommand.d.ts.map +1 -0
  120. package/lib/types/internal/app-binder/command/SendMetadataCommand.test.d.ts +2 -0
  121. package/lib/types/internal/app-binder/command/SendMetadataCommand.test.d.ts.map +1 -0
  122. package/lib/types/internal/app-binder/command/SignActionsCommand.d.ts +22 -0
  123. package/lib/types/internal/app-binder/command/SignActionsCommand.d.ts.map +1 -0
  124. package/lib/types/internal/app-binder/command/SignActionsCommand.test.d.ts +2 -0
  125. package/lib/types/internal/app-binder/command/SignActionsCommand.test.d.ts.map +1 -0
  126. package/lib/types/internal/app-binder/command/utils/hyperliquidApplicationErrors.d.ts +8 -2
  127. package/lib/types/internal/app-binder/command/utils/hyperliquidApplicationErrors.d.ts.map +1 -1
  128. package/lib/types/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.d.ts +16 -0
  129. package/lib/types/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.d.ts.map +1 -1
  130. package/lib/types/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.test.d.ts +2 -0
  131. package/lib/types/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.test.d.ts.map +1 -0
  132. package/lib/types/internal/app-binder/device-action/__test-utils__/makeInternalApi.d.ts +4 -0
  133. package/lib/types/internal/app-binder/device-action/__test-utils__/makeInternalApi.d.ts.map +1 -0
  134. package/lib/types/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.d.ts +2 -0
  135. package/lib/types/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.d.ts.map +1 -0
  136. package/lib/types/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.d.ts +15 -0
  137. package/lib/types/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.d.ts.map +1 -0
  138. package/lib/types/internal/app-binder/di/appBinderTypes.d.ts +75 -0
  139. package/lib/types/internal/app-binder/di/appBinderTypes.d.ts.map +1 -1
  140. package/lib/types/internal/app-binder/task/SendActionsTask.d.ts +17 -0
  141. package/lib/types/internal/app-binder/task/SendActionsTask.d.ts.map +1 -0
  142. package/lib/types/internal/app-binder/task/SendActionsTask.test.d.ts +2 -0
  143. package/lib/types/internal/app-binder/task/SendActionsTask.test.d.ts.map +1 -0
  144. package/lib/types/internal/app-binder/task/SignActionsTask.d.ts +3 -4
  145. package/lib/types/internal/app-binder/task/SignActionsTask.d.ts.map +1 -1
  146. package/lib/types/internal/app-binder/task/SignActionsTask.test.d.ts +2 -0
  147. package/lib/types/internal/app-binder/task/SignActionsTask.test.d.ts.map +1 -0
  148. package/lib/types/internal/app-binder/utils/actionTlvSerializer.d.ts +59 -0
  149. package/lib/types/internal/app-binder/utils/actionTlvSerializer.d.ts.map +1 -0
  150. package/lib/types/internal/app-binder/utils/actionTlvSerializer.test.d.ts +2 -0
  151. package/lib/types/internal/app-binder/utils/actionTlvSerializer.test.d.ts.map +1 -0
  152. package/lib/types/internal/use-cases/actions/SignActionsUseCase.d.ts +3 -2
  153. package/lib/types/internal/use-cases/actions/SignActionsUseCase.d.ts.map +1 -1
  154. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  155. package/package.json +9 -7
  156. package/lib/cjs/internal/app-binder/command/SignActionCommand.js +0 -2
  157. package/lib/cjs/internal/app-binder/command/SignActionCommand.js.map +0 -7
  158. package/lib/cjs/internal/app-binder/command/SignActionCommand.test.js +0 -2
  159. package/lib/cjs/internal/app-binder/command/SignActionCommand.test.js.map +0 -7
  160. package/lib/esm/internal/app-binder/command/SignActionCommand.js +0 -2
  161. package/lib/esm/internal/app-binder/command/SignActionCommand.js.map +0 -7
  162. package/lib/esm/internal/app-binder/command/SignActionCommand.test.js +0 -2
  163. package/lib/esm/internal/app-binder/command/SignActionCommand.test.js.map +0 -7
  164. package/lib/types/internal/app-binder/command/SignActionCommand.d.ts +0 -21
  165. package/lib/types/internal/app-binder/command/SignActionCommand.d.ts.map +0 -1
  166. package/lib/types/internal/app-binder/command/SignActionCommand.test.d.ts +0 -2
  167. package/lib/types/internal/app-binder/command/SignActionCommand.test.d.ts.map +0 -1
@@ -1 +1,2 @@
1
+ import{isSuccessCommandResult as o,LoadCertificateCommand as l,OpenAppDeviceAction as m,UnknownDAError as A,UserInteractionRequired as a,XStateDeviceAction as E}from"@ledgerhq/device-management-kit";import{Left as y,Right as C}from"purify-ts";import{assign as n,fromPromise as s,setup as D}from"xstate";import{signActionsDAStateSteps as i}from"../../../../api/app-binder/SignActionsDeviceActionTypes";import{SendMetadataCommand as f}from"../../../app-binder/command/SendMetadataCommand";import{SendActionsTask as I}from"../../../app-binder/task/SendActionsTask";import{SignActionsTask as _}from"../../../app-binder/task/SignActionsTask";const S="Hyperliquid",k=17;class U extends E{makeStateMachine(r){const{setCertificate:c,sendMetadata:p,sendActions:u,signActions:d}=this.extractDependencies(r);return D({types:{input:{},context:{},output:{}},actors:{openAppStateMachine:new m({input:{appName:S}}).makeStateMachine(r),setCertificate:s(({input:t})=>c(t)),sendMetadata:s(({input:t})=>p(t)),sendActions:s(({input:t})=>u(t)),signActions:s(({input:t})=>d(t))},guards:{noInternalError:({context:t})=>t._internalState.error===null,skipOpenApp:({context:t})=>t.input.skipOpenApp===!0},actions:{assignErrorFromEvent:n({_internalState:({event:t})=>({error:new A(t.error instanceof Error?t.error.message:String(t.error)),signature:null,actionIndex:0})})}}).createMachine({id:"SignActionsDeviceAction",initial:"InitialState",context:({input:t})=>({input:t,intermediateValue:{requiredUserInteraction:a.None,step:i.OPEN_APP},_internalState:{error:null,signature:null,actionIndex:0}}),states:{InitialState:{always:[{target:"SetCertificate",guard:"skipOpenApp"},{target:"OpenAppDeviceAction"}]},OpenAppDeviceAction:{entry:n({intermediateValue:()=>({requiredUserInteraction:a.None,step:i.OPEN_APP})}),invoke:{id:"openAppStateMachine",src:"openAppStateMachine",input:()=>({appName:S}),onSnapshot:{actions:n({intermediateValue:({event:t})=>({...t.snapshot.context.intermediateValue,step:i.OPEN_APP})})},onDone:{target:"CheckOpenAppResult",actions:n({_internalState:({event:t,context:e})=>t.output.caseOf({Right:()=>e._internalState,Left:g=>({...e._internalState,error:g})})})}}},CheckOpenAppResult:{always:[{target:"SetCertificate",guard:"noInternalError"},{target:"Error"}]},SetCertificate:{entry:n({intermediateValue:()=>({requiredUserInteraction:a.None,step:i.SET_CERTIFICATE})}),invoke:{id:"setCertificate",src:"setCertificate",input:({context:t})=>({payload:t.input.certificate,keyUsageNumber:k}),onDone:{target:"SetCertificateResultCheck",actions:n({_internalState:({event:t,context:e})=>o(t.output)?e._internalState:{...e._internalState,error:t.output.error}})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},SetCertificateResultCheck:{always:[{target:"SendMetadata",guard:"noInternalError"},{target:"Error"}]},SendMetadata:{entry:n({intermediateValue:()=>({requiredUserInteraction:a.None,step:i.SEND_METADATA})}),invoke:{id:"sendMetadata",src:"sendMetadata",input:({context:t})=>t.input.signedMetadata,onDone:{target:"SendMetadataResultCheck",actions:n({_internalState:({event:t,context:e})=>o(t.output)?e._internalState:{...e._internalState,error:t.output.error}})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},SendMetadataResultCheck:{always:[{target:"SendActions",guard:"noInternalError"},{target:"Error"}]},SendActions:{entry:n({intermediateValue:()=>({requiredUserInteraction:a.None,step:i.SEND_ACTION})}),invoke:{id:"sendActions",src:"sendActions",input:({context:t})=>t.input.actions,onDone:{target:"SendActionsResultCheck",actions:n({_internalState:({event:t,context:e})=>o(t.output)?e._internalState:{...e._internalState,error:t.output.error}})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},SendActionsResultCheck:{always:[{target:"SignActions",guard:"noInternalError"},{target:"Error"}]},SignActions:{entry:n({intermediateValue:()=>({requiredUserInteraction:a.SignTransaction,step:i.SIGN_ACTIONS})}),invoke:{id:"signActions",src:"signActions",input:({context:t})=>t.input.derivationPath,onDone:{target:"SignActionsResultCheck",actions:n({_internalState:({event:t,context:e})=>o(t.output)?{...e._internalState,signature:t.output.data}:{...e._internalState,error:t.output.error}})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},SignActionsResultCheck:{always:[{target:"Success",guard:"noInternalError"},{target:"Error"}]},Success:{type:"final"},Error:{type:"final"}},output:({context:t})=>t._internalState.signature?C(t._internalState.signature):y(t._internalState.error??new A("No error or signature available"))})}extractDependencies(r){return{setCertificate:t=>r.sendCommand(new l({certificate:t.payload,keyUsage:t.keyUsageNumber})),sendMetadata:t=>r.sendCommand(new f({signedMetadata:t})),sendActions:t=>new I(r,{actions:t}).run(),signActions:t=>new _(r,{derivationPath:t}).run()}}}export{U as SignActionsDeviceAction};
1
2
  //# sourceMappingURL=SignActionsDeviceAction.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
3
+ "sources": ["../../../../../../src/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.ts"],
4
+ "sourcesContent": ["import { type PkiCertificate } from \"@ledgerhq/context-module\";\nimport {\n type CommandResult,\n type DeviceActionStateMachine,\n type InternalApi,\n isSuccessCommandResult,\n LoadCertificateCommand,\n type LoadCertificateErrorCodes,\n OpenAppDeviceAction,\n type StateMachineTypes,\n UnknownDAError,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type SignActionsDAError,\n type SignActionsDAInput,\n type SignActionsDAIntermediateValue,\n type SignActionsDAInternalState,\n type SignActionsDAOutput,\n signActionsDAStateSteps,\n} from \"@api/app-binder/SignActionsDeviceActionTypes\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { SendMetadataCommand } from \"@internal/app-binder/command/SendMetadataCommand\";\nimport { type HyperliquidErrorCodes } from \"@internal/app-binder/command/utils/hyperliquidApplicationErrors\";\nimport type { HyperliquidAction } from \"@internal/app-binder/di/appBinderTypes\";\nimport { SendActionsTask } from \"@internal/app-binder/task/SendActionsTask\";\nimport { SignActionsTask } from \"@internal/app-binder/task/SignActionsTask\";\n\nconst APP_NAME = \"Hyperliquid\";\nconst PERPS_DATA_KEY_USAGE = 0x11;\n\nexport type SignActionsMachineDependencies = {\n readonly setCertificate: (\n certificate: PkiCertificate,\n ) => Promise<CommandResult<void, LoadCertificateErrorCodes>>;\n readonly sendMetadata: (\n signedMetadata: Uint8Array,\n ) => Promise<CommandResult<void, HyperliquidErrorCodes>>;\n readonly sendActions: (\n actions: HyperliquidAction[],\n ) => Promise<CommandResult<void, HyperliquidErrorCodes>>;\n readonly signActions: (\n derivationPath: string,\n ) => Promise<CommandResult<Signature[], HyperliquidErrorCodes>>;\n};\n\nexport class SignActionsDeviceAction extends XStateDeviceAction<\n SignActionsDAOutput,\n SignActionsDAInput,\n SignActionsDAError,\n SignActionsDAIntermediateValue,\n SignActionsDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n SignActionsDAOutput,\n SignActionsDAInput,\n SignActionsDAError,\n SignActionsDAIntermediateValue,\n SignActionsDAInternalState\n > {\n type types = StateMachineTypes<\n SignActionsDAOutput,\n SignActionsDAInput,\n SignActionsDAError,\n SignActionsDAIntermediateValue,\n SignActionsDAInternalState\n >;\n\n const { setCertificate, sendMetadata, sendActions, signActions } =\n this.extractDependencies(internalApi);\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n openAppStateMachine: new OpenAppDeviceAction({\n input: { appName: APP_NAME },\n }).makeStateMachine(internalApi),\n setCertificate: fromPromise(({ input }: { input: PkiCertificate }) =>\n setCertificate(input),\n ),\n sendMetadata: fromPromise(({ input }: { input: Uint8Array }) =>\n sendMetadata(input),\n ),\n sendActions: fromPromise(({ input }: { input: HyperliquidAction[] }) =>\n sendActions(input),\n ),\n signActions: fromPromise(({ input }: { input: string }) =>\n signActions(input),\n ),\n },\n guards: {\n noInternalError: ({ context }) => context._internalState.error === null,\n skipOpenApp: ({ context }) => context.input.skipOpenApp === true,\n },\n actions: {\n assignErrorFromEvent: assign({\n _internalState: ({ event }) => ({\n error: new UnknownDAError(\n event[\"error\"] instanceof Error\n ? event[\"error\"].message\n : String(event[\"error\"]),\n ) as SignActionsDAError,\n signature: null,\n actionIndex: 0,\n }),\n }),\n },\n }).createMachine({\n id: \"SignActionsDeviceAction\",\n initial: \"InitialState\",\n context: ({ input }) => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signActionsDAStateSteps.OPEN_APP,\n },\n _internalState: {\n error: null,\n signature: null,\n actionIndex: 0,\n },\n }),\n states: {\n InitialState: {\n always: [\n { target: \"SetCertificate\", guard: \"skipOpenApp\" },\n { target: \"OpenAppDeviceAction\" },\n ],\n },\n OpenAppDeviceAction: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n step: signActionsDAStateSteps.OPEN_APP,\n }),\n }),\n invoke: {\n id: \"openAppStateMachine\",\n src: \"openAppStateMachine\",\n input: () => ({ appName: APP_NAME }),\n onSnapshot: {\n actions: assign({\n intermediateValue: ({ event }) => ({\n ...event.snapshot.context.intermediateValue,\n step: signActionsDAStateSteps.OPEN_APP,\n }),\n }),\n },\n onDone: {\n target: \"CheckOpenAppResult\",\n actions: assign({\n _internalState: ({ event, context }) =>\n event.output.caseOf({\n Right: () => context._internalState,\n Left: (error) => ({\n ...context._internalState,\n error,\n }),\n }),\n }),\n },\n },\n },\n CheckOpenAppResult: {\n always: [\n { target: \"SetCertificate\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n SetCertificate: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n step: signActionsDAStateSteps.SET_CERTIFICATE,\n }),\n }),\n invoke: {\n id: \"setCertificate\",\n src: \"setCertificate\",\n input: ({ context }) => ({\n payload: context.input.certificate,\n keyUsageNumber: PERPS_DATA_KEY_USAGE,\n }),\n onDone: {\n target: \"SetCertificateResultCheck\",\n actions: assign({\n _internalState: ({ event, context }) =>\n isSuccessCommandResult(event.output)\n ? context._internalState\n : {\n ...context._internalState,\n error: event.output.error as SignActionsDAError,\n },\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n SetCertificateResultCheck: {\n always: [\n { target: \"SendMetadata\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n SendMetadata: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n step: signActionsDAStateSteps.SEND_METADATA,\n }),\n }),\n invoke: {\n id: \"sendMetadata\",\n src: \"sendMetadata\",\n input: ({ context }) => context.input.signedMetadata,\n onDone: {\n target: \"SendMetadataResultCheck\",\n actions: assign({\n _internalState: ({ event, context }) =>\n isSuccessCommandResult(event.output)\n ? context._internalState\n : {\n ...context._internalState,\n error: event.output.error as SignActionsDAError,\n },\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n SendMetadataResultCheck: {\n always: [\n { target: \"SendActions\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n SendActions: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n step: signActionsDAStateSteps.SEND_ACTION,\n }),\n }),\n invoke: {\n id: \"sendActions\",\n src: \"sendActions\",\n input: ({ context }) => context.input.actions,\n onDone: {\n target: \"SendActionsResultCheck\",\n actions: assign({\n _internalState: ({ event, context }) =>\n isSuccessCommandResult(event.output)\n ? context._internalState\n : {\n ...context._internalState,\n error: event.output.error as SignActionsDAError,\n },\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n SendActionsResultCheck: {\n always: [\n { target: \"SignActions\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n SignActions: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: signActionsDAStateSteps.SIGN_ACTIONS,\n }),\n }),\n invoke: {\n id: \"signActions\",\n src: \"signActions\",\n input: ({ context }) => context.input.derivationPath,\n onDone: {\n target: \"SignActionsResultCheck\",\n actions: assign({\n _internalState: ({ event, context }) =>\n isSuccessCommandResult(event.output)\n ? {\n ...context._internalState,\n signature: event.output.data,\n }\n : {\n ...context._internalState,\n error: event.output.error as SignActionsDAError,\n },\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n SignActionsResultCheck: {\n always: [\n { target: \"Success\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n Success: { type: \"final\" },\n Error: { type: \"final\" },\n },\n output: ({ context }) =>\n context._internalState.signature\n ? Right(context._internalState.signature)\n : Left(\n context._internalState.error ??\n new UnknownDAError(\"No error or signature available\"),\n ),\n });\n }\n\n extractDependencies(\n internalApi: InternalApi,\n ): SignActionsMachineDependencies {\n const setCertificate = (certificate: PkiCertificate) =>\n internalApi.sendCommand(\n new LoadCertificateCommand({\n certificate: certificate.payload,\n keyUsage: certificate.keyUsageNumber,\n }),\n );\n\n const sendMetadata = (signedMetadata: Uint8Array) =>\n internalApi.sendCommand(new SendMetadataCommand({ signedMetadata }));\n\n const sendActions = (actions: HyperliquidAction[]) =>\n new SendActionsTask(internalApi, { actions }).run();\n\n const signActions = (derivationPath: string) =>\n new SignActionsTask(internalApi, {\n derivationPath,\n }).run();\n\n return {\n setCertificate,\n sendMetadata,\n sendActions,\n signActions,\n };\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["isSuccessCommandResult", "LoadCertificateCommand", "OpenAppDeviceAction", "UnknownDAError", "UserInteractionRequired", "XStateDeviceAction", "Left", "Right", "assign", "fromPromise", "setup", "signActionsDAStateSteps", "SendMetadataCommand", "SendActionsTask", "SignActionsTask", "APP_NAME", "PERPS_DATA_KEY_USAGE", "SignActionsDeviceAction", "internalApi", "setCertificate", "sendMetadata", "sendActions", "signActions", "input", "context", "event", "error", "certificate", "signedMetadata", "actions", "derivationPath"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ import{CommandResultFactory as t,DeviceActionStatus as e,DeviceModelId as I,DeviceSessionStateType as f,DeviceStatus as y,UserInteractionRequired as n}from"@ledgerhq/device-management-kit";import{beforeEach as V,describe as O,it as C,vi as o}from"vitest";import{signActionsDAStateSteps as i}from"../../../../api/app-binder/SignActionsDeviceActionTypes";import{makeDeviceActionInternalApiMock as h}from"../../../app-binder/device-action/__test-utils__/makeInternalApi";import{setupOpenAppDAMock as E}from"../../../app-binder/device-action/__test-utils__/setupOpenAppDAMock";import{testDeviceActionStates as T}from"../../../app-binder/device-action/__test-utils__/testDeviceActionStates";import{SignActionsDeviceAction as k}from"./SignActionsDeviceAction";o.mock("@ledgerhq/device-management-kit",async s=>({...await s(),OpenAppDeviceAction:o.fn(()=>({makeStateMachine:o.fn()}))}));const g=new Uint8Array([1,2,3]),D=new Uint8Array([4,5,6]),v={r:"0xaa",s:"0xbb",v:27};let c,d,u,p,m;function N(){return{setCertificate:d,sendMetadata:u,sendActions:p,signActions:m}}O("SignActionsDeviceAction (Hyperliquid)",()=>{V(()=>{c=h(),d=o.fn(),u=o.fn(),p=o.fn(),m=o.fn()}),C("happy path (skip open): SetCertificate -> SendMetadata -> SignActions (no actions)",()=>new Promise((s,A)=>{E(),c.getDeviceSessionState.mockReturnValue({sessionStateType:f.ReadyWithoutSecureChannel,deviceStatus:y.CONNECTED,installedApps:[],currentApp:{name:"Hyperliquid",version:"1.0.0"},deviceModelId:I.NANO_X,isSecureConnectionAllowed:!0}),d.mockResolvedValue(t({data:void 0})),u.mockResolvedValue(t({data:void 0})),p.mockResolvedValue(t({data:void 0})),m.mockResolvedValue(t({data:[v]}));const a={derivationPath:"44'/637'/0'/0'",certificate:g,signedMetadata:D,actions:[],skipOpenApp:!0},r=new k({input:a});o.spyOn(r,"extractDependencies").mockReturnValue(N());const l=[{intermediateValue:{requiredUserInteraction:n.None,step:i.SET_CERTIFICATE},status:e.Pending},{intermediateValue:{requiredUserInteraction:n.None,step:i.SEND_METADATA},status:e.Pending},{intermediateValue:{requiredUserInteraction:n.None,step:i.SEND_ACTION},status:e.Pending},{intermediateValue:{requiredUserInteraction:n.SignTransaction,step:i.SIGN_ACTIONS},status:e.Pending},{output:[v],status:e.Completed}];T(r,l,c,{onDone:s,onError:A})})),C("happy path: SetCertificate -> SendMetadata -> SendAction -> SignActions",()=>new Promise((s,A)=>{c.getDeviceSessionState.mockReturnValue({sessionStateType:f.ReadyWithoutSecureChannel,deviceStatus:y.CONNECTED,installedApps:[],currentApp:{name:"Hyperliquid",version:"1.0.0"},deviceModelId:I.NANO_X,isSecureConnectionAllowed:!0}),d.mockResolvedValue(t({data:void 0})),u.mockResolvedValue(t({data:void 0})),p.mockResolvedValue(t({data:void 0}));const a=[{r:"0xcc",s:"0xdd",v:27},{r:"0xcc",s:"0xdd",v:27}];m.mockResolvedValue(t({data:a}));const r=[{type:"order",orders:[{a:0,b:!0,p:"100",s:"100",t:{limit:{tif:"Gtc"}},r:!1}],grouping:"na",builder:{b:"0x1234567890123456789012345678901234567890",f:1},nonce:1},{type:"updateLeverage",asset:0,isCross:!1,leverage:10,nonce:2}],l={derivationPath:"44'/637'/0'/0'",certificate:g,signedMetadata:D,actions:r,skipOpenApp:!0},S=new k({input:l});o.spyOn(S,"extractDependencies").mockReturnValue(N());const x=[{intermediateValue:{requiredUserInteraction:n.None,step:i.SET_CERTIFICATE},status:e.Pending},{intermediateValue:{requiredUserInteraction:n.None,step:i.SEND_METADATA},status:e.Pending},{intermediateValue:{requiredUserInteraction:n.None,step:i.SEND_ACTION},status:e.Pending},{intermediateValue:{requiredUserInteraction:n.SignTransaction,step:i.SIGN_ACTIONS},status:e.Pending},{output:a,status:e.Completed}];T(S,x,c,{onDone:()=>{expect(d).toHaveBeenCalledTimes(1),expect(d).toHaveBeenCalledWith({payload:g,keyUsageNumber:17}),expect(u).toHaveBeenCalledTimes(1),expect(u).toHaveBeenCalledWith(D),expect(p).toHaveBeenCalledTimes(1),expect(p).toHaveBeenCalledWith(r),expect(m).toHaveBeenCalledTimes(1),s()},onError:A})})),C("calls SetCertificate then SendMetadata then SendActions then SignActions in order (no actions)",()=>new Promise((s,A)=>{E(),c.getDeviceSessionState.mockReturnValue({sessionStateType:f.ReadyWithoutSecureChannel,deviceStatus:y.CONNECTED,installedApps:[],currentApp:{name:"Hyperliquid",version:"1.0.0"},deviceModelId:I.NANO_X,isSecureConnectionAllowed:!0});const a=[];d.mockImplementation(()=>(a.push("setCertificate"),Promise.resolve(t({data:void 0})))),u.mockImplementation(()=>(a.push("sendMetadata"),Promise.resolve(t({data:void 0})))),p.mockImplementation(()=>(a.push("sendActions"),Promise.resolve(t({data:void 0})))),m.mockImplementation(()=>(a.push("signActions"),Promise.resolve(t({data:[v]}))));const r={derivationPath:"44'/637'/0'/0'",certificate:g,signedMetadata:D,actions:[],skipOpenApp:!0},l=new k({input:r});o.spyOn(l,"extractDependencies").mockReturnValue(N());const S=[{intermediateValue:{requiredUserInteraction:n.None,step:i.SET_CERTIFICATE},status:e.Pending},{intermediateValue:{requiredUserInteraction:n.None,step:i.SEND_METADATA},status:e.Pending},{intermediateValue:{requiredUserInteraction:n.None,step:i.SEND_ACTION},status:e.Pending},{intermediateValue:{requiredUserInteraction:n.SignTransaction,step:i.SIGN_ACTIONS},status:e.Pending},{output:[v],status:e.Completed}];T(l,S,c,{onDone:()=>{expect(a).toEqual(["setCertificate","sendMetadata","sendActions","signActions"]),s()},onError:A})}))});
2
+ //# sourceMappingURL=SignActionsDeviceAction.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.test.ts"],
4
+ "sourcesContent": ["import {\n CommandResultFactory,\n type DeviceActionState,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { beforeEach, describe, it, vi } from \"vitest\";\n\nimport {\n type SignActionsDAError,\n type SignActionsDAInput,\n type SignActionsDAIntermediateValue,\n type SignActionsDAOutput,\n signActionsDAStateSteps,\n} from \"@api/app-binder/SignActionsDeviceActionTypes\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { setupOpenAppDAMock } from \"@internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport type { HyperliquidAction } from \"@internal/app-binder/di/appBinderTypes\";\n\nimport { SignActionsDeviceAction } from \"./SignActionsDeviceAction\";\n\nvi.mock(\"@ledgerhq/device-management-kit\", async (importOriginal) => {\n const original =\n // eslint-disable-next-line @typescript-eslint/consistent-type-imports\n await importOriginal<typeof import(\"@ledgerhq/device-management-kit\")>();\n return {\n ...original,\n OpenAppDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n };\n});\n\nconst exampleCertificate = new Uint8Array([0x01, 0x02, 0x03]);\nconst exampleMetadata = new Uint8Array([0x04, 0x05, 0x06]);\n\nconst exampleSignature = {\n r: \"0xaa\",\n s: \"0xbb\",\n v: 27,\n};\n\nlet apiMock: ReturnType<typeof makeDeviceActionInternalApiMock>;\nlet setCertificateMock: ReturnType<typeof vi.fn>;\nlet sendMetadataMock: ReturnType<typeof vi.fn>;\nlet sendActionsMock: ReturnType<typeof vi.fn>;\nlet signActionsMock: ReturnType<typeof vi.fn>;\n\nfunction extractDeps() {\n return {\n setCertificate: setCertificateMock,\n sendMetadata: sendMetadataMock,\n sendActions: sendActionsMock,\n signActions: signActionsMock,\n };\n}\n\ndescribe(\"SignActionsDeviceAction (Hyperliquid)\", () => {\n beforeEach(() => {\n apiMock = makeDeviceActionInternalApiMock();\n setCertificateMock = vi.fn();\n sendMetadataMock = vi.fn();\n sendActionsMock = vi.fn();\n signActionsMock = vi.fn();\n });\n\n it(\"happy path (skip open): SetCertificate -> SendMetadata -> SignActions (no actions)\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Hyperliquid\", version: \"1.0.0\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n setCertificateMock.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n sendMetadataMock.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n sendActionsMock.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n signActionsMock.mockResolvedValue(\n CommandResultFactory({ data: [exampleSignature] }),\n );\n\n const input: SignActionsDAInput = {\n derivationPath: \"44'/637'/0'/0'\",\n certificate: exampleCertificate,\n signedMetadata: exampleMetadata,\n actions: [],\n skipOpenApp: true,\n };\n\n const action = new SignActionsDeviceAction({ input });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signActionsDAStateSteps.SET_CERTIFICATE,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signActionsDAStateSteps.SEND_METADATA,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signActionsDAStateSteps.SEND_ACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: signActionsDAStateSteps.SIGN_ACTIONS,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: [exampleSignature],\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n SignActionsDAOutput,\n SignActionsDAError,\n SignActionsDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n SignActionsDAOutput,\n SignActionsDAInput,\n SignActionsDAError,\n SignActionsDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n\n it(\"happy path: SetCertificate -> SendMetadata -> SendAction -> SignActions\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Hyperliquid\", version: \"1.0.0\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n setCertificateMock.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n sendMetadataMock.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n sendActionsMock.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n const exampleSignature2 = [\n {\n r: \"0xcc\",\n s: \"0xdd\",\n v: 27,\n },\n {\n r: \"0xcc\",\n s: \"0xdd\",\n v: 27,\n },\n ];\n signActionsMock.mockResolvedValue(\n CommandResultFactory({ data: exampleSignature2 }),\n );\n\n const actions: HyperliquidAction[] = [\n {\n type: \"order\",\n orders: [\n {\n a: 0,\n b: true,\n p: \"100\",\n s: \"100\",\n t: {\n limit: {\n tif: \"Gtc\",\n },\n },\n r: false,\n },\n ],\n grouping: \"na\",\n builder: {\n b: \"0x1234567890123456789012345678901234567890\",\n f: 1,\n },\n nonce: 1,\n },\n {\n type: \"updateLeverage\",\n asset: 0,\n isCross: false,\n leverage: 10,\n nonce: 2,\n },\n ];\n const input: SignActionsDAInput = {\n derivationPath: \"44'/637'/0'/0'\",\n certificate: exampleCertificate,\n signedMetadata: exampleMetadata,\n actions,\n skipOpenApp: true,\n };\n\n // WHEN\n const action = new SignActionsDeviceAction({ input });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n // THEN\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signActionsDAStateSteps.SET_CERTIFICATE,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signActionsDAStateSteps.SEND_METADATA,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signActionsDAStateSteps.SEND_ACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: signActionsDAStateSteps.SIGN_ACTIONS,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: exampleSignature2,\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n SignActionsDAOutput,\n SignActionsDAError,\n SignActionsDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n SignActionsDAOutput,\n SignActionsDAInput,\n SignActionsDAError,\n SignActionsDAIntermediateValue\n >(action, expected, apiMock, {\n onDone: () => {\n expect(setCertificateMock).toHaveBeenCalledTimes(1);\n expect(setCertificateMock).toHaveBeenCalledWith({\n payload: exampleCertificate,\n keyUsageNumber: 0x11,\n });\n expect(sendMetadataMock).toHaveBeenCalledTimes(1);\n expect(sendMetadataMock).toHaveBeenCalledWith(exampleMetadata);\n expect(sendActionsMock).toHaveBeenCalledTimes(1);\n expect(sendActionsMock).toHaveBeenCalledWith(actions);\n expect(signActionsMock).toHaveBeenCalledTimes(1);\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"calls SetCertificate then SendMetadata then SendActions then SignActions in order (no actions)\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Hyperliquid\", version: \"1.0.0\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n const callOrder: string[] = [];\n setCertificateMock.mockImplementation(() => {\n callOrder.push(\"setCertificate\");\n return Promise.resolve(CommandResultFactory({ data: undefined }));\n });\n sendMetadataMock.mockImplementation(() => {\n callOrder.push(\"sendMetadata\");\n return Promise.resolve(CommandResultFactory({ data: undefined }));\n });\n sendActionsMock.mockImplementation(() => {\n callOrder.push(\"sendActions\");\n return Promise.resolve(CommandResultFactory({ data: undefined }));\n });\n signActionsMock.mockImplementation(() => {\n callOrder.push(\"signActions\");\n return Promise.resolve(\n CommandResultFactory({ data: [exampleSignature] }),\n );\n });\n\n const input: SignActionsDAInput = {\n derivationPath: \"44'/637'/0'/0'\",\n certificate: exampleCertificate,\n signedMetadata: exampleMetadata,\n actions: [],\n skipOpenApp: true,\n };\n\n const action = new SignActionsDeviceAction({ input });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signActionsDAStateSteps.SET_CERTIFICATE,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signActionsDAStateSteps.SEND_METADATA,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signActionsDAStateSteps.SEND_ACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: signActionsDAStateSteps.SIGN_ACTIONS,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: [exampleSignature],\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n SignActionsDAOutput,\n SignActionsDAError,\n SignActionsDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n SignActionsDAOutput,\n SignActionsDAInput,\n SignActionsDAError,\n SignActionsDAIntermediateValue\n >(action, expected, apiMock, {\n onDone: () => {\n expect(callOrder).toEqual([\n \"setCertificate\",\n \"sendMetadata\",\n \"sendActions\",\n \"signActions\",\n ]);\n resolve();\n },\n onError: reject,\n });\n }));\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["CommandResultFactory", "DeviceActionStatus", "DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "UserInteractionRequired", "beforeEach", "describe", "it", "vi", "signActionsDAStateSteps", "makeDeviceActionInternalApiMock", "setupOpenAppDAMock", "testDeviceActionStates", "SignActionsDeviceAction", "importOriginal", "exampleCertificate", "exampleMetadata", "exampleSignature", "apiMock", "setCertificateMock", "sendMetadataMock", "sendActionsMock", "signActionsMock", "extractDeps", "resolve", "reject", "input", "action", "expected", "exampleSignature2", "actions", "callOrder"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{vi as e}from"vitest";function r(){return{sendApdu:e.fn(),sendCommand:e.fn().mockResolvedValue(void 0),getDeviceModel:e.fn(),getDeviceSessionState:e.fn(),getDeviceSessionStateObservable:e.fn(),setDeviceSessionState:e.fn(),getManagerApiService:e.fn(),getSecureChannelService:e.fn(),loggerFactory:e.fn(n=>({debug:e.fn(),info:e.fn(),warn:e.fn(),error:e.fn(),subscribers:[]}))}}export{r as makeDeviceActionInternalApiMock};
2
+ //# sourceMappingURL=makeInternalApi.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/device-action/__test-utils__/makeInternalApi.ts"],
4
+ "sourcesContent": ["import { type InternalApi } from \"@ledgerhq/device-management-kit\";\nimport { type Mocked } from \"vitest\";\nimport { vi } from \"vitest\";\n\nexport function makeDeviceActionInternalApiMock(): Mocked<InternalApi> {\n return {\n sendApdu: vi.fn(),\n sendCommand: vi.fn().mockResolvedValue(undefined),\n getDeviceModel: vi.fn(),\n getDeviceSessionState: vi.fn(),\n getDeviceSessionStateObservable: vi.fn(),\n setDeviceSessionState: vi.fn(),\n getManagerApiService: vi.fn(),\n getSecureChannelService: vi.fn(),\n loggerFactory: vi.fn((_tag: string) => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n })),\n };\n}\n"],
5
+ "mappings": "AAEA,OAAS,MAAAA,MAAU,SAEZ,SAASC,GAAuD,CACrE,MAAO,CACL,SAAUD,EAAG,GAAG,EAChB,YAAaA,EAAG,GAAG,EAAE,kBAAkB,MAAS,EAChD,eAAgBA,EAAG,GAAG,EACtB,sBAAuBA,EAAG,GAAG,EAC7B,gCAAiCA,EAAG,GAAG,EACvC,sBAAuBA,EAAG,GAAG,EAC7B,qBAAsBA,EAAG,GAAG,EAC5B,wBAAyBA,EAAG,GAAG,EAC/B,cAAeA,EAAG,GAAIE,IAAkB,CACtC,MAAOF,EAAG,GAAG,EACb,KAAMA,EAAG,GAAG,EACZ,KAAMA,EAAG,GAAG,EACZ,MAAOA,EAAG,GAAG,EACb,YAAa,CAAC,CAChB,EAAE,CACJ,CACF",
6
+ "names": ["vi", "makeDeviceActionInternalApiMock", "_tag"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{OpenAppDeviceAction as n,UserInteractionRequired as t}from"@ledgerhq/device-management-kit";import{Left as i,Right as o}from"purify-ts";import{assign as p,createMachine as r}from"xstate";const f=e=>{n.mockImplementation(()=>({makeStateMachine:vi.fn().mockImplementation(()=>r({initial:"pending",states:{pending:{entry:p({intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp}}),after:{0:"done"}},done:{type:"final"}},output:()=>e?i(e):o(void 0)}))}))};export{f as setupOpenAppDAMock};
2
+ //# sourceMappingURL=setupOpenAppDAMock.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.ts"],
4
+ "sourcesContent": ["import {\n OpenAppDeviceAction,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { type Mock } from \"vitest\";\nimport { assign, createMachine } from \"xstate\";\n\nexport const setupOpenAppDAMock = (error?: unknown) => {\n (OpenAppDeviceAction as Mock).mockImplementation(() => ({\n makeStateMachine: vi.fn().mockImplementation(() =>\n createMachine({\n initial: \"pending\",\n states: {\n pending: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n }),\n after: {\n 0: \"done\",\n },\n },\n done: {\n type: \"final\",\n },\n },\n output: () => (error ? Left(error) : Right(undefined)),\n }),\n ),\n }));\n};\n"],
5
+ "mappings": "AAAA,OACE,uBAAAA,EACA,2BAAAC,MACK,kCACP,OAAS,QAAAC,EAAM,SAAAC,MAAa,YAE5B,OAAS,UAAAC,EAAQ,iBAAAC,MAAqB,SAE/B,MAAMC,EAAsBC,GAAoB,CACpDP,EAA6B,mBAAmB,KAAO,CACtD,iBAAkB,GAAG,GAAG,EAAE,mBAAmB,IAC3CK,EAAc,CACZ,QAAS,UACT,OAAQ,CACN,QAAS,CACP,MAAOD,EAAO,CACZ,kBAAmB,CACjB,wBAAyBH,EAAwB,cACnD,CACF,CAAC,EACD,MAAO,CACL,EAAG,MACL,CACF,EACA,KAAM,CACJ,KAAM,OACR,CACF,EACA,OAAQ,IAAOM,EAAQL,EAAKK,CAAK,EAAIJ,EAAM,MAAS,CACtD,CAAC,CACH,CACF,EAAE,CACJ",
6
+ "names": ["OpenAppDeviceAction", "UserInteractionRequired", "Left", "Right", "assign", "createMachine", "setupOpenAppDAMock", "error"]
7
+ }
@@ -0,0 +1,2 @@
1
+ function p(n,i,c,{onDone:a,onError:t}){const r=[],{observable:o,cancel:u}=n._execute(c);return o.subscribe({next:e=>{r.push(e)},error:e=>{t(e)},complete:()=>{try{expect(r).toEqual(i),a()}catch(e){t(e)}}}),{observable:o,cancel:u}}export{p as testDeviceActionStates};
2
+ //# sourceMappingURL=testDeviceActionStates.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.ts"],
4
+ "sourcesContent": ["import {\n type DeviceAction,\n type DeviceActionIntermediateValue,\n type DeviceActionState,\n type DmkError,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\n\n/**\n * Test that the states emitted by a device action match the expected states.\n * @param deviceAction The device action to test.\n * @param expectedStates The expected states.\n * @param callbacks { onDone, onError } The callbacks to call when the test is done or an error occurs.\n */\nexport function testDeviceActionStates<\n Output,\n Input,\n Error extends DmkError,\n IntermediateValue extends DeviceActionIntermediateValue,\n>(\n deviceAction: DeviceAction<Output, Input, Error, IntermediateValue>,\n expectedStates: Array<DeviceActionState<Output, Error, IntermediateValue>>,\n internalApi: InternalApi,\n {\n onDone,\n onError,\n }: {\n onDone: () => void;\n onError: (error: Error) => void;\n },\n) {\n const observedStates: Array<\n DeviceActionState<Output, Error, IntermediateValue>\n > = [];\n\n const { observable, cancel } = deviceAction._execute(internalApi);\n observable.subscribe({\n next: (state) => {\n observedStates.push(state);\n },\n error: (error) => {\n onError(error);\n },\n complete: () => {\n try {\n expect(observedStates).toEqual(expectedStates);\n onDone();\n } catch (e) {\n onError(e as Error);\n }\n },\n });\n return { observable, cancel };\n}\n"],
5
+ "mappings": "AAcO,SAASA,EAMdC,EACAC,EACAC,EACA,CACE,OAAAC,EACA,QAAAC,CACF,EAIA,CACA,MAAMC,EAEF,CAAC,EAEC,CAAE,WAAAC,EAAY,OAAAC,CAAO,EAAIP,EAAa,SAASE,CAAW,EAChE,OAAAI,EAAW,UAAU,CACnB,KAAOE,GAAU,CACfH,EAAe,KAAKG,CAAK,CAC3B,EACA,MAAQC,GAAU,CAChBL,EAAQK,CAAK,CACf,EACA,SAAU,IAAM,CACd,GAAI,CACF,OAAOJ,CAAc,EAAE,QAAQJ,CAAc,EAC7CE,EAAO,CACT,OAAS,EAAG,CACVC,EAAQ,CAAU,CACpB,CACF,CACF,CAAC,EACM,CAAE,WAAAE,EAAY,OAAAC,CAAO,CAC9B",
6
+ "names": ["testDeviceActionStates", "deviceAction", "expectedStates", "internalApi", "onDone", "onError", "observedStates", "observable", "cancel", "state", "error"]
7
+ }
@@ -1,2 +1,2 @@
1
- const p={AppBinding:Symbol.for("AppBinding")};export{p as appBinderTypes};
1
+ const e={AppBinding:Symbol.for("AppBinding")};export{e as appBinderTypes};
2
2
  //# sourceMappingURL=appBinderTypes.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/di/appBinderTypes.ts"],
4
- "sourcesContent": ["export const appBinderTypes = {\n AppBinding: Symbol.for(\"AppBinding\"),\n} as const;\n"],
5
- "mappings": "AAAO,MAAMA,EAAiB,CAC5B,WAAY,OAAO,IAAI,YAAY,CACrC",
4
+ "sourcesContent": ["import type { HexaString } from \"@ledgerhq/device-management-kit\";\n\nexport const appBinderTypes = {\n AppBinding: Symbol.for(\"AppBinding\"),\n} as const;\n\n/** Order structure used in Hyperliquid actions (create_order / update_order). */\nexport type Order = {\n a: number; // Asset\n b: boolean; // buy: true, sell: false\n p: string; // Price in USDC\n s: string; // Size is the price in coin/token unit\n r: boolean; // reduceOnly\n t:\n | {\n limit: {\n tif: \"Alo\" | \"Ioc\" | \"Gtc\";\n };\n }\n | {\n trigger: {\n isMarket: boolean;\n triggerPx: string;\n tpsl: \"tp\" | \"sl\";\n };\n }; // Type\n};\n\n/**\n * One action to send to the device. The task will serialize it to TLV\n * and send it via SendActionCommand.\n * Serialization follows specs.md \"Set action to sign\" (create_order / update_order / cancel_order / leverage / approveBuilderFee).\n */\nexport type HyperliquidAction =\n | {\n readonly type: \"order\";\n orders: Order[];\n grouping: \"na\" | \"normalTpsl\" | \"positionTpsl\";\n builder?: {\n b: HexaString;\n f: number;\n };\n nonce: number;\n }\n | {\n type: \"modify\";\n modifies: {\n oid: number;\n order: Order;\n }[];\n nonce: number;\n }\n | {\n type: \"batchModify\";\n modifies: {\n oid: number;\n order: Order;\n }[];\n nonce: number;\n }\n | {\n type: \"cancel\";\n cancels: {\n a: number; // asset id\n o: number; // oid\n }[];\n nonce: number;\n }\n | {\n type: \"updateLeverage\";\n asset: number; // index of coin\n isCross: boolean; // cross-leverage\n leverage: number;\n nonce: number;\n }\n | {\n type: \"approveBuilderFee\";\n hyperliquidChain: \"Mainnet\" | \"Testnet\";\n signatureChainId: string; // chainId in hex format. Ex: 0xa4b1 for Arbitrum\n maxFeeRate: string;\n builder: HexaString;\n nonce: number;\n }\n | {\n type: \"updateIsolatedMargin\";\n asset: number; // index of coin\n isBuy: boolean; // cross-leverage\n ntli: number;\n nonce: number;\n };\n"],
5
+ "mappings": "AAEO,MAAMA,EAAiB,CAC5B,WAAY,OAAO,IAAI,YAAY,CACrC",
6
6
  "names": ["appBinderTypes"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ import{CommandResultFactory as e,isSuccessCommandResult as n}from"@ledgerhq/device-management-kit";import{SendActionCommand as s}from"../../app-binder/command/SendActionCommand";import{serializeActionToTlv as a}from"../../app-binder/utils/actionTlvSerializer";class l{constructor(i,r){this.api=i;this.args=r}async run(){const{actions:i}=this.args;for(const r of i){const o=a(r),t=await this.api.sendCommand(new s({serializedAction:o}));if(!n(t))return t}return e({data:void 0})}}export{l as SendActionsTask};
2
+ //# sourceMappingURL=SendActionsTask.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/SendActionsTask.ts"],
4
+ "sourcesContent": ["import {\n type CommandResult,\n CommandResultFactory,\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { SendActionCommand } from \"@internal/app-binder/command/SendActionCommand\";\nimport { type HyperliquidErrorCodes } from \"@internal/app-binder/command/utils/hyperliquidApplicationErrors\";\nimport type { HyperliquidAction } from \"@internal/app-binder/di/appBinderTypes\";\nimport { serializeActionToTlv } from \"@internal/app-binder/utils/actionTlvSerializer\";\n\nexport type SendActionsTaskArgs = {\n actions: HyperliquidAction[];\n};\n\n/**\n * Sends a list of actions to the device by serializing each action to TLV\n * and calling SendActionCommand in sequence.\n */\nexport class SendActionsTask {\n constructor(\n private api: InternalApi,\n private args: SendActionsTaskArgs,\n ) {}\n\n async run(): Promise<CommandResult<void, HyperliquidErrorCodes>> {\n const { actions } = this.args;\n\n for (const action of actions) {\n const serialized = serializeActionToTlv(action);\n const result = await this.api.sendCommand(\n new SendActionCommand({ serializedAction: serialized }),\n );\n\n if (!isSuccessCommandResult(result)) {\n return result;\n }\n }\n\n return CommandResultFactory({ data: undefined });\n }\n}\n"],
5
+ "mappings": "AAAA,OAEE,wBAAAA,EAEA,0BAAAC,MACK,kCAEP,OAAS,qBAAAC,MAAyB,iDAGlC,OAAS,wBAAAC,MAA4B,iDAU9B,MAAMC,CAAgB,CAC3B,YACUC,EACAC,EACR,CAFQ,SAAAD,EACA,UAAAC,CACP,CAEH,MAAM,KAA2D,CAC/D,KAAM,CAAE,QAAAC,CAAQ,EAAI,KAAK,KAEzB,UAAWC,KAAUD,EAAS,CAC5B,MAAME,EAAaN,EAAqBK,CAAM,EACxCE,EAAS,MAAM,KAAK,IAAI,YAC5B,IAAIR,EAAkB,CAAE,iBAAkBO,CAAW,CAAC,CACxD,EAEA,GAAI,CAACR,EAAuBS,CAAM,EAChC,OAAOA,CAEX,CAEA,OAAOV,EAAqB,CAAE,KAAM,MAAU,CAAC,CACjD,CACF",
6
+ "names": ["CommandResultFactory", "isSuccessCommandResult", "SendActionCommand", "serializeActionToTlv", "SendActionsTask", "api", "args", "actions", "action", "serialized", "result"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{CommandResultFactory as d,hexaStringToBuffer as o,UnknownDeviceExchangeError as p}from"@ledgerhq/device-management-kit";import{beforeEach as u,describe as f,expect as n,it as i}from"vitest";import{SendActionCommand as s}from"../../app-binder/command/SendActionCommand";import{makeDeviceActionInternalApiMock as C}from"../../app-binder/device-action/__test-utils__/makeInternalApi";import{SendActionsTask as c}from"./SendActionsTask";f("SendActionsTask",()=>{const e=C();u(()=>{e.sendCommand.mockClear(),e.sendCommand.mockResolvedValue(d({data:void 0}))}),i.each([{action:{type:"order",orders:[{a:42,b:!0,p:"1992",s:"0.512",t:{limit:{tif:"Ioc"}},r:!1}],grouping:"na",builder:{b:"0xc0708cdd6cd166d51da264e3f49a0422be26e35b",f:100},nonce:1770816625873},expectedSerialization:"01012c02010181d0010081da06019c4ce55cd181db4b81dd2681e0010081d1012a81e2010181e3043139393281e405302e35313281e5010081d70481e6010181ea010081eb1b81d314c0708cdd6cd166d51da264e3f49a0422be26e35b81ec0164"},{action:{type:"batchModify",modifies:[{oid:343050796655,order:{a:0,b:!1,p:"85169",s:"0.0005",r:!0,t:{trigger:{isMarket:!0,triggerPx:"85169",tpsl:"tp"}}}}],nonce:1773050015814},expectedSerialization:"01012c02010181d0010181da06019CD204304681db4581d84281dd3481e0010181d1010081e2010081e305383531363981e406302E3030303581e5010181d71081e7010181e805383531363981e9010081dc080000004FDF6BBE6F"},{action:{type:"cancel",cancels:[{a:0,o:340574409238}],nonce:1772813983827},expectedSerialization:"01012c02010181d0010281da06019CC3F2A05381db1281d90f81d1010081dc080000004F4BD11216"}])("calls SendActionCommand once when actions has one item",async({action:t,expectedSerialization:a})=>{const r=await new c(e,{actions:[t]}).run();n(r).toEqual(d({data:void 0})),n(e.sendCommand).toHaveBeenCalledTimes(1);const m=o(a);n(e.sendCommand).toHaveBeenCalledWith(new s({serializedAction:m}))}),i.each([{actions:[{type:"order",orders:[{a:0,b:!0,p:"1",s:"1",t:{limit:{tif:"Gtc"}},r:!1}],grouping:"na",nonce:1},{type:"cancel",cancels:[{a:0,o:42}],nonce:2},{type:"updateLeverage",asset:0,isCross:!1,leverage:10,nonce:3}],expectedSerializations:[o("01012c02010181d0010081da010181db2681dd1f81e0010081d1010081e2010181e3013181e4013181e5010081d70481e6010281ea0100"),o("01012c02010181d0010281da010281db1281d90f81d1010081dc08000000000000002a"),o("01012c02010181d0010381da010381db1381d1010081de010081ed08000000000000000a")]}])("calls SendActionCommand multiple times in order when actions has several items",async({actions:t,expectedSerializations:a})=>{await new c(e,{actions:t}).run(),n(e.sendCommand).toHaveBeenCalledTimes(3),n(e.sendCommand).toHaveBeenNthCalledWith(1,new s({serializedAction:a[0]})),n(e.sendCommand).toHaveBeenNthCalledWith(2,new s({serializedAction:a[1]})),n(e.sendCommand).toHaveBeenNthCalledWith(3,new s({serializedAction:a[2]}))}),i("returns error result and stops on first SendActionCommand failure",async()=>{const t=d({error:new p});e.sendCommand.mockResolvedValueOnce(d({data:void 0})).mockResolvedValueOnce(t);const a=[{type:"order",orders:[{a:0,b:!1,p:"1",s:"1",t:{limit:{tif:"Gtc"}},r:!1}],grouping:"na",nonce:1},{type:"cancel",cancels:[{a:0,o:1}],nonce:2}],r=await new c(e,{actions:a}).run();n(r).toStrictEqual(t),n(e.sendCommand).toHaveBeenCalledTimes(2)}),i("returns success when actions is empty",async()=>{const a=await new c(e,{actions:[]}).run();n(a).toEqual(d({data:void 0})),n(e.sendCommand).not.toHaveBeenCalled()})});
2
+ //# sourceMappingURL=SendActionsTask.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/SendActionsTask.test.ts"],
4
+ "sourcesContent": ["import {\n CommandResultFactory,\n hexaStringToBuffer,\n UnknownDeviceExchangeError,\n} from \"@ledgerhq/device-management-kit\";\nimport { beforeEach, describe, expect, it, type vi } from \"vitest\";\n\nimport { SendActionCommand } from \"@internal/app-binder/command/SendActionCommand\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport type { HyperliquidAction } from \"@internal/app-binder/di/appBinderTypes\";\n\nimport { SendActionsTask } from \"./SendActionsTask\";\n\ndescribe(\"SendActionsTask\", () => {\n const apiMock = makeDeviceActionInternalApiMock();\n\n beforeEach(() => {\n apiMock.sendCommand.mockClear();\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n });\n\n it.each([\n {\n action: {\n type: \"order\",\n orders: [\n {\n a: 42,\n b: true,\n p: \"1992\",\n s: \"0.512\",\n t: {\n limit: {\n tif: \"Ioc\",\n },\n },\n r: false,\n },\n ],\n grouping: \"na\",\n builder: {\n b: \"0xc0708cdd6cd166d51da264e3f49a0422be26e35b\",\n f: 100,\n },\n nonce: 1770816625873,\n } satisfies HyperliquidAction,\n expectedSerialization:\n // prettier-ignore\n /* eslint-disable prettier/prettier */\n \"01012c\" +\n \"020101\" +\n \"81d00100\" +\n \"81da06019c4ce55cd1\" +\n \"81db4b\" +\n \"81dd26\" +\n \"81e00100\" +\n \"81d1012a\" +\n \"81e20101\" +\n \"81e30431393932\" +\n \"81e405302e353132\" +\n \"81e50100\" +\n \"81d704\" + // ORDER_DETAIL\n \"81e60101\" + // TIF\n \"81ea0100\" + // GROUPING\n \"81eb1b\" + //BUILDER\n \"81d314c0708cdd6cd166d51da264e3f49a0422be26e35b\" + // BUILDER_ADDRESS\n \"81ec0164\", // BUILDER_FEE\n /* eslint-enable prettier/prettier */\n },\n {\n action: {\n type: \"batchModify\",\n modifies: [\n {\n oid: 343050796655,\n order: {\n a: 0,\n b: false,\n p: \"85169\",\n s: \"0.0005\",\n r: true,\n t: {\n trigger: {\n isMarket: true,\n triggerPx: \"85169\",\n tpsl: \"tp\",\n },\n },\n },\n },\n ],\n nonce: 1773050015814,\n } satisfies HyperliquidAction,\n expectedSerialization:\n // prettier-ignore\n /* eslint-disable prettier/prettier */\n \"01012c\" + // STRUCTURE_TYPE\n \"020101\" + // VERSION\n \"81d00101\" + // ACTION_TYPE\n \"81da06019CD2043046\" + // NONCE\n \"81db45\" + // ACTION_STRUCTURE\n \"81d842\" + // UPDATE_ORDERS\n \"81dd34\" + // ORDER\n \"81e00101\" + // ORDER_TYPE\n \"81d10100\" + // ASSET_ID\n \"81e20100\" + // BUY_OR_NOT\n \"81e3053835313639\" + // PRICE\n \"81e406302E30303035\" + // SIZE\n \"81e50101\" + // REDUCE_ONLY\n \"81d710\" + // ORDER_DETAIL\n \"81e70101\" + // TRIGGER_MARKET\n \"81e8053835313639\" + // TRIGGER_PRICE\n \"81e90100\" + // TRIGGER_TYPE\n \"81dc080000004FDF6BBE6F\", // ORDER_ID\n /* eslint-enable prettier/prettier */\n },\n {\n action: {\n type: \"cancel\",\n cancels: [\n {\n a: 0,\n o: 340574409238,\n },\n ],\n nonce: 1772813983827,\n } satisfies HyperliquidAction,\n expectedSerialization:\n // prettier-ignore\n /* eslint-disable prettier/prettier */\n \"01012c\" + // STRUCTURE_TYPE\n \"020101\" + // VERSION\n \"81d00102\" + // ACTION_TYPE\n \"81da06019CC3F2A053\" + // NONCE\n \"81db12\" + // ACTION_STRUCTURE\n \"81d90f\" + // CANCEL_ORDERS\n \"81d10100\" + // ASSET_ID\n \"81dc080000004F4BD11216\", // ORDER_ID\n /* eslint-enable prettier/prettier */\n },\n ])(\n \"calls SendActionCommand once when actions has one item\",\n async ({ action, expectedSerialization }) => {\n // GIVEN one action\n // WHEN\n const task = new SendActionsTask(apiMock, { actions: [action] });\n const result = await task.run();\n\n // THEN\n expect(result).toEqual(\n CommandResultFactory({\n data: undefined,\n }),\n );\n expect(apiMock.sendCommand).toHaveBeenCalledTimes(1);\n\n const expectedBytes = hexaStringToBuffer(expectedSerialization)!;\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendActionCommand({\n serializedAction: expectedBytes,\n }),\n );\n },\n );\n\n it.each([\n {\n actions: [\n {\n type: \"order\",\n orders: [\n {\n a: 0,\n b: true,\n p: \"1\",\n s: \"1\",\n t: { limit: { tif: \"Gtc\" } },\n r: false,\n },\n ],\n grouping: \"na\",\n nonce: 1,\n },\n {\n type: \"cancel\",\n cancels: [{ a: 0, o: 42 }],\n nonce: 2,\n },\n {\n type: \"updateLeverage\",\n asset: 0,\n isCross: false,\n leverage: 10,\n nonce: 3,\n },\n ] satisfies HyperliquidAction[],\n expectedSerializations: [\n hexaStringToBuffer(\n \"01012c02010181d0010081da010181db2681dd1f81e0010081d1010081e2010181e3013181e4013181e5010081d70481e6010281ea0100\",\n )!,\n hexaStringToBuffer(\n \"01012c02010181d0010281da010281db1281d90f81d1010081dc08000000000000002a\",\n )!,\n hexaStringToBuffer(\n \"01012c02010181d0010381da010381db1381d1010081de010081ed08000000000000000a\",\n )!,\n ],\n },\n ])(\n \"calls SendActionCommand multiple times in order when actions has several items\",\n async ({ actions, expectedSerializations }) => {\n // GIVEN several actions\n // WHEN\n const task = new SendActionsTask(apiMock, { actions });\n await task.run();\n\n // THEN\n expect(apiMock.sendCommand).toHaveBeenCalledTimes(3);\n\n expect(apiMock.sendCommand).toHaveBeenNthCalledWith(\n 1,\n new SendActionCommand({\n serializedAction: expectedSerializations[0]!,\n }),\n );\n\n expect(apiMock.sendCommand).toHaveBeenNthCalledWith(\n 2,\n new SendActionCommand({\n serializedAction: expectedSerializations[1]!,\n }),\n );\n\n expect(apiMock.sendCommand).toHaveBeenNthCalledWith(\n 3,\n new SendActionCommand({\n serializedAction: expectedSerializations[2]!,\n }),\n );\n },\n );\n\n it(\"returns error result and stops on first SendActionCommand failure\", async () => {\n // GIVEN api returns success for first command then error for second\n const errorResult = CommandResultFactory({\n error: new UnknownDeviceExchangeError(),\n });\n (apiMock.sendCommand as ReturnType<typeof vi.fn>)\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(errorResult);\n\n const actions: HyperliquidAction[] = [\n {\n type: \"order\",\n orders: [\n {\n a: 0,\n b: false,\n p: \"1\",\n s: \"1\",\n t: { limit: { tif: \"Gtc\" } },\n r: false,\n },\n ],\n grouping: \"na\",\n nonce: 1,\n },\n {\n type: \"cancel\",\n cancels: [{ a: 0, o: 1 }],\n nonce: 2,\n },\n ];\n\n // WHEN\n const task = new SendActionsTask(apiMock, { actions });\n const result = await task.run();\n\n // THEN\n expect(result).toStrictEqual(errorResult);\n expect(apiMock.sendCommand).toHaveBeenCalledTimes(2);\n });\n\n it(\"returns success when actions is empty\", async () => {\n // GIVEN empty actions\n // WHEN\n const task = new SendActionsTask(apiMock, { actions: [] });\n const result = await task.run();\n\n // THEN\n expect(result).toEqual(\n CommandResultFactory({\n data: undefined,\n }),\n );\n expect(apiMock.sendCommand).not.toHaveBeenCalled();\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["CommandResultFactory", "hexaStringToBuffer", "UnknownDeviceExchangeError", "beforeEach", "describe", "expect", "it", "SendActionCommand", "makeDeviceActionInternalApiMock", "SendActionsTask", "apiMock", "action", "expectedSerialization", "result", "expectedBytes", "actions", "expectedSerializations", "errorResult"]
7
+ }
@@ -1,2 +1,2 @@
1
- import{CommandResultFactory as r,isSuccessCommandResult as i}from"@ledgerhq/device-management-kit";import{SignActionCommand as a}from"../../app-binder/command/SignActionCommand";class m{constructor(t,s){this.api=t;this.args=s}async run(){const t=await this.api.sendCommand(new a({derivationPath:this.args.derivationPath,Actions:this.args.Actions}));return i(t)?r({data:t.data.signature}):t}}export{m as SignActionsTask};
1
+ import{CommandResultFactory as n,isSuccessCommandResult as s}from"@ledgerhq/device-management-kit";import{SignActionsCommand as e}from"../../app-binder/command/SignActionsCommand";class m{constructor(r,t){this.api=r;this.args=t}async run(){return await this.signAction()}async signAction(r){const t=await this.api.sendCommand(new e(this.args));if(!s(t))return t;const i=r?[...r,t.data.signature]:[t.data.signature];return t.data.signaturesLeft!==0?await this.signAction(i):n({data:i})}}export{m as SignActionsTask};
2
2
  //# sourceMappingURL=SignActionsTask.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/task/SignActionsTask.ts"],
4
- "sourcesContent": ["import {\n type CommandResult,\n CommandResultFactory,\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type Signature } from \"@api/model/Signature\";\nimport { SignActionCommand } from \"@internal/app-binder/command/SignActionCommand\";\nimport { type HyperliquidErrorCodes } from \"@internal/app-binder/command/utils/hyperliquidApplicationErrors\";\n\ntype SignActionsTaskArgs = {\n derivationPath: string;\n Actions: Uint8Array;\n};\n\nexport class SignActionsTask {\n constructor(\n private api: InternalApi,\n private args: SignActionsTaskArgs,\n ) {}\n\n async run(): Promise<CommandResult<Signature, HyperliquidErrorCodes>> {\n // TODO: Adapt this implementation to your blockchain's signing protocol\n // For Actionss larger than a single APDU, you may need to:\n // 1. Split the Actions into chunks\n // 2. Send each chunk with appropriate first/continue flags\n // 3. Collect the final signature from the last response\n\n const result = await this.api.sendCommand(\n new SignActionCommand({\n derivationPath: this.args.derivationPath,\n Actions: this.args.Actions,\n }),\n );\n\n if (!isSuccessCommandResult(result)) {\n return result;\n }\n\n return CommandResultFactory({\n data: result.data.signature,\n });\n }\n}\n"],
5
- "mappings": "AAAA,OAEE,wBAAAA,EAEA,0BAAAC,MACK,kCAGP,OAAS,qBAAAC,MAAyB,iDAQ3B,MAAMC,CAAgB,CAC3B,YACUC,EACAC,EACR,CAFQ,SAAAD,EACA,UAAAC,CACP,CAEH,MAAM,KAAgE,CAOpE,MAAMC,EAAS,MAAM,KAAK,IAAI,YAC5B,IAAIJ,EAAkB,CACpB,eAAgB,KAAK,KAAK,eAC1B,QAAS,KAAK,KAAK,OACrB,CAAC,CACH,EAEA,OAAKD,EAAuBK,CAAM,EAI3BN,EAAqB,CAC1B,KAAMM,EAAO,KAAK,SACpB,CAAC,EALQA,CAMX,CACF",
6
- "names": ["CommandResultFactory", "isSuccessCommandResult", "SignActionCommand", "SignActionsTask", "api", "args", "result"]
4
+ "sourcesContent": ["import {\n type CommandResult,\n CommandResultFactory,\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type Signature } from \"@api/model/Signature\";\nimport { SignActionsCommand } from \"@internal/app-binder/command/SignActionsCommand\";\nimport { type HyperliquidErrorCodes } from \"@internal/app-binder/command/utils/hyperliquidApplicationErrors\";\n\nexport type SignActionsTaskArgs = {\n derivationPath: string;\n};\n\nexport class SignActionsTask {\n constructor(\n private api: InternalApi,\n private args: SignActionsTaskArgs,\n ) {}\n\n async run(): Promise<CommandResult<Signature[], HyperliquidErrorCodes>> {\n const result = await this.signAction();\n\n return result;\n }\n\n private async signAction(\n signatures?: Signature[],\n ): Promise<CommandResult<Signature[], HyperliquidErrorCodes>> {\n const result = await this.api.sendCommand(\n new SignActionsCommand(this.args),\n );\n\n if (!isSuccessCommandResult(result)) {\n return result;\n }\n\n const nextSignatures = signatures\n ? [...signatures, result.data.signature]\n : [result.data.signature];\n\n if (result.data.signaturesLeft !== 0) {\n return await this.signAction(nextSignatures);\n } else {\n return CommandResultFactory({\n data: nextSignatures,\n });\n }\n }\n}\n"],
5
+ "mappings": "AAAA,OAEE,wBAAAA,EAEA,0BAAAC,MACK,kCAGP,OAAS,sBAAAC,MAA0B,kDAO5B,MAAMC,CAAgB,CAC3B,YACUC,EACAC,EACR,CAFQ,SAAAD,EACA,UAAAC,CACP,CAEH,MAAM,KAAkE,CAGtE,OAFe,MAAM,KAAK,WAAW,CAGvC,CAEA,MAAc,WACZC,EAC4D,CAC5D,MAAMC,EAAS,MAAM,KAAK,IAAI,YAC5B,IAAIL,EAAmB,KAAK,IAAI,CAClC,EAEA,GAAI,CAACD,EAAuBM,CAAM,EAChC,OAAOA,EAGT,MAAMC,EAAiBF,EACnB,CAAC,GAAGA,EAAYC,EAAO,KAAK,SAAS,EACrC,CAACA,EAAO,KAAK,SAAS,EAE1B,OAAIA,EAAO,KAAK,iBAAmB,EAC1B,MAAM,KAAK,WAAWC,CAAc,EAEpCR,EAAqB,CAC1B,KAAMQ,CACR,CAAC,CAEL,CACF",
6
+ "names": ["CommandResultFactory", "isSuccessCommandResult", "SignActionsCommand", "SignActionsTask", "api", "args", "signatures", "result", "nextSignatures"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ import{CommandResultFactory as u,isSuccessCommandResult as s,UnknownDeviceExchangeError as l}from"@ledgerhq/device-management-kit";import{beforeEach as f,describe as g,expect as a,it as d}from"vitest";import{SignActionsCommand as o}from"../../app-binder/command/SignActionsCommand";import{makeDeviceActionInternalApiMock as v}from"../../app-binder/device-action/__test-utils__/makeInternalApi";import{SignActionsTask as c}from"./SignActionsTask";const n="44'/637'/0'/0'",i=e=>u({data:{signaturesLeft:e.signaturesLeft,signature:{r:e.r??"1a7718eede70393bbc640a649ee65401748953a1b671ffa15fea9cb7e2092898",s:e.s??"37e2621d96135f05f54fe891bb5850a94003717dfe228c270fba5d8e7f35b590",v:e.v??28}}});g("SignActionsTask",()=>{const e=v();f(()=>{e.sendCommand.mockClear()}),d("returns error when sendCommand returns an error",async()=>{const r=u({error:new l});e.sendCommand.mockResolvedValue(r);const m=await new c(e,{derivationPath:n}).run();a(s(m)).toBe(!1),a(m).toEqual(r),a(e.sendCommand).toHaveBeenCalledTimes(1),a(e.sendCommand).toHaveBeenCalledWith(new o({derivationPath:n}))}),d("returns one signature when device returns signaturesLeft 0 on first call",async()=>{e.sendCommand.mockResolvedValue(i({signaturesLeft:0}));const t=await new c(e,{derivationPath:n}).run();if(a(s(t)).toBe(!0),!s(t))throw new Error("Unexpected");a(t.data).toHaveLength(1),a(t.data[0]).toEqual({r:"1a7718eede70393bbc640a649ee65401748953a1b671ffa15fea9cb7e2092898",s:"37e2621d96135f05f54fe891bb5850a94003717dfe228c270fba5d8e7f35b590",v:28}),a(e.sendCommand).toHaveBeenCalledTimes(1)}),d("returns three signatures when device returns signaturesLeft 2, 1, 0 across three calls",async()=>{e.sendCommand.mockResolvedValueOnce(i({signaturesLeft:2,r:"sig1_r",s:"sig1_s",v:27})).mockResolvedValueOnce(i({signaturesLeft:1,r:"sig2_r",s:"sig2_s",v:28})).mockResolvedValueOnce(i({signaturesLeft:0,r:"sig3_r",s:"sig3_s",v:27}));const t=await new c(e,{derivationPath:n}).run();if(a(s(t)).toBe(!0),!s(t))throw new Error("Unexpected");a(t.data).toHaveLength(3),a(t.data[0]).toEqual({r:"sig1_r",s:"sig1_s",v:27}),a(t.data[1]).toEqual({r:"sig2_r",s:"sig2_s",v:28}),a(t.data[2]).toEqual({r:"sig3_r",s:"sig3_s",v:27}),a(e.sendCommand).toHaveBeenCalledTimes(3),a(e.sendCommand).toHaveBeenNthCalledWith(1,new o({derivationPath:n})),a(e.sendCommand).toHaveBeenNthCalledWith(2,new o({derivationPath:n})),a(e.sendCommand).toHaveBeenNthCalledWith(3,new o({derivationPath:n}))})});
2
+ //# sourceMappingURL=SignActionsTask.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/SignActionsTask.test.ts"],
4
+ "sourcesContent": ["import {\n CommandResultFactory,\n isSuccessCommandResult,\n UnknownDeviceExchangeError,\n} from \"@ledgerhq/device-management-kit\";\nimport { beforeEach, describe, expect, it } from \"vitest\";\n\nimport { SignActionsCommand } from \"@internal/app-binder/command/SignActionsCommand\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\n\nimport { SignActionsTask } from \"./SignActionsTask\";\n\nconst DEFAULT_DERIVATION_PATH = \"44'/637'/0'/0'\";\n\nconst createSignatureResponse = (overrides: {\n signaturesLeft: number;\n r?: string;\n s?: string;\n v?: number;\n}) =>\n CommandResultFactory({\n data: {\n signaturesLeft: overrides.signaturesLeft,\n signature: {\n r:\n overrides.r ??\n \"1a7718eede70393bbc640a649ee65401748953a1b671ffa15fea9cb7e2092898\",\n s:\n overrides.s ??\n \"37e2621d96135f05f54fe891bb5850a94003717dfe228c270fba5d8e7f35b590\",\n v: overrides.v ?? 0x1c,\n },\n },\n });\n\ndescribe(\"SignActionsTask\", () => {\n const apiMock = makeDeviceActionInternalApiMock();\n\n beforeEach(() => {\n apiMock.sendCommand.mockClear();\n });\n\n it(\"returns error when sendCommand returns an error\", async () => {\n // GIVEN\n const error = CommandResultFactory({\n error: new UnknownDeviceExchangeError(),\n });\n apiMock.sendCommand.mockResolvedValue(error);\n\n // WHEN\n const task = new SignActionsTask(apiMock, {\n derivationPath: DEFAULT_DERIVATION_PATH,\n });\n const result = await task.run();\n\n // THEN\n expect(isSuccessCommandResult(result)).toBe(false);\n expect(result).toEqual(error);\n expect(apiMock.sendCommand).toHaveBeenCalledTimes(1);\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SignActionsCommand({ derivationPath: DEFAULT_DERIVATION_PATH }),\n );\n });\n\n it(\"returns one signature when device returns signaturesLeft 0 on first call\", async () => {\n // GIVEN\n apiMock.sendCommand.mockResolvedValue(\n createSignatureResponse({ signaturesLeft: 0 }),\n );\n\n // WHEN\n const task = new SignActionsTask(apiMock, {\n derivationPath: DEFAULT_DERIVATION_PATH,\n });\n const result = await task.run();\n\n // THEN\n expect(isSuccessCommandResult(result)).toBe(true);\n if (!isSuccessCommandResult(result)) {\n throw new Error(\"Unexpected\");\n }\n expect(result.data).toHaveLength(1);\n expect(result.data[0]).toEqual({\n r: \"1a7718eede70393bbc640a649ee65401748953a1b671ffa15fea9cb7e2092898\",\n s: \"37e2621d96135f05f54fe891bb5850a94003717dfe228c270fba5d8e7f35b590\",\n v: 0x1c,\n });\n expect(apiMock.sendCommand).toHaveBeenCalledTimes(1);\n });\n\n it(\"returns three signatures when device returns signaturesLeft 2, 1, 0 across three calls\", async () => {\n // GIVEN\n apiMock.sendCommand\n .mockResolvedValueOnce(\n createSignatureResponse({\n signaturesLeft: 2,\n r: \"sig1_r\",\n s: \"sig1_s\",\n v: 27,\n }),\n )\n .mockResolvedValueOnce(\n createSignatureResponse({\n signaturesLeft: 1,\n r: \"sig2_r\",\n s: \"sig2_s\",\n v: 28,\n }),\n )\n .mockResolvedValueOnce(\n createSignatureResponse({\n signaturesLeft: 0,\n r: \"sig3_r\",\n s: \"sig3_s\",\n v: 27,\n }),\n );\n\n // WHEN\n const task = new SignActionsTask(apiMock, {\n derivationPath: DEFAULT_DERIVATION_PATH,\n });\n const result = await task.run();\n\n // THEN\n expect(isSuccessCommandResult(result)).toBe(true);\n if (!isSuccessCommandResult(result)) {\n throw new Error(\"Unexpected\");\n }\n expect(result.data).toHaveLength(3);\n expect(result.data[0]).toEqual({ r: \"sig1_r\", s: \"sig1_s\", v: 27 });\n expect(result.data[1]).toEqual({ r: \"sig2_r\", s: \"sig2_s\", v: 28 });\n expect(result.data[2]).toEqual({ r: \"sig3_r\", s: \"sig3_s\", v: 27 });\n expect(apiMock.sendCommand).toHaveBeenCalledTimes(3);\n expect(apiMock.sendCommand).toHaveBeenNthCalledWith(\n 1,\n new SignActionsCommand({ derivationPath: DEFAULT_DERIVATION_PATH }),\n );\n expect(apiMock.sendCommand).toHaveBeenNthCalledWith(\n 2,\n new SignActionsCommand({ derivationPath: DEFAULT_DERIVATION_PATH }),\n );\n expect(apiMock.sendCommand).toHaveBeenNthCalledWith(\n 3,\n new SignActionsCommand({ derivationPath: DEFAULT_DERIVATION_PATH }),\n );\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["CommandResultFactory", "isSuccessCommandResult", "UnknownDeviceExchangeError", "beforeEach", "describe", "expect", "it", "SignActionsCommand", "makeDeviceActionInternalApiMock", "SignActionsTask", "DEFAULT_DERIVATION_PATH", "createSignatureResponse", "overrides", "apiMock", "error", "result"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{ByteArrayBuilder as T}from"@ledgerhq/device-management-kit";const E=33024,n={STRUCTURE_TYPE:1,VERSION:2,CHAIN_ID:35,MAX_FEE:176,ACTION_TYPE:208,ASSET_ID:209,BUILDER_ADDRESS:211,NONCE:218,ACTION_STRUCTURE:219,ORDER_ID:220,ORDER:221,IS_CROSS:222,ORDER_TYPE:224,BUY_OR_NOT:226,PRICE:227,SIZE:228,REDUCE_ONLY:229,TIF:230,TRIGGER_MARKET:231,TRIGGER_PRICE:232,TRIGGER_TYPE:233,GROUPING:234,BUILDER_INFO:235,BUILDER_FEE:236,LEVERAGE:237,UPDATE_ORDERS:216,CANCEL_ORDERS:217,ORDER_DETAIL:215,NTLI:214},U=44,B=1,s={ORDER:0,MODIFY:1,CANCEL:2,UPDATE_LEVERAGE:3,APPROVAL_BUILDER_FEE:4,UPDATE_ISOLATED_MARGIN:5},D={LIMIT:0,TRIGGER:1},c={ALO:0,IOC:1,GTC:2},_={TP:0,SL:1},R={NA:0,NORMAL_TPSL:1,POSITION_TPSL:2};function x(e){switch(e.type){case"order":return s.ORDER;case"modify":case"batchModify":return s.MODIFY;case"cancel":return s.CANCEL;case"updateLeverage":return s.UPDATE_LEVERAGE;case"approveBuilderFee":return s.APPROVAL_BUILDER_FEE;case"updateIsolatedMargin":return s.UPDATE_ISOLATED_MARGIN;default:throw new Error(`Unknown action type: ${e.type}`)}}function O(e){switch(e){case"Alo":return c.ALO;case"Ioc":return c.IOC;case"Gtc":return c.GTC;default:return c.GTC}}function y(e){switch(e){case"na":return R.NA;case"normalTpsl":return R.NORMAL_TPSL;case"positionTpsl":return R.POSITION_TPSL;default:return R.NA}}function p(e,t=8){if(e<0||!Number.isInteger(e))throw new Error(`Expected non-negative integer, got ${e}`);if(!Number.isSafeInteger(e))throw new Error(`Value ${e} is not a safe integer`);const r=BigInt(e);if(r>0xffffffffffffffffn)throw new Error(`Value ${e} exceeds u64 range`);if(r===0n)return new Uint8Array([0]);const o=[];let a=r;for(;a>0n&&o.length<t;)o.unshift(Number(a&0xffn)),a>>=8n;return new Uint8Array(o)}function I(e,t,r,o=8){t>127?e.add16BitUIntToData(E+t):e.add8BitUIntToData(t);const a=p(r,o);e.add8BitUIntToData(a.length),e.addBufferToData(a)}function i(e,t,r){t>127?e.add16BitUIntToData(E+t):e.add8BitUIntToData(t),e.add8BitUIntToData(1),e.add8BitUIntToData(r)}function u(e,t,r){t>127?e.add16BitUIntToData(E+t):e.add8BitUIntToData(t),e.add8BitUIntToData(8),e.add64BitUIntToData(r)}function f(e,t,r){t>127?e.add16BitUIntToData(E+t):e.add8BitUIntToData(t),e.encodeInLVFromAscii(r)}function d(e,t,r){t>127?e.add16BitUIntToData(E+t):e.add8BitUIntToData(t),e.encodeInLVFromBuffer(r)}function l(e){const t=new T,r="limit"in e.t,o=e.t;i(t,n.ORDER_TYPE,r?D.LIMIT:D.TRIGGER),I(t,n.ASSET_ID,e.a),i(t,n.BUY_OR_NOT,e.b?1:0),f(t,n.PRICE,e.p),f(t,n.SIZE,e.s),i(t,n.REDUCE_ONLY,e.r?1:0);const a=new T;return r&&"limit"in o?i(a,n.TIF,O(o.limit.tif)):"trigger"in o&&(i(a,n.TRIGGER_MARKET,o.trigger.isMarket?1:0),f(a,n.TRIGGER_PRICE,o.trigger.triggerPx),i(a,n.TRIGGER_TYPE,o.trigger.tpsl==="tp"?_.TP:_.SL)),d(t,n.ORDER_DETAIL,a.build()),t.build()}function A(e,t,r){t>127?e.add16BitUIntToData(E+t):e.add8BitUIntToData(t),e.encodeInLVFromHexa(r)}function m(e){const t=new T;switch(e.type){case"order":{const r=e.orders[0];if(!r)throw new Error("order action must have at least one order");const o=l(r);if(d(t,n.ORDER,o),i(t,n.GROUPING,y(e.grouping)),e.builder!==void 0){const a=new T;A(a,n.BUILDER_ADDRESS,e.builder.b),I(a,n.BUILDER_FEE,e.builder.f),d(t,n.BUILDER_INFO,a.build())}break}case"modify":case"batchModify":{if(!e.modifies.length)throw new Error("modify action must have at least one modify");const r=new T;for(const a of e.modifies)d(r,n.ORDER,l(a.order)),u(r,n.ORDER_ID,a.oid);const o=r.build();d(t,n.UPDATE_ORDERS,o);break}case"cancel":{if(!e.cancels.length)throw new Error("cancel action must have at least one cancel");const r=new T;for(const a of e.cancels)I(r,n.ASSET_ID,a.a),u(r,n.ORDER_ID,a.o);const o=r.build();d(t,n.CANCEL_ORDERS,o);break}case"updateLeverage":{I(t,n.ASSET_ID,e.asset),i(t,n.IS_CROSS,e.isCross?1:0),u(t,n.LEVERAGE,e.leverage);break}case"approveBuilderFee":A(t,n.CHAIN_ID,e.signatureChainId),f(t,n.MAX_FEE,e.maxFeeRate),A(t,n.BUILDER_ADDRESS,e.builder);break;case"updateIsolatedMargin":I(t,n.ASSET_ID,e.asset),i(t,n.BUY_OR_NOT,e.isBuy?1:0),u(t,n.NTLI,e.ntli);break;default:break}return t.build()}function L(e){const t=new T,r=x(e),o=m(e);return t.add8BitUIntToData(n.STRUCTURE_TYPE).add8BitUIntToData(1).add8BitUIntToData(U),t.add8BitUIntToData(n.VERSION).add8BitUIntToData(1).add8BitUIntToData(B),t.add16BitUIntToData(E+n.ACTION_TYPE).add8BitUIntToData(1).add8BitUIntToData(r),I(t,n.NONCE,e.nonce),d(t,n.ACTION_STRUCTURE,o),t.build()}export{s as ACTION_TYPE,U as STRUCTURE_TYPE_VALUE,n as TLV_TAG,B as VERSION_VALUE,m as buildActionStructure,L as serializeActionToTlv,l as serializeOrderToTlv};
2
+ //# sourceMappingURL=actionTlvSerializer.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/utils/actionTlvSerializer.ts"],
4
+ "sourcesContent": ["import { ByteArrayBuilder } from \"@ledgerhq/device-management-kit\";\n\nimport type {\n HyperliquidAction,\n Order,\n} from \"@internal/app-binder/di/appBinderTypes\";\n\nconst LONG_NUMBER_MAX_BYTES = 0x81 << 8;\n\n/**\n * TLV tags for \"Set action to sign\" (specs.md \u00A7 Set action to sign).\n */\nexport const TLV_TAG = {\n STRUCTURE_TYPE: 0x01,\n VERSION: 0x02,\n CHAIN_ID: 0x23,\n MAX_FEE: 0xb0,\n ACTION_TYPE: 0xd0,\n ASSET_ID: 0xd1,\n BUILDER_ADDRESS: 0xd3,\n NONCE: 0xda,\n ACTION_STRUCTURE: 0xdb,\n ORDER_ID: 0xdc,\n ORDER: 0xdd,\n IS_CROSS: 0xde,\n ORDER_TYPE: 0xe0,\n BUY_OR_NOT: 0xe2,\n PRICE: 0xe3,\n SIZE: 0xe4,\n REDUCE_ONLY: 0xe5,\n TIF: 0xe6,\n TRIGGER_MARKET: 0xe7,\n TRIGGER_PRICE: 0xe8,\n TRIGGER_TYPE: 0xe9,\n GROUPING: 0xea,\n BUILDER_INFO: 0xeb,\n BUILDER_FEE: 0xec,\n LEVERAGE: 0xed,\n UPDATE_ORDERS: 0xd8,\n CANCEL_ORDERS: 0xd9,\n ORDER_DETAIL: 0xd7,\n NTLI: 0xd6,\n} as const;\n\n/** Required structure_type value per specs */\nexport const STRUCTURE_TYPE_VALUE = 0x2c;\n\n/** Required version value per specs */\nexport const VERSION_VALUE = 0x01;\n\n/** action_type enum: order, modify, cancel, updateLeverage, approvalBuilderFee */\nexport const ACTION_TYPE = {\n ORDER: 0x00,\n MODIFY: 0x01,\n CANCEL: 0x02,\n UPDATE_LEVERAGE: 0x03,\n APPROVAL_BUILDER_FEE: 0x04,\n UPDATE_ISOLATED_MARGIN: 0x05,\n} as const;\n\n/** order_type: limit, trigger (specs Order structure) */\nconst ORDER_TYPE = {\n LIMIT: 0x00,\n TRIGGER: 0x01,\n} as const;\n\n/** TIF: ALO, IOC, GTC (specs) */\nconst TIF = {\n ALO: 0x00,\n IOC: 0x01,\n GTC: 0x02,\n} as const;\n\n/** trigger_type: TP, SL (specs) */\nconst TRIGGER_TYPE = {\n TP: 0x00,\n SL: 0x01,\n} as const;\n\n/** grouping (specs create_order) */\nconst GROUPING = {\n NA: 0x00,\n NORMAL_TPSL: 0x01,\n POSITION_TPSL: 0x02,\n} as const;\n\nexport type ActionTypeValue = (typeof ACTION_TYPE)[keyof typeof ACTION_TYPE];\n\nfunction getActionTypeByte(action: HyperliquidAction): number {\n switch (action.type) {\n case \"order\":\n return ACTION_TYPE.ORDER;\n case \"modify\":\n case \"batchModify\":\n return ACTION_TYPE.MODIFY;\n case \"cancel\":\n return ACTION_TYPE.CANCEL;\n case \"updateLeverage\":\n return ACTION_TYPE.UPDATE_LEVERAGE;\n case \"approveBuilderFee\":\n return ACTION_TYPE.APPROVAL_BUILDER_FEE;\n case \"updateIsolatedMargin\":\n return ACTION_TYPE.UPDATE_ISOLATED_MARGIN;\n default:\n throw new Error(\n `Unknown action type: ${(action as HyperliquidAction).type}`,\n );\n }\n}\n\nfunction tifToByte(tif: \"Alo\" | \"Ioc\" | \"Gtc\"): number {\n switch (tif) {\n case \"Alo\":\n return TIF.ALO;\n case \"Ioc\":\n return TIF.IOC;\n case \"Gtc\":\n return TIF.GTC;\n default:\n return TIF.GTC;\n }\n}\n\nfunction groupingToByte(g: \"na\" | \"normalTpsl\" | \"positionTpsl\"): number {\n switch (g) {\n case \"na\":\n return GROUPING.NA;\n case \"normalTpsl\":\n return GROUPING.NORMAL_TPSL;\n case \"positionTpsl\":\n return GROUPING.POSITION_TPSL;\n default:\n return GROUPING.NA;\n }\n}\n\n/**\n * Encode a non-negative integer as 1\u20138 bytes big-endian (minimal length).\n * 0 \u2192 1 byte (0x00), 1..255 \u2192 1 byte, 256..65535 \u2192 2 bytes, etc.\n */\nfunction numberToVarBytes(value: number, maxBytes: number = 8): Uint8Array {\n if (value < 0 || !Number.isInteger(value)) {\n throw new Error(`Expected non-negative integer, got ${value}`);\n }\n if (!Number.isSafeInteger(value)) {\n throw new Error(`Value ${value} is not a safe integer`);\n }\n const big = BigInt(value);\n if (big > 0xffffffffffffffffn) {\n throw new Error(`Value ${value} exceeds u64 range`);\n }\n if (big === 0n) {\n return new Uint8Array([0]);\n }\n const bytes: number[] = [];\n let n = big;\n while (n > 0n && bytes.length < maxBytes) {\n bytes.unshift(Number(n & 0xffn));\n n >>= 8n;\n }\n return new Uint8Array(bytes);\n}\n\n/** Append a TLV field with variable-length number (tag + length 1..8 + value bytes). */\nfunction encodeTlvVarNumber(\n builder: ByteArrayBuilder,\n tag: number,\n value: number,\n maxBytes: number = 8,\n): void {\n if (tag > 0x7f) {\n builder.add16BitUIntToData(LONG_NUMBER_MAX_BYTES + tag);\n } else {\n builder.add8BitUIntToData(tag);\n }\n const bytes = numberToVarBytes(value, maxBytes);\n builder.add8BitUIntToData(bytes.length);\n builder.addBufferToData(bytes);\n}\n\nfunction encodeInTlvFromUInt8(\n builder: ByteArrayBuilder,\n tag: number,\n value: number,\n): void {\n if (tag > 0x7f) {\n builder.add16BitUIntToData(LONG_NUMBER_MAX_BYTES + tag);\n } else {\n builder.add8BitUIntToData(tag);\n }\n builder.add8BitUIntToData(1);\n builder.add8BitUIntToData(value);\n}\n\nfunction encodeInTlvFromUInt64(\n builder: ByteArrayBuilder,\n tag: number,\n value: number,\n): void {\n if (tag > 0x7f) {\n builder.add16BitUIntToData(LONG_NUMBER_MAX_BYTES + tag);\n } else {\n builder.add8BitUIntToData(tag);\n }\n builder.add8BitUIntToData(8);\n builder.add64BitUIntToData(value);\n}\n\nfunction encodeInTlvFromAscii(\n builder: ByteArrayBuilder,\n tag: number,\n value: string,\n): void {\n if (tag > 0x7f) {\n builder.add16BitUIntToData(LONG_NUMBER_MAX_BYTES + tag);\n } else {\n builder.add8BitUIntToData(tag);\n }\n builder.encodeInLVFromAscii(value);\n}\n\nfunction encodeInTlvFromBuffer(\n builder: ByteArrayBuilder,\n tag: number,\n value: Uint8Array,\n): void {\n if (tag > 0x7f) {\n builder.add16BitUIntToData(LONG_NUMBER_MAX_BYTES + tag);\n } else {\n builder.add8BitUIntToData(tag);\n }\n builder.encodeInLVFromBuffer(value);\n}\n\n/** Serialize a single Order to TLV (specs Order structure: 0xe0\u20130xe9). */\nexport function serializeOrderToTlv(order: Order): Uint8Array {\n const b = new ByteArrayBuilder();\n const isLimit = \"limit\" in order.t;\n const orderType = order.t;\n\n // 0xe0 ORDER_TYPE: limit 0x00, trigger 0x01\n encodeInTlvFromUInt8(\n b,\n TLV_TAG.ORDER_TYPE,\n isLimit ? ORDER_TYPE.LIMIT : ORDER_TYPE.TRIGGER,\n );\n // 0xe1 ASSET_ID (var number: 1\u20138 bytes)\n encodeTlvVarNumber(b, TLV_TAG.ASSET_ID, order.a);\n // 0xe2 BUY_OR_NOT: 1 byte boolean\n encodeInTlvFromUInt8(b, TLV_TAG.BUY_OR_NOT, order.b ? 1 : 0);\n // 0xe3 PRICE, 0xe4 SIZE\n encodeInTlvFromAscii(b, TLV_TAG.PRICE, order.p);\n encodeInTlvFromAscii(b, TLV_TAG.SIZE, order.s);\n // 0xe5 REDUCE_ONLY\n encodeInTlvFromUInt8(b, TLV_TAG.REDUCE_ONLY, order.r ? 1 : 0);\n\n const payloadBuilder = new ByteArrayBuilder();\n if (isLimit && \"limit\" in orderType) {\n encodeInTlvFromUInt8(\n payloadBuilder,\n TLV_TAG.TIF,\n tifToByte(orderType.limit.tif),\n );\n } else if (\"trigger\" in orderType) {\n encodeInTlvFromUInt8(\n payloadBuilder,\n TLV_TAG.TRIGGER_MARKET,\n orderType.trigger.isMarket ? 1 : 0,\n );\n encodeInTlvFromAscii(\n payloadBuilder,\n TLV_TAG.TRIGGER_PRICE,\n orderType.trigger.triggerPx,\n );\n encodeInTlvFromUInt8(\n payloadBuilder,\n TLV_TAG.TRIGGER_TYPE,\n orderType.trigger.tpsl === \"tp\" ? TRIGGER_TYPE.TP : TRIGGER_TYPE.SL,\n );\n }\n encodeInTlvFromBuffer(b, TLV_TAG.ORDER_DETAIL, payloadBuilder.build());\n\n return b.build();\n}\n\nfunction encodeInTlvFromHexa(\n builder: ByteArrayBuilder,\n tag: number,\n value: string,\n): void {\n if (tag > 0x7f) {\n builder.add16BitUIntToData(LONG_NUMBER_MAX_BYTES + tag);\n } else {\n builder.add8BitUIntToData(tag);\n }\n builder.encodeInLVFromHexa(value);\n}\n\n/** Build action_structure (value for tag 0xdb) per specs create_order / update_order / cancel_order / leverage. */\nexport function buildActionStructure(action: HyperliquidAction): Uint8Array {\n const b = new ByteArrayBuilder();\n\n switch (action.type) {\n case \"order\": {\n // create_order: order (0xdd), grouping (0xea), optional builder_address (0xeb), builder_fee (0xec)\n const order = action.orders[0];\n if (!order) throw new Error(\"order action must have at least one order\");\n const orderPayload = serializeOrderToTlv(order);\n encodeInTlvFromBuffer(b, TLV_TAG.ORDER, orderPayload);\n encodeInTlvFromUInt8(\n b,\n TLV_TAG.GROUPING,\n groupingToByte(action.grouping),\n );\n if (action.builder !== undefined) {\n const builderInfoBuilder = new ByteArrayBuilder();\n encodeInTlvFromHexa(\n builderInfoBuilder,\n TLV_TAG.BUILDER_ADDRESS,\n action.builder.b,\n );\n encodeTlvVarNumber(\n builderInfoBuilder,\n TLV_TAG.BUILDER_FEE,\n action.builder.f,\n );\n\n encodeInTlvFromBuffer(\n b,\n TLV_TAG.BUILDER_INFO,\n builderInfoBuilder.build(),\n );\n }\n break;\n }\n case \"modify\":\n case \"batchModify\": {\n // update_order: tag UPDATE_ORDER (0xd8) once, then length of buffer, then buffer of [order (0xdd), oid (0xdc)] per modify\n if (!action.modifies.length) {\n throw new Error(\"modify action must have at least one modify\");\n }\n const payloadBuilder = new ByteArrayBuilder();\n for (const mod of action.modifies) {\n encodeInTlvFromBuffer(\n payloadBuilder,\n TLV_TAG.ORDER,\n serializeOrderToTlv(mod.order),\n );\n encodeInTlvFromUInt64(payloadBuilder, TLV_TAG.ORDER_ID, mod.oid);\n }\n const updateOrderPayload = payloadBuilder.build();\n encodeInTlvFromBuffer(b, TLV_TAG.UPDATE_ORDERS, updateOrderPayload);\n break;\n }\n case \"cancel\": {\n // cancel_order: asset_id (0xd1), oid (0xdc)\n if (!action.cancels.length) {\n throw new Error(\"cancel action must have at least one cancel\");\n }\n const payloadBuilder = new ByteArrayBuilder();\n for (const cancel of action.cancels) {\n encodeTlvVarNumber(payloadBuilder, TLV_TAG.ASSET_ID, cancel.a);\n encodeInTlvFromUInt64(payloadBuilder, TLV_TAG.ORDER_ID, cancel.o);\n }\n const updateOrderPayload = payloadBuilder.build();\n encodeInTlvFromBuffer(b, TLV_TAG.CANCEL_ORDERS, updateOrderPayload);\n\n break;\n }\n case \"updateLeverage\": {\n // leverage: asset_id (0xd1), is_cross (0xde), leverage (0xed)\n encodeTlvVarNumber(b, TLV_TAG.ASSET_ID, action.asset);\n encodeInTlvFromUInt8(b, TLV_TAG.IS_CROSS, action.isCross ? 1 : 0);\n encodeInTlvFromUInt64(b, TLV_TAG.LEVERAGE, action.leverage);\n break;\n }\n case \"approveBuilderFee\":\n encodeInTlvFromHexa(b, TLV_TAG.CHAIN_ID, action.signatureChainId);\n encodeInTlvFromAscii(b, TLV_TAG.MAX_FEE, action.maxFeeRate);\n encodeInTlvFromHexa(b, TLV_TAG.BUILDER_ADDRESS, action.builder);\n break;\n case \"updateIsolatedMargin\":\n encodeTlvVarNumber(b, TLV_TAG.ASSET_ID, action.asset);\n encodeInTlvFromUInt8(b, TLV_TAG.BUY_OR_NOT, action.isBuy ? 1 : 0);\n encodeInTlvFromUInt64(b, TLV_TAG.NTLI, action.ntli);\n break;\n default:\n break;\n }\n\n return b.build();\n}\n\n/**\n * Serialize a single action to the TLV format defined in specs.md \"Set action to sign\".\n * Data fields: structure_type (0x01), version (0x02), action_type (0xd0), nonce (0xda), action_structure (0xdb).\n */\nexport function serializeActionToTlv(action: HyperliquidAction): Uint8Array {\n const builder = new ByteArrayBuilder();\n const actionTypeByte = getActionTypeByte(action);\n const actionStructure = buildActionStructure(action);\n\n // structure_type (0x01): required u8, value 0x2c\n builder\n .add8BitUIntToData(TLV_TAG.STRUCTURE_TYPE)\n .add8BitUIntToData(1)\n .add8BitUIntToData(STRUCTURE_TYPE_VALUE);\n\n // version (0x02): required u8, value 0x01\n builder\n .add8BitUIntToData(TLV_TAG.VERSION)\n .add8BitUIntToData(1)\n .add8BitUIntToData(VERSION_VALUE);\n\n // action_type (0xd0): 1 byte, required u8\n builder\n .add16BitUIntToData(LONG_NUMBER_MAX_BYTES + TLV_TAG.ACTION_TYPE)\n .add8BitUIntToData(1)\n .add8BitUIntToData(actionTypeByte);\n\n // nonce (0xda): var, required number \u2014 1\u20138 bytes\n encodeTlvVarNumber(builder, TLV_TAG.NONCE, action.nonce);\n\n // action_structure (0xdb): var\n encodeInTlvFromBuffer(builder, TLV_TAG.ACTION_STRUCTURE, actionStructure);\n\n return builder.build();\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["ByteArrayBuilder", "LONG_NUMBER_MAX_BYTES", "TLV_TAG", "STRUCTURE_TYPE_VALUE", "VERSION_VALUE", "ACTION_TYPE", "ORDER_TYPE", "TIF", "TRIGGER_TYPE", "GROUPING", "getActionTypeByte", "action", "tifToByte", "tif", "groupingToByte", "g", "numberToVarBytes", "value", "maxBytes", "big", "bytes", "n", "encodeTlvVarNumber", "builder", "tag", "encodeInTlvFromUInt8", "encodeInTlvFromUInt64", "encodeInTlvFromAscii", "encodeInTlvFromBuffer", "serializeOrderToTlv", "order", "b", "isLimit", "orderType", "payloadBuilder", "encodeInTlvFromHexa", "buildActionStructure", "orderPayload", "builderInfoBuilder", "mod", "updateOrderPayload", "cancel", "serializeActionToTlv", "actionTypeByte", "actionStructure"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{hexaStringToBuffer as d}from"@ledgerhq/device-management-kit";import{describe as n,expect as t,it as o}from"vitest";import{buildActionStructure as c,serializeOrderToTlv as s}from"./actionTlvSerializer";n("serializeOrderToTlv",()=>{o.each([{name:"order limit (Gtc)",order:{a:0,b:!0,p:"100",s:"1",r:!1,t:{limit:{tif:"Gtc"}}},expectedHex:"81e0010081d1010081e2010181e30331303081e4013181e5010081d70481e60102"},{name:"order trigger (tp, isMarket)",order:{a:0,b:!1,p:"85169",s:"0.0005",r:!0,t:{trigger:{isMarket:!0,triggerPx:"85169",tpsl:"tp"}}},expectedHex:"81e0010181d1010081e2010081e305383531363981e406302E3030303581e5010181d71081e7010181e805383531363981e90100"},{name:"order limit (Ioc)",order:{a:42,b:!1,p:"1992",s:"0.512",r:!1,t:{limit:{tif:"Ioc"}}},expectedHex:"81e0010081d1012a81e2010081e3043139393281e405302E35313281e5010081d70481e60101"}])("$name",({order:i,expectedHex:a})=>{const e=s(i);t(e).toBeInstanceOf(Uint8Array),t(e.length).toBeGreaterThan(0);const r=d(a);t(e).toEqual(r)})});n("buildActionStructure",()=>{o.each([{name:"action type order (create_order)",action:{type:"order",orders:[{a:0,b:!0,p:"1",s:"1",r:!1,t:{limit:{tif:"Gtc"}}}],grouping:"na",nonce:1},expectedHex:"81dd1f81e0010081d1010081e2010181e3013181e4013181e5010081d70481e6010281ea0100"},{name:"action type batchModify (update_order)",action:{type:"batchModify",modifies:[{oid:343050796655,order:{a:0,b:!1,p:"85169",s:"0.0005",r:!0,t:{trigger:{isMarket:!0,triggerPx:"85169",tpsl:"tp"}}}}],nonce:1773050015814},expectedHex:"81d84281dd3481e0010181d1010081e2010081e305383531363981e406302E3030303581e5010181d71081e7010181e805383531363981e9010081dc080000004FDF6BBE6F"},{name:"action type cancel",action:{type:"cancel",cancels:[{a:0,o:340574409238}],nonce:1772813983827},expectedHex:"81d90f81d1010081dc080000004F4BD11216"},{name:"action type updateLeverage",action:{type:"updateLeverage",asset:0,isCross:!1,leverage:10,nonce:3},expectedHex:"81d1010081de010081ed08000000000000000a"},{name:"action type approveBuilderFee",action:{type:"approveBuilderFee",hyperliquidChain:"Mainnet",signatureChainId:"0xa4b1",maxFeeRate:"0.1000%",builder:"0xc0708cdd6cd166d51da264e3f49a0422be26e35b",nonce:1772440978175},expectedHex:"2302a4b181b007302E313030302581d314c0708cdd6cd166d51da264e3f49a0422be26e35b"},{name:"action type updateIsolatedMargin",action:{type:"updateIsolatedMargin",asset:0,isBuy:!0,ntli:1e7,nonce:1772440978175},expectedHex:"81d1010081e2010181d6080000000000989680"}])("$name",({action:i,expectedHex:a})=>{const e=c(i);t(e).toBeInstanceOf(Uint8Array),t(e.length).toBeGreaterThan(0);const r=d(a);t(e).toEqual(r)})});
2
+ //# sourceMappingURL=actionTlvSerializer.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/utils/actionTlvSerializer.test.ts"],
4
+ "sourcesContent": ["import { hexaStringToBuffer } from \"@ledgerhq/device-management-kit\";\nimport { describe, expect, it } from \"vitest\";\n\nimport type { HyperliquidAction } from \"@internal/app-binder/di/appBinderTypes\";\n\nimport {\n buildActionStructure,\n serializeOrderToTlv,\n} from \"./actionTlvSerializer\";\n\ndescribe(\"serializeOrderToTlv\", () => {\n it.each([\n {\n name: \"order limit (Gtc)\",\n order: {\n a: 0,\n b: true,\n p: \"100\",\n s: \"1\",\n r: false,\n t: { limit: { tif: \"Gtc\" as const } },\n },\n expectedHex:\n \"81e00100\" + // ORDER_TYPE\n \"81d10100\" + // ASSET_ID\n \"81e20101\" + // BUY_OR_NOT\n \"81e303313030\" + // PRICE\n \"81e40131\" + // SIZE\n \"81e50100\" + // REDUCE_ONLY\n \"81d704\" + // ORDER_DETAIL\n \"81e60102\", // TIF\n },\n {\n name: \"order trigger (tp, isMarket)\",\n order: {\n a: 0,\n b: false,\n p: \"85169\",\n s: \"0.0005\",\n r: true,\n t: {\n trigger: {\n isMarket: true,\n triggerPx: \"85169\",\n tpsl: \"tp\" as const,\n },\n },\n },\n expectedHex:\n \"81e00101\" + // ORDER_TYPE\n \"81d10100\" + // ASSET_ID\n \"81e20100\" + // BUY_OR_NOT\n \"81e3053835313639\" + // PRICE\n \"81e406302E30303035\" + // SIZE\n \"81e50101\" + // REDUCE_ONLY\n \"81d710\" + // ORDER_DETAIL\n \"81e70101\" + // TRIGGER_MARKET\n \"81e8053835313639\" + // TRIGGER_PRICE\n \"81e90100\", // TRIGGER_TYPE\n },\n {\n name: \"order limit (Ioc)\",\n order: {\n a: 42,\n b: false,\n p: \"1992\",\n s: \"0.512\",\n r: false,\n t: { limit: { tif: \"Ioc\" as const } },\n },\n expectedHex:\n \"81e00100\" + // ORDER_TYPE\n \"81d1012a\" + // ASSET_ID\n \"81e20100\" + // BUY_OR_NOT\n \"81e30431393932\" + // PRICE\n \"81e405302E353132\" + // SIZE\n \"81e50100\" + // REDUCE_ONLY\n \"81d704\" + // ORDER_DETAIL\n \"81e60101\", // TIF\n },\n ])(\"$name\", ({ order, expectedHex }) => {\n const result = serializeOrderToTlv(order);\n\n expect(result).toBeInstanceOf(Uint8Array);\n expect(result.length).toBeGreaterThan(0);\n const expected = hexaStringToBuffer(expectedHex);\n expect(result).toEqual(expected);\n });\n});\n\ndescribe(\"buildActionStructure\", () => {\n it.each([\n {\n name: \"action type order (create_order)\",\n action: {\n type: \"order\",\n orders: [\n {\n a: 0,\n b: true,\n p: \"1\",\n s: \"1\",\n r: false,\n t: { limit: { tif: \"Gtc\" as const } },\n },\n ],\n grouping: \"na\",\n nonce: 1, // Not serialized with this fuction call\n } satisfies HyperliquidAction,\n expectedHex:\n // prettier-ignore\n /* eslint-disable prettier/prettier */\n \"81dd1f\" + // ORDER\n \"81e00100\" + // ORDER_TYPE\n \"81d10100\" + // ASSET_ID\n \"81e20101\" + // BUY_OR_NOT\n \"81e30131\" + // PRICE\n \"81e40131\" + // SIZE\n \"81e50100\" + // REDUCE_ONLY\n \"81d704\" + // ORDER_DETAIL\n \"81e60102\" + // TIF\n \"81ea0100\", // GROUPING\n /* eslint-enable prettier/prettier */\n },\n {\n name: \"action type batchModify (update_order)\",\n action: {\n type: \"batchModify\",\n modifies: [\n {\n oid: 343050796655,\n order: {\n a: 0,\n b: false,\n p: \"85169\",\n s: \"0.0005\",\n r: true,\n t: {\n trigger: {\n isMarket: true,\n triggerPx: \"85169\",\n tpsl: \"tp\" as const,\n },\n },\n },\n },\n ],\n nonce: 1773050015814, // Not serialized with this fuction call // Not serialized with this fuction call\n } satisfies HyperliquidAction,\n expectedHex:\n // prettier-ignore\n /* eslint-disable prettier/prettier */\n \"81d842\" + // UPDATE_ORDERS\n \"81dd34\" + // ORDER\n \"81e00101\" + // ORDER_TYPE\n \"81d10100\" + // ASSET_ID\n \"81e20100\" + // BUY_OR_NOT\n \"81e3053835313639\" + // PRICE\n \"81e406302E30303035\" + // SIZE\n \"81e50101\" + // REDUCE_ONLY\n \"81d710\" + // ORDER_DETAIL\n \"81e70101\" + // TRIGGER_MARKET\n \"81e8053835313639\" + // TRIGGER_PRICE\n \"81e90100\" + // TRIGGER_TYPE\n \"81dc080000004FDF6BBE6F\", // ORDER_ID\n /* eslint-enable prettier/prettier */\n },\n {\n name: \"action type cancel\",\n action: {\n type: \"cancel\",\n cancels: [{ a: 0, o: 340574409238 }],\n nonce: 1772813983827, // Not serialized with this fuction call\n } satisfies HyperliquidAction,\n expectedHex:\n // prettier-ignore\n /* eslint-disable prettier/prettier */\n \"81d90f\" + // CANCEL_ORDERS\n \"81d10100\" + // ASSET_ID\n \"81dc080000004F4BD11216\", // ORDER_ID\n /* eslint-enable prettier/prettier */\n },\n {\n name: \"action type updateLeverage\",\n action: {\n type: \"updateLeverage\",\n asset: 0,\n isCross: false,\n leverage: 10,\n nonce: 3, // Not serialized with this fuction call\n } satisfies HyperliquidAction,\n expectedHex:\n /* eslint-disable prettier/prettier */\n \"81d10100\" + // ASSET_ID\n \"81de0100\" + // IS_CROSS\n \"81ed08000000000000000a\", // LEVERAGE,\n /* eslint-enable prettier/prettier */\n },\n {\n name: \"action type approveBuilderFee\",\n action: {\n type: \"approveBuilderFee\",\n hyperliquidChain: \"Mainnet\",\n signatureChainId: \"0xa4b1\",\n maxFeeRate: \"0.1000%\",\n builder: \"0xc0708cdd6cd166d51da264e3f49a0422be26e35b\",\n nonce: 1772440978175, // Not serialized with this fuction call\n } satisfies HyperliquidAction,\n expectedHex:\n \"2302a4b1\" + // CHAIN_ID\n \"81b007302E3130303025\" + // MAX_FEE\n \"81d314c0708cdd6cd166d51da264e3f49a0422be26e35b\", // APPROVE_BUILDER_ADDRESS\n },\n {\n name: \"action type updateIsolatedMargin\",\n action: {\n type: \"updateIsolatedMargin\",\n asset: 0,\n isBuy: true,\n ntli: 10000000,\n nonce: 1772440978175,\n } satisfies HyperliquidAction,\n expectedHex:\n \"81d10100\" + // ASSET_ID\n \"81e20101\" + // BUY_OR_NOT\n \"81d6080000000000989680\", // NTLI\n },\n ])(\"$name\", ({ action, expectedHex }) => {\n const result = buildActionStructure(action);\n\n expect(result).toBeInstanceOf(Uint8Array);\n expect(result.length).toBeGreaterThan(0);\n const expected = hexaStringToBuffer(expectedHex);\n expect(result).toEqual(expected);\n });\n});\n"],
5
+ "mappings": "AAAA,OAAS,sBAAAA,MAA0B,kCACnC,OAAS,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,MAAU,SAIrC,OACE,wBAAAC,EACA,uBAAAC,MACK,wBAEPJ,EAAS,sBAAuB,IAAM,CACpCE,EAAG,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,MAAAG,EAAO,YAAAC,CAAY,IAAM,CACtC,MAAMC,EAASH,EAAoBC,CAAK,EAExCJ,EAAOM,CAAM,EAAE,eAAe,UAAU,EACxCN,EAAOM,EAAO,MAAM,EAAE,gBAAgB,CAAC,EACvC,MAAMC,EAAWT,EAAmBO,CAAW,EAC/CL,EAAOM,CAAM,EAAE,QAAQC,CAAQ,CACjC,CAAC,CACH,CAAC,EAEDR,EAAS,uBAAwB,IAAM,CACrCE,EAAG,KAAK,CACN,CACE,KAAM,mCACN,OAAQ,CACN,KAAM,QACN,OAAQ,CACN,CACE,EAAG,EACH,EAAG,GACH,EAAG,IACH,EAAG,IACH,EAAG,GACH,EAAG,CAAE,MAAO,CAAE,IAAK,KAAe,CAAE,CACtC,CACF,EACA,SAAU,KACV,MAAO,CACT,EACA,YAGE,8EAWJ,EACA,CACE,KAAM,yCACN,OAAQ,CACN,KAAM,cACN,SAAU,CACR,CACE,IAAK,aACL,MAAO,CACL,EAAG,EACH,EAAG,GACH,EAAG,QACH,EAAG,SACH,EAAG,GACH,EAAG,CACD,QAAS,CACP,SAAU,GACV,UAAW,QACX,KAAM,IACR,CACF,CACF,CACF,CACF,EACA,MAAO,aACT,EACA,YAGE,4IAcJ,EACA,CACE,KAAM,qBACN,OAAQ,CACN,KAAM,SACN,QAAS,CAAC,CAAE,EAAG,EAAG,EAAG,YAAa,CAAC,EACnC,MAAO,aACT,EACA,YAGE,sCAIJ,EACA,CACE,KAAM,6BACN,OAAQ,CACN,KAAM,iBACN,MAAO,EACP,QAAS,GACT,SAAU,GACV,MAAO,CACT,EACA,YAEE,wCAIJ,EACA,CACE,KAAM,gCACN,OAAQ,CACN,KAAM,oBACN,iBAAkB,UAClB,iBAAkB,SAClB,WAAY,UACZ,QAAS,6CACT,MAAO,aACT,EACA,YACE,4EAGJ,EACA,CACE,KAAM,mCACN,OAAQ,CACN,KAAM,uBACN,MAAO,EACP,MAAO,GACP,KAAM,IACN,MAAO,aACT,EACA,YACE,wCAGJ,CACF,CAAC,EAAE,QAAS,CAAC,CAAE,OAAAO,EAAQ,YAAAH,CAAY,IAAM,CACvC,MAAMC,EAASJ,EAAqBM,CAAM,EAE1CR,EAAOM,CAAM,EAAE,eAAe,UAAU,EACxCN,EAAOM,EAAO,MAAM,EAAE,gBAAgB,CAAC,EACvC,MAAMC,EAAWT,EAAmBO,CAAW,EAC/CL,EAAOM,CAAM,EAAE,QAAQC,CAAQ,CACjC,CAAC,CACH,CAAC",
6
+ "names": ["hexaStringToBuffer", "describe", "expect", "it", "buildActionStructure", "serializeOrderToTlv", "order", "expectedHex", "result", "expected", "action"]
7
+ }
@@ -1,2 +1,2 @@
1
- var y=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var A=(n,p,r,i)=>{for(var t=i>1?void 0:i?c(p,r):p,o=n.length-1,d;o>=0;o--)(d=n[o])&&(t=(i?d(p,r,t):d(t))||t);return i&&t&&y(p,r,t),t},m=(n,p)=>(r,i)=>p(r,i,n);import{inject as s,injectable as u}from"inversify";import{appBinderTypes as B}from"../../app-binder/di/appBinderTypes";let e=class{_appBinder;constructor(p){this._appBinder=p}execute(p,r,i){return this._appBinder.signActions({derivationPath:p,Actions:r,skipOpenApp:i?.skipOpenApp})}};e=A([u(),m(0,s(B.AppBinding))],e);export{e as SignActionsUseCase};
1
+ var y=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var a=(e,i,n,r)=>{for(var p=r>1?void 0:r?A(i,n):i,o=e.length-1,d;o>=0;o--)(d=e[o])&&(p=(r?d(i,n,p):d(p))||p);return r&&p&&y(i,n,p),p},m=(e,i)=>(n,r)=>i(n,r,e);import{inject as c,injectable as u}from"inversify";import{appBinderTypes as B}from"../../app-binder/di/appBinderTypes";let t=class{_appBinder;constructor(i){this._appBinder=i}execute(i){return this._appBinder.signActions(i)}};t=a([u(),m(0,c(B.AppBinding))],t);export{t as SignActionsUseCase};
2
2
  //# sourceMappingURL=SignActionsUseCase.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/use-cases/actions/SignActionsUseCase.ts"],
4
- "sourcesContent": ["import { inject, injectable } from \"inversify\";\n\nimport { type SignActionsDAReturnType } from \"@api/app-binder/SignActionsDeviceActionTypes\";\nimport { type ActionsOptions } from \"@api/model/ActionsOptions\";\nimport { appBinderTypes } from \"@internal/app-binder/di/appBinderTypes\";\nimport { HyperliquidAppBinder } from \"@internal/app-binder/HyperliquidAppBinder\";\n\n@injectable()\nexport class SignActionsUseCase {\n private readonly _appBinder: HyperliquidAppBinder;\n\n constructor(\n @inject(appBinderTypes.AppBinding) appBinder: HyperliquidAppBinder,\n ) {\n this._appBinder = appBinder;\n }\n\n execute(\n derivationPath: string,\n Actions: Uint8Array,\n options?: ActionsOptions,\n ): SignActionsDAReturnType {\n return this._appBinder.signActions({\n derivationPath,\n Actions,\n skipOpenApp: options?.skipOpenApp,\n });\n }\n}\n"],
5
- "mappings": "iOAAA,OAAS,UAAAA,EAAQ,cAAAC,MAAkB,YAInC,OAAS,kBAAAC,MAAsB,yCAIxB,IAAMC,EAAN,KAAyB,CACb,WAEjB,YACqCC,EACnC,CACA,KAAK,WAAaA,CACpB,CAEA,QACEC,EACAC,EACAC,EACyB,CACzB,OAAO,KAAK,WAAW,YAAY,CACjC,eAAAF,EACA,QAAAC,EACA,YAAaC,GAAS,WACxB,CAAC,CACH,CACF,EApBaJ,EAANK,EAAA,CADNC,EAAW,EAKPC,EAAA,EAAAC,EAAOC,EAAe,UAAU,IAJxBT",
6
- "names": ["inject", "injectable", "appBinderTypes", "SignActionsUseCase", "appBinder", "derivationPath", "Actions", "options", "__decorateClass", "injectable", "__decorateParam", "inject", "appBinderTypes"]
4
+ "sourcesContent": ["import { inject, injectable } from \"inversify\";\n\nimport { type SignActionsDAReturnType } from \"@api/app-binder/SignActionsDeviceActionTypes\";\nimport { appBinderTypes } from \"@internal/app-binder/di/appBinderTypes\";\nimport { HyperliquidAppBinder } from \"@internal/app-binder/HyperliquidAppBinder\";\n\ntype SignActionsParams = Parameters<HyperliquidAppBinder[\"signActions\"]>[0];\n\n@injectable()\nexport class SignActionsUseCase {\n private readonly _appBinder: HyperliquidAppBinder;\n\n constructor(\n @inject(appBinderTypes.AppBinding) appBinder: HyperliquidAppBinder,\n ) {\n this._appBinder = appBinder;\n }\n\n execute(params: SignActionsParams): SignActionsDAReturnType {\n return this._appBinder.signActions(params);\n }\n}\n"],
5
+ "mappings": "iOAAA,OAAS,UAAAA,EAAQ,cAAAC,MAAkB,YAGnC,OAAS,kBAAAC,MAAsB,yCAMxB,IAAMC,EAAN,KAAyB,CACb,WAEjB,YACqCC,EACnC,CACA,KAAK,WAAaA,CACpB,CAEA,QAAQC,EAAoD,CAC1D,OAAO,KAAK,WAAW,YAAYA,CAAM,CAC3C,CACF,EAZaF,EAANG,EAAA,CADNC,EAAW,EAKPC,EAAA,EAAAC,EAAOC,EAAe,UAAU,IAJxBP",
6
+ "names": ["inject", "injectable", "appBinderTypes", "SignActionsUseCase", "appBinder", "params", "__decorateClass", "injectable", "__decorateParam", "inject", "appBinderTypes"]
7
7
  }
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "dependencies": {
3
+ "@ledgerhq/context-module": "workspace:*",
3
4
  "@ledgerhq/signer-utils": "workspace:*",
4
5
  "inversify": "catalog:",
5
6
  "purify-ts": "catalog:",
@@ -52,10 +53,11 @@
52
53
  "prettier:fix": "prettier . --write",
53
54
  "test": "vitest run",
54
55
  "test:coverage": "vitest run --coverage",
56
+ "test:file": "vitest run --",
55
57
  "test:watch": "vitest",
56
58
  "typecheck": "tsc --noEmit",
57
59
  "watch:builds": "pnpm ldmk-tool watch --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
58
60
  "watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
59
61
  },
60
- "version": "0.0.0-develop-20260312001221"
62
+ "version": "0.0.0-develop-20260313001318"
61
63
  }
@@ -1,6 +1,5 @@
1
- import { type SignActionsDAReturnType } from "./app-binder/SignActionsDeviceActionTypes";
2
- import { type ActionsOptions } from "./model/ActionsOptions";
1
+ import { type SignActionsDAInput, type SignActionsDAReturnType } from "./app-binder/SignActionsDeviceActionTypes";
3
2
  export interface SignerHyperliquid {
4
- signActions: (derivationPath: string, transaction: Uint8Array, options?: ActionsOptions) => SignActionsDAReturnType;
3
+ signActions: (params: SignActionsDAInput) => SignActionsDAReturnType;
5
4
  }
6
5
  //# sourceMappingURL=SignerHyperliquid.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SignerHyperliquid.d.ts","sourceRoot":"","sources":["../../../src/api/SignerHyperliquid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,8CAA8C,CAAC;AAC5F,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,CACX,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,UAAU,EACvB,OAAO,CAAC,EAAE,cAAc,KACrB,uBAAuB,CAAC;CAC9B"}
1
+ {"version":3,"file":"SignerHyperliquid.d.ts","sourceRoot":"","sources":["../../../src/api/SignerHyperliquid.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC7B,MAAM,8CAA8C,CAAC;AAEtD,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,uBAAuB,CAAC;CACtE"}
@@ -1,11 +1,36 @@
1
- import { type CommandErrorResult, type ExecuteDeviceActionReturnType, type OpenAppDAError, type OpenAppDARequiredInteraction, type UserInteractionRequired } from "@ledgerhq/device-management-kit";
1
+ import { type CommandErrorResult, type DeviceActionState, type ExecuteDeviceActionReturnType, type LoadCertificateErrorCodes, type OpenAppDAError, type OpenAppDARequiredInteraction, type UserInteractionRequired } from "@ledgerhq/device-management-kit";
2
2
  import { type Signature } from "../model/Signature";
3
3
  import { type HyperliquidErrorCodes } from "../../internal/app-binder/command/utils/hyperliquidApplicationErrors";
4
- export type SignActionsDAOutput = Signature;
5
- export type SignActionsDAError = OpenAppDAError | CommandErrorResult<HyperliquidErrorCodes>["error"];
4
+ import type { HyperliquidAction } from "../../internal/app-binder/di/appBinderTypes";
5
+ export declare const signActionsDAStateSteps: Readonly<{
6
+ readonly OPEN_APP: "signer.hl.steps.openApp";
7
+ readonly SET_CERTIFICATE: "signer.hl.steps.setCertificate";
8
+ readonly SEND_METADATA: "signer.hl.steps.sendMetadata";
9
+ readonly SEND_ACTION: "signer.hl.steps.sendAction";
10
+ readonly SIGN_ACTIONS: "signer.hl.steps.signActions";
11
+ }>;
12
+ export type SignActionsDAStateStep = (typeof signActionsDAStateSteps)[keyof typeof signActionsDAStateSteps];
13
+ export type SignActionsDAOutput = Signature[];
14
+ /** One action to sign (TLV format per specs "Set action to sign") */
15
+ export type SignActionsActionItem = HyperliquidAction;
16
+ export type SignActionsDAInput = {
17
+ readonly derivationPath: string;
18
+ readonly certificate: Uint8Array;
19
+ readonly signedMetadata: Uint8Array;
20
+ readonly actions: SignActionsActionItem[];
21
+ readonly skipOpenApp?: boolean;
22
+ };
23
+ export type SignActionsDAError = OpenAppDAError | CommandErrorResult<HyperliquidErrorCodes>["error"] | CommandErrorResult<LoadCertificateErrorCodes>["error"];
6
24
  type SignActionsDARequiredInteraction = OpenAppDARequiredInteraction | UserInteractionRequired.SignTransaction;
7
25
  export type SignActionsDAIntermediateValue = {
8
26
  requiredUserInteraction: SignActionsDARequiredInteraction;
27
+ step: SignActionsDAStateStep;
28
+ };
29
+ export type SignActionsDAState = DeviceActionState<SignActionsDAOutput, SignActionsDAError, SignActionsDAIntermediateValue>;
30
+ export type SignActionsDAInternalState = {
31
+ readonly error: SignActionsDAError | null;
32
+ readonly signature: SignActionsDAOutput | null;
33
+ readonly actionIndex: number;
9
34
  };
10
35
  export type SignActionsDAReturnType = ExecuteDeviceActionReturnType<SignActionsDAOutput, SignActionsDAError, SignActionsDAIntermediateValue>;
11
36
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"SignActionsDeviceActionTypes.d.ts","sourceRoot":"","sources":["../../../../src/api/app-binder/SignActionsDeviceActionTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,6BAA6B,EAClC,KAAK,cAAc,EACnB,KAAK,4BAA4B,EACjC,KAAK,uBAAuB,EAC7B,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,iEAAiE,CAAC;AAE7G,MAAM,MAAM,mBAAmB,GAAG,SAAS,CAAC;AAE5C,MAAM,MAAM,kBAAkB,GAC1B,cAAc,GACd,kBAAkB,CAAC,qBAAqB,CAAC,CAAC,OAAO,CAAC,CAAC;AAEvD,KAAK,gCAAgC,GACjC,4BAA4B,GAC5B,uBAAuB,CAAC,eAAe,CAAC;AAE5C,MAAM,MAAM,8BAA8B,GAAG;IAC3C,uBAAuB,EAAE,gCAAgC,CAAC;CAC3D,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,6BAA6B,CACjE,mBAAmB,EACnB,kBAAkB,EAClB,8BAA8B,CAC/B,CAAC"}
1
+ {"version":3,"file":"SignActionsDeviceActionTypes.d.ts","sourceRoot":"","sources":["../../../../src/api/app-binder/SignActionsDeviceActionTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,6BAA6B,EAClC,KAAK,yBAAyB,EAC9B,KAAK,cAAc,EACnB,KAAK,4BAA4B,EACjC,KAAK,uBAAuB,EAC7B,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,iEAAiE,CAAC;AAC7G,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAEhF,eAAO,MAAM,uBAAuB;;;;;;EAMzB,CAAC;AAEZ,MAAM,MAAM,sBAAsB,GAChC,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,OAAO,uBAAuB,CAAC,CAAC;AAEzE,MAAM,MAAM,mBAAmB,GAAG,SAAS,EAAE,CAAC;AAE9C,qEAAqE;AACrE,MAAM,MAAM,qBAAqB,GAAG,iBAAiB,CAAC;AAEtD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,UAAU,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,qBAAqB,EAAE,CAAC;IAC1C,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC1B,cAAc,GACd,kBAAkB,CAAC,qBAAqB,CAAC,CAAC,OAAO,CAAC,GAClD,kBAAkB,CAAC,yBAAyB,CAAC,CAAC,OAAO,CAAC,CAAC;AAE3D,KAAK,gCAAgC,GACjC,4BAA4B,GAC5B,uBAAuB,CAAC,eAAe,CAAC;AAE5C,MAAM,MAAM,8BAA8B,GAAG;IAC3C,uBAAuB,EAAE,gCAAgC,CAAC;IAC1D,IAAI,EAAE,sBAAsB,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,CAChD,mBAAmB,EACnB,kBAAkB,EAClB,8BAA8B,CAC/B,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,QAAQ,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC/C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,6BAA6B,CACjE,mBAAmB,EACnB,kBAAkB,EAClB,8BAA8B,CAC/B,CAAC"}