@ledgerhq/device-signer-kit-hyperliquid 0.0.0-develop-20260312001221 → 0.0.0-develop-20260313001318
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/api/SignerHyperliquid.js +1 -1
- package/lib/cjs/api/SignerHyperliquid.js.map +1 -1
- package/lib/cjs/api/app-binder/SignActionsDeviceActionTypes.js +1 -1
- package/lib/cjs/api/app-binder/SignActionsDeviceActionTypes.js.map +3 -3
- package/lib/cjs/api/index.js +1 -1
- package/lib/cjs/api/index.js.map +3 -3
- package/lib/cjs/api/model/Signature.js.map +1 -1
- package/lib/cjs/internal/DefaultSignerHyperliquid.js +1 -1
- package/lib/cjs/internal/DefaultSignerHyperliquid.js.map +3 -3
- package/lib/cjs/internal/app-binder/HyperliquidAppBinder.js +1 -1
- package/lib/cjs/internal/app-binder/HyperliquidAppBinder.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/SendActionCommand.js +2 -0
- package/lib/cjs/internal/app-binder/command/SendActionCommand.js.map +7 -0
- package/lib/cjs/internal/app-binder/command/SendActionCommand.test.js +2 -0
- package/lib/cjs/internal/app-binder/command/SendActionCommand.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/command/SendMetadataCommand.js +2 -0
- package/lib/cjs/internal/app-binder/command/SendMetadataCommand.js.map +7 -0
- package/lib/cjs/internal/app-binder/command/SendMetadataCommand.test.js +2 -0
- package/lib/cjs/internal/app-binder/command/SendMetadataCommand.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/command/SignActionsCommand.js +2 -0
- package/lib/cjs/internal/app-binder/command/SignActionsCommand.js.map +7 -0
- package/lib/cjs/internal/app-binder/command/SignActionsCommand.test.js +2 -0
- package/lib/cjs/internal/app-binder/command/SignActionsCommand.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/command/utils/hyperliquidApplicationErrors.js +1 -1
- package/lib/cjs/internal/app-binder/command/utils/hyperliquidApplicationErrors.js.map +3 -3
- package/lib/cjs/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.js +1 -1
- package/lib/cjs/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.js.map +4 -4
- package/lib/cjs/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.test.js +2 -0
- package/lib/cjs/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +2 -0
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +7 -0
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js +2 -0
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js.map +7 -0
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js +2 -0
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js.map +7 -0
- package/lib/cjs/internal/app-binder/di/appBinderTypes.js +1 -1
- package/lib/cjs/internal/app-binder/di/appBinderTypes.js.map +2 -2
- package/lib/cjs/internal/app-binder/task/SendActionsTask.js +2 -0
- package/lib/cjs/internal/app-binder/task/SendActionsTask.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/SendActionsTask.test.js +2 -0
- package/lib/cjs/internal/app-binder/task/SendActionsTask.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/SignActionsTask.js +1 -1
- package/lib/cjs/internal/app-binder/task/SignActionsTask.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/SignActionsTask.test.js +2 -0
- package/lib/cjs/internal/app-binder/task/SignActionsTask.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/utils/actionTlvSerializer.js +2 -0
- package/lib/cjs/internal/app-binder/utils/actionTlvSerializer.js.map +7 -0
- package/lib/cjs/internal/app-binder/utils/actionTlvSerializer.test.js +2 -0
- package/lib/cjs/internal/app-binder/utils/actionTlvSerializer.test.js.map +7 -0
- package/lib/cjs/internal/use-cases/actions/SignActionsUseCase.js +1 -1
- package/lib/cjs/internal/use-cases/actions/SignActionsUseCase.js.map +3 -3
- package/lib/cjs/package.json +3 -1
- package/lib/esm/api/app-binder/SignActionsDeviceActionTypes.js +1 -0
- package/lib/esm/api/app-binder/SignActionsDeviceActionTypes.js.map +4 -4
- package/lib/esm/api/index.js +1 -1
- package/lib/esm/api/index.js.map +3 -3
- package/lib/esm/internal/DefaultSignerHyperliquid.js +1 -1
- package/lib/esm/internal/DefaultSignerHyperliquid.js.map +3 -3
- package/lib/esm/internal/app-binder/HyperliquidAppBinder.js +1 -1
- package/lib/esm/internal/app-binder/HyperliquidAppBinder.js.map +3 -3
- package/lib/esm/internal/app-binder/command/SendActionCommand.js +2 -0
- package/lib/esm/internal/app-binder/command/SendActionCommand.js.map +7 -0
- package/lib/esm/internal/app-binder/command/SendActionCommand.test.js +2 -0
- package/lib/esm/internal/app-binder/command/SendActionCommand.test.js.map +7 -0
- package/lib/esm/internal/app-binder/command/SendMetadataCommand.js +2 -0
- package/lib/esm/internal/app-binder/command/SendMetadataCommand.js.map +7 -0
- package/lib/esm/internal/app-binder/command/SendMetadataCommand.test.js +2 -0
- package/lib/esm/internal/app-binder/command/SendMetadataCommand.test.js.map +7 -0
- package/lib/esm/internal/app-binder/command/SignActionsCommand.js +2 -0
- package/lib/esm/internal/app-binder/command/SignActionsCommand.js.map +7 -0
- package/lib/esm/internal/app-binder/command/SignActionsCommand.test.js +2 -0
- package/lib/esm/internal/app-binder/command/SignActionsCommand.test.js.map +7 -0
- package/lib/esm/internal/app-binder/command/utils/hyperliquidApplicationErrors.js +1 -1
- package/lib/esm/internal/app-binder/command/utils/hyperliquidApplicationErrors.js.map +3 -3
- package/lib/esm/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.js +1 -0
- package/lib/esm/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.js.map +4 -4
- package/lib/esm/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.test.js +2 -0
- package/lib/esm/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.test.js.map +7 -0
- package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +2 -0
- package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +7 -0
- package/lib/esm/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js +2 -0
- package/lib/esm/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js.map +7 -0
- package/lib/esm/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js +2 -0
- package/lib/esm/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js.map +7 -0
- package/lib/esm/internal/app-binder/di/appBinderTypes.js +1 -1
- package/lib/esm/internal/app-binder/di/appBinderTypes.js.map +2 -2
- package/lib/esm/internal/app-binder/task/SendActionsTask.js +2 -0
- package/lib/esm/internal/app-binder/task/SendActionsTask.js.map +7 -0
- package/lib/esm/internal/app-binder/task/SendActionsTask.test.js +2 -0
- package/lib/esm/internal/app-binder/task/SendActionsTask.test.js.map +7 -0
- package/lib/esm/internal/app-binder/task/SignActionsTask.js +1 -1
- package/lib/esm/internal/app-binder/task/SignActionsTask.js.map +3 -3
- package/lib/esm/internal/app-binder/task/SignActionsTask.test.js +2 -0
- package/lib/esm/internal/app-binder/task/SignActionsTask.test.js.map +7 -0
- package/lib/esm/internal/app-binder/utils/actionTlvSerializer.js +2 -0
- package/lib/esm/internal/app-binder/utils/actionTlvSerializer.js.map +7 -0
- package/lib/esm/internal/app-binder/utils/actionTlvSerializer.test.js +2 -0
- package/lib/esm/internal/app-binder/utils/actionTlvSerializer.test.js.map +7 -0
- package/lib/esm/internal/use-cases/actions/SignActionsUseCase.js +1 -1
- package/lib/esm/internal/use-cases/actions/SignActionsUseCase.js.map +3 -3
- package/lib/esm/package.json +3 -1
- package/lib/types/api/SignerHyperliquid.d.ts +2 -3
- package/lib/types/api/SignerHyperliquid.d.ts.map +1 -1
- package/lib/types/api/app-binder/SignActionsDeviceActionTypes.d.ts +28 -3
- package/lib/types/api/app-binder/SignActionsDeviceActionTypes.d.ts.map +1 -1
- package/lib/types/api/index.d.ts +3 -1
- package/lib/types/api/index.d.ts.map +1 -1
- package/lib/types/api/model/Signature.d.ts +1 -1
- package/lib/types/api/model/Signature.d.ts.map +1 -1
- package/lib/types/internal/DefaultSignerHyperliquid.d.ts +1 -2
- package/lib/types/internal/DefaultSignerHyperliquid.d.ts.map +1 -1
- package/lib/types/internal/app-binder/HyperliquidAppBinder.d.ts +5 -2
- package/lib/types/internal/app-binder/HyperliquidAppBinder.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/SendActionCommand.d.ts +16 -0
- package/lib/types/internal/app-binder/command/SendActionCommand.d.ts.map +1 -0
- package/lib/types/internal/app-binder/command/SendActionCommand.test.d.ts +2 -0
- package/lib/types/internal/app-binder/command/SendActionCommand.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/command/SendMetadataCommand.d.ts +14 -0
- package/lib/types/internal/app-binder/command/SendMetadataCommand.d.ts.map +1 -0
- package/lib/types/internal/app-binder/command/SendMetadataCommand.test.d.ts +2 -0
- package/lib/types/internal/app-binder/command/SendMetadataCommand.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/command/SignActionsCommand.d.ts +22 -0
- package/lib/types/internal/app-binder/command/SignActionsCommand.d.ts.map +1 -0
- package/lib/types/internal/app-binder/command/SignActionsCommand.test.d.ts +2 -0
- package/lib/types/internal/app-binder/command/SignActionsCommand.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/command/utils/hyperliquidApplicationErrors.d.ts +8 -2
- package/lib/types/internal/app-binder/command/utils/hyperliquidApplicationErrors.d.ts.map +1 -1
- package/lib/types/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.d.ts +16 -0
- package/lib/types/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.d.ts.map +1 -1
- package/lib/types/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.test.d.ts +2 -0
- package/lib/types/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/device-action/__test-utils__/makeInternalApi.d.ts +4 -0
- package/lib/types/internal/app-binder/device-action/__test-utils__/makeInternalApi.d.ts.map +1 -0
- package/lib/types/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.d.ts +2 -0
- package/lib/types/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.d.ts.map +1 -0
- package/lib/types/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.d.ts +15 -0
- package/lib/types/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.d.ts.map +1 -0
- package/lib/types/internal/app-binder/di/appBinderTypes.d.ts +75 -0
- package/lib/types/internal/app-binder/di/appBinderTypes.d.ts.map +1 -1
- package/lib/types/internal/app-binder/task/SendActionsTask.d.ts +17 -0
- package/lib/types/internal/app-binder/task/SendActionsTask.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/SendActionsTask.test.d.ts +2 -0
- package/lib/types/internal/app-binder/task/SendActionsTask.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/SignActionsTask.d.ts +3 -4
- package/lib/types/internal/app-binder/task/SignActionsTask.d.ts.map +1 -1
- package/lib/types/internal/app-binder/task/SignActionsTask.test.d.ts +2 -0
- package/lib/types/internal/app-binder/task/SignActionsTask.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/utils/actionTlvSerializer.d.ts +59 -0
- package/lib/types/internal/app-binder/utils/actionTlvSerializer.d.ts.map +1 -0
- package/lib/types/internal/app-binder/utils/actionTlvSerializer.test.d.ts +2 -0
- package/lib/types/internal/app-binder/utils/actionTlvSerializer.test.d.ts.map +1 -0
- package/lib/types/internal/use-cases/actions/SignActionsUseCase.d.ts +3 -2
- package/lib/types/internal/use-cases/actions/SignActionsUseCase.d.ts.map +1 -1
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +9 -7
- package/lib/cjs/internal/app-binder/command/SignActionCommand.js +0 -2
- package/lib/cjs/internal/app-binder/command/SignActionCommand.js.map +0 -7
- package/lib/cjs/internal/app-binder/command/SignActionCommand.test.js +0 -2
- package/lib/cjs/internal/app-binder/command/SignActionCommand.test.js.map +0 -7
- package/lib/esm/internal/app-binder/command/SignActionCommand.js +0 -2
- package/lib/esm/internal/app-binder/command/SignActionCommand.js.map +0 -7
- package/lib/esm/internal/app-binder/command/SignActionCommand.test.js +0 -2
- package/lib/esm/internal/app-binder/command/SignActionCommand.test.js.map +0 -7
- package/lib/types/internal/app-binder/command/SignActionCommand.d.ts +0 -21
- package/lib/types/internal/app-binder/command/SignActionCommand.d.ts.map +0 -1
- package/lib/types/internal/app-binder/command/SignActionCommand.test.d.ts +0 -2
- package/lib/types/internal/app-binder/command/SignActionCommand.test.d.ts.map +0 -1
|
@@ -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
|
package/lib/esm/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.js.map
CHANGED
|
@@ -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
|
package/lib/esm/internal/app-binder/device-action/SignActions/SignActionsDeviceAction.test.js.map
ADDED
|
@@ -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
|
package/lib/esm/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js.map
ADDED
|
@@ -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
|
|
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": ["
|
|
5
|
-
"mappings": "
|
|
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
|
|
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 {
|
|
5
|
-
"mappings": "AAAA,OAEE,wBAAAA,EAEA,0BAAAC,MACK,kCAGP,OAAS,
|
|
6
|
-
"names": ["CommandResultFactory", "isSuccessCommandResult", "
|
|
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
|
|
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 {
|
|
5
|
-
"mappings": "iOAAA,OAAS,UAAAA,EAAQ,cAAAC,MAAkB,
|
|
6
|
-
"names": ["inject", "injectable", "appBinderTypes", "SignActionsUseCase", "appBinder", "
|
|
4
|
+
"sourcesContent": ["import { inject, injectable } from \"inversify\";\n\nimport { type SignActionsDAReturnType } from \"@api/app-binder/SignActionsDeviceActionTypes\";\nimport { appBinderTypes } from \"@internal/app-binder/di/appBinderTypes\";\nimport { HyperliquidAppBinder } from \"@internal/app-binder/HyperliquidAppBinder\";\n\ntype SignActionsParams = Parameters<HyperliquidAppBinder[\"signActions\"]>[0];\n\n@injectable()\nexport class SignActionsUseCase {\n private readonly _appBinder: HyperliquidAppBinder;\n\n constructor(\n @inject(appBinderTypes.AppBinding) appBinder: HyperliquidAppBinder,\n ) {\n this._appBinder = appBinder;\n }\n\n execute(params: SignActionsParams): SignActionsDAReturnType {\n return this._appBinder.signActions(params);\n }\n}\n"],
|
|
5
|
+
"mappings": "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
|
}
|
package/lib/esm/package.json
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"dependencies": {
|
|
3
|
+
"@ledgerhq/context-module": "workspace:*",
|
|
3
4
|
"@ledgerhq/signer-utils": "workspace:*",
|
|
4
5
|
"inversify": "catalog:",
|
|
5
6
|
"purify-ts": "catalog:",
|
|
@@ -52,10 +53,11 @@
|
|
|
52
53
|
"prettier:fix": "prettier . --write",
|
|
53
54
|
"test": "vitest run",
|
|
54
55
|
"test:coverage": "vitest run --coverage",
|
|
56
|
+
"test:file": "vitest run --",
|
|
55
57
|
"test:watch": "vitest",
|
|
56
58
|
"typecheck": "tsc --noEmit",
|
|
57
59
|
"watch:builds": "pnpm ldmk-tool watch --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
|
|
58
60
|
"watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
|
|
59
61
|
},
|
|
60
|
-
"version": "0.0.0-develop-
|
|
62
|
+
"version": "0.0.0-develop-20260313001318"
|
|
61
63
|
}
|
|
@@ -1,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: (
|
|
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,
|
|
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
|
-
|
|
5
|
-
export
|
|
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;
|
|
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"}
|