@ledgerhq/device-signer-kit-solana 1.0.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/README.md +148 -356
  2. package/lib/cjs/api/app-binder/GetAddressDeviceActionTypes.js +1 -1
  3. package/lib/cjs/api/app-binder/GetAddressDeviceActionTypes.js.map +1 -1
  4. package/lib/cjs/api/app-binder/GetAppConfigurationDeviceActionTypes.js +1 -1
  5. package/lib/cjs/api/app-binder/GetAppConfigurationDeviceActionTypes.js.map +1 -1
  6. package/lib/cjs/api/app-binder/SignMessageDeviceActionTypes.js +1 -1
  7. package/lib/cjs/api/app-binder/SignMessageDeviceActionTypes.js.map +1 -1
  8. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
  9. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js.map +1 -1
  10. package/lib/cjs/internal/app-binder/command/GetAppConfigurationCommand.js +1 -1
  11. package/lib/cjs/internal/app-binder/command/GetAppConfigurationCommand.js.map +3 -3
  12. package/lib/cjs/internal/app-binder/command/GetAppConfigurationCommand.test.js +1 -1
  13. package/lib/cjs/internal/app-binder/command/GetAppConfigurationCommand.test.js.map +2 -2
  14. package/lib/cjs/internal/app-binder/command/GetPubKeyCommand.js +1 -1
  15. package/lib/cjs/internal/app-binder/command/GetPubKeyCommand.js.map +3 -3
  16. package/lib/cjs/internal/app-binder/command/GetPubKeyCommand.test.js +1 -1
  17. package/lib/cjs/internal/app-binder/command/GetPubKeyCommand.test.js.map +2 -2
  18. package/lib/cjs/internal/app-binder/command/SignOffChainMessageCommand.js +1 -1
  19. package/lib/cjs/internal/app-binder/command/SignOffChainMessageCommand.js.map +3 -3
  20. package/lib/cjs/internal/app-binder/command/SignOffChainMessageCommand.test.js +1 -1
  21. package/lib/cjs/internal/app-binder/command/SignOffChainMessageCommand.test.js.map +2 -2
  22. package/lib/cjs/internal/app-binder/command/SignTransactionCommand.js +1 -1
  23. package/lib/cjs/internal/app-binder/command/SignTransactionCommand.js.map +3 -3
  24. package/lib/cjs/internal/app-binder/command/utils/SolanaAppErrors.test.js +2 -0
  25. package/lib/cjs/internal/app-binder/command/utils/SolanaAppErrors.test.js.map +7 -0
  26. package/lib/cjs/internal/app-binder/command/utils/SolanaApplicationErrors.js +2 -0
  27. package/lib/cjs/internal/app-binder/command/utils/SolanaApplicationErrors.js.map +7 -0
  28. package/lib/cjs/internal/app-binder/device-action/SignMessage/SignMessageDeviceAction.js +1 -1
  29. package/lib/cjs/internal/app-binder/device-action/SignMessage/SignMessageDeviceAction.js.map +2 -2
  30. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
  31. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +3 -3
  32. package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +1 -1
  33. package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +3 -3
  34. package/lib/cjs/internal/app-binder/task/SendCommandInChunksTask.js +1 -1
  35. package/lib/cjs/internal/app-binder/task/SendCommandInChunksTask.js.map +2 -2
  36. package/lib/cjs/internal/app-binder/task/SendSignDataTask.js +1 -1
  37. package/lib/cjs/internal/app-binder/task/SendSignDataTask.js.map +2 -2
  38. package/lib/cjs/internal/app-binder/task/SendSignMessageTask.js +1 -1
  39. package/lib/cjs/internal/app-binder/task/SendSignMessageTask.js.map +2 -2
  40. package/lib/cjs/package.json +4 -3
  41. package/lib/esm/internal/app-binder/command/GetAppConfigurationCommand.js +1 -1
  42. package/lib/esm/internal/app-binder/command/GetAppConfigurationCommand.js.map +3 -3
  43. package/lib/esm/internal/app-binder/command/GetAppConfigurationCommand.test.js +1 -1
  44. package/lib/esm/internal/app-binder/command/GetAppConfigurationCommand.test.js.map +2 -2
  45. package/lib/esm/internal/app-binder/command/GetPubKeyCommand.js +1 -1
  46. package/lib/esm/internal/app-binder/command/GetPubKeyCommand.js.map +3 -3
  47. package/lib/esm/internal/app-binder/command/GetPubKeyCommand.test.js +1 -1
  48. package/lib/esm/internal/app-binder/command/GetPubKeyCommand.test.js.map +2 -2
  49. package/lib/esm/internal/app-binder/command/SignOffChainMessageCommand.js +1 -1
  50. package/lib/esm/internal/app-binder/command/SignOffChainMessageCommand.js.map +3 -3
  51. package/lib/esm/internal/app-binder/command/SignOffChainMessageCommand.test.js +1 -1
  52. package/lib/esm/internal/app-binder/command/SignOffChainMessageCommand.test.js.map +2 -2
  53. package/lib/esm/internal/app-binder/command/SignTransactionCommand.js +1 -1
  54. package/lib/esm/internal/app-binder/command/SignTransactionCommand.js.map +3 -3
  55. package/lib/esm/internal/app-binder/command/utils/SolanaAppErrors.test.js +2 -0
  56. package/lib/esm/internal/app-binder/command/utils/SolanaAppErrors.test.js.map +7 -0
  57. package/lib/esm/internal/app-binder/command/utils/SolanaApplicationErrors.js +2 -0
  58. package/lib/esm/internal/app-binder/command/utils/SolanaApplicationErrors.js.map +7 -0
  59. package/lib/esm/internal/app-binder/device-action/SignMessage/SignMessageDeviceAction.js +1 -1
  60. package/lib/esm/internal/app-binder/device-action/SignMessage/SignMessageDeviceAction.js.map +2 -2
  61. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
  62. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +3 -3
  63. package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +1 -1
  64. package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +3 -3
  65. package/lib/esm/internal/app-binder/task/SendCommandInChunksTask.js +1 -1
  66. package/lib/esm/internal/app-binder/task/SendCommandInChunksTask.js.map +2 -2
  67. package/lib/esm/internal/app-binder/task/SendSignDataTask.js +1 -1
  68. package/lib/esm/internal/app-binder/task/SendSignDataTask.js.map +2 -2
  69. package/lib/esm/internal/app-binder/task/SendSignMessageTask.js +1 -1
  70. package/lib/esm/internal/app-binder/task/SendSignMessageTask.js.map +2 -2
  71. package/lib/esm/package.json +4 -3
  72. package/lib/types/api/app-binder/GetAddressDeviceActionTypes.d.ts +2 -1
  73. package/lib/types/api/app-binder/GetAddressDeviceActionTypes.d.ts.map +1 -1
  74. package/lib/types/api/app-binder/GetAppConfigurationDeviceActionTypes.d.ts +2 -1
  75. package/lib/types/api/app-binder/GetAppConfigurationDeviceActionTypes.d.ts.map +1 -1
  76. package/lib/types/api/app-binder/SignMessageDeviceActionTypes.d.ts +3 -2
  77. package/lib/types/api/app-binder/SignMessageDeviceActionTypes.d.ts.map +1 -1
  78. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts +3 -2
  79. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts.map +1 -1
  80. package/lib/types/internal/app-binder/command/GetAppConfigurationCommand.d.ts +4 -2
  81. package/lib/types/internal/app-binder/command/GetAppConfigurationCommand.d.ts.map +1 -1
  82. package/lib/types/internal/app-binder/command/GetPubKeyCommand.d.ts +4 -2
  83. package/lib/types/internal/app-binder/command/GetPubKeyCommand.d.ts.map +1 -1
  84. package/lib/types/internal/app-binder/command/SignOffChainMessageCommand.d.ts +4 -2
  85. package/lib/types/internal/app-binder/command/SignOffChainMessageCommand.d.ts.map +1 -1
  86. package/lib/types/internal/app-binder/command/SignTransactionCommand.d.ts +5 -3
  87. package/lib/types/internal/app-binder/command/SignTransactionCommand.d.ts.map +1 -1
  88. package/lib/types/internal/app-binder/command/utils/SolanaAppErrors.test.d.ts +2 -0
  89. package/lib/types/internal/app-binder/command/utils/SolanaAppErrors.test.d.ts.map +1 -0
  90. package/lib/types/internal/app-binder/command/utils/SolanaApplicationErrors.d.ts +8 -0
  91. package/lib/types/internal/app-binder/command/utils/SolanaApplicationErrors.d.ts.map +1 -0
  92. package/lib/types/internal/app-binder/device-action/SignMessage/SignMessageDeviceAction.d.ts +2 -1
  93. package/lib/types/internal/app-binder/device-action/SignMessage/SignMessageDeviceAction.d.ts.map +1 -1
  94. package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts +2 -1
  95. package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts.map +1 -1
  96. package/lib/types/internal/app-binder/task/SendCommandInChunksTask.d.ts +3 -2
  97. package/lib/types/internal/app-binder/task/SendCommandInChunksTask.d.ts.map +1 -1
  98. package/lib/types/internal/app-binder/task/SendSignDataTask.d.ts +3 -2
  99. package/lib/types/internal/app-binder/task/SendSignDataTask.d.ts.map +1 -1
  100. package/lib/types/internal/app-binder/task/SendSignMessageTask.d.ts +3 -1
  101. package/lib/types/internal/app-binder/task/SendSignMessageTask.d.ts.map +1 -1
  102. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  103. package/package.json +10 -9
  104. package/lib/cjs/internal/app-binder/command/utils/solanaAppError.test.js +0 -2
  105. package/lib/cjs/internal/app-binder/command/utils/solanaAppError.test.js.map +0 -7
  106. package/lib/cjs/internal/app-binder/command/utils/solanaAppErrors.js +0 -2
  107. package/lib/cjs/internal/app-binder/command/utils/solanaAppErrors.js.map +0 -7
  108. package/lib/esm/internal/app-binder/command/utils/solanaAppError.test.js +0 -2
  109. package/lib/esm/internal/app-binder/command/utils/solanaAppError.test.js.map +0 -7
  110. package/lib/esm/internal/app-binder/command/utils/solanaAppErrors.js +0 -2
  111. package/lib/esm/internal/app-binder/command/utils/solanaAppErrors.js.map +0 -7
  112. package/lib/types/internal/app-binder/command/utils/solanaAppError.test.d.ts +0 -2
  113. package/lib/types/internal/app-binder/command/utils/solanaAppError.test.d.ts.map +0 -1
  114. package/lib/types/internal/app-binder/command/utils/solanaAppErrors.d.ts +0 -8
  115. package/lib/types/internal/app-binder/command/utils/solanaAppErrors.d.ts.map +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/device-action/SignTransactionDeviceAction.ts"],
4
- "sourcesContent": ["import {\n type CommandResult,\n type DeviceActionStateMachine,\n type InternalApi,\n isSuccessCommandResult,\n OpenAppDeviceAction,\n type StateMachineTypes,\n UnknownDAError,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, type Maybe, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAInternalState,\n type SignTransactionDAOutput,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { SignTransactionCommand } from \"@internal/app-binder/command/SignTransactionCommand\";\nimport { SignDataTask } from \"@internal/app-binder/task/SendSignDataTask\";\n\nexport type MachineDependencies = {\n readonly signTransaction: (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) => Promise<CommandResult<Maybe<Signature>>>;\n};\n\nexport class SignTransactionDeviceAction extends XStateDeviceAction<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n > {\n type types = StateMachineTypes<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n >;\n\n const { signTransaction } = 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: \"Solana\" },\n }).makeStateMachine(internalApi),\n signTransaction: fromPromise(signTransaction),\n },\n guards: {\n noInternalError: ({ context }) => context._internalState.error === null,\n },\n actions: {\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: _.event[\"error\"], // NOTE: it should never happen, the error is not typed anymore here\n }),\n }),\n },\n }).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QGUCWUB2AVATgQw1jwGMAXVAewwBEwA3VYsAQTMowDoB5ABzA2Y8etBk1bkqAYghUwHVBjoUA1nIp8BQ5KTykwAWRIALBWADaABgC6iUDwqxUEjLZAAPRABYAzAHYOAJwAHABMFgCMnhYWUSFBvgA0IACeiEEAbOkcAKxBQQGeASG+3tmeISEAvpVJaJi4BERsVCKMLM2cAMJGYMTKvPyCwvRt4uwASnAArgA2pJKWNkgg9o7Orh4IAQEWHN7RvgGH2dne4UHhSakI+Vnpvtkh4eme2Udh3tW16Nj4hCTOVpiDocbq9foaIZA9rOSawWbzMzhJZ2BxOdgbRDbXb7CyHY6nc6XFJpcIcc6+OLebzxCoBbLhL4gOq-RoA9jQsZUDgAcTApG6eBmM34MGksnkihUchgAqMQpFGBgi1cq3RVExCEi+Q4nnO6RC3ji232QSuiBKZPCEQyZwsmSCNKZLIa-w6nJBfLlCtFYEkYBwOAoOA4PBmugAZsGALYcWWC4W+lXLNXrZabbUBXX6w3GgKm803eLk7ZBTwZF6Uz41Zk-V1NQEjYHODgAISmqBmEE6VD0bnmMgwcgUSlUHAARh2uz2MH3SMnUWsMenEOFtv5HhYghEdt5PPvC7ks2v89EAvdwuFDc6638GxymzD2G2p93e2B+-7A8HQ+HSFGcFjSdOzfWcP3naxVTRNNQAzdccjCbc1wsPcDxJBBfFeDgQneDJHgZAib3qO92RaR8uU4AAFIMGAgMAZzncUh0lUc5B4GjUDohjwIXFZoOXWDEBCU4sl8DJwl8Xxogsc8YkLTwxI4TDlMwjJfHSCwqhrF0SPdciQWoihaPo99PwDIMQzDSMY1DDiuNMiCUT4pcNRXBBhO8UTxMk6TZM8QsNO8PYCkpHwghOIIiNZN1G1EJ9uUM4zuP7OEETBPoFkglN+NcwSEFxHEtziB49wCYlrj3XZhM8e5HQiCJCii+tSJofSW0SziTLAlLpjmdLlAWZEoJclw3IKvYiviU5CnKxBsi3DhHT8fd7hwmk9ya3TYtGEEdLZDomOHKUx0cYj9ucXjUwE9xEFKHDyRCfcHhCF411m9zIiU88jXyQ4-CvTbzofOKKI4PaYvYL8LN-azAI4U7ovvKhLpy0a8ru49HoUx5XrKwtqSzfdSgeeILjKmJAYhsiQd228gaoVK+p6DKUZGzVvHghrNKNEoHn89CT2zHYyjOalPIB7S6ap1qaZbcGkYwRm5XBQanKu3KbvyznIm54o-DKQsscW0I3nSZ4TkKalqhrDAKDo+BlnllqPRg5z1TRzWAFp0kLb2OGkgPA4OSmFZd58Bk0YZZeu9WPc2cpCzLEJdRkix5oI-cQ+dtrn36iOoRzhnetIYb3c1dIy11alHWyTIzfSbJEnQvIgmw14t1KwpMOrb4zulsPuS9BNFRgUvXYzc4goZTzgntE980T3wySNPEJPCfZyg5rO9Oj7l2xA5KS+ytm3OeI5FoqGrMiiEofELSlCaJMpsXCx7t+25tnw6+zuqPxcy7chUNOgRHovHwuUbGh5iwETeHEBkcR7Tv2BjtdqdkupziVv1Me11NjFCwshTSKEGTqX5tceauwojiwkluNcb9JZ91DoXTgTsOjYI1psM4+YEKXniK9N4704itx2CUUI4UGTBC0r3RG2dd7MKlgrTBzNlBsLjrdXmCFHT6kiNsV4htPK6keDVFeW4UKZ3odIneKDnzICmMQJgsAHb-3Hl4J4VUXpFGrjEUohY1xZHCLXE4-j8zkIUkg6mVjuQAFFvw4BUZqco1psLuMNDSLx2RDzAMblePU9I7QvWrNUIAA */\n id: \"SignTransactionDeviceAction\",\n initial: \"OpenAppDeviceAction\",\n context: ({ input }) => {\n return {\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n _internalState: {\n error: null,\n signature: null,\n },\n };\n },\n states: {\n OpenAppDeviceAction: {\n exit: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n invoke: {\n id: \"openAppStateMachine\",\n input: { appName: \"Solana\" },\n src: \"openAppStateMachine\",\n onSnapshot: {\n actions: assign({\n intermediateValue: (_) =>\n _.event.snapshot.context.intermediateValue,\n }),\n },\n onDone: {\n actions: assign({\n _internalState: (_) => {\n return _.event.output.caseOf<SignTransactionDAInternalState>({\n Right: () => _.context._internalState,\n Left: (error) => ({\n ..._.context._internalState,\n error,\n }),\n });\n },\n }),\n target: \"CheckOpenAppDeviceActionResult\",\n },\n },\n },\n CheckOpenAppDeviceActionResult: {\n always: [\n {\n target: \"SignTransaction\",\n guard: \"noInternalError\",\n },\n \"Error\",\n ],\n },\n SignTransaction: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n }),\n exit: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n invoke: {\n id: \"signTransaction\",\n src: \"signTransaction\",\n input: ({ context }) => ({\n derivationPath: context.input.derivationPath,\n serializedTransaction: context.input.transaction,\n }),\n onDone: {\n target: \"SignTransactionResultCheck\",\n actions: [\n assign({\n _internalState: ({ event, context }) => {\n if (!isSuccessCommandResult(event.output))\n return {\n ...context._internalState,\n error: event.output.error,\n };\n\n if (event.output.data.isJust())\n return {\n ...context._internalState,\n signature: event.output.data.extract(),\n };\n\n return {\n ...context._internalState,\n error: new UnknownDAError(\"No Signature available\"),\n };\n },\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n SignTransactionResultCheck: {\n always: [\n { guard: \"noInternalError\", target: \"Success\" },\n { target: \"Error\" },\n ],\n },\n Success: {\n type: \"final\",\n },\n Error: {\n type: \"final\",\n },\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(internalApi: InternalApi): MachineDependencies {\n const signTransaction = async (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) => {\n return new SignDataTask(internalApi, {\n commandFactory: (args) =>\n new SignTransactionCommand({\n serializedTransaction: args.chunkedData,\n more: args.more,\n extend: args.extend,\n }),\n derivationPath: arg0.input.derivationPath,\n sendingData: arg0.input.serializedTransaction,\n }).run();\n };\n\n return {\n signTransaction,\n };\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["SignTransactionDeviceAction_exports", "__export", "SignTransactionDeviceAction", "__toCommonJS", "import_device_management_kit", "import_purify_ts", "import_xstate", "import_SignTransactionCommand", "import_SendSignDataTask", "internalApi", "signTransaction", "context", "_", "input", "error", "event", "arg0", "args"]
4
+ "sourcesContent": ["import {\n type CommandResult,\n type DeviceActionStateMachine,\n type InternalApi,\n isSuccessCommandResult,\n OpenAppDeviceAction,\n type StateMachineTypes,\n UnknownDAError,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, type Maybe, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAInternalState,\n type SignTransactionDAOutput,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { SignTransactionCommand } from \"@internal/app-binder/command/SignTransactionCommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { SignDataTask } from \"@internal/app-binder/task/SendSignDataTask\";\n\nexport type MachineDependencies = {\n readonly signTransaction: (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) => Promise<\n CommandResult<Maybe<Signature | SolanaAppErrorCodes>, SolanaAppErrorCodes>\n >;\n};\n\nexport class SignTransactionDeviceAction extends XStateDeviceAction<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n > {\n type types = StateMachineTypes<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n >;\n\n const { signTransaction } = 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: \"Solana\" },\n }).makeStateMachine(internalApi),\n signTransaction: fromPromise(signTransaction),\n },\n guards: {\n noInternalError: ({ context }) => context._internalState.error === null,\n },\n actions: {\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: _.event[\"error\"], // NOTE: it should never happen, the error is not typed anymore here\n }),\n }),\n },\n }).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QGUCWUB2AVATgQw1jwGMAXVAewwBEwA3VYsAQTMowDoB5ABzA2Y8etBk1bkqAYghUwHVBjoUA1nIp8BQ5KTykwAWRIALBWADaABgC6iUDwqxUEjLZAAPRABYAzAHYOAJwAHABMFgCMnhYWUSFBvgA0IACeiEEAbOkcAKxBQQGeASG+3tmeISEAvpVJaJi4BERsVCKMLM2cAMJGYMTKvPyCwvRt4uwASnAArgA2pJKWNkgg9o7Orh4IAQEWHN7RvgGH2dne4UHhSakI+Vnpvtkh4eme2Udh3tW16Nj4hCTOVpiDocbq9foaIZA9rOSawWbzMzhJZ2BxOdgbRDbXb7CyHY6nc6XFJpcIcc6+OLebzxCoBbLhL4gOq-RoA9jQsZUDgAcTApG6eBmM34MGksnkihUchgAqMQpFGBgi1cq3RVExCEi+Q4nnO6RC3ji232QSuiBKZPCEQyZwsmSCNKZLIa-w6nJBfLlCtFYEkYBwOAoOA4PBmugAZsGALYcWWC4W+lXLNXrZabbUBXX6w3GgKm803eLk7ZBTwZF6Uz41Zk-V1NQEjYHODgAISmqBmEE6VD0bnmMgwcgUSlUHAARh2uz2MH3SMnUWsMenEOFtv5HhYghEdt5PPvC7ks2v89EAvdwuFDc6638GxymzD2G2p93e2B+-7A8HQ+HSFGcFjSdOzfWcP3naxVTRNNQAzdccjCbc1wsPcDxJBBfFeDgQneDJHgZAib3qO92RaR8uU4AAFIMGAgMAZzncUh0lUc5B4GjUDohjwIXFZoOXWDEBCU4sl8DJwl8Xxogsc8YkLTwxI4TDlMwjJfHSCwqhrF0SPdciQWoihaPo99PwDIMQzDSMY1DDiuNMiCUT4pcNRXBBhO8UTxMk6TZM8QsNO8PYCkpHwghOIIiNZN1G1EJ9uUM4zuP7OEETBPoFkglN+NcwSEFxHEtziB49wCYlrj3XZhM8e5HQiCJCii+tSJofSW0SziTLAlLpjmdLlAWZEoJclw3IKvYiviU5CnKxBsi3DhHT8fd7hwmk9ya3TYtGEEdLZDomOHKUx0cYj9ucXjUwE9xEFKHDyRCfcHhCF411m9zIiU88jXyQ4-CvTbzofOKKI4PaYvYL8LN-azAI4U7ovvKhLpy0a8ru49HoUx5XrKwtqSzfdSgeeILjKmJAYhsiQd228gaoVK+p6DKUZGzVvHghrNKNEoHn89CT2zHYyjOalPIB7S6ap1qaZbcGkYwRm5XBQanKu3KbvyznIm54o-DKQsscW0I3nSZ4TkKalqhrDAKDo+BlnllqPRg5z1TRzWAFp0kLb2OGkgPA4OSmFZd58Bk0YZZeu9WPc2cpCzLEJdRkix5oI-cQ+dtrn36iOoRzhnetIYb3c1dIy11alHWyTIzfSbJEnQvIgmw14t1KwpMOrb4zulsPuS9BNFRgUvXYzc4goZTzgntE980T3wySNPEJPCfZyg5rO9Oj7l2xA5KS+ytm3OeI5FoqGrMiiEofELSlCaJMpsXCx7t+25tnw6+zuqPxcy7chUNOgRHovHwuUbGh5iwETeHEBkcR7Tv2BjtdqdkupziVv1Me11NjFCwshTSKEGTqX5tceauwojiwkluNcb9JZ91DoXTgTsOjYI1psM4+YEKXniK9N4704itx2CUUI4UGTBC0r3RG2dd7MKlgrTBzNlBsLjrdXmCFHT6kiNsV4htPK6keDVFeW4UKZ3odIneKDnzICmMQJgsAHb-3Hl4J4VUXpFGrjEUohY1xZHCLXE4-j8zkIUkg6mVjuQAFFvw4BUZqco1psLuMNDSLx2RDzAMblePU9I7QvWrNUIAA */\n id: \"SignTransactionDeviceAction\",\n initial: \"OpenAppDeviceAction\",\n context: ({ input }) => {\n return {\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n _internalState: {\n error: null,\n signature: null,\n },\n };\n },\n states: {\n OpenAppDeviceAction: {\n exit: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n invoke: {\n id: \"openAppStateMachine\",\n input: { appName: \"Solana\" },\n src: \"openAppStateMachine\",\n onSnapshot: {\n actions: assign({\n intermediateValue: (_) =>\n _.event.snapshot.context.intermediateValue,\n }),\n },\n onDone: {\n actions: assign({\n _internalState: (_) => {\n return _.event.output.caseOf<SignTransactionDAInternalState>({\n Right: () => _.context._internalState,\n Left: (error) => ({\n ..._.context._internalState,\n error,\n }),\n });\n },\n }),\n target: \"CheckOpenAppDeviceActionResult\",\n },\n },\n },\n CheckOpenAppDeviceActionResult: {\n always: [\n {\n target: \"SignTransaction\",\n guard: \"noInternalError\",\n },\n \"Error\",\n ],\n },\n SignTransaction: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n }),\n exit: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n invoke: {\n id: \"signTransaction\",\n src: \"signTransaction\",\n input: ({ context }) => ({\n derivationPath: context.input.derivationPath,\n serializedTransaction: context.input.transaction,\n }),\n onDone: {\n target: \"SignTransactionResultCheck\",\n actions: [\n assign({\n _internalState: ({ event, context }) => {\n if (!isSuccessCommandResult(event.output))\n return {\n ...context._internalState,\n error: event.output.error,\n };\n\n const data = event.output.data.extract();\n if (\n event.output.data.isJust() &&\n data instanceof Uint8Array\n )\n return {\n ...context._internalState,\n signature: data,\n };\n\n return {\n ...context._internalState,\n error: new UnknownDAError(\"No Signature available\"),\n };\n },\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n SignTransactionResultCheck: {\n always: [\n { guard: \"noInternalError\", target: \"Success\" },\n { target: \"Error\" },\n ],\n },\n Success: {\n type: \"final\",\n },\n Error: {\n type: \"final\",\n },\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(internalApi: InternalApi): MachineDependencies {\n const signTransaction = async (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) => {\n return new SignDataTask(internalApi, {\n commandFactory: (args) =>\n new SignTransactionCommand({\n serializedTransaction: args.chunkedData,\n more: args.more,\n extend: args.extend,\n }),\n derivationPath: arg0.input.derivationPath,\n sendingData: arg0.input.serializedTransaction,\n }).run();\n };\n\n return {\n signTransaction,\n };\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["SignTransactionDeviceAction_exports", "__export", "SignTransactionDeviceAction", "__toCommonJS", "import_device_management_kit", "import_purify_ts", "import_xstate", "import_SignTransactionCommand", "import_SendSignDataTask", "internalApi", "signTransaction", "context", "_", "input", "error", "event", "data", "arg0", "args"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var o=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var r=(t,e)=>{for(var n in e)o(t,n,{get:e[n],enumerable:!0})},S=(t,e,n,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of i(e))!p.call(t,s)&&s!==n&&o(t,s,{get:()=>e[s],enumerable:!(a=c(e,s))||a.enumerable});return t};var v=t=>S(o({},"__esModule",{value:!0}),t);var j={};r(j,{makeDeviceActionInternalApiMock:()=>D});module.exports=v(j);const M=jest.fn(),k=jest.fn(),d=jest.fn(),f=jest.fn(),m=jest.fn();function D(){return{sendCommand:M,getDeviceSessionState:k,getDeviceSessionStateObservable:d,setDeviceSessionState:f,getMetadataForAppHashes:m}}0&&(module.exports={makeDeviceActionInternalApiMock});
1
+ "use strict";var i=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var r=Object.prototype.hasOwnProperty;var S=(t,e)=>{for(var s in e)i(t,s,{get:e[s],enumerable:!0})},v=(t,e,s,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of a(e))!r.call(t,n)&&n!==s&&i(t,n,{get:()=>e[n],enumerable:!(o=c(e,n))||o.enumerable});return t};var p=t=>v(i({},"__esModule",{value:!0}),t);var j={};S(j,{makeDeviceActionInternalApiMock:()=>g});module.exports=p(j);const M=jest.fn(),k=jest.fn(),f=jest.fn(),m=jest.fn(),D=jest.fn();function g(){return{sendCommand:M,getDeviceSessionState:k,getDeviceSessionStateObservable:f,setDeviceSessionState:m,getManagerApiService:D}}0&&(module.exports={makeDeviceActionInternalApiMock});
2
2
  //# sourceMappingURL=makeInternalApi.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/internal/app-binder/device-action/__test-utils__/makeInternalApi.ts"],
4
- "sourcesContent": ["import { type InternalApi } from \"@ledgerhq/device-management-kit\";\n\nconst sendCommandMock = jest.fn();\nconst apiGetDeviceSessionStateMock = jest.fn();\nconst apiGetDeviceSessionStateObservableMock = jest.fn();\nconst setDeviceSessionStateMock = jest.fn();\nconst getMetadataForAppHashesMock = jest.fn();\n\nexport function makeDeviceActionInternalApiMock(): jest.Mocked<InternalApi> {\n return {\n sendCommand: sendCommandMock,\n getDeviceSessionState: apiGetDeviceSessionStateMock,\n getDeviceSessionStateObservable: apiGetDeviceSessionStateObservableMock,\n setDeviceSessionState: setDeviceSessionStateMock,\n getMetadataForAppHashes: getMetadataForAppHashesMock,\n };\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qCAAAE,IAAA,eAAAC,EAAAH,GAEA,MAAMI,EAAkB,KAAK,GAAG,EAC1BC,EAA+B,KAAK,GAAG,EACvCC,EAAyC,KAAK,GAAG,EACjDC,EAA4B,KAAK,GAAG,EACpCC,EAA8B,KAAK,GAAG,EAErC,SAASN,GAA4D,CAC1E,MAAO,CACL,YAAaE,EACb,sBAAuBC,EACvB,gCAAiCC,EACjC,sBAAuBC,EACvB,wBAAyBC,CAC3B,CACF",
6
- "names": ["makeInternalApi_exports", "__export", "makeDeviceActionInternalApiMock", "__toCommonJS", "sendCommandMock", "apiGetDeviceSessionStateMock", "apiGetDeviceSessionStateObservableMock", "setDeviceSessionStateMock", "getMetadataForAppHashesMock"]
4
+ "sourcesContent": ["import { type InternalApi } from \"@ledgerhq/device-management-kit\";\n\nconst sendCommandMock = jest.fn();\nconst apiGetDeviceSessionStateMock = jest.fn();\nconst apiGetDeviceSessionStateObservableMock = jest.fn();\nconst setDeviceSessionStateMock = jest.fn();\nconst getManagerApiServiceMock = jest.fn();\n\nexport function makeDeviceActionInternalApiMock(): jest.Mocked<InternalApi> {\n return {\n sendCommand: sendCommandMock,\n getDeviceSessionState: apiGetDeviceSessionStateMock,\n getDeviceSessionStateObservable: apiGetDeviceSessionStateObservableMock,\n setDeviceSessionState: setDeviceSessionStateMock,\n getManagerApiService: getManagerApiServiceMock,\n };\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qCAAAE,IAAA,eAAAC,EAAAH,GAEA,MAAMI,EAAkB,KAAK,GAAG,EAC1BC,EAA+B,KAAK,GAAG,EACvCC,EAAyC,KAAK,GAAG,EACjDC,EAA4B,KAAK,GAAG,EACpCC,EAA2B,KAAK,GAAG,EAElC,SAASN,GAA4D,CAC1E,MAAO,CACL,YAAaE,EACb,sBAAuBC,EACvB,gCAAiCC,EACjC,sBAAuBC,EACvB,qBAAsBC,CACxB,CACF",
6
+ "names": ["makeInternalApi_exports", "__export", "makeDeviceActionInternalApiMock", "__toCommonJS", "sendCommandMock", "apiGetDeviceSessionStateMock", "apiGetDeviceSessionStateObservableMock", "setDeviceSessionStateMock", "getManagerApiServiceMock"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var d=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var i=Object.prototype.hasOwnProperty;var c=(e,a)=>{for(var r in a)d(e,r,{get:a[r],enumerable:!0})},C=(e,a,r,o)=>{if(a&&typeof a=="object"||typeof a=="function")for(let n of u(a))!i.call(e,n)&&n!==r&&d(e,n,{get:()=>a[n],enumerable:!(o=l(a,n))||o.enumerable});return e};var p=e=>C(d({},"__esModule",{value:!0}),e);var h={};c(h,{SendCommandInChunksTask:()=>y});module.exports=p(h);var t=require("@ledgerhq/device-management-kit");class y{constructor(a,r){this.api=a;this.args=r}async run(){const{data:a,commandFactory:r}=this.args,o=new t.ByteArrayBuilder(a.length).addBufferToData(a).build();for(let n=0;n<o.length;n+=t.APDU_MAX_PAYLOAD){const m=n+t.APDU_MAX_PAYLOAD>=o.length,s=await this.api.sendCommand(r({more:!m,extend:n>0,chunkedData:o.slice(n,n+t.APDU_MAX_PAYLOAD)}));if(!(0,t.isSuccessCommandResult)(s))return s;if(m)return(0,t.CommandResultFactory)({data:s.data})}throw new t.InvalidStatusWordError("No result after processing all chunks")}}0&&(module.exports={SendCommandInChunksTask});
1
+ "use strict";var d=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var C=(t,a)=>{for(var e in a)d(t,e,{get:a[e],enumerable:!0})},i=(t,a,e,o)=>{if(a&&typeof a=="object"||typeof a=="function")for(let n of u(a))!p.call(t,n)&&n!==e&&d(t,n,{get:()=>a[n],enumerable:!(o=l(a,n))||o.enumerable});return t};var c=t=>i(d({},"__esModule",{value:!0}),t);var A={};C(A,{SendCommandInChunksTask:()=>y});module.exports=c(A);var r=require("@ledgerhq/device-management-kit");class y{constructor(a,e){this.api=a;this.args=e}async run(){const{data:a,commandFactory:e}=this.args,o=new r.ByteArrayBuilder(a.length).addBufferToData(a).build();for(let n=0;n<o.length;n+=r.APDU_MAX_PAYLOAD){const m=n+r.APDU_MAX_PAYLOAD>=o.length,s=await this.api.sendCommand(e({more:!m,extend:n>0,chunkedData:o.slice(n,n+r.APDU_MAX_PAYLOAD)}));if(!(0,r.isSuccessCommandResult)(s))return s;if(m)return(0,r.CommandResultFactory)({data:s.data})}throw new r.InvalidStatusWordError("No result after processing all chunks")}}0&&(module.exports={SendCommandInChunksTask});
2
2
  //# sourceMappingURL=SendCommandInChunksTask.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/task/SendCommandInChunksTask.ts"],
4
- "sourcesContent": ["import {\n APDU_MAX_PAYLOAD,\n ByteArrayBuilder,\n type Command,\n type CommandResult,\n CommandResultFactory,\n type InternalApi,\n InvalidStatusWordError,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nexport type SendCommandInChunksTaskArgs<T> = {\n data: Uint8Array;\n commandFactory: CommandFactory<T>;\n};\n\nexport type CommandFactory<T> = <V extends ChunkableCommandArgs>(\n args: ChunkableCommandArgs,\n) => Command<T, V>;\n\nexport type ChunkableCommandArgs = {\n chunkedData: Uint8Array;\n more: boolean;\n extend: boolean;\n};\n\nexport class SendCommandInChunksTask<T> {\n constructor(\n private api: InternalApi,\n private args: SendCommandInChunksTaskArgs<T>,\n ) {}\n\n async run(): Promise<CommandResult<T, void>> {\n const { data: fullPayload, commandFactory } = this.args;\n\n const dataBuffer = new ByteArrayBuilder(fullPayload.length)\n .addBufferToData(fullPayload)\n .build();\n\n for (\n let offset = 0;\n offset < dataBuffer.length;\n offset += APDU_MAX_PAYLOAD\n ) {\n const isLastChunk = offset + APDU_MAX_PAYLOAD >= dataBuffer.length;\n const result = await this.api.sendCommand(\n commandFactory({\n more: !isLastChunk,\n extend: offset > 0,\n chunkedData: dataBuffer.slice(offset, offset + APDU_MAX_PAYLOAD),\n }),\n );\n\n if (!isSuccessCommandResult(result)) {\n return result;\n }\n\n if (isLastChunk) {\n return CommandResultFactory({\n data: result.data,\n });\n }\n }\n\n throw new InvalidStatusWordError(\"No result after processing all chunks\");\n }\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,6BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EASO,2CAiBA,MAAMF,CAA2B,CACtC,YACUG,EACAC,EACR,CAFQ,SAAAD,EACA,UAAAC,CACP,CAEH,MAAM,KAAuC,CAC3C,KAAM,CAAE,KAAMC,EAAa,eAAAC,CAAe,EAAI,KAAK,KAE7CC,EAAa,IAAI,mBAAiBF,EAAY,MAAM,EACvD,gBAAgBA,CAAW,EAC3B,MAAM,EAET,QACMG,EAAS,EACbA,EAASD,EAAW,OACpBC,GAAU,mBACV,CACA,MAAMC,EAAcD,EAAS,oBAAoBD,EAAW,OACtDG,EAAS,MAAM,KAAK,IAAI,YAC5BJ,EAAe,CACb,KAAM,CAACG,EACP,OAAQD,EAAS,EACjB,YAAaD,EAAW,MAAMC,EAAQA,EAAS,kBAAgB,CACjE,CAAC,CACH,EAEA,GAAI,IAAC,0BAAuBE,CAAM,EAChC,OAAOA,EAGT,GAAID,EACF,SAAO,wBAAqB,CAC1B,KAAMC,EAAO,IACf,CAAC,CAEL,CAEA,MAAM,IAAI,yBAAuB,uCAAuC,CAC1E,CACF",
4
+ "sourcesContent": ["import {\n APDU_MAX_PAYLOAD,\n ByteArrayBuilder,\n type Command,\n type CommandResult,\n CommandResultFactory,\n type InternalApi,\n InvalidStatusWordError,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\n\nexport type SendCommandInChunksTaskArgs<T> = {\n data: Uint8Array;\n commandFactory: CommandFactory<T>;\n};\n\nexport type CommandFactory<T> = <V extends ChunkableCommandArgs>(\n args: ChunkableCommandArgs,\n) => Command<T, V, SolanaAppErrorCodes>;\n\nexport type ChunkableCommandArgs = {\n chunkedData: Uint8Array;\n more: boolean;\n extend: boolean;\n};\n\nexport class SendCommandInChunksTask<T> {\n constructor(\n private api: InternalApi,\n private args: SendCommandInChunksTaskArgs<T>,\n ) {}\n\n async run(): Promise<CommandResult<T, SolanaAppErrorCodes>> {\n const { data: fullPayload, commandFactory } = this.args;\n\n const dataBuffer = new ByteArrayBuilder(fullPayload.length)\n .addBufferToData(fullPayload)\n .build();\n\n for (\n let offset = 0;\n offset < dataBuffer.length;\n offset += APDU_MAX_PAYLOAD\n ) {\n const isLastChunk = offset + APDU_MAX_PAYLOAD >= dataBuffer.length;\n const result = await this.api.sendCommand(\n commandFactory({\n more: !isLastChunk,\n extend: offset > 0,\n chunkedData: dataBuffer.slice(offset, offset + APDU_MAX_PAYLOAD),\n }),\n );\n\n if (!isSuccessCommandResult(result)) {\n return result;\n }\n\n if (isLastChunk) {\n return CommandResultFactory({\n data: result.data,\n });\n }\n }\n\n throw new InvalidStatusWordError(\"No result after processing all chunks\");\n }\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,6BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EASO,2CAmBA,MAAMF,CAA2B,CACtC,YACUG,EACAC,EACR,CAFQ,SAAAD,EACA,UAAAC,CACP,CAEH,MAAM,KAAsD,CAC1D,KAAM,CAAE,KAAMC,EAAa,eAAAC,CAAe,EAAI,KAAK,KAE7CC,EAAa,IAAI,mBAAiBF,EAAY,MAAM,EACvD,gBAAgBA,CAAW,EAC3B,MAAM,EAET,QACMG,EAAS,EACbA,EAASD,EAAW,OACpBC,GAAU,mBACV,CACA,MAAMC,EAAcD,EAAS,oBAAoBD,EAAW,OACtDG,EAAS,MAAM,KAAK,IAAI,YAC5BJ,EAAe,CACb,KAAM,CAACG,EACP,OAAQD,EAAS,EACjB,YAAaD,EAAW,MAAMC,EAAQA,EAAS,kBAAgB,CACjE,CAAC,CACH,EAEA,GAAI,IAAC,0BAAuBE,CAAM,EAChC,OAAOA,EAGT,GAAID,EACF,SAAO,wBAAqB,CAC1B,KAAMC,EAAO,IACf,CAAC,CAEL,CAEA,MAAM,IAAI,yBAAuB,uCAAuC,CAC1E,CACF",
6
6
  "names": ["SendCommandInChunksTask_exports", "__export", "SendCommandInChunksTask", "__toCommonJS", "import_device_management_kit", "api", "args", "fullPayload", "commandFactory", "dataBuffer", "offset", "isLastChunk", "result"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var o=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var l=(n,a)=>{for(var r in a)o(n,r,{get:a[r],enumerable:!0})},h=(n,a,r,e)=>{if(a&&typeof a=="object"||typeof a=="function")for(let t of c(a))!u.call(n,t)&&t!==r&&o(n,t,{get:()=>a[t],enumerable:!(e=g(a,t))||e.enumerable});return n};var f=n=>h(o({},"__esModule",{value:!0}),n);var T={};l(T,{SignDataTask:()=>S});module.exports=f(T);var s=require("@ledgerhq/device-management-kit"),d=require("@ledgerhq/signer-utils"),m=require("./SendCommandInChunksTask");const D=4;class S{constructor(a,r){this.api=a;this.args=r}async run(){const{sendingData:a,derivationPath:r,commandFactory:e}=this.args,t=d.DerivationPathUtils.splitPath(r),i=new s.ByteArrayBuilder(a.length+2+t.length*D);i.add8BitUIntToData(1),i.add8BitUIntToData(t.length),t.forEach(y=>i.add32BitUIntToData(y)),i.addBufferToData(a);const p=i.build();return await new m.SendCommandInChunksTask(this.api,{data:p,commandFactory:e}).run()}}0&&(module.exports={SignDataTask});
1
+ "use strict";var i=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var u=(r,a)=>{for(var o in a)i(r,o,{get:a[o],enumerable:!0})},S=(r,a,o,e)=>{if(a&&typeof a=="object"||typeof a=="function")for(let t of g(a))!c.call(r,t)&&t!==o&&i(r,t,{get:()=>a[t],enumerable:!(e=l(a,t))||e.enumerable});return r};var h=r=>S(i({},"__esModule",{value:!0}),r);var C={};u(C,{SignDataTask:()=>f});module.exports=h(C);var s=require("@ledgerhq/device-management-kit"),p=require("@ledgerhq/signer-utils"),d=require("./SendCommandInChunksTask");const A=4;class f{constructor(a,o){this.api=a;this.args=o}async run(){const{sendingData:a,derivationPath:o,commandFactory:e}=this.args,t=p.DerivationPathUtils.splitPath(o),n=new s.ByteArrayBuilder(a.length+2+t.length*A);n.add8BitUIntToData(1),n.add8BitUIntToData(t.length),t.forEach(y=>n.add32BitUIntToData(y)),n.addBufferToData(a);const m=n.build();return await new d.SendCommandInChunksTask(this.api,{data:m,commandFactory:e}).run()}}0&&(module.exports={SignDataTask});
2
2
  //# sourceMappingURL=SendSignDataTask.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/task/SendSignDataTask.ts"],
4
- "sourcesContent": ["import {\n ByteArrayBuilder,\n type CommandResult,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\nimport { DerivationPathUtils } from \"@ledgerhq/signer-utils\";\nimport { type Maybe } from \"purify-ts\";\n\nimport { type Signature } from \"@api/model/Signature\";\n\nimport {\n type CommandFactory,\n SendCommandInChunksTask,\n} from \"./SendCommandInChunksTask\";\n\nconst PATH_SIZE = 4;\n\ntype SignDataTaskArgs = {\n sendingData: Uint8Array;\n derivationPath: string;\n commandFactory: CommandFactory<Maybe<Signature>>;\n};\n\nexport class SignDataTask {\n constructor(\n private api: InternalApi,\n private args: SignDataTaskArgs,\n ) {}\n\n async run(): Promise<CommandResult<Maybe<Signature>, void>> {\n const { sendingData, derivationPath, commandFactory } = this.args;\n\n const paths = DerivationPathUtils.splitPath(derivationPath);\n const builder = new ByteArrayBuilder(\n sendingData.length + 2 + paths.length * PATH_SIZE,\n );\n // add the number of signers\n builder.add8BitUIntToData(1);\n // add the number of derivation\n builder.add8BitUIntToData(paths.length);\n // add every derivation path\n paths.forEach((path) => builder.add32BitUIntToData(path));\n builder.addBufferToData(sendingData);\n const buffer = builder.build();\n\n return await new SendCommandInChunksTask<Maybe<Signature>>(this.api, {\n data: buffer,\n commandFactory,\n }).run();\n }\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,kBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAIO,2CACPC,EAAoC,kCAKpCC,EAGO,qCAEP,MAAMC,EAAY,EAQX,MAAML,CAAa,CACxB,YACUM,EACAC,EACR,CAFQ,SAAAD,EACA,UAAAC,CACP,CAEH,MAAM,KAAsD,CAC1D,KAAM,CAAE,YAAAC,EAAa,eAAAC,EAAgB,eAAAC,CAAe,EAAI,KAAK,KAEvDC,EAAQ,sBAAoB,UAAUF,CAAc,EACpDG,EAAU,IAAI,mBAClBJ,EAAY,OAAS,EAAIG,EAAM,OAASN,CAC1C,EAEAO,EAAQ,kBAAkB,CAAC,EAE3BA,EAAQ,kBAAkBD,EAAM,MAAM,EAEtCA,EAAM,QAASE,GAASD,EAAQ,mBAAmBC,CAAI,CAAC,EACxDD,EAAQ,gBAAgBJ,CAAW,EACnC,MAAMM,EAASF,EAAQ,MAAM,EAE7B,OAAO,MAAM,IAAI,0BAA0C,KAAK,IAAK,CACnE,KAAME,EACN,eAAAJ,CACF,CAAC,EAAE,IAAI,CACT,CACF",
4
+ "sourcesContent": ["import {\n ByteArrayBuilder,\n type CommandResult,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\nimport { DerivationPathUtils } from \"@ledgerhq/signer-utils\";\nimport { type Maybe } from \"purify-ts\";\n\nimport { type Signature } from \"@api/model/Signature\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\n\nimport {\n type CommandFactory,\n SendCommandInChunksTask,\n} from \"./SendCommandInChunksTask\";\n\nconst PATH_SIZE = 4;\n\ntype SignDataTaskArgs = {\n sendingData: Uint8Array;\n derivationPath: string;\n commandFactory: CommandFactory<Maybe<Signature | SolanaAppErrorCodes>>;\n};\n\nexport class SignDataTask {\n constructor(\n private api: InternalApi,\n private args: SignDataTaskArgs,\n ) {}\n\n async run(): Promise<\n CommandResult<Maybe<Signature | SolanaAppErrorCodes>, SolanaAppErrorCodes>\n > {\n const { sendingData, derivationPath, commandFactory } = this.args;\n\n const paths = DerivationPathUtils.splitPath(derivationPath);\n const builder = new ByteArrayBuilder(\n sendingData.length + 2 + paths.length * PATH_SIZE,\n );\n // add the number of signers\n builder.add8BitUIntToData(1);\n // add the number of derivation\n builder.add8BitUIntToData(paths.length);\n // add every derivation path\n paths.forEach((path) => builder.add32BitUIntToData(path));\n builder.addBufferToData(sendingData);\n const buffer = builder.build();\n\n return await new SendCommandInChunksTask<\n Maybe<Signature | SolanaAppErrorCodes>\n >(this.api, {\n data: buffer,\n commandFactory,\n }).run();\n }\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,kBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAIO,2CACPC,EAAoC,kCAMpCC,EAGO,qCAEP,MAAMC,EAAY,EAQX,MAAML,CAAa,CACxB,YACUM,EACAC,EACR,CAFQ,SAAAD,EACA,UAAAC,CACP,CAEH,MAAM,KAEJ,CACA,KAAM,CAAE,YAAAC,EAAa,eAAAC,EAAgB,eAAAC,CAAe,EAAI,KAAK,KAEvDC,EAAQ,sBAAoB,UAAUF,CAAc,EACpDG,EAAU,IAAI,mBAClBJ,EAAY,OAAS,EAAIG,EAAM,OAASN,CAC1C,EAEAO,EAAQ,kBAAkB,CAAC,EAE3BA,EAAQ,kBAAkBD,EAAM,MAAM,EAEtCA,EAAM,QAASE,GAASD,EAAQ,mBAAmBC,CAAI,CAAC,EACxDD,EAAQ,gBAAgBJ,CAAW,EACnC,MAAMM,EAASF,EAAQ,MAAM,EAE7B,OAAO,MAAM,IAAI,0BAEf,KAAK,IAAK,CACV,KAAME,EACN,eAAAJ,CACF,CAAC,EAAE,IAAI,CACT,CACF",
6
6
  "names": ["SendSignDataTask_exports", "__export", "SignDataTask", "__toCommonJS", "import_device_management_kit", "import_signer_utils", "import_SendCommandInChunksTask", "PATH_SIZE", "api", "args", "sendingData", "derivationPath", "commandFactory", "paths", "builder", "path", "buffer"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var d=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var h=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var y=(i,e)=>{for(var n in e)d(i,n,{get:e[n],enumerable:!0})},A=(i,e,n,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of h(e))!S.call(i,t)&&t!==n&&d(i,t,{get:()=>e[t],enumerable:!(a=p(e,t))||a.enumerable});return i};var v=i=>A(d({},"__esModule",{value:!0}),i);var b={};y(b,{SendSignMessageTask:()=>U});module.exports=v(b);var l=require("@ledgerhq/device-management-kit"),f=require("@ledgerhq/signer-utils"),m=require("../../app-binder/command/SignOffChainMessageCommand");class U{constructor(e,n){this.api=e;this.args=n}async run(){const{sendingData:e,derivationPath:n}=this.args,a=this._buildApduCommand(this._buildFullMessage(e),f.DerivationPathUtils.splitPath(n));return await this.api.sendCommand(new m.SignOffChainMessageCommand({message:a,derivationPath:n}))}_buildFullMessage(e){const n=new TextEncoder().encode("solana offchain"),a=4,t=new Uint8Array(a);t[2]=e.length;const s=new Uint8Array(1+n.length+t.length+e.length);let r=0;return s[r++]=255,s.set(n,r),r+=n.length,s.set(t,r),r+=t.length,s.set(e,r),s}_buildApduCommand(e,n){const u=n.length,o=new l.ByteArrayBuilder(e.length+1+1+u*4);return o.add8BitUIntToData(1),o.add8BitUIntToData(u),n.forEach(c=>{const g=new Uint8Array(4);new DataView(g.buffer).setUint32(0,c,!1),o.addBufferToData(g)}),o.addBufferToData(e),o.build()}}0&&(module.exports={SendSignMessageTask});
1
+ "use strict";var d=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var y=(r,e)=>{for(var n in e)d(r,n,{get:e[n],enumerable:!0})},A=(r,e,n,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of S(e))!h.call(r,t)&&t!==n&&d(r,t,{get:()=>e[t],enumerable:!(a=c(e,t))||a.enumerable});return r};var C=r=>A(d({},"__esModule",{value:!0}),r);var v={};y(v,{SendSignMessageTask:()=>b});module.exports=C(v);var l=require("@ledgerhq/device-management-kit"),m=require("@ledgerhq/signer-utils"),p=require("../../app-binder/command/SignOffChainMessageCommand");class b{constructor(e,n){this.api=e;this.args=n}async run(){const{sendingData:e,derivationPath:n}=this.args,a=this._buildApduCommand(this._buildFullMessage(e),m.DerivationPathUtils.splitPath(n));return await this.api.sendCommand(new p.SignOffChainMessageCommand({message:a,derivationPath:n}))}_buildFullMessage(e){const n=new TextEncoder().encode("solana offchain"),a=4,t=new Uint8Array(a);t[2]=e.length;const s=new Uint8Array(1+n.length+t.length+e.length);let i=0;return s[i++]=255,s.set(n,i),i+=n.length,s.set(t,i),i+=t.length,s.set(e,i),s}_buildApduCommand(e,n){const u=n.length,o=new l.ByteArrayBuilder(e.length+1+1+u*4);return o.add8BitUIntToData(1),o.add8BitUIntToData(u),n.forEach(f=>{const g=new Uint8Array(4);new DataView(g.buffer).setUint32(0,f,!1),o.addBufferToData(g)}),o.addBufferToData(e),o.build()}}0&&(module.exports={SendSignMessageTask});
2
2
  //# sourceMappingURL=SendSignMessageTask.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/task/SendSignMessageTask.ts"],
4
- "sourcesContent": ["import {\n ByteArrayBuilder,\n type CommandResult,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\nimport { DerivationPathUtils } from \"@ledgerhq/signer-utils\";\n\nimport { SignOffChainMessageCommand } from \"@internal/app-binder/command/SignOffChainMessageCommand\";\n\nexport type SendSignMessageTaskArgs = {\n sendingData: Uint8Array;\n derivationPath: string;\n};\n\nexport type SendSignMessageTaskRunFunctionReturn = Promise<\n CommandResult<Uint8Array, void>\n>;\n\nexport class SendSignMessageTask {\n constructor(\n private api: InternalApi,\n private args: SendSignMessageTaskArgs,\n ) {}\n\n async run(): SendSignMessageTaskRunFunctionReturn {\n const { sendingData, derivationPath } = this.args;\n\n const commandBuffer = this._buildApduCommand(\n this._buildFullMessage(sendingData),\n DerivationPathUtils.splitPath(derivationPath),\n );\n\n return await this.api.sendCommand(\n new SignOffChainMessageCommand({\n message: commandBuffer,\n derivationPath,\n }),\n );\n }\n\n private _buildFullMessage(sendingData: Uint8Array): Uint8Array {\n const prefix = new TextEncoder().encode(\"solana offchain\");\n const msgLengthFieldSize = 4;\n\n const lengthBytes = new Uint8Array(msgLengthFieldSize);\n lengthBytes[2] = sendingData.length;\n\n const fullMessage = new Uint8Array(\n 1 + prefix.length + lengthBytes.length + sendingData.length,\n );\n\n let offset = 0;\n fullMessage[offset++] = 0xff;\n fullMessage.set(prefix, offset);\n offset += prefix.length;\n fullMessage.set(lengthBytes, offset);\n offset += lengthBytes.length;\n fullMessage.set(sendingData, offset);\n\n return fullMessage;\n }\n\n private _buildApduCommand(\n fullMessage: Uint8Array,\n paths: number[],\n ): Uint8Array {\n const numberOfSigners = 1;\n const pathSize = 4;\n const signersCountSize = 1;\n const derivationsCountSize = 1;\n const numberOfDerivations = paths.length;\n const builder = new ByteArrayBuilder(\n fullMessage.length +\n signersCountSize +\n derivationsCountSize +\n numberOfDerivations * pathSize,\n );\n\n builder.add8BitUIntToData(numberOfSigners);\n builder.add8BitUIntToData(numberOfDerivations);\n\n paths.forEach((path) => {\n const buffer = new Uint8Array(4);\n const view = new DataView(buffer.buffer);\n view.setUint32(0, path, false);\n builder.addBufferToData(buffer);\n });\n\n builder.addBufferToData(fullMessage);\n return builder.build();\n }\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,yBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAIO,2CACPC,EAAoC,kCAEpCC,EAA2C,mEAWpC,MAAMJ,CAAoB,CAC/B,YACUK,EACAC,EACR,CAFQ,SAAAD,EACA,UAAAC,CACP,CAEH,MAAM,KAA4C,CAChD,KAAM,CAAE,YAAAC,EAAa,eAAAC,CAAe,EAAI,KAAK,KAEvCC,EAAgB,KAAK,kBACzB,KAAK,kBAAkBF,CAAW,EAClC,sBAAoB,UAAUC,CAAc,CAC9C,EAEA,OAAO,MAAM,KAAK,IAAI,YACpB,IAAI,6BAA2B,CAC7B,QAASC,EACT,eAAAD,CACF,CAAC,CACH,CACF,CAEQ,kBAAkBD,EAAqC,CAC7D,MAAMG,EAAS,IAAI,YAAY,EAAE,OAAO,iBAAiB,EACnDC,EAAqB,EAErBC,EAAc,IAAI,WAAWD,CAAkB,EACrDC,EAAY,CAAC,EAAIL,EAAY,OAE7B,MAAMM,EAAc,IAAI,WACtB,EAAIH,EAAO,OAASE,EAAY,OAASL,EAAY,MACvD,EAEA,IAAIO,EAAS,EACb,OAAAD,EAAYC,GAAQ,EAAI,IACxBD,EAAY,IAAIH,EAAQI,CAAM,EAC9BA,GAAUJ,EAAO,OACjBG,EAAY,IAAID,EAAaE,CAAM,EACnCA,GAAUF,EAAY,OACtBC,EAAY,IAAIN,EAAaO,CAAM,EAE5BD,CACT,CAEQ,kBACNA,EACAE,EACY,CAKZ,MAAMC,EAAsBD,EAAM,OAC5BE,EAAU,IAAI,mBAClBJ,EAAY,OACV,EACA,EACAG,EAAsB,CAC1B,EAEA,OAAAC,EAAQ,kBAAkB,CAAe,EACzCA,EAAQ,kBAAkBD,CAAmB,EAE7CD,EAAM,QAASG,GAAS,CACtB,MAAMC,EAAS,IAAI,WAAW,CAAC,EAClB,IAAI,SAASA,EAAO,MAAM,EAClC,UAAU,EAAGD,EAAM,EAAK,EAC7BD,EAAQ,gBAAgBE,CAAM,CAChC,CAAC,EAEDF,EAAQ,gBAAgBJ,CAAW,EAC5BI,EAAQ,MAAM,CACvB,CACF",
4
+ "sourcesContent": ["import {\n ByteArrayBuilder,\n type CommandResult,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\nimport { DerivationPathUtils } from \"@ledgerhq/signer-utils\";\n\nimport { type Signature } from \"@api/index\";\nimport { SignOffChainMessageCommand } from \"@internal/app-binder/command/SignOffChainMessageCommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\n\nexport type SendSignMessageTaskArgs = {\n sendingData: Uint8Array;\n derivationPath: string;\n};\n\nexport type SendSignMessageTaskRunFunctionReturn = Promise<\n CommandResult<Signature, SolanaAppErrorCodes>\n>;\n\nexport class SendSignMessageTask {\n constructor(\n private api: InternalApi,\n private args: SendSignMessageTaskArgs,\n ) {}\n\n async run(): SendSignMessageTaskRunFunctionReturn {\n const { sendingData, derivationPath } = this.args;\n\n const commandBuffer = this._buildApduCommand(\n this._buildFullMessage(sendingData),\n DerivationPathUtils.splitPath(derivationPath),\n );\n\n return await this.api.sendCommand(\n new SignOffChainMessageCommand({\n message: commandBuffer,\n derivationPath,\n }),\n );\n }\n\n private _buildFullMessage(sendingData: Uint8Array): Uint8Array {\n const prefix = new TextEncoder().encode(\"solana offchain\");\n const msgLengthFieldSize = 4;\n\n const lengthBytes = new Uint8Array(msgLengthFieldSize);\n lengthBytes[2] = sendingData.length;\n\n const fullMessage = new Uint8Array(\n 1 + prefix.length + lengthBytes.length + sendingData.length,\n );\n\n let offset = 0;\n fullMessage[offset++] = 0xff;\n fullMessage.set(prefix, offset);\n offset += prefix.length;\n fullMessage.set(lengthBytes, offset);\n offset += lengthBytes.length;\n fullMessage.set(sendingData, offset);\n\n return fullMessage;\n }\n\n private _buildApduCommand(\n fullMessage: Uint8Array,\n paths: number[],\n ): Uint8Array {\n const numberOfSigners = 1;\n const pathSize = 4;\n const signersCountSize = 1;\n const derivationsCountSize = 1;\n const numberOfDerivations = paths.length;\n const builder = new ByteArrayBuilder(\n fullMessage.length +\n signersCountSize +\n derivationsCountSize +\n numberOfDerivations * pathSize,\n );\n\n builder.add8BitUIntToData(numberOfSigners);\n builder.add8BitUIntToData(numberOfDerivations);\n\n paths.forEach((path) => {\n const buffer = new Uint8Array(4);\n const view = new DataView(buffer.buffer);\n view.setUint32(0, path, false);\n builder.addBufferToData(buffer);\n });\n\n builder.addBufferToData(fullMessage);\n return builder.build();\n }\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,yBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAIO,2CACPC,EAAoC,kCAGpCC,EAA2C,mEAYpC,MAAMJ,CAAoB,CAC/B,YACUK,EACAC,EACR,CAFQ,SAAAD,EACA,UAAAC,CACP,CAEH,MAAM,KAA4C,CAChD,KAAM,CAAE,YAAAC,EAAa,eAAAC,CAAe,EAAI,KAAK,KAEvCC,EAAgB,KAAK,kBACzB,KAAK,kBAAkBF,CAAW,EAClC,sBAAoB,UAAUC,CAAc,CAC9C,EAEA,OAAO,MAAM,KAAK,IAAI,YACpB,IAAI,6BAA2B,CAC7B,QAASC,EACT,eAAAD,CACF,CAAC,CACH,CACF,CAEQ,kBAAkBD,EAAqC,CAC7D,MAAMG,EAAS,IAAI,YAAY,EAAE,OAAO,iBAAiB,EACnDC,EAAqB,EAErBC,EAAc,IAAI,WAAWD,CAAkB,EACrDC,EAAY,CAAC,EAAIL,EAAY,OAE7B,MAAMM,EAAc,IAAI,WACtB,EAAIH,EAAO,OAASE,EAAY,OAASL,EAAY,MACvD,EAEA,IAAIO,EAAS,EACb,OAAAD,EAAYC,GAAQ,EAAI,IACxBD,EAAY,IAAIH,EAAQI,CAAM,EAC9BA,GAAUJ,EAAO,OACjBG,EAAY,IAAID,EAAaE,CAAM,EACnCA,GAAUF,EAAY,OACtBC,EAAY,IAAIN,EAAaO,CAAM,EAE5BD,CACT,CAEQ,kBACNA,EACAE,EACY,CAKZ,MAAMC,EAAsBD,EAAM,OAC5BE,EAAU,IAAI,mBAClBJ,EAAY,OACV,EACA,EACAG,EAAsB,CAC1B,EAEA,OAAAC,EAAQ,kBAAkB,CAAe,EACzCA,EAAQ,kBAAkBD,CAAmB,EAE7CD,EAAM,QAASG,GAAS,CACtB,MAAMC,EAAS,IAAI,WAAW,CAAC,EAClB,IAAI,SAASA,EAAO,MAAM,EAClC,UAAU,EAAGD,EAAM,EAAK,EAC7BD,EAAQ,gBAAgBE,CAAM,CAChC,CAAC,EAEDF,EAAQ,gBAAgBJ,CAAW,EAC5BI,EAAQ,MAAM,CACvB,CACF",
6
6
  "names": ["SendSignMessageTask_exports", "__export", "SendSignMessageTask", "__toCommonJS", "import_device_management_kit", "import_signer_utils", "import_SignOffChainMessageCommand", "api", "args", "sendingData", "derivationPath", "commandBuffer", "prefix", "msgLengthFieldSize", "lengthBytes", "fullMessage", "offset", "paths", "numberOfDerivations", "builder", "path", "buffer"]
7
7
  }
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@ledgerhq/device-signer-kit-solana",
3
- "version": "1.0.1",
3
+ "version": "1.1.0",
4
+ "private": false,
4
5
  "license": "Apache-2.0",
5
6
  "exports": {
6
7
  ".": {
@@ -36,11 +37,11 @@
36
37
  "dependencies": {
37
38
  "@ledgerhq/signer-utils": "workspace:*",
38
39
  "bs58": "^6.0.0",
39
- "inversify": "^6.0.3",
40
+ "inversify": "^6.2.1",
40
41
  "inversify-logger-middleware": "^3.1.0",
41
42
  "purify-ts": "^2.1.0",
42
43
  "reflect-metadata": "^0.2.2",
43
- "xstate": "^5.18.2"
44
+ "xstate": "^5.19.2"
44
45
  },
45
46
  "devDependencies": {
46
47
  "@ledgerhq/device-management-kit": "workspace:*",
@@ -1,2 +1,2 @@
1
- import{ApduBuilder as d,ApduParser as m,CommandResultFactory as e,InvalidStatusWordError as u,isCommandErrorCode as C}from"@ledgerhq/device-management-kit";import{PublicKeyDisplayMode as p}from"../../../api/model/PublicKeyDisplayMode";import{SolanaAppCommandError as g,solanaAppErrors as a}from"./utils/solanaAppErrors";class y{args;constructor(r){this.args=r}getApdu(){return new d({cla:224,ins:4,p1:0,p2:0}).build()}parseResponse(r){const t=new m(r),n=t.encodeToHexaString(r.statusCode);if(C(n,a))return e({error:new g({...a[n],errorCode:n})});const o=t.extractFieldByLength(5);if(!o||o.length!==5||o.some(s=>s===void 0))return e({error:new u("Invalid response")});const i={blindSigningEnabled:!!o[0],pubKeyDisplayMode:o[1]===0?p.LONG:p.SHORT,version:`${o[2]}.${o[3]}.${o[4]}`};return e({data:i})}}export{y as GetAppConfigurationCommand};
1
+ import{ApduBuilder as t,ApduParser as i,CommandResultFactory as e,InvalidStatusWordError as m}from"@ledgerhq/device-management-kit";import{CommandErrorHelper as d}from"@ledgerhq/signer-utils";import{Maybe as s}from"purify-ts";import{PublicKeyDisplayMode as n}from"../../../api/model/PublicKeyDisplayMode";import{SOLANA_APP_ERRORS as u,SolanaAppCommandErrorFactory as l}from"./utils/SolanaApplicationErrors";class R{errorHelper=new d(u,l);args;constructor(o){this.args=o}getApdu(){return new t({cla:224,ins:4,p1:0,p2:0}).build()}parseResponse(o){return s.fromNullable(this.errorHelper.getError(o)).orDefaultLazy(()=>{const r=new i(o).extractFieldByLength(5);if(!r||r.length!==5||r.some(a=>a===void 0))return e({error:new m("Invalid response")});const p={blindSigningEnabled:!!r[0],pubKeyDisplayMode:r[1]===0?n.LONG:n.SHORT,version:`${r[2]}.${r[3]}.${r[4]}`};return e({data:p})})}}export{R as GetAppConfigurationCommand};
2
2
  //# sourceMappingURL=GetAppConfigurationCommand.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/command/GetAppConfigurationCommand.ts"],
4
- "sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n isCommandErrorCode,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { PublicKeyDisplayMode } from \"@api/model/PublicKeyDisplayMode\";\n\nimport {\n SolanaAppCommandError,\n solanaAppErrors,\n} from \"./utils/solanaAppErrors\";\n\ntype GetAppConfigurationCommandArgs = void;\n\nexport class GetAppConfigurationCommand\n implements Command<AppConfiguration, GetAppConfigurationCommandArgs>\n{\n args: GetAppConfigurationCommandArgs;\n\n constructor(args: GetAppConfigurationCommandArgs) {\n this.args = args;\n }\n\n getApdu(): Apdu {\n return new ApduBuilder({\n cla: 0xe0,\n ins: 0x04,\n p1: 0x00,\n p2: 0x00,\n }).build();\n }\n\n parseResponse(response: ApduResponse): CommandResult<AppConfiguration> {\n const parser = new ApduParser(response);\n const errorCode = parser.encodeToHexaString(response.statusCode);\n if (isCommandErrorCode(errorCode, solanaAppErrors)) {\n return CommandResultFactory({\n error: new SolanaAppCommandError({\n ...solanaAppErrors[errorCode],\n errorCode,\n }),\n });\n }\n\n const buffer = parser.extractFieldByLength(5);\n if (\n !buffer ||\n buffer.length !== 5 ||\n buffer.some((element) => element === undefined)\n ) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"Invalid response\"),\n });\n }\n\n const config: AppConfiguration = {\n blindSigningEnabled: Boolean(buffer[0]),\n pubKeyDisplayMode:\n buffer[1] === 0\n ? PublicKeyDisplayMode.LONG\n : PublicKeyDisplayMode.SHORT,\n version: `${buffer[2]}.${buffer[3]}.${buffer[4]}`,\n };\n\n return CommandResultFactory({\n data: config,\n });\n }\n}\n"],
5
- "mappings": "AAAA,OAEE,eAAAA,EACA,cAAAC,EAIA,wBAAAC,EACA,0BAAAC,EACA,sBAAAC,MACK,kCAGP,OAAS,wBAAAC,MAA4B,kCAErC,OACE,yBAAAC,EACA,mBAAAC,MACK,0BAIA,MAAMC,CAEb,CACE,KAEA,YAAYC,EAAsC,CAChD,KAAK,KAAOA,CACd,CAEA,SAAgB,CACd,OAAO,IAAIT,EAAY,CACrB,IAAK,IACL,IAAK,EACL,GAAI,EACJ,GAAI,CACN,CAAC,EAAE,MAAM,CACX,CAEA,cAAcU,EAAyD,CACrE,MAAMC,EAAS,IAAIV,EAAWS,CAAQ,EAChCE,EAAYD,EAAO,mBAAmBD,EAAS,UAAU,EAC/D,GAAIN,EAAmBQ,EAAWL,CAAe,EAC/C,OAAOL,EAAqB,CAC1B,MAAO,IAAII,EAAsB,CAC/B,GAAGC,EAAgBK,CAAS,EAC5B,UAAAA,CACF,CAAC,CACH,CAAC,EAGH,MAAMC,EAASF,EAAO,qBAAqB,CAAC,EAC5C,GACE,CAACE,GACDA,EAAO,SAAW,GAClBA,EAAO,KAAMC,GAAYA,IAAY,MAAS,EAE9C,OAAOZ,EAAqB,CAC1B,MAAO,IAAIC,EAAuB,kBAAkB,CACtD,CAAC,EAGH,MAAMY,EAA2B,CAC/B,oBAAqB,EAAQF,EAAO,CAAC,EACrC,kBACEA,EAAO,CAAC,IAAM,EACVR,EAAqB,KACrBA,EAAqB,MAC3B,QAAS,GAAGQ,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,CAAC,EACjD,EAEA,OAAOX,EAAqB,CAC1B,KAAMa,CACR,CAAC,CACH,CACF",
6
- "names": ["ApduBuilder", "ApduParser", "CommandResultFactory", "InvalidStatusWordError", "isCommandErrorCode", "PublicKeyDisplayMode", "SolanaAppCommandError", "solanaAppErrors", "GetAppConfigurationCommand", "args", "response", "parser", "errorCode", "buffer", "element", "config"]
4
+ "sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\nimport { CommandErrorHelper } from \"@ledgerhq/signer-utils\";\nimport { Maybe } from \"purify-ts\";\n\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { PublicKeyDisplayMode } from \"@api/model/PublicKeyDisplayMode\";\n\nimport {\n SOLANA_APP_ERRORS,\n SolanaAppCommandErrorFactory,\n type SolanaAppErrorCodes,\n} from \"./utils/SolanaApplicationErrors\";\n\ntype GetAppConfigurationCommandArgs = void;\n\nexport class GetAppConfigurationCommand\n implements\n Command<\n AppConfiguration,\n GetAppConfigurationCommandArgs,\n SolanaAppErrorCodes\n >\n{\n private readonly errorHelper = new CommandErrorHelper<\n AppConfiguration,\n SolanaAppErrorCodes\n >(SOLANA_APP_ERRORS, SolanaAppCommandErrorFactory);\n\n args: GetAppConfigurationCommandArgs;\n\n constructor(args: GetAppConfigurationCommandArgs) {\n this.args = args;\n }\n\n getApdu(): Apdu {\n return new ApduBuilder({\n cla: 0xe0,\n ins: 0x04,\n p1: 0x00,\n p2: 0x00,\n }).build();\n }\n\n parseResponse(\n response: ApduResponse,\n ): CommandResult<AppConfiguration, SolanaAppErrorCodes> {\n return Maybe.fromNullable(\n this.errorHelper.getError(response),\n ).orDefaultLazy(() => {\n const parser = new ApduParser(response);\n const buffer = parser.extractFieldByLength(5);\n if (\n !buffer ||\n buffer.length !== 5 ||\n buffer.some((element) => element === undefined)\n ) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"Invalid response\"),\n });\n }\n\n const config: AppConfiguration = {\n blindSigningEnabled: Boolean(buffer[0]),\n pubKeyDisplayMode:\n buffer[1] === 0\n ? PublicKeyDisplayMode.LONG\n : PublicKeyDisplayMode.SHORT,\n version: `${buffer[2]}.${buffer[3]}.${buffer[4]}`,\n };\n\n return CommandResultFactory({\n data: config,\n });\n });\n }\n}\n"],
5
+ "mappings": "AAAA,OAEE,eAAAA,EACA,cAAAC,EAIA,wBAAAC,EACA,0BAAAC,MACK,kCACP,OAAS,sBAAAC,MAA0B,yBACnC,OAAS,SAAAC,MAAa,YAGtB,OAAS,wBAAAC,MAA4B,kCAErC,OACE,qBAAAC,EACA,gCAAAC,MAEK,kCAIA,MAAMC,CAOb,CACmB,YAAc,IAAIL,EAGjCG,EAAmBC,CAA4B,EAEjD,KAEA,YAAYE,EAAsC,CAChD,KAAK,KAAOA,CACd,CAEA,SAAgB,CACd,OAAO,IAAIV,EAAY,CACrB,IAAK,IACL,IAAK,EACL,GAAI,EACJ,GAAI,CACN,CAAC,EAAE,MAAM,CACX,CAEA,cACEW,EACsD,CACtD,OAAON,EAAM,aACX,KAAK,YAAY,SAASM,CAAQ,CACpC,EAAE,cAAc,IAAM,CAEpB,MAAMC,EADS,IAAIX,EAAWU,CAAQ,EAChB,qBAAqB,CAAC,EAC5C,GACE,CAACC,GACDA,EAAO,SAAW,GAClBA,EAAO,KAAMC,GAAYA,IAAY,MAAS,EAE9C,OAAOX,EAAqB,CAC1B,MAAO,IAAIC,EAAuB,kBAAkB,CACtD,CAAC,EAGH,MAAMW,EAA2B,CAC/B,oBAAqB,EAAQF,EAAO,CAAC,EACrC,kBACEA,EAAO,CAAC,IAAM,EACVN,EAAqB,KACrBA,EAAqB,MAC3B,QAAS,GAAGM,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,CAAC,EACjD,EAEA,OAAOV,EAAqB,CAC1B,KAAMY,CACR,CAAC,CACH,CAAC,CACH,CACF",
6
+ "names": ["ApduBuilder", "ApduParser", "CommandResultFactory", "InvalidStatusWordError", "CommandErrorHelper", "Maybe", "PublicKeyDisplayMode", "SOLANA_APP_ERRORS", "SolanaAppCommandErrorFactory", "GetAppConfigurationCommand", "args", "response", "buffer", "element", "config"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{ApduResponse as s,CommandResultFactory as n,isSuccessCommandResult as o}from"@ledgerhq/device-management-kit";import{PublicKeyDisplayMode as a}from"../../../api/model/PublicKeyDisplayMode";import{GetAppConfigurationCommand as i}from"./GetAppConfigurationCommand";const p=new Uint8Array([224,4,0,0,0]),c=new Uint8Array([1,0,2,5,10]),d=new s({statusCode:Uint8Array.from([144,0]),data:c}),l=new Uint8Array([1,1,2,5,10]),u=new s({statusCode:Uint8Array.from([144,0]),data:l});describe("GetAppConfigurationCommand",()=>{let t;beforeEach(()=>{t=new i,jest.clearAllMocks(),jest.requireActual("@ledgerhq/device-management-kit")}),describe("getApdu",()=>{it("should return the correct APDU",()=>{const e=t.getApdu();expect(e.getRawApdu()).toEqual(p)})}),describe("parseResponse",()=>{it("should parse the response correctly",()=>{const e=t.parseResponse(d);expect(e).toStrictEqual(n({data:{blindSigningEnabled:!0,pubKeyDisplayMode:a.LONG,version:"2.5.10"}}))}),it("should parse the response correctly with short pub key display mode",()=>{const e=t.parseResponse(u);expect(e).toStrictEqual(n({data:{blindSigningEnabled:!0,pubKeyDisplayMode:a.SHORT,version:"2.5.10"}}))}),describe("error handling",()=>{it("should return error if response is not success",()=>{const e=new s({statusCode:Uint8Array.from([106,130]),data:new Uint8Array(0)}),r=t.parseResponse(e);expect(o(r)).toBe(!1),o(r)?fail("Expected error"):expect(r.error).toEqual(expect.objectContaining({_tag:"InvalidStatusWordError",originalError:expect.objectContaining({message:"Invalid response"})}))}),it("should return error if response is not success",()=>{const e=new s({statusCode:Uint8Array.from([106,130]),data:new Uint8Array(0)}),r=t.parseResponse(e);expect(o(r)).toBe(!1),o(r)?fail("Expected error"):expect(r.error).toEqual(expect.objectContaining({_tag:"InvalidStatusWordError",originalError:expect.objectContaining({message:"Invalid response"})}))})})})});
1
+ import{ApduResponse as s,CommandResultFactory as a,isSuccessCommandResult as o}from"@ledgerhq/device-management-kit";import{PublicKeyDisplayMode as n}from"../../../api/model/PublicKeyDisplayMode";import{GetAppConfigurationCommand as i}from"./GetAppConfigurationCommand";const p=new Uint8Array([224,4,0,0,0]),c=new Uint8Array([1,0,2,5,10]),d=new s({statusCode:Uint8Array.from([144,0]),data:c}),l=new Uint8Array([1,1,2,5,10]),u=new s({statusCode:Uint8Array.from([144,0]),data:l});describe("GetAppConfigurationCommand",()=>{let t;beforeEach(()=>{t=new i,jest.clearAllMocks(),jest.requireActual("@ledgerhq/device-management-kit")}),describe("getApdu",()=>{it("should return the correct APDU",()=>{const e=t.getApdu();expect(e.getRawApdu()).toEqual(p)})}),describe("parseResponse",()=>{it("should parse the response correctly",()=>{const e=t.parseResponse(d);expect(e).toStrictEqual(a({data:{blindSigningEnabled:!0,pubKeyDisplayMode:n.LONG,version:"2.5.10"}}))}),it("should parse the response correctly with short pub key display mode",()=>{const e=t.parseResponse(u);expect(e).toStrictEqual(a({data:{blindSigningEnabled:!0,pubKeyDisplayMode:n.SHORT,version:"2.5.10"}}))}),describe("error handling",()=>{it("should return error if response is not success",()=>{const e=new s({statusCode:Uint8Array.from([106,130]),data:new Uint8Array(0)}),r=t.parseResponse(e);expect(o(r)).toBe(!1),o(r)?fail("Expected error"):expect(r.error).toEqual(expect.objectContaining({_tag:"SolanaAppCommandError",errorCode:"6a82",message:"Invalid off-chain message format"}))}),it("should return error if response is not success",()=>{const e=new s({statusCode:Uint8Array.from([106,130]),data:new Uint8Array(0)}),r=t.parseResponse(e);expect(o(r)).toBe(!1),o(r)?fail("Expected error"):expect(r.error).toEqual(expect.objectContaining({_tag:"SolanaAppCommandError",errorCode:"6a82",message:"Invalid off-chain message format"}))})})})});
2
2
  //# sourceMappingURL=GetAppConfigurationCommand.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/command/GetAppConfigurationCommand.test.ts"],
4
- "sourcesContent": ["import {\n ApduResponse,\n CommandResultFactory,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { PublicKeyDisplayMode } from \"@api/model/PublicKeyDisplayMode\";\n\nimport { GetAppConfigurationCommand } from \"./GetAppConfigurationCommand\";\n\nconst GET_APP_CONFIG_APDU = new Uint8Array([0xe0, 0x04, 0x00, 0x00, 0x00]);\n\nconst GET_APP_CONFIG_RESPONSE_DATA = new Uint8Array([\n 0x01, 0x00, 0x02, 0x05, 0x0a,\n]);\n\nconst GET_APP_CONFIG_RESPONSE = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: GET_APP_CONFIG_RESPONSE_DATA,\n});\n\nconst GET_APP_CONFIG_RESPONSE_DATA_SHORT_PUB_KEY_DISPLAY_MODE = new Uint8Array([\n 0x01, 0x01, 0x02, 0x05, 0x0a,\n]);\n\nconst GET_APP_CONFIG_RESPONSE_SHORT_PUB_KEY_DISPLAY_MODE = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: GET_APP_CONFIG_RESPONSE_DATA_SHORT_PUB_KEY_DISPLAY_MODE,\n});\n\ndescribe(\"GetAppConfigurationCommand\", () => {\n let command: GetAppConfigurationCommand;\n\n beforeEach(() => {\n command = new GetAppConfigurationCommand();\n jest.clearAllMocks();\n jest.requireActual(\"@ledgerhq/device-management-kit\");\n });\n\n describe(\"getApdu\", () => {\n it(\"should return the correct APDU\", () => {\n const apdu = command.getApdu();\n expect(apdu.getRawApdu()).toEqual(GET_APP_CONFIG_APDU);\n });\n });\n\n describe(\"parseResponse\", () => {\n it(\"should parse the response correctly\", () => {\n const parsed = command.parseResponse(GET_APP_CONFIG_RESPONSE);\n expect(parsed).toStrictEqual(\n CommandResultFactory({\n data: {\n blindSigningEnabled: true,\n pubKeyDisplayMode: PublicKeyDisplayMode.LONG,\n version: \"2.5.10\",\n },\n }),\n );\n });\n\n it(\"should parse the response correctly with short pub key display mode\", () => {\n const parsed = command.parseResponse(\n GET_APP_CONFIG_RESPONSE_SHORT_PUB_KEY_DISPLAY_MODE,\n );\n expect(parsed).toStrictEqual(\n CommandResultFactory({\n data: {\n blindSigningEnabled: true,\n pubKeyDisplayMode: PublicKeyDisplayMode.SHORT,\n version: \"2.5.10\",\n },\n }),\n );\n });\n\n describe(\"error handling\", () => {\n it(\"should return error if response is not success\", () => {\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x6a, 0x82]),\n data: new Uint8Array(0),\n });\n const result = command.parseResponse(response);\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect(result.error).toEqual(\n expect.objectContaining({\n _tag: \"InvalidStatusWordError\",\n originalError: expect.objectContaining({\n message: \"Invalid response\",\n }),\n }),\n );\n } else {\n fail(\"Expected error\");\n }\n });\n\n it(\"should return error if response is not success\", () => {\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x6a, 0x82]),\n data: new Uint8Array(0),\n });\n const result = command.parseResponse(response);\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect(result.error).toEqual(\n expect.objectContaining({\n _tag: \"InvalidStatusWordError\",\n originalError: expect.objectContaining({\n message: \"Invalid response\",\n }),\n }),\n );\n } else {\n fail(\"Expected error\");\n }\n });\n });\n });\n});\n"],
5
- "mappings": "AAAA,OACE,gBAAAA,EACA,wBAAAC,EACA,0BAAAC,MACK,kCAEP,OAAS,wBAAAC,MAA4B,kCAErC,OAAS,8BAAAC,MAAkC,+BAE3C,MAAMC,EAAsB,IAAI,WAAW,CAAC,IAAM,EAAM,EAAM,EAAM,CAAI,CAAC,EAEnEC,EAA+B,IAAI,WAAW,CAClD,EAAM,EAAM,EAAM,EAAM,EAC1B,CAAC,EAEKC,EAA0B,IAAIP,EAAa,CAC/C,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAMM,CACR,CAAC,EAEKE,EAA0D,IAAI,WAAW,CAC7E,EAAM,EAAM,EAAM,EAAM,EAC1B,CAAC,EAEKC,EAAqD,IAAIT,EAAa,CAC1E,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAMQ,CACR,CAAC,EAED,SAAS,6BAA8B,IAAM,CAC3C,IAAIE,EAEJ,WAAW,IAAM,CACfA,EAAU,IAAIN,EACd,KAAK,cAAc,EACnB,KAAK,cAAc,iCAAiC,CACtD,CAAC,EAED,SAAS,UAAW,IAAM,CACxB,GAAG,iCAAkC,IAAM,CACzC,MAAMO,EAAOD,EAAQ,QAAQ,EAC7B,OAAOC,EAAK,WAAW,CAAC,EAAE,QAAQN,CAAmB,CACvD,CAAC,CACH,CAAC,EAED,SAAS,gBAAiB,IAAM,CAC9B,GAAG,sCAAuC,IAAM,CAC9C,MAAMO,EAASF,EAAQ,cAAcH,CAAuB,EAC5D,OAAOK,CAAM,EAAE,cACbX,EAAqB,CACnB,KAAM,CACJ,oBAAqB,GACrB,kBAAmBE,EAAqB,KACxC,QAAS,QACX,CACF,CAAC,CACH,CACF,CAAC,EAED,GAAG,sEAAuE,IAAM,CAC9E,MAAMS,EAASF,EAAQ,cACrBD,CACF,EACA,OAAOG,CAAM,EAAE,cACbX,EAAqB,CACnB,KAAM,CACJ,oBAAqB,GACrB,kBAAmBE,EAAqB,MACxC,QAAS,QACX,CACF,CAAC,CACH,CACF,CAAC,EAED,SAAS,iBAAkB,IAAM,CAC/B,GAAG,iDAAkD,IAAM,CACzD,MAAMU,EAAW,IAAIb,EAAa,CAChC,WAAY,WAAW,KAAK,CAAC,IAAM,GAAI,CAAC,EACxC,KAAM,IAAI,WAAW,CAAC,CACxB,CAAC,EACKc,EAASJ,EAAQ,cAAcG,CAAQ,EAC7C,OAAOX,EAAuBY,CAAM,CAAC,EAAE,KAAK,EAAK,EAC5CZ,EAAuBY,CAAM,EAUhC,KAAK,gBAAgB,EATrB,OAAOA,EAAO,KAAK,EAAE,QACnB,OAAO,iBAAiB,CACtB,KAAM,yBACN,cAAe,OAAO,iBAAiB,CACrC,QAAS,kBACX,CAAC,CACH,CAAC,CACH,CAIJ,CAAC,EAED,GAAG,iDAAkD,IAAM,CACzD,MAAMD,EAAW,IAAIb,EAAa,CAChC,WAAY,WAAW,KAAK,CAAC,IAAM,GAAI,CAAC,EACxC,KAAM,IAAI,WAAW,CAAC,CACxB,CAAC,EACKc,EAASJ,EAAQ,cAAcG,CAAQ,EAC7C,OAAOX,EAAuBY,CAAM,CAAC,EAAE,KAAK,EAAK,EAC5CZ,EAAuBY,CAAM,EAUhC,KAAK,gBAAgB,EATrB,OAAOA,EAAO,KAAK,EAAE,QACnB,OAAO,iBAAiB,CACtB,KAAM,yBACN,cAAe,OAAO,iBAAiB,CACrC,QAAS,kBACX,CAAC,CACH,CAAC,CACH,CAIJ,CAAC,CACH,CAAC,CACH,CAAC,CACH,CAAC",
4
+ "sourcesContent": ["import {\n ApduResponse,\n CommandResultFactory,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { PublicKeyDisplayMode } from \"@api/model/PublicKeyDisplayMode\";\n\nimport { GetAppConfigurationCommand } from \"./GetAppConfigurationCommand\";\n\nconst GET_APP_CONFIG_APDU = new Uint8Array([0xe0, 0x04, 0x00, 0x00, 0x00]);\n\nconst GET_APP_CONFIG_RESPONSE_DATA = new Uint8Array([\n 0x01, 0x00, 0x02, 0x05, 0x0a,\n]);\n\nconst GET_APP_CONFIG_RESPONSE = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: GET_APP_CONFIG_RESPONSE_DATA,\n});\n\nconst GET_APP_CONFIG_RESPONSE_DATA_SHORT_PUB_KEY_DISPLAY_MODE = new Uint8Array([\n 0x01, 0x01, 0x02, 0x05, 0x0a,\n]);\n\nconst GET_APP_CONFIG_RESPONSE_SHORT_PUB_KEY_DISPLAY_MODE = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: GET_APP_CONFIG_RESPONSE_DATA_SHORT_PUB_KEY_DISPLAY_MODE,\n});\n\ndescribe(\"GetAppConfigurationCommand\", () => {\n let command: GetAppConfigurationCommand;\n\n beforeEach(() => {\n command = new GetAppConfigurationCommand();\n jest.clearAllMocks();\n jest.requireActual(\"@ledgerhq/device-management-kit\");\n });\n\n describe(\"getApdu\", () => {\n it(\"should return the correct APDU\", () => {\n const apdu = command.getApdu();\n expect(apdu.getRawApdu()).toEqual(GET_APP_CONFIG_APDU);\n });\n });\n\n describe(\"parseResponse\", () => {\n it(\"should parse the response correctly\", () => {\n const parsed = command.parseResponse(GET_APP_CONFIG_RESPONSE);\n expect(parsed).toStrictEqual(\n CommandResultFactory({\n data: {\n blindSigningEnabled: true,\n pubKeyDisplayMode: PublicKeyDisplayMode.LONG,\n version: \"2.5.10\",\n },\n }),\n );\n });\n\n it(\"should parse the response correctly with short pub key display mode\", () => {\n const parsed = command.parseResponse(\n GET_APP_CONFIG_RESPONSE_SHORT_PUB_KEY_DISPLAY_MODE,\n );\n expect(parsed).toStrictEqual(\n CommandResultFactory({\n data: {\n blindSigningEnabled: true,\n pubKeyDisplayMode: PublicKeyDisplayMode.SHORT,\n version: \"2.5.10\",\n },\n }),\n );\n });\n\n describe(\"error handling\", () => {\n it(\"should return error if response is not success\", () => {\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x6a, 0x82]),\n data: new Uint8Array(0),\n });\n const result = command.parseResponse(response);\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect(result.error).toEqual(\n expect.objectContaining({\n _tag: \"SolanaAppCommandError\",\n errorCode: \"6a82\",\n message: \"Invalid off-chain message format\",\n }),\n );\n } else {\n fail(\"Expected error\");\n }\n });\n\n it(\"should return error if response is not success\", () => {\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x6a, 0x82]),\n data: new Uint8Array(0),\n });\n const result = command.parseResponse(response);\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect(result.error).toEqual(\n expect.objectContaining({\n _tag: \"SolanaAppCommandError\",\n errorCode: \"6a82\",\n message: \"Invalid off-chain message format\",\n }),\n );\n } else {\n fail(\"Expected error\");\n }\n });\n });\n });\n});\n"],
5
+ "mappings": "AAAA,OACE,gBAAAA,EACA,wBAAAC,EACA,0BAAAC,MACK,kCAEP,OAAS,wBAAAC,MAA4B,kCAErC,OAAS,8BAAAC,MAAkC,+BAE3C,MAAMC,EAAsB,IAAI,WAAW,CAAC,IAAM,EAAM,EAAM,EAAM,CAAI,CAAC,EAEnEC,EAA+B,IAAI,WAAW,CAClD,EAAM,EAAM,EAAM,EAAM,EAC1B,CAAC,EAEKC,EAA0B,IAAIP,EAAa,CAC/C,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAMM,CACR,CAAC,EAEKE,EAA0D,IAAI,WAAW,CAC7E,EAAM,EAAM,EAAM,EAAM,EAC1B,CAAC,EAEKC,EAAqD,IAAIT,EAAa,CAC1E,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAMQ,CACR,CAAC,EAED,SAAS,6BAA8B,IAAM,CAC3C,IAAIE,EAEJ,WAAW,IAAM,CACfA,EAAU,IAAIN,EACd,KAAK,cAAc,EACnB,KAAK,cAAc,iCAAiC,CACtD,CAAC,EAED,SAAS,UAAW,IAAM,CACxB,GAAG,iCAAkC,IAAM,CACzC,MAAMO,EAAOD,EAAQ,QAAQ,EAC7B,OAAOC,EAAK,WAAW,CAAC,EAAE,QAAQN,CAAmB,CACvD,CAAC,CACH,CAAC,EAED,SAAS,gBAAiB,IAAM,CAC9B,GAAG,sCAAuC,IAAM,CAC9C,MAAMO,EAASF,EAAQ,cAAcH,CAAuB,EAC5D,OAAOK,CAAM,EAAE,cACbX,EAAqB,CACnB,KAAM,CACJ,oBAAqB,GACrB,kBAAmBE,EAAqB,KACxC,QAAS,QACX,CACF,CAAC,CACH,CACF,CAAC,EAED,GAAG,sEAAuE,IAAM,CAC9E,MAAMS,EAASF,EAAQ,cACrBD,CACF,EACA,OAAOG,CAAM,EAAE,cACbX,EAAqB,CACnB,KAAM,CACJ,oBAAqB,GACrB,kBAAmBE,EAAqB,MACxC,QAAS,QACX,CACF,CAAC,CACH,CACF,CAAC,EAED,SAAS,iBAAkB,IAAM,CAC/B,GAAG,iDAAkD,IAAM,CACzD,MAAMU,EAAW,IAAIb,EAAa,CAChC,WAAY,WAAW,KAAK,CAAC,IAAM,GAAI,CAAC,EACxC,KAAM,IAAI,WAAW,CAAC,CACxB,CAAC,EACKc,EAASJ,EAAQ,cAAcG,CAAQ,EAC7C,OAAOX,EAAuBY,CAAM,CAAC,EAAE,KAAK,EAAK,EAC5CZ,EAAuBY,CAAM,EAShC,KAAK,gBAAgB,EARrB,OAAOA,EAAO,KAAK,EAAE,QACnB,OAAO,iBAAiB,CACtB,KAAM,wBACN,UAAW,OACX,QAAS,kCACX,CAAC,CACH,CAIJ,CAAC,EAED,GAAG,iDAAkD,IAAM,CACzD,MAAMD,EAAW,IAAIb,EAAa,CAChC,WAAY,WAAW,KAAK,CAAC,IAAM,GAAI,CAAC,EACxC,KAAM,IAAI,WAAW,CAAC,CACxB,CAAC,EACKc,EAASJ,EAAQ,cAAcG,CAAQ,EAC7C,OAAOX,EAAuBY,CAAM,CAAC,EAAE,KAAK,EAAK,EAC5CZ,EAAuBY,CAAM,EAShC,KAAK,gBAAgB,EARrB,OAAOA,EAAO,KAAK,EAAE,QACnB,OAAO,iBAAiB,CACtB,KAAM,wBACN,UAAW,OACX,QAAS,kCACX,CAAC,CACH,CAIJ,CAAC,CACH,CAAC,CACH,CAAC,CACH,CAAC",
6
6
  "names": ["ApduResponse", "CommandResultFactory", "isSuccessCommandResult", "PublicKeyDisplayMode", "GetAppConfigurationCommand", "GET_APP_CONFIG_APDU", "GET_APP_CONFIG_RESPONSE_DATA", "GET_APP_CONFIG_RESPONSE", "GET_APP_CONFIG_RESPONSE_DATA_SHORT_PUB_KEY_DISPLAY_MODE", "GET_APP_CONFIG_RESPONSE_SHORT_PUB_KEY_DISPLAY_MODE", "command", "apdu", "parsed", "response", "result"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{ApduBuilder as m,ApduParser as p,CommandResultFactory as n,InvalidStatusWordError as a,isCommandErrorCode as u}from"@ledgerhq/device-management-kit";import{DerivationPathUtils as c}from"@ledgerhq/signer-utils";import l from"bs58";import{SolanaAppCommandError as y,solanaAppErrors as s}from"./utils/solanaAppErrors";const d=32;class h{args;constructor(t){this.args=t}getApdu(){const t={cla:224,ins:5,p1:this.args.checkOnDevice?1:0,p2:0},e=new m(t),r=this.args.derivationPath,o=c.splitPath(r);return e.add8BitUIntToData(o.length),o.forEach(i=>{e.add32BitUIntToData(i)}),e.build()}parseResponse(t){const e=new p(t),r=e.encodeToHexaString(t.statusCode);if(u(r,s))return n({error:new y({...s[r],errorCode:r})});if(e.testMinimalLength(d)===!1)return n({error:new a("Public key is missing")});const o=e.extractFieldByLength(d);return o===void 0?n({error:new a("Unable to extract public key")}):n({data:l.encode(o)})}}export{h as GetPubKeyCommand};
1
+ import{ApduBuilder as d,ApduParser as m,CommandResultFactory as o,InvalidStatusWordError as n}from"@ledgerhq/device-management-kit";import{CommandErrorHelper as i,DerivationPathUtils as u}from"@ledgerhq/signer-utils";import l from"bs58";import{Maybe as y}from"purify-ts";import{SOLANA_APP_ERRORS as c,SolanaAppCommandErrorFactory as A}from"./utils/SolanaApplicationErrors";const s=32;class K{errorHelper=new i(c,A);args;constructor(e){this.args=e}getApdu(){const e={cla:224,ins:5,p1:this.args.checkOnDevice?1:0,p2:0},r=new d(e),t=this.args.derivationPath,a=u.splitPath(t);return r.add8BitUIntToData(a.length),a.forEach(p=>{r.add32BitUIntToData(p)}),r.build()}parseResponse(e){return y.fromNullable(this.errorHelper.getError(e)).orDefaultLazy(()=>{const r=new m(e);if(r.testMinimalLength(s)===!1)return o({error:new n("Public key is missing")});const t=r.extractFieldByLength(s);return t===void 0?o({error:new n("Unable to extract public key")}):o({data:l.encode(t)})})}}export{K as GetPubKeyCommand};
2
2
  //# sourceMappingURL=GetPubKeyCommand.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/command/GetPubKeyCommand.ts"],
4
- "sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n type ApduBuilderArgs,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n isCommandErrorCode,\n} from \"@ledgerhq/device-management-kit\";\nimport { DerivationPathUtils } from \"@ledgerhq/signer-utils\";\nimport bs58 from \"bs58\";\n\nimport { type PublicKey } from \"@api/model/PublicKey\";\n\nimport {\n SolanaAppCommandError,\n solanaAppErrors,\n} from \"./utils/solanaAppErrors\";\n\nconst PUBKEY_LENGTH = 32;\n\ntype GetPubKeyCommandResponse = PublicKey;\ntype GetPubKeyCommandArgs = {\n derivationPath: string;\n checkOnDevice: boolean;\n};\n\nexport class GetPubKeyCommand\n implements Command<GetPubKeyCommandResponse, GetPubKeyCommandArgs>\n{\n args: GetPubKeyCommandArgs;\n\n constructor(args: GetPubKeyCommandArgs) {\n this.args = args;\n }\n\n getApdu(): Apdu {\n const getPubKeyArgs: ApduBuilderArgs = {\n cla: 0xe0,\n ins: 0x05,\n p1: this.args.checkOnDevice ? 0x01 : 0x00,\n p2: 0x00,\n };\n const builder = new ApduBuilder(getPubKeyArgs);\n const derivationPath = this.args.derivationPath;\n\n const path = DerivationPathUtils.splitPath(derivationPath);\n builder.add8BitUIntToData(path.length);\n path.forEach((element) => {\n builder.add32BitUIntToData(element);\n });\n\n return builder.build();\n }\n\n parseResponse(\n response: ApduResponse,\n ): CommandResult<GetPubKeyCommandResponse> {\n const parser = new ApduParser(response);\n const errorCode = parser.encodeToHexaString(response.statusCode);\n if (isCommandErrorCode(errorCode, solanaAppErrors)) {\n return CommandResultFactory({\n error: new SolanaAppCommandError({\n ...solanaAppErrors[errorCode],\n errorCode,\n }),\n });\n }\n\n if (parser.testMinimalLength(PUBKEY_LENGTH) === false) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"Public key is missing\"),\n });\n }\n\n const buffer = parser.extractFieldByLength(PUBKEY_LENGTH);\n if (buffer === undefined) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"Unable to extract public key\"),\n });\n }\n\n return CommandResultFactory({\n data: bs58.encode(buffer),\n });\n }\n}\n"],
5
- "mappings": "AAAA,OAEE,eAAAA,EAEA,cAAAC,EAIA,wBAAAC,EACA,0BAAAC,EACA,sBAAAC,MACK,kCACP,OAAS,uBAAAC,MAA2B,yBACpC,OAAOC,MAAU,OAIjB,OACE,yBAAAC,EACA,mBAAAC,MACK,0BAEP,MAAMC,EAAgB,GAQf,MAAMC,CAEb,CACE,KAEA,YAAYC,EAA4B,CACtC,KAAK,KAAOA,CACd,CAEA,SAAgB,CACd,MAAMC,EAAiC,CACrC,IAAK,IACL,IAAK,EACL,GAAI,KAAK,KAAK,cAAgB,EAAO,EACrC,GAAI,CACN,EACMC,EAAU,IAAIb,EAAYY,CAAa,EACvCE,EAAiB,KAAK,KAAK,eAE3BC,EAAOV,EAAoB,UAAUS,CAAc,EACzD,OAAAD,EAAQ,kBAAkBE,EAAK,MAAM,EACrCA,EAAK,QAASC,GAAY,CACxBH,EAAQ,mBAAmBG,CAAO,CACpC,CAAC,EAEMH,EAAQ,MAAM,CACvB,CAEA,cACEI,EACyC,CACzC,MAAMC,EAAS,IAAIjB,EAAWgB,CAAQ,EAChCE,EAAYD,EAAO,mBAAmBD,EAAS,UAAU,EAC/D,GAAIb,EAAmBe,EAAWX,CAAe,EAC/C,OAAON,EAAqB,CAC1B,MAAO,IAAIK,EAAsB,CAC/B,GAAGC,EAAgBW,CAAS,EAC5B,UAAAA,CACF,CAAC,CACH,CAAC,EAGH,GAAID,EAAO,kBAAkBT,CAAa,IAAM,GAC9C,OAAOP,EAAqB,CAC1B,MAAO,IAAIC,EAAuB,uBAAuB,CAC3D,CAAC,EAGH,MAAMiB,EAASF,EAAO,qBAAqBT,CAAa,EACxD,OAAIW,IAAW,OACNlB,EAAqB,CAC1B,MAAO,IAAIC,EAAuB,8BAA8B,CAClE,CAAC,EAGID,EAAqB,CAC1B,KAAMI,EAAK,OAAOc,CAAM,CAC1B,CAAC,CACH,CACF",
6
- "names": ["ApduBuilder", "ApduParser", "CommandResultFactory", "InvalidStatusWordError", "isCommandErrorCode", "DerivationPathUtils", "bs58", "SolanaAppCommandError", "solanaAppErrors", "PUBKEY_LENGTH", "GetPubKeyCommand", "args", "getPubKeyArgs", "builder", "derivationPath", "path", "element", "response", "parser", "errorCode", "buffer"]
4
+ "sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n type ApduBuilderArgs,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\nimport {\n CommandErrorHelper,\n DerivationPathUtils,\n} from \"@ledgerhq/signer-utils\";\nimport bs58 from \"bs58\";\nimport { Maybe } from \"purify-ts\";\n\nimport { type PublicKey } from \"@api/model/PublicKey\";\n\nimport {\n SOLANA_APP_ERRORS,\n SolanaAppCommandErrorFactory,\n type SolanaAppErrorCodes,\n} from \"./utils/SolanaApplicationErrors\";\n\nconst PUBKEY_LENGTH = 32;\n\ntype GetPubKeyCommandResponse = PublicKey;\ntype GetPubKeyCommandArgs = {\n derivationPath: string;\n checkOnDevice: boolean;\n};\n\nexport class GetPubKeyCommand\n implements\n Command<GetPubKeyCommandResponse, GetPubKeyCommandArgs, SolanaAppErrorCodes>\n{\n private readonly errorHelper = new CommandErrorHelper<\n GetPubKeyCommandResponse,\n SolanaAppErrorCodes\n >(SOLANA_APP_ERRORS, SolanaAppCommandErrorFactory);\n\n args: GetPubKeyCommandArgs;\n\n constructor(args: GetPubKeyCommandArgs) {\n this.args = args;\n }\n\n getApdu(): Apdu {\n const getPubKeyArgs: ApduBuilderArgs = {\n cla: 0xe0,\n ins: 0x05,\n p1: this.args.checkOnDevice ? 0x01 : 0x00,\n p2: 0x00,\n };\n const builder = new ApduBuilder(getPubKeyArgs);\n const derivationPath = this.args.derivationPath;\n\n const path = DerivationPathUtils.splitPath(derivationPath);\n builder.add8BitUIntToData(path.length);\n path.forEach((element) => {\n builder.add32BitUIntToData(element);\n });\n\n return builder.build();\n }\n\n parseResponse(\n response: ApduResponse,\n ): CommandResult<GetPubKeyCommandResponse, SolanaAppErrorCodes> {\n return Maybe.fromNullable(\n this.errorHelper.getError(response),\n ).orDefaultLazy(() => {\n const parser = new ApduParser(response);\n\n if (parser.testMinimalLength(PUBKEY_LENGTH) === false) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"Public key is missing\"),\n });\n }\n\n const buffer = parser.extractFieldByLength(PUBKEY_LENGTH);\n if (buffer === undefined) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"Unable to extract public key\"),\n });\n }\n\n return CommandResultFactory({\n data: bs58.encode(buffer),\n });\n });\n }\n}\n"],
5
+ "mappings": "AAAA,OAEE,eAAAA,EAEA,cAAAC,EAIA,wBAAAC,EACA,0BAAAC,MACK,kCACP,OACE,sBAAAC,EACA,uBAAAC,MACK,yBACP,OAAOC,MAAU,OACjB,OAAS,SAAAC,MAAa,YAItB,OACE,qBAAAC,EACA,gCAAAC,MAEK,kCAEP,MAAMC,EAAgB,GAQf,MAAMC,CAGb,CACmB,YAAc,IAAIP,EAGjCI,EAAmBC,CAA4B,EAEjD,KAEA,YAAYG,EAA4B,CACtC,KAAK,KAAOA,CACd,CAEA,SAAgB,CACd,MAAMC,EAAiC,CACrC,IAAK,IACL,IAAK,EACL,GAAI,KAAK,KAAK,cAAgB,EAAO,EACrC,GAAI,CACN,EACMC,EAAU,IAAId,EAAYa,CAAa,EACvCE,EAAiB,KAAK,KAAK,eAE3BC,EAAOX,EAAoB,UAAUU,CAAc,EACzD,OAAAD,EAAQ,kBAAkBE,EAAK,MAAM,EACrCA,EAAK,QAASC,GAAY,CACxBH,EAAQ,mBAAmBG,CAAO,CACpC,CAAC,EAEMH,EAAQ,MAAM,CACvB,CAEA,cACEI,EAC8D,CAC9D,OAAOX,EAAM,aACX,KAAK,YAAY,SAASW,CAAQ,CACpC,EAAE,cAAc,IAAM,CACpB,MAAMC,EAAS,IAAIlB,EAAWiB,CAAQ,EAEtC,GAAIC,EAAO,kBAAkBT,CAAa,IAAM,GAC9C,OAAOR,EAAqB,CAC1B,MAAO,IAAIC,EAAuB,uBAAuB,CAC3D,CAAC,EAGH,MAAMiB,EAASD,EAAO,qBAAqBT,CAAa,EACxD,OAAIU,IAAW,OACNlB,EAAqB,CAC1B,MAAO,IAAIC,EAAuB,8BAA8B,CAClE,CAAC,EAGID,EAAqB,CAC1B,KAAMI,EAAK,OAAOc,CAAM,CAC1B,CAAC,CACH,CAAC,CACH,CACF",
6
+ "names": ["ApduBuilder", "ApduParser", "CommandResultFactory", "InvalidStatusWordError", "CommandErrorHelper", "DerivationPathUtils", "bs58", "Maybe", "SOLANA_APP_ERRORS", "SolanaAppCommandErrorFactory", "PUBKEY_LENGTH", "GetPubKeyCommand", "args", "getPubKeyArgs", "builder", "derivationPath", "path", "element", "response", "parser", "buffer"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{ApduResponse as o,CommandResultFactory as a,isSuccessCommandResult as x}from"@ledgerhq/device-management-kit";import{GetPubKeyCommand as n}from"./GetPubKeyCommand";const i=new Uint8Array([224,5,1,0,9,2,128,0,0,44,128,0,1,245]),c=new Uint8Array([224,5,0,0,9,2,128,0,0,44,128,0,1,245]),d=new Uint8Array([224,5,1,0,9,2,128,0,0,44,128,0,1,246]),u=new Uint8Array([178,167,34,220,24,221,92,73,195,244,142,155,7,38,241,27,230,103,134,233,28,172,87,52,152,214,238,136,57,44,201,106,144,0]),p=new o({statusCode:Uint8Array.from([144,0]),data:u});describe("GetPubKeyCommand",()=>{let t;const s={derivationPath:"44'/501'",checkOnDevice:!0};beforeEach(()=>{t=new n(s),jest.clearAllMocks(),jest.requireActual("@ledgerhq/device-management-kit")}),describe("getApdu",()=>{it("should return APDU",()=>{const e=t.getApdu();expect(e.getRawApdu()).toEqual(i)}),it("should return APDU without confirm",()=>{t=new n({...s,checkOnDevice:!1});const e=t.getApdu();expect(e.getRawApdu()).toEqual(c)}),it("should return APDU with different path",()=>{t=new n({...s,derivationPath:"44'/502'"});const e=t.getApdu();expect(e.getRawApdu()).toEqual(d)})}),describe("parseResponse",()=>{it("should parse the response",()=>{const e=t.parseResponse(p);expect(e).toStrictEqual(a({data:"D2PPQSYFe83nDzk96FqGumVU8JA7J8vj2Rhjc2oXzEi5"}))}),describe("error handling",()=>{it("should return error if response is not success",()=>{const e=new o({statusCode:Uint8Array.from([106,130]),data:new Uint8Array(0)}),r=t.parseResponse(e);expect(x(r)).toBe(!1),x(r)?fail("Expected error"):expect(r.error).toEqual(expect.objectContaining({_tag:"InvalidStatusWordError",originalError:expect.objectContaining({message:"Public key is missing"})}))}),it("should return error if public key is missing",()=>{const e=new o({statusCode:Uint8Array.from([144,0]),data:new Uint8Array(0)}),r=t.parseResponse(e);expect(x(r)).toBe(!1),x(r)?fail("Expected error"):expect(r.error.originalError).toEqual(expect.objectContaining({message:"Public key is missing"}))})})})});
1
+ import{ApduResponse as a,CommandResultFactory as n,isSuccessCommandResult as x}from"@ledgerhq/device-management-kit";import{GetPubKeyCommand as o}from"./GetPubKeyCommand";const c=new Uint8Array([224,5,1,0,9,2,128,0,0,44,128,0,1,245]),i=new Uint8Array([224,5,0,0,9,2,128,0,0,44,128,0,1,245]),d=new Uint8Array([224,5,1,0,9,2,128,0,0,44,128,0,1,246]),u=new Uint8Array([178,167,34,220,24,221,92,73,195,244,142,155,7,38,241,27,230,103,134,233,28,172,87,52,152,214,238,136,57,44,201,106,144,0]),p=new a({statusCode:Uint8Array.from([144,0]),data:u});describe("GetPubKeyCommand",()=>{let t;const s={derivationPath:"44'/501'",checkOnDevice:!0};beforeEach(()=>{t=new o(s),jest.clearAllMocks(),jest.requireActual("@ledgerhq/device-management-kit")}),describe("getApdu",()=>{it("should return APDU",()=>{const e=t.getApdu();expect(e.getRawApdu()).toEqual(c)}),it("should return APDU without confirm",()=>{t=new o({...s,checkOnDevice:!1});const e=t.getApdu();expect(e.getRawApdu()).toEqual(i)}),it("should return APDU with different path",()=>{t=new o({...s,derivationPath:"44'/502'"});const e=t.getApdu();expect(e.getRawApdu()).toEqual(d)})}),describe("parseResponse",()=>{it("should parse the response",()=>{const e=t.parseResponse(p);expect(e).toStrictEqual(n({data:"D2PPQSYFe83nDzk96FqGumVU8JA7J8vj2Rhjc2oXzEi5"}))}),describe("error handling",()=>{it("should return error if response is not success",()=>{const e=new a({statusCode:Uint8Array.from([106,130]),data:new Uint8Array(0)}),r=t.parseResponse(e);expect(x(r)).toBe(!1),x(r)?fail("Expected error"):expect(r.error).toEqual(expect.objectContaining({_tag:"SolanaAppCommandError",errorCode:"6a82",message:"Invalid off-chain message format"}))}),it("should return error if public key is missing",()=>{const e=new a({statusCode:Uint8Array.from([144,0]),data:new Uint8Array(0)}),r=t.parseResponse(e);expect(x(r)).toBe(!1),x(r)?fail("Expected error"):expect(r.error.originalError).toEqual(expect.objectContaining({message:"Public key is missing"}))})})})});
2
2
  //# sourceMappingURL=GetPubKeyCommand.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/command/GetPubKeyCommand.test.ts"],
4
- "sourcesContent": ["import {\n ApduResponse,\n CommandResultFactory,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { GetPubKeyCommand } from \"./GetPubKeyCommand\";\n\nconst GET_PUBKYEY_APDU_DEFAULT_PATH_WITH_CONFIRM = new Uint8Array([\n 0xe0, 0x05, 0x01, 0x00, 0x09, 0x02, 0x80, 0x00, 0x00, 0x2c, 0x80, 0x00, 0x01,\n 0xf5,\n]);\n\nconst GET_PUBKYEY_APDU_DEFAULT_PATH_WITHOUT_CONFIRM = new Uint8Array([\n 0xe0, 0x05, 0x00, 0x00, 0x09, 0x02, 0x80, 0x00, 0x00, 0x2c, 0x80, 0x00, 0x01,\n 0xf5,\n]);\n\nconst GET_PUBKEY_APDU_DIFFERENT_PATH = new Uint8Array([\n 0xe0, 0x05, 0x01, 0x00, 0x09, 0x02, 0x80, 0x00, 0x00, 0x2c, 0x80, 0x00, 0x01,\n 0xf6,\n]);\n\n// D2PPQSYFe83nDzk96FqGumVU8JA7J8vj2Rhjc2oXzEi5\nconst GET_PUBKEY_APDU = new Uint8Array([\n 0xb2, 0xa7, 0x22, 0xdc, 0x18, 0xdd, 0x5c, 0x49, 0xc3, 0xf4, 0x8e, 0x9b, 0x07,\n 0x26, 0xf1, 0x1b, 0xe6, 0x67, 0x86, 0xe9, 0x1c, 0xac, 0x57, 0x34, 0x98, 0xd6,\n 0xee, 0x88, 0x39, 0x2c, 0xc9, 0x6a, 0x90, 0x00,\n]);\n\nconst GET_PUBKEY_APDU_RESPONSE = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: GET_PUBKEY_APDU,\n});\n\ndescribe(\"GetPubKeyCommand\", () => {\n let command: GetPubKeyCommand;\n const defaultArgs = {\n derivationPath: \"44'/501'\",\n checkOnDevice: true,\n };\n\n beforeEach(() => {\n command = new GetPubKeyCommand(defaultArgs);\n jest.clearAllMocks();\n jest.requireActual(\"@ledgerhq/device-management-kit\");\n });\n\n describe(\"getApdu\", () => {\n it(\"should return APDU\", () => {\n const apdu = command.getApdu();\n expect(apdu.getRawApdu()).toEqual(\n GET_PUBKYEY_APDU_DEFAULT_PATH_WITH_CONFIRM,\n );\n });\n\n it(\"should return APDU without confirm\", () => {\n command = new GetPubKeyCommand({\n ...defaultArgs,\n checkOnDevice: false,\n });\n const apdu = command.getApdu();\n expect(apdu.getRawApdu()).toEqual(\n GET_PUBKYEY_APDU_DEFAULT_PATH_WITHOUT_CONFIRM,\n );\n });\n\n it(\"should return APDU with different path\", () => {\n command = new GetPubKeyCommand({\n ...defaultArgs,\n derivationPath: \"44'/502'\",\n });\n const apdu = command.getApdu();\n expect(apdu.getRawApdu()).toEqual(GET_PUBKEY_APDU_DIFFERENT_PATH);\n });\n });\n\n describe(\"parseResponse\", () => {\n it(\"should parse the response\", () => {\n const parsed = command.parseResponse(GET_PUBKEY_APDU_RESPONSE);\n expect(parsed).toStrictEqual(\n CommandResultFactory({\n data: \"D2PPQSYFe83nDzk96FqGumVU8JA7J8vj2Rhjc2oXzEi5\",\n }),\n );\n });\n\n describe(\"error handling\", () => {\n it(\"should return error if response is not success\", () => {\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x6a, 0x82]),\n data: new Uint8Array(0),\n });\n const result = command.parseResponse(response);\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect(result.error).toEqual(\n expect.objectContaining({\n _tag: \"InvalidStatusWordError\",\n originalError: expect.objectContaining({\n message: \"Public key is missing\",\n }),\n }),\n );\n } else {\n fail(\"Expected error\");\n }\n });\n\n it(\"should return error if public key is missing\", () => {\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: new Uint8Array(0),\n });\n const result = command.parseResponse(response);\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect(result.error.originalError).toEqual(\n expect.objectContaining({\n message: \"Public key is missing\",\n }),\n );\n } else {\n fail(\"Expected error\");\n }\n });\n });\n });\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n ApduResponse,\n CommandResultFactory,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { GetPubKeyCommand } from \"./GetPubKeyCommand\";\n\nconst GET_PUBKYEY_APDU_DEFAULT_PATH_WITH_CONFIRM = new Uint8Array([\n 0xe0, 0x05, 0x01, 0x00, 0x09, 0x02, 0x80, 0x00, 0x00, 0x2c, 0x80, 0x00, 0x01,\n 0xf5,\n]);\n\nconst GET_PUBKYEY_APDU_DEFAULT_PATH_WITHOUT_CONFIRM = new Uint8Array([\n 0xe0, 0x05, 0x00, 0x00, 0x09, 0x02, 0x80, 0x00, 0x00, 0x2c, 0x80, 0x00, 0x01,\n 0xf5,\n]);\n\nconst GET_PUBKEY_APDU_DIFFERENT_PATH = new Uint8Array([\n 0xe0, 0x05, 0x01, 0x00, 0x09, 0x02, 0x80, 0x00, 0x00, 0x2c, 0x80, 0x00, 0x01,\n 0xf6,\n]);\n\n// D2PPQSYFe83nDzk96FqGumVU8JA7J8vj2Rhjc2oXzEi5\nconst GET_PUBKEY_APDU = new Uint8Array([\n 0xb2, 0xa7, 0x22, 0xdc, 0x18, 0xdd, 0x5c, 0x49, 0xc3, 0xf4, 0x8e, 0x9b, 0x07,\n 0x26, 0xf1, 0x1b, 0xe6, 0x67, 0x86, 0xe9, 0x1c, 0xac, 0x57, 0x34, 0x98, 0xd6,\n 0xee, 0x88, 0x39, 0x2c, 0xc9, 0x6a, 0x90, 0x00,\n]);\n\nconst GET_PUBKEY_APDU_RESPONSE = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: GET_PUBKEY_APDU,\n});\n\ndescribe(\"GetPubKeyCommand\", () => {\n let command: GetPubKeyCommand;\n const defaultArgs = {\n derivationPath: \"44'/501'\",\n checkOnDevice: true,\n };\n\n beforeEach(() => {\n command = new GetPubKeyCommand(defaultArgs);\n jest.clearAllMocks();\n jest.requireActual(\"@ledgerhq/device-management-kit\");\n });\n\n describe(\"getApdu\", () => {\n it(\"should return APDU\", () => {\n const apdu = command.getApdu();\n expect(apdu.getRawApdu()).toEqual(\n GET_PUBKYEY_APDU_DEFAULT_PATH_WITH_CONFIRM,\n );\n });\n\n it(\"should return APDU without confirm\", () => {\n command = new GetPubKeyCommand({\n ...defaultArgs,\n checkOnDevice: false,\n });\n const apdu = command.getApdu();\n expect(apdu.getRawApdu()).toEqual(\n GET_PUBKYEY_APDU_DEFAULT_PATH_WITHOUT_CONFIRM,\n );\n });\n\n it(\"should return APDU with different path\", () => {\n command = new GetPubKeyCommand({\n ...defaultArgs,\n derivationPath: \"44'/502'\",\n });\n const apdu = command.getApdu();\n expect(apdu.getRawApdu()).toEqual(GET_PUBKEY_APDU_DIFFERENT_PATH);\n });\n });\n\n describe(\"parseResponse\", () => {\n it(\"should parse the response\", () => {\n const parsed = command.parseResponse(GET_PUBKEY_APDU_RESPONSE);\n expect(parsed).toStrictEqual(\n CommandResultFactory({\n data: \"D2PPQSYFe83nDzk96FqGumVU8JA7J8vj2Rhjc2oXzEi5\",\n }),\n );\n });\n\n describe(\"error handling\", () => {\n it(\"should return error if response is not success\", () => {\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x6a, 0x82]),\n data: new Uint8Array(0),\n });\n const result = command.parseResponse(response);\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect(result.error).toEqual(\n expect.objectContaining({\n _tag: \"SolanaAppCommandError\",\n errorCode: \"6a82\",\n message: \"Invalid off-chain message format\",\n }),\n );\n } else {\n fail(\"Expected error\");\n }\n });\n\n it(\"should return error if public key is missing\", () => {\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: new Uint8Array(0),\n });\n const result = command.parseResponse(response);\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect(result.error.originalError).toEqual(\n expect.objectContaining({\n message: \"Public key is missing\",\n }),\n );\n } else {\n fail(\"Expected error\");\n }\n });\n });\n });\n});\n"],
5
+ "mappings": "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",
6
6
  "names": ["ApduResponse", "CommandResultFactory", "isSuccessCommandResult", "GetPubKeyCommand", "GET_PUBKYEY_APDU_DEFAULT_PATH_WITH_CONFIRM", "GET_PUBKYEY_APDU_DEFAULT_PATH_WITHOUT_CONFIRM", "GET_PUBKEY_APDU_DIFFERENT_PATH", "GET_PUBKEY_APDU", "GET_PUBKEY_APDU_RESPONSE", "command", "defaultArgs", "apdu", "parsed", "response", "result"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{ApduBuilder as t,ApduParser as i,CommandResultFactory as a,InvalidStatusWordError as m,isCommandErrorCode as d}from"@ledgerhq/device-management-kit";import{SolanaAppCommandError as p,solanaAppErrors as o}from"./utils/solanaAppErrors";const g=64;class l{args;constructor(e){this.args=e}getApdu(){return new t({cla:224,ins:7,p1:1,p2:0}).addBufferToData(this.args.message).build()}parseResponse(e){const n=new i(e),r=n.encodeToHexaString(e.statusCode);if(d(r,o))return a({error:new p({...o[r],errorCode:r})});const s=n.extractFieldByLength(g);return s?a({data:s}):a({error:new m("Signature extraction failed")})}}export{l as SignOffChainMessageCommand};
1
+ import{ApduBuilder as n,ApduParser as o,CommandResultFactory as a,InvalidStatusWordError as s}from"@ledgerhq/device-management-kit";import{CommandErrorHelper as t}from"@ledgerhq/signer-utils";import{Maybe as p}from"purify-ts";import{SOLANA_APP_ERRORS as m,SolanaAppCommandErrorFactory as i}from"./utils/SolanaApplicationErrors";const d=64;class S{errorHelper=new t(m,i);args;constructor(e){this.args=e}getApdu(){return new n({cla:224,ins:7,p1:1,p2:0}).addBufferToData(this.args.message).build()}parseResponse(e){return p.fromNullable(this.errorHelper.getError(e)).orDefaultLazy(()=>{const r=new o(e).extractFieldByLength(d);return r?a({data:r}):a({error:new s("Signature extraction failed")})})}}export{S as SignOffChainMessageCommand};
2
2
  //# sourceMappingURL=SignOffChainMessageCommand.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/command/SignOffChainMessageCommand.ts"],
4
- "sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n isCommandErrorCode,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type Signature } from \"@api/model/Signature\";\n\nimport {\n SolanaAppCommandError,\n solanaAppErrors,\n} from \"./utils/solanaAppErrors\";\n\nconst SIGNATURE_LENGTH = 64;\n\nexport type SignOffChainMessageCommandResponse = Signature;\nexport type SignOffChainMessageCommandArgs = {\n readonly message: Uint8Array;\n readonly derivationPath: string;\n};\n\nexport class SignOffChainMessageCommand\n implements\n Command<SignOffChainMessageCommandResponse, SignOffChainMessageCommandArgs>\n{\n args: SignOffChainMessageCommandArgs;\n\n constructor(args: SignOffChainMessageCommandArgs) {\n this.args = args;\n }\n\n getApdu(): Apdu {\n return new ApduBuilder({\n cla: 0xe0,\n ins: 0x07,\n p1: 0x01,\n p2: 0x00,\n })\n .addBufferToData(this.args.message)\n .build();\n }\n\n parseResponse(\n response: ApduResponse,\n ): CommandResult<SignOffChainMessageCommandResponse> {\n const parser = new ApduParser(response);\n const errorCode = parser.encodeToHexaString(response.statusCode);\n if (isCommandErrorCode(errorCode, solanaAppErrors)) {\n return CommandResultFactory({\n error: new SolanaAppCommandError({\n ...solanaAppErrors[errorCode],\n errorCode,\n }),\n });\n }\n\n const signature = parser.extractFieldByLength(SIGNATURE_LENGTH);\n if (!signature) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"Signature extraction failed\"),\n });\n }\n\n return CommandResultFactory({\n data: signature,\n });\n }\n}\n"],
5
- "mappings": "AAAA,OAEE,eAAAA,EACA,cAAAC,EAIA,wBAAAC,EACA,0BAAAC,EACA,sBAAAC,MACK,kCAIP,OACE,yBAAAC,EACA,mBAAAC,MACK,0BAEP,MAAMC,EAAmB,GAQlB,MAAMC,CAGb,CACE,KAEA,YAAYC,EAAsC,CAChD,KAAK,KAAOA,CACd,CAEA,SAAgB,CACd,OAAO,IAAIT,EAAY,CACrB,IAAK,IACL,IAAK,EACL,GAAI,EACJ,GAAI,CACN,CAAC,EACE,gBAAgB,KAAK,KAAK,OAAO,EACjC,MAAM,CACX,CAEA,cACEU,EACmD,CACnD,MAAMC,EAAS,IAAIV,EAAWS,CAAQ,EAChCE,EAAYD,EAAO,mBAAmBD,EAAS,UAAU,EAC/D,GAAIN,EAAmBQ,EAAWN,CAAe,EAC/C,OAAOJ,EAAqB,CAC1B,MAAO,IAAIG,EAAsB,CAC/B,GAAGC,EAAgBM,CAAS,EAC5B,UAAAA,CACF,CAAC,CACH,CAAC,EAGH,MAAMC,EAAYF,EAAO,qBAAqBJ,CAAgB,EAC9D,OAAKM,EAMEX,EAAqB,CAC1B,KAAMW,CACR,CAAC,EAPQX,EAAqB,CAC1B,MAAO,IAAIC,EAAuB,6BAA6B,CACjE,CAAC,CAML,CACF",
6
- "names": ["ApduBuilder", "ApduParser", "CommandResultFactory", "InvalidStatusWordError", "isCommandErrorCode", "SolanaAppCommandError", "solanaAppErrors", "SIGNATURE_LENGTH", "SignOffChainMessageCommand", "args", "response", "parser", "errorCode", "signature"]
4
+ "sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\nimport { CommandErrorHelper } from \"@ledgerhq/signer-utils\";\nimport { Maybe } from \"purify-ts\";\n\nimport { type Signature } from \"@api/model/Signature\";\n\nimport {\n SOLANA_APP_ERRORS,\n SolanaAppCommandErrorFactory,\n type SolanaAppErrorCodes,\n} from \"./utils/SolanaApplicationErrors\";\n\nconst SIGNATURE_LENGTH = 64;\n\nexport type SignOffChainMessageCommandResponse = Signature;\nexport type SignOffChainMessageCommandArgs = {\n readonly message: Uint8Array;\n readonly derivationPath: string;\n};\n\nexport class SignOffChainMessageCommand\n implements\n Command<\n SignOffChainMessageCommandResponse,\n SignOffChainMessageCommandArgs,\n SolanaAppErrorCodes\n >\n{\n private readonly errorHelper = new CommandErrorHelper<\n SignOffChainMessageCommandResponse,\n SolanaAppErrorCodes\n >(SOLANA_APP_ERRORS, SolanaAppCommandErrorFactory);\n\n args: SignOffChainMessageCommandArgs;\n\n constructor(args: SignOffChainMessageCommandArgs) {\n this.args = args;\n }\n\n getApdu(): Apdu {\n return new ApduBuilder({\n cla: 0xe0,\n ins: 0x07,\n p1: 0x01,\n p2: 0x00,\n })\n .addBufferToData(this.args.message)\n .build();\n }\n\n parseResponse(\n response: ApduResponse,\n ): CommandResult<SignOffChainMessageCommandResponse, SolanaAppErrorCodes> {\n return Maybe.fromNullable(\n this.errorHelper.getError(response),\n ).orDefaultLazy(() => {\n const parser = new ApduParser(response);\n\n const signature = parser.extractFieldByLength(SIGNATURE_LENGTH);\n if (!signature) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"Signature extraction failed\"),\n });\n }\n\n return CommandResultFactory({\n data: signature,\n });\n });\n }\n}\n"],
5
+ "mappings": "AAAA,OAEE,eAAAA,EACA,cAAAC,EAIA,wBAAAC,EACA,0BAAAC,MACK,kCACP,OAAS,sBAAAC,MAA0B,yBACnC,OAAS,SAAAC,MAAa,YAItB,OACE,qBAAAC,EACA,gCAAAC,MAEK,kCAEP,MAAMC,EAAmB,GAQlB,MAAMC,CAOb,CACmB,YAAc,IAAIL,EAGjCE,EAAmBC,CAA4B,EAEjD,KAEA,YAAYG,EAAsC,CAChD,KAAK,KAAOA,CACd,CAEA,SAAgB,CACd,OAAO,IAAIV,EAAY,CACrB,IAAK,IACL,IAAK,EACL,GAAI,EACJ,GAAI,CACN,CAAC,EACE,gBAAgB,KAAK,KAAK,OAAO,EACjC,MAAM,CACX,CAEA,cACEW,EACwE,CACxE,OAAON,EAAM,aACX,KAAK,YAAY,SAASM,CAAQ,CACpC,EAAE,cAAc,IAAM,CAGpB,MAAMC,EAFS,IAAIX,EAAWU,CAAQ,EAEb,qBAAqBH,CAAgB,EAC9D,OAAKI,EAMEV,EAAqB,CAC1B,KAAMU,CACR,CAAC,EAPQV,EAAqB,CAC1B,MAAO,IAAIC,EAAuB,6BAA6B,CACjE,CAAC,CAML,CAAC,CACH,CACF",
6
+ "names": ["ApduBuilder", "ApduParser", "CommandResultFactory", "InvalidStatusWordError", "CommandErrorHelper", "Maybe", "SOLANA_APP_ERRORS", "SolanaAppCommandErrorFactory", "SIGNATURE_LENGTH", "SignOffChainMessageCommand", "args", "response", "signature"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{ApduBuilder as i,ApduResponse as a,isSuccessCommandResult as t}from"@ledgerhq/device-management-kit";import{SignOffChainMessageCommand as c}from"./SignOffChainMessageCommand";describe("SignOffChainMessageCommand",()=>{let s;const n=new Uint8Array(Buffer.from("Solana SignOffChainMessage","utf-8")),o=64;beforeEach(()=>{s=new c({message:n,derivationPath:"44'/501'/0'/0'"}),jest.clearAllMocks(),jest.requireActual("@ledgerhq/device-management-kit")}),describe("getApdu",()=>{it("should return the correct APDU",()=>{const r=s.getApdu(),e=new i({cla:224,ins:7,p1:1,p2:0}).addBufferToData(n).build();expect(r.getRawApdu()).toEqual(e.getRawApdu())})}),describe("parseResponse",()=>{it("should parse the response correctly",()=>{const r=new Uint8Array(o).fill(1),e=s.parseResponse(new a({data:r,statusCode:new Uint8Array([144,0])}));expect(t(e)).toBe(!0),t(e)?expect(e.data).toEqual(r):fail("Expected success result")}),describe("error handling",()=>{it("should return error if response is not success",()=>{const r=s.parseResponse(new a({statusCode:new Uint8Array([106,130]),data:new Uint8Array(0)}));expect(t(r)).toBe(!1),t(r)?fail("Expected error"):expect(r.error).toEqual(expect.objectContaining({_tag:"InvalidStatusWordError",originalError:expect.objectContaining({message:"Signature extraction failed"})}))}),it("should return error if signature is missing or incomplete",()=>{const r=new Uint8Array(o-1).fill(1),e=s.parseResponse(new a({data:r,statusCode:new Uint8Array([144,0])}));expect(t(e)).toBe(!1),t(e)?fail("Expected error"):typeof e.error.originalError=="object"&&e.error.originalError!==null&&"message"in e.error.originalError&&expect(e.error.originalError.message).toBe("Signature extraction failed")})})})});
1
+ import{ApduBuilder as i,ApduResponse as a,isSuccessCommandResult as t}from"@ledgerhq/device-management-kit";import{SignOffChainMessageCommand as c}from"./SignOffChainMessageCommand";describe("SignOffChainMessageCommand",()=>{let s;const o=new Uint8Array(Buffer.from("Solana SignOffChainMessage","utf-8")),n=64;beforeEach(()=>{s=new c({message:o,derivationPath:"44'/501'/0'/0'"}),jest.clearAllMocks(),jest.requireActual("@ledgerhq/device-management-kit")}),describe("getApdu",()=>{it("should return the correct APDU",()=>{const r=s.getApdu(),e=new i({cla:224,ins:7,p1:1,p2:0}).addBufferToData(o).build();expect(r.getRawApdu()).toEqual(e.getRawApdu())})}),describe("parseResponse",()=>{it("should parse the response correctly",()=>{const r=new Uint8Array(n).fill(1),e=s.parseResponse(new a({data:r,statusCode:new Uint8Array([144,0])}));expect(t(e)).toBe(!0),t(e)?expect(e.data).toEqual(r):fail("Expected success result")}),describe("error handling",()=>{it("should return error if response is not success",()=>{const r=s.parseResponse(new a({statusCode:new Uint8Array([106,130]),data:new Uint8Array(0)}));expect(t(r)).toBe(!1),t(r)?fail("Expected error"):expect(r.error).toEqual(expect.objectContaining({_tag:"SolanaAppCommandError",errorCode:"6a82",message:"Invalid off-chain message format"}))}),it("should return error if signature is missing or incomplete",()=>{const r=new Uint8Array(n-1).fill(1),e=s.parseResponse(new a({data:r,statusCode:new Uint8Array([144,0])}));expect(t(e)).toBe(!1),t(e)?fail("Expected error"):typeof e.error.originalError=="object"&&e.error.originalError!==null&&"message"in e.error.originalError&&expect(e.error.originalError.message).toBe("Signature extraction failed")})})})});
2
2
  //# sourceMappingURL=SignOffChainMessageCommand.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/command/SignOffChainMessageCommand.test.ts"],
4
- "sourcesContent": ["import {\n ApduBuilder,\n ApduResponse,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { SignOffChainMessageCommand } from \"./SignOffChainMessageCommand\";\n\ndescribe(\"SignOffChainMessageCommand\", () => {\n let command: SignOffChainMessageCommand;\n const MESSAGE = new Uint8Array(\n Buffer.from(\"Solana SignOffChainMessage\", \"utf-8\"),\n );\n const SIGNATURE_LENGTH = 64;\n\n beforeEach(() => {\n command = new SignOffChainMessageCommand({\n message: MESSAGE,\n derivationPath: \"44'/501'/0'/0'\",\n });\n jest.clearAllMocks();\n jest.requireActual(\"@ledgerhq/device-management-kit\");\n });\n\n describe(\"getApdu\", () => {\n it(\"should return the correct APDU\", () => {\n const apdu = command.getApdu();\n\n const expectedApdu = new ApduBuilder({\n cla: 0xe0,\n ins: 0x07,\n p1: 0x01,\n p2: 0x00,\n })\n .addBufferToData(MESSAGE)\n .build();\n\n expect(apdu.getRawApdu()).toEqual(expectedApdu.getRawApdu());\n });\n });\n\n describe(\"parseResponse\", () => {\n it(\"should parse the response correctly\", () => {\n const signature = new Uint8Array(SIGNATURE_LENGTH).fill(0x01);\n const parsed = command.parseResponse(\n new ApduResponse({\n data: signature,\n statusCode: new Uint8Array([0x90, 0x00]),\n }),\n );\n\n expect(isSuccessCommandResult(parsed)).toBe(true);\n if (isSuccessCommandResult(parsed)) {\n expect(parsed.data).toEqual(signature);\n } else {\n fail(\"Expected success result\");\n }\n });\n\n describe(\"error handling\", () => {\n it(\"should return error if response is not success\", () => {\n const result = command.parseResponse(\n new ApduResponse({\n statusCode: new Uint8Array([0x6a, 0x82]),\n data: new Uint8Array(0),\n }),\n );\n\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect(result.error).toEqual(\n expect.objectContaining({\n _tag: \"InvalidStatusWordError\", // Adjust this based on your actual implementation\n originalError: expect.objectContaining({\n message: \"Signature extraction failed\",\n }),\n }),\n );\n } else {\n fail(\"Expected error\");\n }\n });\n\n it(\"should return error if signature is missing or incomplete\", () => {\n const incompleteSignature = new Uint8Array(SIGNATURE_LENGTH - 1).fill(\n 0x01,\n );\n const result = command.parseResponse(\n new ApduResponse({\n data: incompleteSignature,\n statusCode: new Uint8Array([0x90, 0x00]),\n }),\n );\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n if (\n typeof result.error.originalError === \"object\" &&\n result.error.originalError !== null &&\n \"message\" in result.error.originalError\n ) {\n expect(result.error.originalError.message).toBe(\n \"Signature extraction failed\",\n );\n }\n } else {\n fail(\"Expected error\");\n }\n });\n });\n });\n});\n"],
5
- "mappings": "AAAA,OACE,eAAAA,EACA,gBAAAC,EACA,0BAAAC,MACK,kCAEP,OAAS,8BAAAC,MAAkC,+BAE3C,SAAS,6BAA8B,IAAM,CAC3C,IAAIC,EACJ,MAAMC,EAAU,IAAI,WAClB,OAAO,KAAK,6BAA8B,OAAO,CACnD,EACMC,EAAmB,GAEzB,WAAW,IAAM,CACfF,EAAU,IAAID,EAA2B,CACvC,QAASE,EACT,eAAgB,gBAClB,CAAC,EACD,KAAK,cAAc,EACnB,KAAK,cAAc,iCAAiC,CACtD,CAAC,EAED,SAAS,UAAW,IAAM,CACxB,GAAG,iCAAkC,IAAM,CACzC,MAAME,EAAOH,EAAQ,QAAQ,EAEvBI,EAAe,IAAIR,EAAY,CACnC,IAAK,IACL,IAAK,EACL,GAAI,EACJ,GAAI,CACN,CAAC,EACE,gBAAgBK,CAAO,EACvB,MAAM,EAET,OAAOE,EAAK,WAAW,CAAC,EAAE,QAAQC,EAAa,WAAW,CAAC,CAC7D,CAAC,CACH,CAAC,EAED,SAAS,gBAAiB,IAAM,CAC9B,GAAG,sCAAuC,IAAM,CAC9C,MAAMC,EAAY,IAAI,WAAWH,CAAgB,EAAE,KAAK,CAAI,EACtDI,EAASN,EAAQ,cACrB,IAAIH,EAAa,CACf,KAAMQ,EACN,WAAY,IAAI,WAAW,CAAC,IAAM,CAAI,CAAC,CACzC,CAAC,CACH,EAEA,OAAOP,EAAuBQ,CAAM,CAAC,EAAE,KAAK,EAAI,EAC5CR,EAAuBQ,CAAM,EAC/B,OAAOA,EAAO,IAAI,EAAE,QAAQD,CAAS,EAErC,KAAK,yBAAyB,CAElC,CAAC,EAED,SAAS,iBAAkB,IAAM,CAC/B,GAAG,iDAAkD,IAAM,CACzD,MAAME,EAASP,EAAQ,cACrB,IAAIH,EAAa,CACf,WAAY,IAAI,WAAW,CAAC,IAAM,GAAI,CAAC,EACvC,KAAM,IAAI,WAAW,CAAC,CACxB,CAAC,CACH,EAEA,OAAOC,EAAuBS,CAAM,CAAC,EAAE,KAAK,EAAK,EAC5CT,EAAuBS,CAAM,EAUhC,KAAK,gBAAgB,EATrB,OAAOA,EAAO,KAAK,EAAE,QACnB,OAAO,iBAAiB,CACtB,KAAM,yBACN,cAAe,OAAO,iBAAiB,CACrC,QAAS,6BACX,CAAC,CACH,CAAC,CACH,CAIJ,CAAC,EAED,GAAG,4DAA6D,IAAM,CACpE,MAAMC,EAAsB,IAAI,WAAWN,EAAmB,CAAC,EAAE,KAC/D,CACF,EACMK,EAASP,EAAQ,cACrB,IAAIH,EAAa,CACf,KAAMW,EACN,WAAY,IAAI,WAAW,CAAC,IAAM,CAAI,CAAC,CACzC,CAAC,CACH,EACA,OAAOV,EAAuBS,CAAM,CAAC,EAAE,KAAK,EAAK,EAC5CT,EAAuBS,CAAM,EAWhC,KAAK,gBAAgB,EATnB,OAAOA,EAAO,MAAM,eAAkB,UACtCA,EAAO,MAAM,gBAAkB,MAC/B,YAAaA,EAAO,MAAM,eAE1B,OAAOA,EAAO,MAAM,cAAc,OAAO,EAAE,KACzC,6BACF,CAKN,CAAC,CACH,CAAC,CACH,CAAC,CACH,CAAC",
4
+ "sourcesContent": ["import {\n ApduBuilder,\n ApduResponse,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { SignOffChainMessageCommand } from \"./SignOffChainMessageCommand\";\n\ndescribe(\"SignOffChainMessageCommand\", () => {\n let command: SignOffChainMessageCommand;\n const MESSAGE = new Uint8Array(\n Buffer.from(\"Solana SignOffChainMessage\", \"utf-8\"),\n );\n const SIGNATURE_LENGTH = 64;\n\n beforeEach(() => {\n command = new SignOffChainMessageCommand({\n message: MESSAGE,\n derivationPath: \"44'/501'/0'/0'\",\n });\n jest.clearAllMocks();\n jest.requireActual(\"@ledgerhq/device-management-kit\");\n });\n\n describe(\"getApdu\", () => {\n it(\"should return the correct APDU\", () => {\n const apdu = command.getApdu();\n\n const expectedApdu = new ApduBuilder({\n cla: 0xe0,\n ins: 0x07,\n p1: 0x01,\n p2: 0x00,\n })\n .addBufferToData(MESSAGE)\n .build();\n\n expect(apdu.getRawApdu()).toEqual(expectedApdu.getRawApdu());\n });\n });\n\n describe(\"parseResponse\", () => {\n it(\"should parse the response correctly\", () => {\n const signature = new Uint8Array(SIGNATURE_LENGTH).fill(0x01);\n const parsed = command.parseResponse(\n new ApduResponse({\n data: signature,\n statusCode: new Uint8Array([0x90, 0x00]),\n }),\n );\n\n expect(isSuccessCommandResult(parsed)).toBe(true);\n if (isSuccessCommandResult(parsed)) {\n expect(parsed.data).toEqual(signature);\n } else {\n fail(\"Expected success result\");\n }\n });\n\n describe(\"error handling\", () => {\n it(\"should return error if response is not success\", () => {\n const result = command.parseResponse(\n new ApduResponse({\n statusCode: new Uint8Array([0x6a, 0x82]),\n data: new Uint8Array(0),\n }),\n );\n\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect(result.error).toEqual(\n expect.objectContaining({\n _tag: \"SolanaAppCommandError\",\n errorCode: \"6a82\",\n message: \"Invalid off-chain message format\",\n }),\n );\n } else {\n fail(\"Expected error\");\n }\n });\n\n it(\"should return error if signature is missing or incomplete\", () => {\n const incompleteSignature = new Uint8Array(SIGNATURE_LENGTH - 1).fill(\n 0x01,\n );\n const result = command.parseResponse(\n new ApduResponse({\n data: incompleteSignature,\n statusCode: new Uint8Array([0x90, 0x00]),\n }),\n );\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n if (\n typeof result.error.originalError === \"object\" &&\n result.error.originalError !== null &&\n \"message\" in result.error.originalError\n ) {\n expect(result.error.originalError.message).toBe(\n \"Signature extraction failed\",\n );\n }\n } else {\n fail(\"Expected error\");\n }\n });\n });\n });\n});\n"],
5
+ "mappings": "AAAA,OACE,eAAAA,EACA,gBAAAC,EACA,0BAAAC,MACK,kCAEP,OAAS,8BAAAC,MAAkC,+BAE3C,SAAS,6BAA8B,IAAM,CAC3C,IAAIC,EACJ,MAAMC,EAAU,IAAI,WAClB,OAAO,KAAK,6BAA8B,OAAO,CACnD,EACMC,EAAmB,GAEzB,WAAW,IAAM,CACfF,EAAU,IAAID,EAA2B,CACvC,QAASE,EACT,eAAgB,gBAClB,CAAC,EACD,KAAK,cAAc,EACnB,KAAK,cAAc,iCAAiC,CACtD,CAAC,EAED,SAAS,UAAW,IAAM,CACxB,GAAG,iCAAkC,IAAM,CACzC,MAAME,EAAOH,EAAQ,QAAQ,EAEvBI,EAAe,IAAIR,EAAY,CACnC,IAAK,IACL,IAAK,EACL,GAAI,EACJ,GAAI,CACN,CAAC,EACE,gBAAgBK,CAAO,EACvB,MAAM,EAET,OAAOE,EAAK,WAAW,CAAC,EAAE,QAAQC,EAAa,WAAW,CAAC,CAC7D,CAAC,CACH,CAAC,EAED,SAAS,gBAAiB,IAAM,CAC9B,GAAG,sCAAuC,IAAM,CAC9C,MAAMC,EAAY,IAAI,WAAWH,CAAgB,EAAE,KAAK,CAAI,EACtDI,EAASN,EAAQ,cACrB,IAAIH,EAAa,CACf,KAAMQ,EACN,WAAY,IAAI,WAAW,CAAC,IAAM,CAAI,CAAC,CACzC,CAAC,CACH,EAEA,OAAOP,EAAuBQ,CAAM,CAAC,EAAE,KAAK,EAAI,EAC5CR,EAAuBQ,CAAM,EAC/B,OAAOA,EAAO,IAAI,EAAE,QAAQD,CAAS,EAErC,KAAK,yBAAyB,CAElC,CAAC,EAED,SAAS,iBAAkB,IAAM,CAC/B,GAAG,iDAAkD,IAAM,CACzD,MAAME,EAASP,EAAQ,cACrB,IAAIH,EAAa,CACf,WAAY,IAAI,WAAW,CAAC,IAAM,GAAI,CAAC,EACvC,KAAM,IAAI,WAAW,CAAC,CACxB,CAAC,CACH,EAEA,OAAOC,EAAuBS,CAAM,CAAC,EAAE,KAAK,EAAK,EAC5CT,EAAuBS,CAAM,EAShC,KAAK,gBAAgB,EARrB,OAAOA,EAAO,KAAK,EAAE,QACnB,OAAO,iBAAiB,CACtB,KAAM,wBACN,UAAW,OACX,QAAS,kCACX,CAAC,CACH,CAIJ,CAAC,EAED,GAAG,4DAA6D,IAAM,CACpE,MAAMC,EAAsB,IAAI,WAAWN,EAAmB,CAAC,EAAE,KAC/D,CACF,EACMK,EAASP,EAAQ,cACrB,IAAIH,EAAa,CACf,KAAMW,EACN,WAAY,IAAI,WAAW,CAAC,IAAM,CAAI,CAAC,CACzC,CAAC,CACH,EACA,OAAOV,EAAuBS,CAAM,CAAC,EAAE,KAAK,EAAK,EAC5CT,EAAuBS,CAAM,EAWhC,KAAK,gBAAgB,EATnB,OAAOA,EAAO,MAAM,eAAkB,UACtCA,EAAO,MAAM,gBAAkB,MAC/B,YAAaA,EAAO,MAAM,eAE1B,OAAOA,EAAO,MAAM,cAAc,OAAO,EAAE,KACzC,6BACF,CAKN,CAAC,CACH,CAAC,CACH,CAAC,CACH,CAAC",
6
6
  "names": ["ApduBuilder", "ApduResponse", "isSuccessCommandResult", "SignOffChainMessageCommand", "command", "MESSAGE", "SIGNATURE_LENGTH", "apdu", "expectedApdu", "signature", "parsed", "result", "incompleteSignature"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{ApduBuilder as i,ApduParser as d,CommandResultFactory as a,InvalidStatusWordError as m,isCommandErrorCode as p}from"@ledgerhq/device-management-kit";import{Just as g,Nothing as u}from"purify-ts";import{SolanaAppCommandError as c,solanaAppErrors as t}from"./utils/solanaAppErrors";const l=64;class T{args;constructor(n){this.args=n}getApdu(){const{more:n,extend:o,serializedTransaction:r}=this.args;let e=0;n&&(e|=2),o&&(e|=1);const s={cla:224,ins:6,p1:1,p2:e};return new i(s).addBufferToData(r).build()}parseResponse(n){const o=new d(n),r=o.encodeToHexaString(n.statusCode);if(console.log("Status Code:",n.statusCode),console.log("Error Code:",r),p(r,t))return a({error:new c({...t[r],errorCode:r})});if(o.getUnparsedRemainingLength()===0)return a({data:u});const e=o.extractFieldByLength(l);return e?a({data:g(e)}):a({error:new m("Signature is missing")})}}export{T as SignTransactionCommand};
1
+ import{ApduBuilder as s,ApduParser as i,CommandResultFactory as o,InvalidStatusWordError as p}from"@ledgerhq/device-management-kit";import{CommandErrorHelper as d}from"@ledgerhq/signer-utils";import{Just as m,Maybe as l,Nothing as g}from"purify-ts";import{SOLANA_APP_ERRORS as u,SolanaAppCommandErrorFactory as A}from"./utils/SolanaApplicationErrors";const c=64;class f{errorHelper=new d(u,A);args;constructor(r){this.args=r}getApdu(){const{more:r,extend:n,serializedTransaction:e}=this.args;let a=0;r&&(a|=2),n&&(a|=1);const t={cla:224,ins:6,p1:1,p2:a};return new s(t).addBufferToData(e).build()}parseResponse(r){return l.fromNullable(this.errorHelper.getError(r)).orDefaultLazy(()=>{const n=new i(r);if(n.getUnparsedRemainingLength()===0)return o({data:g});const e=n.extractFieldByLength(c);return e?o({data:m(e)}):o({error:new p("Signature is missing")})})}}export{f as SignTransactionCommand};
2
2
  //# sourceMappingURL=SignTransactionCommand.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/command/SignTransactionCommand.ts"],
4
- "sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n type ApduBuilderArgs,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n isCommandErrorCode,\n} from \"@ledgerhq/device-management-kit\";\nimport { Just, type Maybe, Nothing } from \"purify-ts\";\n\nimport { type Signature } from \"@api/model/Signature\";\n\nimport {\n SolanaAppCommandError,\n solanaAppErrors,\n} from \"./utils/solanaAppErrors\";\n\nconst SIGNATURE_LENGTH = 64;\n\nexport type SignTransactionCommandResponse = Maybe<Signature>;\nexport type SignTransactionCommandArgs = {\n /**\n * Chunked serialized transaction\n */\n readonly serializedTransaction: Uint8Array;\n readonly more: boolean;\n readonly extend: boolean;\n};\n\nexport class SignTransactionCommand\n implements\n Command<SignTransactionCommandResponse, SignTransactionCommandArgs>\n{\n args: SignTransactionCommandArgs;\n\n constructor(args: SignTransactionCommandArgs) {\n this.args = args;\n }\n\n getApdu(): Apdu {\n const { more, extend, serializedTransaction } = this.args;\n let p2 = 0x00;\n if (more) p2 |= 0x02;\n if (extend) p2 |= 0x01;\n\n const signTransactionArgs: ApduBuilderArgs = {\n cla: 0xe0,\n ins: 0x06,\n p1: 0x01,\n p2,\n };\n\n return new ApduBuilder(signTransactionArgs)\n .addBufferToData(serializedTransaction)\n .build();\n }\n\n parseResponse(\n response: ApduResponse,\n ): CommandResult<SignTransactionCommandResponse> {\n const parser = new ApduParser(response);\n const errorCode = parser.encodeToHexaString(response.statusCode);\n console.log(\"Status Code:\", response.statusCode); // Debugging\n console.log(\"Error Code:\", errorCode); // Debugging\n if (isCommandErrorCode(errorCode, solanaAppErrors)) {\n return CommandResultFactory({\n error: new SolanaAppCommandError({\n ...solanaAppErrors[errorCode],\n errorCode,\n }),\n });\n }\n\n if (parser.getUnparsedRemainingLength() === 0) {\n return CommandResultFactory({\n data: Nothing,\n });\n }\n\n const signature = parser.extractFieldByLength(SIGNATURE_LENGTH);\n if (!signature) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"Signature is missing\"),\n });\n }\n\n return CommandResultFactory({\n data: Just(signature),\n });\n }\n}\n"],
5
- "mappings": "AAAA,OAEE,eAAAA,EAEA,cAAAC,EAIA,wBAAAC,EACA,0BAAAC,EACA,sBAAAC,MACK,kCACP,OAAS,QAAAC,EAAkB,WAAAC,MAAe,YAI1C,OACE,yBAAAC,EACA,mBAAAC,MACK,0BAEP,MAAMC,EAAmB,GAYlB,MAAMC,CAGb,CACE,KAEA,YAAYC,EAAkC,CAC5C,KAAK,KAAOA,CACd,CAEA,SAAgB,CACd,KAAM,CAAE,KAAAC,EAAM,OAAAC,EAAQ,sBAAAC,CAAsB,EAAI,KAAK,KACrD,IAAIC,EAAK,EACLH,IAAMG,GAAM,GACZF,IAAQE,GAAM,GAElB,MAAMC,EAAuC,CAC3C,IAAK,IACL,IAAK,EACL,GAAI,EACJ,GAAAD,CACF,EAEA,OAAO,IAAIf,EAAYgB,CAAmB,EACvC,gBAAgBF,CAAqB,EACrC,MAAM,CACX,CAEA,cACEG,EAC+C,CAC/C,MAAMC,EAAS,IAAIjB,EAAWgB,CAAQ,EAChCE,EAAYD,EAAO,mBAAmBD,EAAS,UAAU,EAG/D,GAFA,QAAQ,IAAI,eAAgBA,EAAS,UAAU,EAC/C,QAAQ,IAAI,cAAeE,CAAS,EAChCf,EAAmBe,EAAWX,CAAe,EAC/C,OAAON,EAAqB,CAC1B,MAAO,IAAIK,EAAsB,CAC/B,GAAGC,EAAgBW,CAAS,EAC5B,UAAAA,CACF,CAAC,CACH,CAAC,EAGH,GAAID,EAAO,2BAA2B,IAAM,EAC1C,OAAOhB,EAAqB,CAC1B,KAAMI,CACR,CAAC,EAGH,MAAMc,EAAYF,EAAO,qBAAqBT,CAAgB,EAC9D,OAAKW,EAMElB,EAAqB,CAC1B,KAAMG,EAAKe,CAAS,CACtB,CAAC,EAPQlB,EAAqB,CAC1B,MAAO,IAAIC,EAAuB,sBAAsB,CAC1D,CAAC,CAML,CACF",
6
- "names": ["ApduBuilder", "ApduParser", "CommandResultFactory", "InvalidStatusWordError", "isCommandErrorCode", "Just", "Nothing", "SolanaAppCommandError", "solanaAppErrors", "SIGNATURE_LENGTH", "SignTransactionCommand", "args", "more", "extend", "serializedTransaction", "p2", "signTransactionArgs", "response", "parser", "errorCode", "signature"]
4
+ "sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n type ApduBuilderArgs,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\nimport { CommandErrorHelper } from \"@ledgerhq/signer-utils\";\nimport { Just, Maybe, Nothing } from \"purify-ts\";\n\nimport { type Signature } from \"@api/model/Signature\";\n\nimport {\n SOLANA_APP_ERRORS,\n SolanaAppCommandErrorFactory,\n type SolanaAppErrorCodes,\n} from \"./utils/SolanaApplicationErrors\";\n\nconst SIGNATURE_LENGTH = 64;\n\nexport type SignTransactionCommandResponse = Maybe<Signature>;\nexport type SignTransactionCommandArgs = {\n /**\n * Chunked serialized transaction\n */\n readonly serializedTransaction: Uint8Array;\n readonly more: boolean;\n readonly extend: boolean;\n};\n\nexport class SignTransactionCommand\n implements\n Command<\n SignTransactionCommandResponse,\n SignTransactionCommandArgs,\n SolanaAppErrorCodes\n >\n{\n private readonly errorHelper = new CommandErrorHelper<\n SignTransactionCommandResponse,\n SolanaAppErrorCodes\n >(SOLANA_APP_ERRORS, SolanaAppCommandErrorFactory);\n\n args: SignTransactionCommandArgs;\n\n constructor(args: SignTransactionCommandArgs) {\n this.args = args;\n }\n\n getApdu(): Apdu {\n const { more, extend, serializedTransaction } = this.args;\n let p2 = 0x00;\n if (more) p2 |= 0x02;\n if (extend) p2 |= 0x01;\n\n const signTransactionArgs: ApduBuilderArgs = {\n cla: 0xe0,\n ins: 0x06,\n p1: 0x01,\n p2,\n };\n\n return new ApduBuilder(signTransactionArgs)\n .addBufferToData(serializedTransaction)\n .build();\n }\n\n parseResponse(\n response: ApduResponse,\n ): CommandResult<SignTransactionCommandResponse, SolanaAppErrorCodes> {\n return Maybe.fromNullable(\n this.errorHelper.getError(response),\n ).orDefaultLazy(() => {\n const parser = new ApduParser(response);\n\n if (parser.getUnparsedRemainingLength() === 0) {\n return CommandResultFactory({\n data: Nothing,\n });\n }\n\n const signature = parser.extractFieldByLength(SIGNATURE_LENGTH);\n if (!signature) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"Signature is missing\"),\n });\n }\n\n return CommandResultFactory({\n data: Just(signature),\n });\n });\n }\n}\n"],
5
+ "mappings": "AAAA,OAEE,eAAAA,EAEA,cAAAC,EAIA,wBAAAC,EACA,0BAAAC,MACK,kCACP,OAAS,sBAAAC,MAA0B,yBACnC,OAAS,QAAAC,EAAM,SAAAC,EAAO,WAAAC,MAAe,YAIrC,OACE,qBAAAC,EACA,gCAAAC,MAEK,kCAEP,MAAMC,EAAmB,GAYlB,MAAMC,CAOb,CACmB,YAAc,IAAIP,EAGjCI,EAAmBC,CAA4B,EAEjD,KAEA,YAAYG,EAAkC,CAC5C,KAAK,KAAOA,CACd,CAEA,SAAgB,CACd,KAAM,CAAE,KAAAC,EAAM,OAAAC,EAAQ,sBAAAC,CAAsB,EAAI,KAAK,KACrD,IAAIC,EAAK,EACLH,IAAMG,GAAM,GACZF,IAAQE,GAAM,GAElB,MAAMC,EAAuC,CAC3C,IAAK,IACL,IAAK,EACL,GAAI,EACJ,GAAAD,CACF,EAEA,OAAO,IAAIhB,EAAYiB,CAAmB,EACvC,gBAAgBF,CAAqB,EACrC,MAAM,CACX,CAEA,cACEG,EACoE,CACpE,OAAOZ,EAAM,aACX,KAAK,YAAY,SAASY,CAAQ,CACpC,EAAE,cAAc,IAAM,CACpB,MAAMC,EAAS,IAAIlB,EAAWiB,CAAQ,EAEtC,GAAIC,EAAO,2BAA2B,IAAM,EAC1C,OAAOjB,EAAqB,CAC1B,KAAMK,CACR,CAAC,EAGH,MAAMa,EAAYD,EAAO,qBAAqBT,CAAgB,EAC9D,OAAKU,EAMElB,EAAqB,CAC1B,KAAMG,EAAKe,CAAS,CACtB,CAAC,EAPQlB,EAAqB,CAC1B,MAAO,IAAIC,EAAuB,sBAAsB,CAC1D,CAAC,CAML,CAAC,CACH,CACF",
6
+ "names": ["ApduBuilder", "ApduParser", "CommandResultFactory", "InvalidStatusWordError", "CommandErrorHelper", "Just", "Maybe", "Nothing", "SOLANA_APP_ERRORS", "SolanaAppCommandErrorFactory", "SIGNATURE_LENGTH", "SignTransactionCommand", "args", "more", "extend", "serializedTransaction", "p2", "signTransactionArgs", "response", "parser", "signature"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ import{DeviceExchangeError as t}from"@ledgerhq/device-management-kit";import{SOLANA_APP_ERRORS as a,SolanaAppCommandError as o}from"./SolanaApplicationErrors";describe("SolanaAppCommandError",()=>{afterEach(()=>{jest.resetAllMocks()}),afterAll(()=>{jest.resetModules()}),it("should be an instance of DeviceExchangeError",()=>{const e=new o({message:"Test error message",errorCode:"6700"});expect(e).toBeInstanceOf(t)}),it("should set the correct message when provided",()=>{const e="Custom error message",r=new o({message:e,errorCode:"6700"});expect(r.message).toBe(e)}),it("should set the correct customErrorCode",()=>{const e="6a80",r=new o({message:"Invalid data",errorCode:e});expect(r.errorCode).toBe(e)}),it("should correlate error codes with messages from solanaAppErrors",()=>{const e="6b00",r=a[e].message,s=new o({message:r,errorCode:e});expect(s.errorCode).toBe(e),expect(s.message).toBe(r),expect(s).toBeInstanceOf(t)})});
2
+ //# sourceMappingURL=SolanaAppErrors.test.js.map