@ledgerhq/device-signer-kit-tron 0.2.0 → 0.3.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 (183) hide show
  1. package/README.md +41 -0
  2. package/lib/cjs/api/SignerTrxBuilder.js +1 -1
  3. package/lib/cjs/api/SignerTrxBuilder.js.map +3 -3
  4. package/lib/cjs/api/SignerTrxBuilder.test.js +1 -1
  5. package/lib/cjs/api/SignerTrxBuilder.test.js.map +3 -3
  6. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
  7. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js.map +3 -3
  8. package/lib/cjs/api/index.js +1 -1
  9. package/lib/cjs/api/index.js.map +3 -3
  10. package/lib/cjs/api/model/TronAddressBook.js +1 -1
  11. package/lib/cjs/api/model/TronAddressBook.js.map +3 -3
  12. package/lib/cjs/internal/DefaultSignerTrx.js +1 -1
  13. package/lib/cjs/internal/DefaultSignerTrx.js.map +3 -3
  14. package/lib/cjs/internal/app-binder/TronAppBinder.js +1 -1
  15. package/lib/cjs/internal/app-binder/TronAppBinder.js.map +3 -3
  16. package/lib/cjs/internal/app-binder/TronAppBinder.test.js +1 -1
  17. package/lib/cjs/internal/app-binder/TronAppBinder.test.js.map +3 -3
  18. package/lib/cjs/internal/app-binder/TronApplicationResolver.js +2 -0
  19. package/lib/cjs/internal/app-binder/TronApplicationResolver.js.map +7 -0
  20. package/lib/cjs/internal/app-binder/TronApplicationResolver.test.js +2 -0
  21. package/lib/cjs/internal/app-binder/TronApplicationResolver.test.js.map +7 -0
  22. package/lib/cjs/internal/app-binder/constants.js +1 -1
  23. package/lib/cjs/internal/app-binder/constants.js.map +3 -3
  24. package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js +2 -0
  25. package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js.map +7 -0
  26. package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js +2 -0
  27. package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js.map +7 -0
  28. package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +2 -0
  29. package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +7 -0
  30. package/lib/cjs/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js +2 -0
  31. package/lib/cjs/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js.map +7 -0
  32. package/lib/cjs/internal/app-binder/services/TransactionSerializer.js +1 -1
  33. package/lib/cjs/internal/app-binder/services/TransactionSerializer.js.map +3 -3
  34. package/lib/cjs/internal/app-binder/services/TransactionSerializer.test.js +1 -1
  35. package/lib/cjs/internal/app-binder/services/TransactionSerializer.test.js.map +3 -3
  36. package/lib/cjs/internal/app-binder/task/GetTokenPayloadsTask.js +2 -0
  37. package/lib/cjs/internal/app-binder/task/GetTokenPayloadsTask.js.map +7 -0
  38. package/lib/cjs/internal/app-binder/task/GetTokenPayloadsTask.test.js +2 -0
  39. package/lib/cjs/internal/app-binder/task/GetTokenPayloadsTask.test.js.map +7 -0
  40. package/lib/cjs/internal/app-binder/task/ProvideContactTask.js +2 -0
  41. package/lib/cjs/internal/app-binder/task/ProvideContactTask.js.map +7 -0
  42. package/lib/cjs/internal/app-binder/task/ProvideContactTask.test.js +2 -0
  43. package/lib/cjs/internal/app-binder/task/ProvideContactTask.test.js.map +7 -0
  44. package/lib/cjs/internal/app-binder/task/SignTransactionTask.js +1 -1
  45. package/lib/cjs/internal/app-binder/task/SignTransactionTask.js.map +3 -3
  46. package/lib/cjs/internal/app-binder/task/SignTransactionTask.test.js +1 -1
  47. package/lib/cjs/internal/app-binder/task/SignTransactionTask.test.js.map +3 -3
  48. package/lib/cjs/internal/di.js +1 -1
  49. package/lib/cjs/internal/di.js.map +3 -3
  50. package/lib/cjs/internal/externalTypes.js +1 -1
  51. package/lib/cjs/internal/externalTypes.js.map +2 -2
  52. package/lib/cjs/internal/shared/utils/buildExternalContactPayload.js +2 -0
  53. package/lib/cjs/internal/shared/utils/buildExternalContactPayload.js.map +7 -0
  54. package/lib/cjs/internal/shared/utils/buildExternalContactPayload.test.js +2 -0
  55. package/lib/cjs/internal/shared/utils/buildExternalContactPayload.test.js.map +7 -0
  56. package/lib/cjs/internal/shared/utils/extractTransactionRecipient.js +2 -0
  57. package/lib/cjs/internal/shared/utils/extractTransactionRecipient.js.map +7 -0
  58. package/lib/cjs/internal/shared/utils/extractTransactionRecipient.test.js +2 -0
  59. package/lib/cjs/internal/shared/utils/extractTransactionRecipient.test.js.map +7 -0
  60. package/lib/cjs/internal/shared/utils/tronBase58Check.js +2 -0
  61. package/lib/cjs/internal/shared/utils/tronBase58Check.js.map +7 -0
  62. package/lib/cjs/internal/shared/utils/tronBase58Check.test.js +2 -0
  63. package/lib/cjs/internal/shared/utils/tronBase58Check.test.js.map +7 -0
  64. package/lib/cjs/package.json +6 -1
  65. package/lib/esm/api/SignerTrxBuilder.js +1 -1
  66. package/lib/esm/api/SignerTrxBuilder.js.map +3 -3
  67. package/lib/esm/api/SignerTrxBuilder.test.js +1 -1
  68. package/lib/esm/api/SignerTrxBuilder.test.js.map +3 -3
  69. package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js +1 -0
  70. package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js.map +4 -4
  71. package/lib/esm/api/index.js +1 -1
  72. package/lib/esm/api/index.js.map +3 -3
  73. package/lib/esm/api/model/TronAddressBook.js +1 -0
  74. package/lib/esm/api/model/TronAddressBook.js.map +4 -4
  75. package/lib/esm/internal/DefaultSignerTrx.js +1 -1
  76. package/lib/esm/internal/DefaultSignerTrx.js.map +3 -3
  77. package/lib/esm/internal/app-binder/TronAppBinder.js +1 -1
  78. package/lib/esm/internal/app-binder/TronAppBinder.js.map +3 -3
  79. package/lib/esm/internal/app-binder/TronAppBinder.test.js +1 -1
  80. package/lib/esm/internal/app-binder/TronAppBinder.test.js.map +3 -3
  81. package/lib/esm/internal/app-binder/TronApplicationResolver.js +2 -0
  82. package/lib/esm/internal/app-binder/TronApplicationResolver.js.map +7 -0
  83. package/lib/esm/internal/app-binder/TronApplicationResolver.test.js +2 -0
  84. package/lib/esm/internal/app-binder/TronApplicationResolver.test.js.map +7 -0
  85. package/lib/esm/internal/app-binder/constants.js +1 -1
  86. package/lib/esm/internal/app-binder/constants.js.map +3 -3
  87. package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js +2 -0
  88. package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js.map +7 -0
  89. package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js +2 -0
  90. package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js.map +7 -0
  91. package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +2 -0
  92. package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +7 -0
  93. package/lib/esm/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js +2 -0
  94. package/lib/esm/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js.map +7 -0
  95. package/lib/esm/internal/app-binder/services/TransactionSerializer.js +1 -1
  96. package/lib/esm/internal/app-binder/services/TransactionSerializer.js.map +3 -3
  97. package/lib/esm/internal/app-binder/services/TransactionSerializer.test.js +1 -1
  98. package/lib/esm/internal/app-binder/services/TransactionSerializer.test.js.map +3 -3
  99. package/lib/esm/internal/app-binder/task/GetTokenPayloadsTask.js +2 -0
  100. package/lib/esm/internal/app-binder/task/GetTokenPayloadsTask.js.map +7 -0
  101. package/lib/esm/internal/app-binder/task/GetTokenPayloadsTask.test.js +2 -0
  102. package/lib/esm/internal/app-binder/task/GetTokenPayloadsTask.test.js.map +7 -0
  103. package/lib/esm/internal/app-binder/task/ProvideContactTask.js +2 -0
  104. package/lib/esm/internal/app-binder/task/ProvideContactTask.js.map +7 -0
  105. package/lib/esm/internal/app-binder/task/ProvideContactTask.test.js +2 -0
  106. package/lib/esm/internal/app-binder/task/ProvideContactTask.test.js.map +7 -0
  107. package/lib/esm/internal/app-binder/task/SignTransactionTask.js +1 -1
  108. package/lib/esm/internal/app-binder/task/SignTransactionTask.js.map +3 -3
  109. package/lib/esm/internal/app-binder/task/SignTransactionTask.test.js +1 -1
  110. package/lib/esm/internal/app-binder/task/SignTransactionTask.test.js.map +3 -3
  111. package/lib/esm/internal/di.js +1 -1
  112. package/lib/esm/internal/di.js.map +3 -3
  113. package/lib/esm/internal/externalTypes.js +1 -1
  114. package/lib/esm/internal/externalTypes.js.map +2 -2
  115. package/lib/esm/internal/shared/utils/buildExternalContactPayload.js +2 -0
  116. package/lib/esm/internal/shared/utils/buildExternalContactPayload.js.map +7 -0
  117. package/lib/esm/internal/shared/utils/buildExternalContactPayload.test.js +2 -0
  118. package/lib/esm/internal/shared/utils/buildExternalContactPayload.test.js.map +7 -0
  119. package/lib/esm/internal/shared/utils/extractTransactionRecipient.js +2 -0
  120. package/lib/esm/internal/shared/utils/extractTransactionRecipient.js.map +7 -0
  121. package/lib/esm/internal/shared/utils/extractTransactionRecipient.test.js +2 -0
  122. package/lib/esm/internal/shared/utils/extractTransactionRecipient.test.js.map +7 -0
  123. package/lib/esm/internal/shared/utils/tronBase58Check.js +2 -0
  124. package/lib/esm/internal/shared/utils/tronBase58Check.js.map +7 -0
  125. package/lib/esm/internal/shared/utils/tronBase58Check.test.js +2 -0
  126. package/lib/esm/internal/shared/utils/tronBase58Check.test.js.map +7 -0
  127. package/lib/esm/package.json +6 -1
  128. package/lib/types/api/SignerTrxBuilder.d.ts +12 -1
  129. package/lib/types/api/SignerTrxBuilder.d.ts.map +1 -1
  130. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts +25 -1
  131. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts.map +1 -1
  132. package/lib/types/api/index.d.ts +2 -1
  133. package/lib/types/api/index.d.ts.map +1 -1
  134. package/lib/types/api/model/TronAddressBook.d.ts +8 -3
  135. package/lib/types/api/model/TronAddressBook.d.ts.map +1 -1
  136. package/lib/types/internal/DefaultSignerTrx.d.ts +3 -1
  137. package/lib/types/internal/DefaultSignerTrx.d.ts.map +1 -1
  138. package/lib/types/internal/app-binder/TronAppBinder.d.ts +5 -1
  139. package/lib/types/internal/app-binder/TronAppBinder.d.ts.map +1 -1
  140. package/lib/types/internal/app-binder/TronApplicationResolver.d.ts +5 -0
  141. package/lib/types/internal/app-binder/TronApplicationResolver.d.ts.map +1 -0
  142. package/lib/types/internal/app-binder/TronApplicationResolver.test.d.ts +2 -0
  143. package/lib/types/internal/app-binder/TronApplicationResolver.test.d.ts.map +1 -0
  144. package/lib/types/internal/app-binder/constants.d.ts +3 -0
  145. package/lib/types/internal/app-binder/constants.d.ts.map +1 -1
  146. package/lib/types/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.d.ts +35 -0
  147. package/lib/types/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.d.ts.map +1 -0
  148. package/lib/types/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.d.ts +2 -0
  149. package/lib/types/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.d.ts.map +1 -0
  150. package/lib/types/internal/app-binder/device-action/__test-utils__/makeInternalApi.d.ts +4 -0
  151. package/lib/types/internal/app-binder/device-action/__test-utils__/makeInternalApi.d.ts.map +1 -0
  152. package/lib/types/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.d.ts +15 -0
  153. package/lib/types/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.d.ts.map +1 -0
  154. package/lib/types/internal/app-binder/services/TransactionSerializer.d.ts +4 -1
  155. package/lib/types/internal/app-binder/services/TransactionSerializer.d.ts.map +1 -1
  156. package/lib/types/internal/app-binder/task/GetTokenPayloadsTask.d.ts +17 -0
  157. package/lib/types/internal/app-binder/task/GetTokenPayloadsTask.d.ts.map +1 -0
  158. package/lib/types/internal/app-binder/task/GetTokenPayloadsTask.test.d.ts +2 -0
  159. package/lib/types/internal/app-binder/task/GetTokenPayloadsTask.test.d.ts.map +1 -0
  160. package/lib/types/internal/app-binder/task/ProvideContactTask.d.ts +16 -0
  161. package/lib/types/internal/app-binder/task/ProvideContactTask.d.ts.map +1 -0
  162. package/lib/types/internal/app-binder/task/ProvideContactTask.test.d.ts +2 -0
  163. package/lib/types/internal/app-binder/task/ProvideContactTask.test.d.ts.map +1 -0
  164. package/lib/types/internal/app-binder/task/SignTransactionTask.d.ts +1 -0
  165. package/lib/types/internal/app-binder/task/SignTransactionTask.d.ts.map +1 -1
  166. package/lib/types/internal/di.d.ts +3 -1
  167. package/lib/types/internal/di.d.ts.map +1 -1
  168. package/lib/types/internal/externalTypes.d.ts +1 -0
  169. package/lib/types/internal/externalTypes.d.ts.map +1 -1
  170. package/lib/types/internal/shared/utils/buildExternalContactPayload.d.ts +11 -0
  171. package/lib/types/internal/shared/utils/buildExternalContactPayload.d.ts.map +1 -0
  172. package/lib/types/internal/shared/utils/buildExternalContactPayload.test.d.ts +2 -0
  173. package/lib/types/internal/shared/utils/buildExternalContactPayload.test.d.ts.map +1 -0
  174. package/lib/types/internal/shared/utils/extractTransactionRecipient.d.ts +2 -0
  175. package/lib/types/internal/shared/utils/extractTransactionRecipient.d.ts.map +1 -0
  176. package/lib/types/internal/shared/utils/extractTransactionRecipient.test.d.ts +2 -0
  177. package/lib/types/internal/shared/utils/extractTransactionRecipient.test.d.ts.map +1 -0
  178. package/lib/types/internal/shared/utils/tronBase58Check.d.ts +4 -0
  179. package/lib/types/internal/shared/utils/tronBase58Check.d.ts.map +1 -0
  180. package/lib/types/internal/shared/utils/tronBase58Check.test.d.ts +2 -0
  181. package/lib/types/internal/shared/utils/tronBase58Check.test.d.ts.map +1 -0
  182. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  183. package/package.json +13 -8
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/internal/app-binder/TronAppBinder.test.ts"],
4
- "sourcesContent": ["import {\n CallTaskInAppDeviceAction,\n type DeviceActionState,\n DeviceActionStatus,\n type DeviceManagementKit,\n type DeviceSessionId,\n type LoggerPublisherService,\n SendCommandInAppDeviceAction,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { from } from \"rxjs\";\n\nimport {\n type GetAddressDAError,\n type GetAddressDAIntermediateValue,\n type GetAddressDAOutput,\n} from \"@api/app-binder/GetAddressDeviceActionTypes\";\nimport {\n type GetAppConfigurationDAError,\n type GetAppConfigurationDAIntermediateValue,\n type GetAppConfigurationDAOutput,\n} from \"@api/app-binder/GetAppConfigurationDeviceActionTypes\";\nimport {\n type GetECDHSecretDAError,\n type GetECDHSecretDAIntermediateValue,\n type GetECDHSecretDAOutput,\n} from \"@api/app-binder/GetECDHSecretDeviceActionTypes\";\nimport {\n type SignPersonalMessageDAError,\n type SignPersonalMessageDAIntermediateValue,\n type SignPersonalMessageDAOutput,\n} from \"@api/app-binder/SignPersonalMessageDeviceActionTypes\";\nimport {\n type SignTransactionDAError,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAOutput,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport {\n type SignTransactionHashDAError,\n type SignTransactionHashDAIntermediateValue,\n type SignTransactionHashDAOutput,\n} from \"@api/app-binder/SignTransactionHashDeviceActionTypes\";\nimport { GetAddressCommand } from \"@internal/app-binder/command/GetAddressCommand\";\nimport { GetAppConfigurationCommand } from \"@internal/app-binder/command/GetAppConfigurationCommand\";\nimport { GetECDHSecretCommand } from \"@internal/app-binder/command/GetECDHSecretCommand\";\nimport { SignTransactionHashCommand } from \"@internal/app-binder/command/SignTransactionHashCommand\";\nimport { type TronAppCommandError } from \"@internal/app-binder/command/utils/tronApplicationErrors\";\nimport { APP_NAME } from \"@internal/app-binder/constants\";\n\nimport { TronAppBinder } from \"./TronAppBinder\";\n\ndescribe(\"TronAppBinder\", () => {\n const mockedDmk: DeviceManagementKit = {\n sendCommand: vi.fn(),\n executeDeviceAction: vi.fn(),\n } as unknown as DeviceManagementKit;\n\n const loggerMock = {\n debug: vi.fn(),\n } as unknown as LoggerPublisherService;\n const loggerFactoryMock = vi.fn().mockReturnValue(loggerMock);\n\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"should be defined\", () => {\n const binder = new TronAppBinder(\n {} as DeviceManagementKit,\n {} as DeviceSessionId,\n loggerFactoryMock,\n );\n expect(binder).toBeDefined();\n });\n\n describe(\"getAddress\", () => {\n it(\"should return the address\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const output: GetAddressDAOutput = {\n publicKey: \"0401020304\",\n address: \"TWdnWBzFdBP1b8sqZ5RcFDbkV3sBmnxsYu\",\n };\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output,\n } as DeviceActionState<\n GetAddressDAOutput,\n GetAddressDAError,\n GetAddressDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n );\n const { observable } = binder.getAddress({\n derivationPath: \"44'/195'/0'/0/0\",\n checkOnDevice: false,\n skipOpenApp: false,\n });\n\n // THEN\n const states: DeviceActionState<\n GetAddressDAOutput,\n GetAddressDAError,\n GetAddressDAIntermediateValue\n >[] = [];\n observable.subscribe({\n next: (state) => states.push(state),\n error: reject,\n complete: () => {\n try {\n expect(states).toEqual([\n { status: DeviceActionStatus.Completed, output },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n describe(\"calls executeDeviceAction with the correct params\", () => {\n const derivationPath = \"44'/195'/0'/0/0\";\n\n it(\"requires no user interaction when checkOnDevice is false\", () => {\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n );\n binder.getAddress({\n derivationPath,\n checkOnDevice: false,\n skipOpenApp: false,\n });\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n sessionId: \"sessionId\",\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new GetAddressCommand({\n derivationPath,\n checkOnDevice: false,\n }),\n appName: APP_NAME,\n requiredUserInteraction: UserInteractionRequired.None,\n skipOpenApp: false,\n },\n logger: loggerMock,\n }),\n }),\n );\n });\n\n it(\"requires VerifyAddress interaction when checkOnDevice is true\", () => {\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n );\n binder.getAddress({\n derivationPath,\n checkOnDevice: true,\n skipOpenApp: true,\n });\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n sessionId: \"sessionId\",\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new GetAddressCommand({\n derivationPath,\n checkOnDevice: true,\n }),\n appName: APP_NAME,\n requiredUserInteraction: UserInteractionRequired.VerifyAddress,\n skipOpenApp: true,\n },\n logger: loggerMock,\n }),\n }),\n );\n });\n });\n });\n\n describe(\"signTransaction\", () => {\n const derivationPath = \"44'/195'/0'/0/0\";\n const transaction = Uint8Array.from([0x0a, 0x01, 0x00]);\n\n it(\"should return the signature\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const output: SignTransactionDAOutput = new Uint8Array(65).fill(0xab);\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output,\n } as DeviceActionState<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n );\n const { observable } = binder.signTransaction({\n derivationPath,\n transaction,\n });\n\n // THEN\n const states: DeviceActionState<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[] = [];\n observable.subscribe({\n next: (state) => states.push(state),\n error: reject,\n complete: () => {\n try {\n expect(states).toEqual([\n { status: DeviceActionStatus.Completed, output },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n describe(\"calls executeDeviceAction with the correct params\", () => {\n // The task closure breaks reference equality, so the device action is\n // asserted field by field instead of with toHaveBeenCalledWith.\n const executedDeviceAction = () => {\n const args = vi.mocked(mockedDmk.executeDeviceAction).mock\n .calls[0]![0]!;\n expect(args.sessionId).toBe(\"sessionId\");\n expect(args.deviceAction).toBeInstanceOf(CallTaskInAppDeviceAction);\n return args.deviceAction as CallTaskInAppDeviceAction<\n SignTransactionDAOutput,\n TronAppCommandError,\n UserInteractionRequired.SignTransaction\n >;\n };\n\n it(\"requires the SignTransaction interaction\", () => {\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n );\n binder.signTransaction({\n derivationPath,\n transaction,\n skipOpenApp: true,\n });\n\n // THEN\n const deviceAction = executedDeviceAction();\n expect(deviceAction.input.appName).toBe(APP_NAME);\n expect(deviceAction.input.requiredUserInteraction).toBe(\n UserInteractionRequired.SignTransaction,\n );\n expect(deviceAction.input.skipOpenApp).toBe(true);\n });\n\n it(\"defaults skipOpenApp to false\", () => {\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n );\n binder.signTransaction({ derivationPath, transaction });\n\n // THEN\n expect(executedDeviceAction().input.skipOpenApp).toBe(false);\n });\n });\n });\n\n describe(\"signTransactionHash\", () => {\n const derivationPath = \"44'/195'/0'/0/0\";\n const transactionHash = new Uint8Array(32).fill(0x25);\n\n it(\"should return the signature\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const output: SignTransactionHashDAOutput = new Uint8Array(65).fill(\n 0xab,\n );\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output,\n } as DeviceActionState<\n SignTransactionHashDAOutput,\n SignTransactionHashDAError,\n SignTransactionHashDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n );\n const { observable } = binder.signTransactionHash({\n derivationPath,\n transactionHash,\n });\n\n // THEN\n const states: DeviceActionState<\n SignTransactionHashDAOutput,\n SignTransactionHashDAError,\n SignTransactionHashDAIntermediateValue\n >[] = [];\n observable.subscribe({\n next: (state) => states.push(state),\n error: reject,\n complete: () => {\n try {\n expect(states).toEqual([\n { status: DeviceActionStatus.Completed, output },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n describe(\"calls executeDeviceAction with the correct params\", () => {\n it(\"requires the SignTransaction interaction\", () => {\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n );\n binder.signTransactionHash({\n derivationPath,\n transactionHash,\n skipOpenApp: true,\n });\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n sessionId: \"sessionId\",\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new SignTransactionHashCommand({\n derivationPath,\n transactionHash,\n }),\n appName: APP_NAME,\n requiredUserInteraction:\n UserInteractionRequired.SignTransaction,\n skipOpenApp: true,\n },\n logger: loggerMock,\n }),\n }),\n );\n });\n\n it(\"defaults skipOpenApp to false\", () => {\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n );\n binder.signTransactionHash({ derivationPath, transactionHash });\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new SignTransactionHashCommand({\n derivationPath,\n transactionHash,\n }),\n appName: APP_NAME,\n requiredUserInteraction:\n UserInteractionRequired.SignTransaction,\n skipOpenApp: false,\n },\n logger: loggerMock,\n }),\n }),\n );\n });\n });\n });\n\n describe(\"signPersonalMessage\", () => {\n const derivationPath = \"44'/195'/0'/0/0\";\n const message = Uint8Array.from([0x68, 0x65, 0x6c, 0x6c, 0x6f]);\n\n it(\"should return the signature\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const output: SignPersonalMessageDAOutput = new Uint8Array(65).fill(\n 0xab,\n );\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output,\n } as DeviceActionState<\n SignPersonalMessageDAOutput,\n SignPersonalMessageDAError,\n SignPersonalMessageDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n );\n const { observable } = binder.signPersonalMessage({\n derivationPath,\n message,\n });\n\n // THEN\n const states: DeviceActionState<\n SignPersonalMessageDAOutput,\n SignPersonalMessageDAError,\n SignPersonalMessageDAIntermediateValue\n >[] = [];\n observable.subscribe({\n next: (state) => states.push(state),\n error: reject,\n complete: () => {\n try {\n expect(states).toEqual([\n { status: DeviceActionStatus.Completed, output },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n describe(\"calls executeDeviceAction with the correct params\", () => {\n // The task closure breaks reference equality, so the device action is\n // asserted field by field instead of with toHaveBeenCalledWith.\n const executedDeviceAction = () => {\n const args = vi.mocked(mockedDmk.executeDeviceAction).mock\n .calls[0]![0]!;\n expect(args.sessionId).toBe(\"sessionId\");\n expect(args.deviceAction).toBeInstanceOf(CallTaskInAppDeviceAction);\n return args.deviceAction as CallTaskInAppDeviceAction<\n SignPersonalMessageDAOutput,\n TronAppCommandError,\n UserInteractionRequired.SignPersonalMessage\n >;\n };\n\n it(\"requires the SignPersonalMessage interaction\", () => {\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n );\n binder.signPersonalMessage({\n derivationPath,\n message,\n skipOpenApp: true,\n });\n\n // THEN\n const deviceAction = executedDeviceAction();\n expect(deviceAction.input.appName).toBe(APP_NAME);\n expect(deviceAction.input.requiredUserInteraction).toBe(\n UserInteractionRequired.SignPersonalMessage,\n );\n expect(deviceAction.input.skipOpenApp).toBe(true);\n });\n\n it(\"defaults skipOpenApp to false\", () => {\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n );\n binder.signPersonalMessage({ derivationPath, message });\n\n // THEN\n expect(executedDeviceAction().input.skipOpenApp).toBe(false);\n });\n });\n });\n\n describe(\"getAppConfiguration\", () => {\n it(\"should return the app configuration\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const output: GetAppConfigurationDAOutput = {\n version: \"0.5.0\",\n versionN: 500,\n allowData: true,\n allowContract: true,\n truncateAddress: true,\n signByHash: true,\n };\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output,\n } as DeviceActionState<\n GetAppConfigurationDAOutput,\n GetAppConfigurationDAError,\n GetAppConfigurationDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n );\n const { observable } = binder.getAppConfiguration();\n\n // THEN\n const states: DeviceActionState<\n GetAppConfigurationDAOutput,\n GetAppConfigurationDAError,\n GetAppConfigurationDAIntermediateValue\n >[] = [];\n observable.subscribe({\n next: (state) => states.push(state),\n error: reject,\n complete: () => {\n try {\n expect(states).toEqual([\n { status: DeviceActionStatus.Completed, output },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n it(\"should call executeDeviceAction with the correct params\", () => {\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n );\n binder.getAppConfiguration();\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n sessionId: \"sessionId\",\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new GetAppConfigurationCommand(),\n appName: APP_NAME,\n requiredUserInteraction: UserInteractionRequired.None,\n skipOpenApp: false,\n },\n logger: loggerMock,\n }),\n }),\n );\n });\n });\n\n describe(\"getECDHSecret\", () => {\n const derivationPath = \"44'/195'/0'/0/0\";\n const publicKey = new Uint8Array(65).fill(0x04);\n\n it(\"should return the shared secret\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const output: GetECDHSecretDAOutput = new Uint8Array(65).fill(0xcd);\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output,\n } as DeviceActionState<\n GetECDHSecretDAOutput,\n GetECDHSecretDAError,\n GetECDHSecretDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n );\n const { observable } = binder.getECDHSecret({\n derivationPath,\n publicKey,\n });\n\n // THEN\n const states: DeviceActionState<\n GetECDHSecretDAOutput,\n GetECDHSecretDAError,\n GetECDHSecretDAIntermediateValue\n >[] = [];\n observable.subscribe({\n next: (state) => states.push(state),\n error: reject,\n complete: () => {\n try {\n expect(states).toEqual([\n { status: DeviceActionStatus.Completed, output },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n describe(\"calls executeDeviceAction with the correct params\", () => {\n it(\"requires the SignTransaction interaction\", () => {\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n );\n binder.getECDHSecret({ derivationPath, publicKey, skipOpenApp: true });\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n sessionId: \"sessionId\",\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new GetECDHSecretCommand({\n derivationPath,\n publicKey,\n }),\n appName: APP_NAME,\n requiredUserInteraction:\n UserInteractionRequired.SignTransaction,\n skipOpenApp: true,\n },\n logger: loggerMock,\n }),\n }),\n );\n });\n\n it(\"defaults skipOpenApp to false\", () => {\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n );\n binder.getECDHSecret({ derivationPath, publicKey });\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new GetECDHSecretCommand({\n derivationPath,\n publicKey,\n }),\n appName: APP_NAME,\n requiredUserInteraction:\n UserInteractionRequired.SignTransaction,\n skipOpenApp: false,\n },\n logger: loggerMock,\n }),\n }),\n );\n });\n });\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["import_device_management_kit", "import_rxjs", "import_GetAddressCommand", "import_GetAppConfigurationCommand", "import_GetECDHSecretCommand", "import_SignTransactionHashCommand", "import_constants", "import_TronAppBinder", "mockedDmk", "loggerMock", "loggerFactoryMock", "binder", "resolve", "reject", "output", "observable", "states", "state", "err", "derivationPath", "transaction", "executedDeviceAction", "args", "deviceAction", "transactionHash", "message", "publicKey"]
4
+ "sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CallTaskInAppDeviceAction,\n type DeviceActionState,\n DeviceActionStatus,\n type DeviceManagementKit,\n type DeviceSessionId,\n type LoggerPublisherService,\n SendCommandInAppDeviceAction,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { from } from \"rxjs\";\n\nimport {\n type GetAddressDAError,\n type GetAddressDAIntermediateValue,\n type GetAddressDAOutput,\n} from \"@api/app-binder/GetAddressDeviceActionTypes\";\nimport {\n type GetAppConfigurationDAError,\n type GetAppConfigurationDAIntermediateValue,\n type GetAppConfigurationDAOutput,\n} from \"@api/app-binder/GetAppConfigurationDeviceActionTypes\";\nimport {\n type GetECDHSecretDAError,\n type GetECDHSecretDAIntermediateValue,\n type GetECDHSecretDAOutput,\n} from \"@api/app-binder/GetECDHSecretDeviceActionTypes\";\nimport {\n type SignPersonalMessageDAError,\n type SignPersonalMessageDAIntermediateValue,\n type SignPersonalMessageDAOutput,\n} from \"@api/app-binder/SignPersonalMessageDeviceActionTypes\";\nimport {\n type SignTransactionDAError,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAOutput,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport {\n type SignTransactionHashDAError,\n type SignTransactionHashDAIntermediateValue,\n type SignTransactionHashDAOutput,\n} from \"@api/app-binder/SignTransactionHashDeviceActionTypes\";\nimport { EMPTY_TRON_ADDRESS_BOOK } from \"@api/model/TronAddressBook\";\nimport { GetAddressCommand } from \"@internal/app-binder/command/GetAddressCommand\";\nimport { GetAppConfigurationCommand } from \"@internal/app-binder/command/GetAppConfigurationCommand\";\nimport { GetECDHSecretCommand } from \"@internal/app-binder/command/GetECDHSecretCommand\";\nimport { SignTransactionHashCommand } from \"@internal/app-binder/command/SignTransactionHashCommand\";\nimport { type TronAppCommandError } from \"@internal/app-binder/command/utils/tronApplicationErrors\";\nimport { APP_NAME } from \"@internal/app-binder/constants\";\nimport { SignTransactionDeviceAction } from \"@internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction\";\n\nimport { TronAppBinder } from \"./TronAppBinder\";\n\ndescribe(\"TronAppBinder\", () => {\n const mockedDmk: DeviceManagementKit = {\n sendCommand: vi.fn(),\n executeDeviceAction: vi.fn(),\n } as unknown as DeviceManagementKit;\n\n const loggerMock = {\n debug: vi.fn(),\n } as unknown as LoggerPublisherService;\n const loggerFactoryMock = vi.fn().mockReturnValue(loggerMock);\n const contextModuleMock = {\n getContexts: vi.fn().mockResolvedValue([]),\n } as unknown as ContextModule;\n\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"should be defined\", () => {\n const binder = new TronAppBinder(\n {} as DeviceManagementKit,\n {} as DeviceSessionId,\n loggerFactoryMock,\n contextModuleMock,\n );\n expect(binder).toBeDefined();\n });\n\n describe(\"getAddress\", () => {\n it(\"should return the address\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const output: GetAddressDAOutput = {\n publicKey: \"0401020304\",\n address: \"TWdnWBzFdBP1b8sqZ5RcFDbkV3sBmnxsYu\",\n };\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output,\n } as DeviceActionState<\n GetAddressDAOutput,\n GetAddressDAError,\n GetAddressDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n contextModuleMock,\n );\n const { observable } = binder.getAddress({\n derivationPath: \"44'/195'/0'/0/0\",\n checkOnDevice: false,\n skipOpenApp: false,\n });\n\n // THEN\n const states: DeviceActionState<\n GetAddressDAOutput,\n GetAddressDAError,\n GetAddressDAIntermediateValue\n >[] = [];\n observable.subscribe({\n next: (state) => states.push(state),\n error: reject,\n complete: () => {\n try {\n expect(states).toEqual([\n { status: DeviceActionStatus.Completed, output },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n describe(\"calls executeDeviceAction with the correct params\", () => {\n const derivationPath = \"44'/195'/0'/0/0\";\n\n it(\"requires no user interaction when checkOnDevice is false\", () => {\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n contextModuleMock,\n );\n binder.getAddress({\n derivationPath,\n checkOnDevice: false,\n skipOpenApp: false,\n });\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n sessionId: \"sessionId\",\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new GetAddressCommand({\n derivationPath,\n checkOnDevice: false,\n }),\n appName: APP_NAME,\n requiredUserInteraction: UserInteractionRequired.None,\n skipOpenApp: false,\n },\n logger: loggerMock,\n }),\n }),\n );\n });\n\n it(\"requires VerifyAddress interaction when checkOnDevice is true\", () => {\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n contextModuleMock,\n );\n binder.getAddress({\n derivationPath,\n checkOnDevice: true,\n skipOpenApp: true,\n });\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n sessionId: \"sessionId\",\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new GetAddressCommand({\n derivationPath,\n checkOnDevice: true,\n }),\n appName: APP_NAME,\n requiredUserInteraction: UserInteractionRequired.VerifyAddress,\n skipOpenApp: true,\n },\n logger: loggerMock,\n }),\n }),\n );\n });\n });\n });\n\n describe(\"signTransaction\", () => {\n const derivationPath = \"44'/195'/0'/0/0\";\n const transaction = Uint8Array.from([0x0a, 0x01, 0x00]);\n const addressBook = EMPTY_TRON_ADDRESS_BOOK;\n\n it(\"should return the signature\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const output: SignTransactionDAOutput = new Uint8Array(65).fill(0xab);\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output,\n } as DeviceActionState<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n contextModuleMock,\n addressBook,\n );\n const { observable } = binder.signTransaction({\n derivationPath,\n transaction,\n });\n\n // THEN\n const states: DeviceActionState<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[] = [];\n observable.subscribe({\n next: (state) => states.push(state),\n error: reject,\n complete: () => {\n try {\n expect(states).toEqual([\n { status: DeviceActionStatus.Completed, output },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n describe(\"calls executeDeviceAction with the correct params\", () => {\n // The logger the binder attaches breaks reference equality, hence the\n // field by field assertions instead of toHaveBeenCalledWith.\n const executedDeviceAction = () => {\n const args = vi.mocked(mockedDmk.executeDeviceAction).mock\n .calls[0]![0]!;\n expect(args.sessionId).toBe(\"sessionId\");\n expect(args.deviceAction).toBeInstanceOf(SignTransactionDeviceAction);\n return args.deviceAction as SignTransactionDeviceAction;\n };\n\n it(\"passes the transaction and the context module resolving its tokens\", () => {\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n contextModuleMock,\n addressBook,\n );\n binder.signTransaction({\n derivationPath,\n transaction,\n skipOpenApp: true,\n });\n\n // THEN\n const deviceAction = executedDeviceAction();\n expect(deviceAction.input.derivationPath).toBe(derivationPath);\n expect(deviceAction.input.transaction).toBe(transaction);\n expect(deviceAction.input.contextModule).toBe(contextModuleMock);\n expect(deviceAction.input.addressBook).toBe(addressBook);\n expect(deviceAction.input.skipOpenApp).toBe(true);\n });\n\n it(\"defaults skipOpenApp to false\", () => {\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n contextModuleMock,\n );\n binder.signTransaction({ derivationPath, transaction });\n\n // THEN\n expect(executedDeviceAction().input.skipOpenApp).toBe(false);\n });\n });\n });\n\n describe(\"signTransactionHash\", () => {\n const derivationPath = \"44'/195'/0'/0/0\";\n const transactionHash = new Uint8Array(32).fill(0x25);\n\n it(\"should return the signature\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const output: SignTransactionHashDAOutput = new Uint8Array(65).fill(\n 0xab,\n );\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output,\n } as DeviceActionState<\n SignTransactionHashDAOutput,\n SignTransactionHashDAError,\n SignTransactionHashDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n contextModuleMock,\n );\n const { observable } = binder.signTransactionHash({\n derivationPath,\n transactionHash,\n });\n\n // THEN\n const states: DeviceActionState<\n SignTransactionHashDAOutput,\n SignTransactionHashDAError,\n SignTransactionHashDAIntermediateValue\n >[] = [];\n observable.subscribe({\n next: (state) => states.push(state),\n error: reject,\n complete: () => {\n try {\n expect(states).toEqual([\n { status: DeviceActionStatus.Completed, output },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n describe(\"calls executeDeviceAction with the correct params\", () => {\n it(\"requires the SignTransaction interaction\", () => {\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n contextModuleMock,\n );\n binder.signTransactionHash({\n derivationPath,\n transactionHash,\n skipOpenApp: true,\n });\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n sessionId: \"sessionId\",\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new SignTransactionHashCommand({\n derivationPath,\n transactionHash,\n }),\n appName: APP_NAME,\n requiredUserInteraction:\n UserInteractionRequired.SignTransaction,\n skipOpenApp: true,\n },\n logger: loggerMock,\n }),\n }),\n );\n });\n\n it(\"defaults skipOpenApp to false\", () => {\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n contextModuleMock,\n );\n binder.signTransactionHash({ derivationPath, transactionHash });\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new SignTransactionHashCommand({\n derivationPath,\n transactionHash,\n }),\n appName: APP_NAME,\n requiredUserInteraction:\n UserInteractionRequired.SignTransaction,\n skipOpenApp: false,\n },\n logger: loggerMock,\n }),\n }),\n );\n });\n });\n });\n\n describe(\"signPersonalMessage\", () => {\n const derivationPath = \"44'/195'/0'/0/0\";\n const message = Uint8Array.from([0x68, 0x65, 0x6c, 0x6c, 0x6f]);\n\n it(\"should return the signature\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const output: SignPersonalMessageDAOutput = new Uint8Array(65).fill(\n 0xab,\n );\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output,\n } as DeviceActionState<\n SignPersonalMessageDAOutput,\n SignPersonalMessageDAError,\n SignPersonalMessageDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n contextModuleMock,\n );\n const { observable } = binder.signPersonalMessage({\n derivationPath,\n message,\n });\n\n // THEN\n const states: DeviceActionState<\n SignPersonalMessageDAOutput,\n SignPersonalMessageDAError,\n SignPersonalMessageDAIntermediateValue\n >[] = [];\n observable.subscribe({\n next: (state) => states.push(state),\n error: reject,\n complete: () => {\n try {\n expect(states).toEqual([\n { status: DeviceActionStatus.Completed, output },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n describe(\"calls executeDeviceAction with the correct params\", () => {\n // The task closure breaks reference equality, so the device action is\n // asserted field by field instead of with toHaveBeenCalledWith.\n const executedDeviceAction = () => {\n const args = vi.mocked(mockedDmk.executeDeviceAction).mock\n .calls[0]![0]!;\n expect(args.sessionId).toBe(\"sessionId\");\n expect(args.deviceAction).toBeInstanceOf(CallTaskInAppDeviceAction);\n return args.deviceAction as CallTaskInAppDeviceAction<\n SignPersonalMessageDAOutput,\n TronAppCommandError,\n UserInteractionRequired.SignPersonalMessage\n >;\n };\n\n it(\"requires the SignPersonalMessage interaction\", () => {\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n contextModuleMock,\n );\n binder.signPersonalMessage({\n derivationPath,\n message,\n skipOpenApp: true,\n });\n\n // THEN\n const deviceAction = executedDeviceAction();\n expect(deviceAction.input.appName).toBe(APP_NAME);\n expect(deviceAction.input.requiredUserInteraction).toBe(\n UserInteractionRequired.SignPersonalMessage,\n );\n expect(deviceAction.input.skipOpenApp).toBe(true);\n });\n\n it(\"defaults skipOpenApp to false\", () => {\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n contextModuleMock,\n );\n binder.signPersonalMessage({ derivationPath, message });\n\n // THEN\n expect(executedDeviceAction().input.skipOpenApp).toBe(false);\n });\n });\n });\n\n describe(\"getAppConfiguration\", () => {\n it(\"should return the app configuration\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const output: GetAppConfigurationDAOutput = {\n version: \"0.5.0\",\n versionN: 500,\n allowData: true,\n allowContract: true,\n truncateAddress: true,\n signByHash: true,\n };\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output,\n } as DeviceActionState<\n GetAppConfigurationDAOutput,\n GetAppConfigurationDAError,\n GetAppConfigurationDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n contextModuleMock,\n );\n const { observable } = binder.getAppConfiguration();\n\n // THEN\n const states: DeviceActionState<\n GetAppConfigurationDAOutput,\n GetAppConfigurationDAError,\n GetAppConfigurationDAIntermediateValue\n >[] = [];\n observable.subscribe({\n next: (state) => states.push(state),\n error: reject,\n complete: () => {\n try {\n expect(states).toEqual([\n { status: DeviceActionStatus.Completed, output },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n it(\"should call executeDeviceAction with the correct params\", () => {\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n contextModuleMock,\n );\n binder.getAppConfiguration();\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n sessionId: \"sessionId\",\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new GetAppConfigurationCommand(),\n appName: APP_NAME,\n requiredUserInteraction: UserInteractionRequired.None,\n skipOpenApp: false,\n },\n logger: loggerMock,\n }),\n }),\n );\n });\n });\n\n describe(\"getECDHSecret\", () => {\n const derivationPath = \"44'/195'/0'/0/0\";\n const publicKey = new Uint8Array(65).fill(0x04);\n\n it(\"should return the shared secret\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const output: GetECDHSecretDAOutput = new Uint8Array(65).fill(0xcd);\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output,\n } as DeviceActionState<\n GetECDHSecretDAOutput,\n GetECDHSecretDAError,\n GetECDHSecretDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n contextModuleMock,\n );\n const { observable } = binder.getECDHSecret({\n derivationPath,\n publicKey,\n });\n\n // THEN\n const states: DeviceActionState<\n GetECDHSecretDAOutput,\n GetECDHSecretDAError,\n GetECDHSecretDAIntermediateValue\n >[] = [];\n observable.subscribe({\n next: (state) => states.push(state),\n error: reject,\n complete: () => {\n try {\n expect(states).toEqual([\n { status: DeviceActionStatus.Completed, output },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n describe(\"calls executeDeviceAction with the correct params\", () => {\n it(\"requires the SignTransaction interaction\", () => {\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n contextModuleMock,\n );\n binder.getECDHSecret({ derivationPath, publicKey, skipOpenApp: true });\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n sessionId: \"sessionId\",\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new GetECDHSecretCommand({\n derivationPath,\n publicKey,\n }),\n appName: APP_NAME,\n requiredUserInteraction:\n UserInteractionRequired.SignTransaction,\n skipOpenApp: true,\n },\n logger: loggerMock,\n }),\n }),\n );\n });\n\n it(\"defaults skipOpenApp to false\", () => {\n // WHEN\n const binder = new TronAppBinder(\n mockedDmk,\n \"sessionId\",\n loggerFactoryMock,\n contextModuleMock,\n );\n binder.getECDHSecret({ derivationPath, publicKey });\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new GetECDHSecretCommand({\n derivationPath,\n publicKey,\n }),\n appName: APP_NAME,\n requiredUserInteraction:\n UserInteractionRequired.SignTransaction,\n skipOpenApp: false,\n },\n logger: loggerMock,\n }),\n }),\n );\n });\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_device_management_kit", "import_rxjs", "import_TronAddressBook", "import_GetAddressCommand", "import_GetAppConfigurationCommand", "import_GetECDHSecretCommand", "import_SignTransactionHashCommand", "import_constants", "import_SignTransactionDeviceAction", "import_TronAppBinder", "mockedDmk", "loggerMock", "loggerFactoryMock", "contextModuleMock", "binder", "resolve", "reject", "output", "observable", "states", "state", "err", "derivationPath", "transaction", "addressBook", "executedDeviceAction", "args", "deviceAction", "transactionHash", "message", "publicKey"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ "use strict";var t=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var v=Object.getOwnPropertyNames;var A=Object.prototype.hasOwnProperty;var c=(p,e)=>{for(var o in e)t(p,o,{get:e[o],enumerable:!0})},m=(p,e,o,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of v(e))!A.call(p,s)&&s!==o&&t(p,s,{get:()=>e[s],enumerable:!(i=a(e,s))||i.enumerable});return p};var f=p=>m(t({},"__esModule",{value:!0}),p);var S={};c(S,{TronApplicationResolver:()=>C});module.exports=f(S);var r=require("@ledgerhq/device-management-kit"),l=require("../app-binder/constants");const n="0.0.1";class C{resolve(e,o){if(e.sessionStateType===r.DeviceSessionStateType.Connected)return{isCompatible:!1,version:n};const i=e.currentApp;return i?.name!==l.APP_NAME?{isCompatible:!1,version:n}:{isCompatible:!0,version:i.version}}}0&&(module.exports={TronApplicationResolver});
2
+ //# sourceMappingURL=TronApplicationResolver.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/internal/app-binder/TronApplicationResolver.ts"],
4
+ "sourcesContent": ["import {\n type AppConfig,\n type ApplicationResolver,\n type DeviceSessionState,\n DeviceSessionStateType,\n type ResolvedApp,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { APP_NAME } from \"@internal/app-binder/constants\";\n\nconst DEFAULT_VERSION = \"0.0.1\";\n\nexport class TronApplicationResolver implements ApplicationResolver {\n resolve(deviceState: DeviceSessionState, _appConfig: AppConfig): ResolvedApp {\n if (deviceState.sessionStateType === DeviceSessionStateType.Connected) {\n return { isCompatible: false, version: DEFAULT_VERSION };\n }\n\n const currentApp = deviceState.currentApp;\n if (currentApp?.name !== APP_NAME) {\n return { isCompatible: false, version: DEFAULT_VERSION };\n }\n\n return { isCompatible: true, version: currentApp.version };\n }\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,6BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAMO,2CAEPC,EAAyB,0CAEzB,MAAMC,EAAkB,QAEjB,MAAMJ,CAAuD,CAClE,QAAQK,EAAiCC,EAAoC,CAC3E,GAAID,EAAY,mBAAqB,yBAAuB,UAC1D,MAAO,CAAE,aAAc,GAAO,QAASD,CAAgB,EAGzD,MAAMG,EAAaF,EAAY,WAC/B,OAAIE,GAAY,OAAS,WAChB,CAAE,aAAc,GAAO,QAASH,CAAgB,EAGlD,CAAE,aAAc,GAAM,QAASG,EAAW,OAAQ,CAC3D,CACF",
6
+ "names": ["TronApplicationResolver_exports", "__export", "TronApplicationResolver", "__toCommonJS", "import_device_management_kit", "import_constants", "DEFAULT_VERSION", "deviceState", "_appConfig", "currentApp"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var e=require("@ledgerhq/device-management-kit"),i=require("./TronApplicationResolver");describe("TronApplicationResolver",()=>{const t=new i.TronApplicationResolver,o={version:"0.8.0"},s=(n,r)=>({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:n,version:r},deviceModelId:e.DeviceModelId.FLEX,isSecureConnectionAllowed:!1});it("resolves the running Tron app version",()=>{expect(t.resolve(s("Tron","0.8.0-rc2"),o)).toEqual({isCompatible:!0,version:"0.8.0-rc2"})}),it("rejects another running app",()=>{expect(t.resolve(s("Ethereum","1.23.0"),o)).toEqual({isCompatible:!1,version:"0.0.1"})}),it("rejects the dashboard state",()=>{expect(t.resolve({...s("Tron","0.8.0"),sessionStateType:e.DeviceSessionStateType.Connected},o)).toEqual({isCompatible:!1,version:"0.0.1"})})});
2
+ //# sourceMappingURL=TronApplicationResolver.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/internal/app-binder/TronApplicationResolver.test.ts"],
4
+ "sourcesContent": ["import {\n type AppConfig,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { TronApplicationResolver } from \"./TronApplicationResolver\";\n\ndescribe(\"TronApplicationResolver\", () => {\n const resolver = new TronApplicationResolver();\n const appConfig = { version: \"0.8.0\" } as AppConfig;\n\n const readyState = (name: string, version: string) => ({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name, version },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n\n it(\"resolves the running Tron app version\", () => {\n expect(\n resolver.resolve(readyState(\"Tron\", \"0.8.0-rc2\"), appConfig),\n ).toEqual({\n isCompatible: true,\n version: \"0.8.0-rc2\",\n });\n });\n\n it(\"rejects another running app\", () => {\n expect(\n resolver.resolve(readyState(\"Ethereum\", \"1.23.0\"), appConfig),\n ).toEqual({\n isCompatible: false,\n version: \"0.0.1\",\n });\n });\n\n it(\"rejects the dashboard state\", () => {\n expect(\n resolver.resolve(\n {\n ...readyState(\"Tron\", \"0.8.0\"),\n sessionStateType: DeviceSessionStateType.Connected,\n },\n appConfig,\n ),\n ).toEqual({ isCompatible: false, version: \"0.0.1\" });\n });\n});\n"],
5
+ "mappings": "aAAA,IAAAA,EAKO,2CAEPC,EAAwC,qCAExC,SAAS,0BAA2B,IAAM,CACxC,MAAMC,EAAW,IAAI,0BACfC,EAAY,CAAE,QAAS,OAAQ,EAE/BC,EAAa,CAACC,EAAcC,KAAqB,CACrD,iBAAkB,yBAAuB,0BACzC,aAAc,eAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAAD,EAAM,QAAAC,CAAQ,EAC5B,cAAe,gBAAc,KAC7B,0BAA2B,EAC7B,GAEA,GAAG,wCAAyC,IAAM,CAChD,OACEJ,EAAS,QAAQE,EAAW,OAAQ,WAAW,EAAGD,CAAS,CAC7D,EAAE,QAAQ,CACR,aAAc,GACd,QAAS,WACX,CAAC,CACH,CAAC,EAED,GAAG,8BAA+B,IAAM,CACtC,OACED,EAAS,QAAQE,EAAW,WAAY,QAAQ,EAAGD,CAAS,CAC9D,EAAE,QAAQ,CACR,aAAc,GACd,QAAS,OACX,CAAC,CACH,CAAC,EAED,GAAG,8BAA+B,IAAM,CACtC,OACED,EAAS,QACP,CACE,GAAGE,EAAW,OAAQ,OAAO,EAC7B,iBAAkB,yBAAuB,SAC3C,EACAD,CACF,CACF,EAAE,QAAQ,CAAE,aAAc,GAAO,QAAS,OAAQ,CAAC,CACrD,CAAC,CACH,CAAC",
6
+ "names": ["import_device_management_kit", "import_TronApplicationResolver", "resolver", "appConfig", "readyState", "name", "version"]
7
+ }
@@ -1,2 +1,2 @@
1
- "use strict";var x=Object.defineProperty;var _=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var A=Object.prototype.hasOwnProperty;var I=(S,E)=>{for(var o in E)x(S,o,{get:E[o],enumerable:!0})},s=(S,E,o,t)=>{if(E&&typeof E=="object"||typeof E=="function")for(let N of T(E))!A.call(S,N)&&N!==o&&x(S,N,{get:()=>E[N],enumerable:!(t=_(E,N))||t.enumerable});return S};var G=S=>s(x({},"__esModule",{value:!0}),S);var P={};I(P,{APP_NAME:()=>n,CHAIN_CODE_LENGTH:()=>p,CHUNK_SIZE:()=>C,ECDH_SECRET_LENGTH:()=>H,INS:()=>R,LEDGER_CLA:()=>c,P2_NONE:()=>e,SIGNATURE_LENGTH:()=>r,SIGN_PERSONAL_MESSAGE_P1:()=>O,SIGN_TRANSACTION_P1:()=>L});module.exports=G(P);const n="Tron",c=224,R={GET_ADDRESS:2,SIGN_TRANSACTION:4,SIGN_TRANSACTION_HASH:5,GET_APP_CONFIGURATION:6,SIGN_PERSONAL_MESSAGE:8,ECDH_SECRET:10},C=250,e=0,r=65,p=32,H=65,L={SINGLE:16,FIRST:0,SUBSEQUENT:128,LAST:144},O={FIRST:0,SUBSEQUENT:128};0&&(module.exports={APP_NAME,CHAIN_CODE_LENGTH,CHUNK_SIZE,ECDH_SECRET_LENGTH,INS,LEDGER_CLA,P2_NONE,SIGNATURE_LENGTH,SIGN_PERSONAL_MESSAGE_P1,SIGN_TRANSACTION_P1});
1
+ "use strict";var x=Object.defineProperty;var t=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var s=(S,E)=>{for(var _ in E)x(S,_,{get:E[_],enumerable:!0})},G=(S,E,_,o)=>{if(E&&typeof E=="object"||typeof E=="function")for(let N of A(E))!T.call(S,N)&&N!==_&&x(S,N,{get:()=>E[N],enumerable:!(o=t(E,N))||o.enumerable});return S};var I=S=>G(x({},"__esModule",{value:!0}),S);var U={};s(U,{APP_NAME:()=>n,CHAIN_CODE_LENGTH:()=>p,CHUNK_SIZE:()=>C,ECDH_SECRET_LENGTH:()=>L,INS:()=>c,LEDGER_CLA:()=>R,MAX_TOKEN_FRAMES:()=>H,P2_NONE:()=>e,SIGNATURE_LENGTH:()=>r,SIGN_PERSONAL_MESSAGE_P1:()=>P,SIGN_TRANSACTION_P1:()=>O});module.exports=I(U);const n="Tron",R=224,c={GET_ADDRESS:2,SIGN_TRANSACTION:4,SIGN_TRANSACTION_HASH:5,GET_APP_CONFIGURATION:6,SIGN_PERSONAL_MESSAGE:8,ECDH_SECRET:10},C=250,e=0,r=65,p=32,L=65,O={SINGLE:16,FIRST:0,SUBSEQUENT:128,LAST:144,TRC10_NAME:160,LAST_TOKEN_FLAG:8},H=2,P={FIRST:0,SUBSEQUENT:128};0&&(module.exports={APP_NAME,CHAIN_CODE_LENGTH,CHUNK_SIZE,ECDH_SECRET_LENGTH,INS,LEDGER_CLA,MAX_TOKEN_FRAMES,P2_NONE,SIGNATURE_LENGTH,SIGN_PERSONAL_MESSAGE_P1,SIGN_TRANSACTION_P1});
2
2
  //# sourceMappingURL=constants.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/internal/app-binder/constants.ts"],
4
- "sourcesContent": ["export const APP_NAME = \"Tron\";\n\n// Tron application APDU class byte.\nexport const LEDGER_CLA = 0xe0;\n\n// Tron application instruction bytes\nexport const INS = {\n GET_ADDRESS: 0x02,\n SIGN_TRANSACTION: 0x04,\n SIGN_TRANSACTION_HASH: 0x05,\n GET_APP_CONFIGURATION: 0x06,\n SIGN_PERSONAL_MESSAGE: 0x08,\n ECDH_SECRET: 0x0a,\n} as const;\n\n// Maximum APDU payload chunk size used by the Tron application.\nexport const CHUNK_SIZE = 250;\n\n// Common P2 value for the Tron application commands.\nexport const P2_NONE = 0x00;\n\n// Length of a Tron signature (r[32] + s[32] + v[1]).\nexport const SIGNATURE_LENGTH = 65;\n\n// Length of a chain code returned by the GetAddress command.\nexport const CHAIN_CODE_LENGTH = 32;\n\n// Length of the ECDH shared point (0x04 || X || Y) returned by ECDH_SECRET.\nexport const ECDH_SECRET_LENGTH = 65;\n\n/**\n * P1 \"start byte\" values for the SIGN_TRANSACTION instruction.\n *\n * The Tron app frames a transaction across several APDUs and encodes the frame\n * position in P1. The multi-frame chunking is orchestrated by\n * `SignTransactionTask`.\n */\nexport const SIGN_TRANSACTION_P1 = {\n // First and only frame (transaction fits in a single APDU).\n SINGLE: 0x10,\n // First frame, more frames to follow.\n FIRST: 0x00,\n // Continuation frame.\n SUBSEQUENT: 0x80,\n // Last continuation frame.\n LAST: 0x90,\n} as const;\n\n/**\n * P1 values for the SIGN_PERSONAL_MESSAGE instruction.\n */\nexport const SIGN_PERSONAL_MESSAGE_P1 = {\n // First frame.\n FIRST: 0x00,\n // Continuation frame.\n SUBSEQUENT: 0x80,\n} as const;\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,cAAAE,EAAA,sBAAAC,EAAA,eAAAC,EAAA,uBAAAC,EAAA,QAAAC,EAAA,eAAAC,EAAA,YAAAC,EAAA,qBAAAC,EAAA,6BAAAC,EAAA,wBAAAC,IAAA,eAAAC,EAAAZ,GAAO,MAAME,EAAW,OAGXK,EAAa,IAGbD,EAAM,CACjB,YAAa,EACb,iBAAkB,EAClB,sBAAuB,EACvB,sBAAuB,EACvB,sBAAuB,EACvB,YAAa,EACf,EAGaF,EAAa,IAGbI,EAAU,EAGVC,EAAmB,GAGnBN,EAAoB,GAGpBE,EAAqB,GASrBM,EAAsB,CAEjC,OAAQ,GAER,MAAO,EAEP,WAAY,IAEZ,KAAM,GACR,EAKaD,EAA2B,CAEtC,MAAO,EAEP,WAAY,GACd",
6
- "names": ["constants_exports", "__export", "APP_NAME", "CHAIN_CODE_LENGTH", "CHUNK_SIZE", "ECDH_SECRET_LENGTH", "INS", "LEDGER_CLA", "P2_NONE", "SIGNATURE_LENGTH", "SIGN_PERSONAL_MESSAGE_P1", "SIGN_TRANSACTION_P1", "__toCommonJS"]
4
+ "sourcesContent": ["export const APP_NAME = \"Tron\";\n\n// Tron application APDU class byte.\nexport const LEDGER_CLA = 0xe0;\n\n// Tron application instruction bytes\nexport const INS = {\n GET_ADDRESS: 0x02,\n SIGN_TRANSACTION: 0x04,\n SIGN_TRANSACTION_HASH: 0x05,\n GET_APP_CONFIGURATION: 0x06,\n SIGN_PERSONAL_MESSAGE: 0x08,\n ECDH_SECRET: 0x0a,\n} as const;\n\n// Maximum APDU payload chunk size used by the Tron application.\nexport const CHUNK_SIZE = 250;\n\n// Common P2 value for the Tron application commands.\nexport const P2_NONE = 0x00;\n\n// Length of a Tron signature (r[32] + s[32] + v[1]).\nexport const SIGNATURE_LENGTH = 65;\n\n// Length of a chain code returned by the GetAddress command.\nexport const CHAIN_CODE_LENGTH = 32;\n\n// Length of the ECDH shared point (0x04 || X || Y) returned by ECDH_SECRET.\nexport const ECDH_SECRET_LENGTH = 65;\n\n/**\n * P1 \"start byte\" values for the SIGN_TRANSACTION instruction.\n *\n * The Tron app frames a transaction across several APDUs and encodes the frame\n * position in P1. The multi-frame chunking is orchestrated by\n * `SignTransactionTask`.\n */\nexport const SIGN_TRANSACTION_P1 = {\n // First and only frame (transaction fits in a single APDU).\n SINGLE: 0x10,\n // First frame, more frames to follow.\n FIRST: 0x00,\n // Continuation frame.\n SUBSEQUENT: 0x80,\n // Last continuation frame.\n LAST: 0x90,\n // TRC10 token-name frame; the frame index is OR-ed into the low 3 bits.\n TRC10_NAME: 0xa0,\n // Marks the final TRC10 token-name frame, on which the device signs.\n LAST_TOKEN_FLAG: 0x08,\n} as const;\n\n// The Tron app rejects a TRC10 token-name frame whose index exceeds 1, so at\n// most two token names can ever be provided for a single transaction.\nexport const MAX_TOKEN_FRAMES = 2;\n\n/**\n * P1 values for the SIGN_PERSONAL_MESSAGE instruction.\n */\nexport const SIGN_PERSONAL_MESSAGE_P1 = {\n // First frame.\n FIRST: 0x00,\n // Continuation frame.\n SUBSEQUENT: 0x80,\n} as const;\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,cAAAE,EAAA,sBAAAC,EAAA,eAAAC,EAAA,uBAAAC,EAAA,QAAAC,EAAA,eAAAC,EAAA,qBAAAC,EAAA,YAAAC,EAAA,qBAAAC,EAAA,6BAAAC,EAAA,wBAAAC,IAAA,eAAAC,EAAAb,GAAO,MAAME,EAAW,OAGXK,EAAa,IAGbD,EAAM,CACjB,YAAa,EACb,iBAAkB,EAClB,sBAAuB,EACvB,sBAAuB,EACvB,sBAAuB,EACvB,YAAa,EACf,EAGaF,EAAa,IAGbK,EAAU,EAGVC,EAAmB,GAGnBP,EAAoB,GAGpBE,EAAqB,GASrBO,EAAsB,CAEjC,OAAQ,GAER,MAAO,EAEP,WAAY,IAEZ,KAAM,IAEN,WAAY,IAEZ,gBAAiB,CACnB,EAIaJ,EAAmB,EAKnBG,EAA2B,CAEtC,MAAO,EAEP,WAAY,GACd",
6
+ "names": ["constants_exports", "__export", "APP_NAME", "CHAIN_CODE_LENGTH", "CHUNK_SIZE", "ECDH_SECRET_LENGTH", "INS", "LEDGER_CLA", "MAX_TOKEN_FRAMES", "P2_NONE", "SIGNATURE_LENGTH", "SIGN_PERSONAL_MESSAGE_P1", "SIGN_TRANSACTION_P1", "__toCommonJS"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ "use strict";var g=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var D=Object.prototype.hasOwnProperty;var f=(o,e)=>{for(var p in e)g(o,p,{get:e[p],enumerable:!0})},v=(o,e,p,u)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of T(e))!D.call(o,r)&&r!==p&&g(o,r,{get:()=>e[r],enumerable:!(u=y(e,r))||u.enumerable});return o};var I=o=>v(g({},"__esModule",{value:!0}),o);var E={};f(E,{SignTransactionDeviceAction:()=>P});module.exports=I(E);var a=require("@ledgerhq/device-management-kit"),l=require("purify-ts"),n=require("xstate"),c=require("../../../../api/app-binder/SignTransactionDeviceActionTypes"),S=require("../../../app-binder/command/GetAppConfigurationCommand"),d=require("../../../app-binder/constants"),A=require("../../../app-binder/task/GetTokenPayloadsTask"),m=require("../../../app-binder/task/ProvideContactTask"),C=require("../../../app-binder/task/SignTransactionTask");class P extends a.XStateDeviceAction{makeStateMachine(e){const{getAppConfig:p,buildContext:u,provideContact:r,signTransaction:i}=this.extractDependencies(e);return(0,n.setup)({types:{input:{},context:{},output:{}},actors:{getAppConfig:(0,n.fromPromise)(p),buildContext:(0,n.fromPromise)(u),provideContact:(0,n.fromPromise)(r),signTransaction:(0,n.fromPromise)(i),openAppStateMachine:new a.OpenAppDeviceAction({input:{appName:d.APP_NAME}}).makeStateMachine(e)},guards:{skipOpenApp:({context:t})=>t.input.skipOpenApp,noInternalError:({context:t})=>t._internalState.error===null},actions:{assignErrorFromEvent:(0,n.assign)({_internalState:t=>({...t.context._internalState,error:new a.UnknownDAError(t.event.error instanceof Error?t.event.error.message:String(t.event.error))})})}}).createMachine({id:"SignTransactionDeviceAction",initial:"InitialState",context:({input:t})=>({input:t,intermediateValue:{requiredUserInteraction:a.UserInteractionRequired.None,step:c.SignTransactionDAStep.OPEN_APP},_internalState:{error:null,appConfig:null,tokenPayloads:null,signature:null}}),states:{InitialState:{always:[{target:"GetAppConfig",guard:"skipOpenApp"},"OpenAppDeviceAction"]},OpenAppDeviceAction:{invoke:{id:"openAppStateMachine",src:"openAppStateMachine",input:{appName:d.APP_NAME},onSnapshot:{actions:(0,n.assign)({intermediateValue:t=>({...t.event.snapshot.context.intermediateValue,step:c.SignTransactionDAStep.OPEN_APP})})},onDone:{target:"CheckOpenAppDeviceActionResult",actions:(0,n.assign)({_internalState:t=>t.event.output.caseOf({Right:()=>t.context._internalState,Left:s=>({...t.context._internalState,error:s})})})}}},CheckOpenAppDeviceActionResult:{always:[{target:"GetAppConfig",guard:"noInternalError"},"Error"]},GetAppConfig:{entry:(0,n.assign)({intermediateValue:{requiredUserInteraction:a.UserInteractionRequired.None,step:c.SignTransactionDAStep.GET_APP_CONFIG}}),invoke:{id:"getAppConfig",src:"getAppConfig",onDone:{target:"BuildContext",actions:(0,n.assign)({_internalState:({event:t,context:s})=>({...s._internalState,appConfig:(0,a.isSuccessCommandResult)(t.output)?t.output.data:null})})},onError:{target:"BuildContext"}}},BuildContext:{entry:(0,n.assign)({intermediateValue:{requiredUserInteraction:a.UserInteractionRequired.None,step:c.SignTransactionDAStep.BUILD_CONTEXT}}),invoke:{id:"buildContext",src:"buildContext",input:({context:t})=>({transaction:t.input.transaction}),onDone:{target:"ProvideContact",actions:(0,n.assign)({_internalState:({event:t,context:s})=>({...s._internalState,tokenPayloads:t.output})})},onError:{target:"ProvideContact",actions:(0,n.assign)({_internalState:({context:t})=>({...t._internalState,tokenPayloads:[]})})}}},ProvideContact:{entry:(0,n.assign)({intermediateValue:{requiredUserInteraction:a.UserInteractionRequired.None,step:c.SignTransactionDAStep.PROVIDE_CONTACT}}),invoke:{id:"provideContact",src:"provideContact",input:({context:t})=>({transaction:t.input.transaction,appConfig:t._internalState.appConfig}),onDone:{target:"SignTransaction"},onError:{target:"SignTransaction"}}},SignTransaction:{entry:(0,n.assign)({intermediateValue:{requiredUserInteraction:a.UserInteractionRequired.SignTransaction,step:c.SignTransactionDAStep.SIGN_TRANSACTION}}),invoke:{id:"signTransaction",src:"signTransaction",input:({context:t})=>({transaction:t.input.transaction,tokenPayloads:t._internalState.tokenPayloads??[]}),onDone:{target:"SignTransactionResultCheck",actions:(0,n.assign)({_internalState:({event:t,context:s})=>(0,a.isSuccessCommandResult)(t.output)?{...s._internalState,signature:t.output.data}:{...s._internalState,error:t.output.error}})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},SignTransactionResultCheck:{always:[{target:"Success",guard:"noInternalError"},{target:"Error"}]},Success:{type:"final"},Error:{type:"final"}},output:({context:t})=>t._internalState.signature?(0,l.Right)(t._internalState.signature):(0,l.Left)(t._internalState.error||new a.UnknownDAError("No error or signature available"))})}extractDependencies(e){const{addressBook:p,contextModule:u,derivationPath:r}=this.input;return{getAppConfig:()=>e.sendCommand(new S.GetAppConfigurationCommand),buildContext:i=>new A.GetTokenPayloadsTask({contextModule:u,transaction:i.input.transaction}).run(),provideContact:i=>new m.ProvideContactTask(e,{addressBook:p,transaction:i.input.transaction,appConfig:i.input.appConfig}).run(),signTransaction:i=>new C.SignTransactionTask(e,{derivationPath:r,transaction:i.input.transaction,tokenPayloads:i.input.tokenPayloads}).run()}}}0&&(module.exports={SignTransactionDeviceAction});
2
+ //# sourceMappingURL=SignTransactionDeviceAction.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/device-action/SignTransaction/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, 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 SignTransactionDAStep,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { GetAppConfigurationCommand } from \"@internal/app-binder/command/GetAppConfigurationCommand\";\nimport { type TronAppErrorCodes } from \"@internal/app-binder/command/utils/tronApplicationErrors\";\nimport { APP_NAME } from \"@internal/app-binder/constants\";\nimport { GetTokenPayloadsTask } from \"@internal/app-binder/task/GetTokenPayloadsTask\";\nimport { ProvideContactTask } from \"@internal/app-binder/task/ProvideContactTask\";\nimport { SignTransactionTask } from \"@internal/app-binder/task/SignTransactionTask\";\n\nexport type MachineDependencies = {\n readonly getAppConfig: () => Promise<\n CommandResult<AppConfiguration, TronAppErrorCodes>\n >;\n readonly buildContext: (arg0: {\n input: { transaction: Uint8Array };\n }) => Promise<Uint8Array[]>;\n readonly provideContact: (arg0: {\n input: { transaction: Uint8Array; appConfig: AppConfiguration | null };\n }) => Promise<void>;\n readonly signTransaction: (arg0: {\n input: { transaction: Uint8Array; tokenPayloads: Uint8Array[] };\n }) => Promise<CommandResult<Signature, TronAppErrorCodes>>;\n};\n\n/**\n * Building the context is a state of its own rather than part of the signing\n * task so that `SignTransaction` is announced only once the device holds the\n * transaction, and not while the descriptor is still being fetched.\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 { getAppConfig, buildContext, provideContact, signTransaction } =\n this.extractDependencies(internalApi);\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n getAppConfig: fromPromise(getAppConfig),\n buildContext: fromPromise(buildContext),\n provideContact: fromPromise(provideContact),\n signTransaction: fromPromise(signTransaction),\n openAppStateMachine: new OpenAppDeviceAction({\n input: { appName: APP_NAME },\n }).makeStateMachine(internalApi),\n },\n guards: {\n skipOpenApp: ({ context }) => context.input.skipOpenApp,\n noInternalError: ({ context }) => context._internalState.error === null,\n },\n actions: {\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: new UnknownDAError(\n _.event[\"error\"] instanceof Error\n ? _.event[\"error\"].message\n : String(_.event[\"error\"]),\n ),\n }),\n }),\n },\n }).createMachine({\n id: \"SignTransactionDeviceAction\",\n initial: \"InitialState\",\n context: ({ input }) => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.OPEN_APP,\n },\n _internalState: {\n error: null,\n appConfig: null,\n tokenPayloads: null,\n signature: null,\n },\n }),\n states: {\n InitialState: {\n always: [\n { target: \"GetAppConfig\", guard: \"skipOpenApp\" },\n \"OpenAppDeviceAction\",\n ],\n },\n OpenAppDeviceAction: {\n invoke: {\n id: \"openAppStateMachine\",\n src: \"openAppStateMachine\",\n input: { appName: APP_NAME },\n onSnapshot: {\n actions: assign({\n intermediateValue: (_) => ({\n ..._.event.snapshot.context.intermediateValue,\n step: SignTransactionDAStep.OPEN_APP,\n }),\n }),\n },\n onDone: {\n target: \"CheckOpenAppDeviceActionResult\",\n actions: assign({\n _internalState: (_) =>\n _.event.output.caseOf<SignTransactionDAInternalState>({\n Right: () => _.context._internalState,\n Left: (error) => ({ ..._.context._internalState, error }),\n }),\n }),\n },\n },\n },\n CheckOpenAppDeviceActionResult: {\n always: [\n { target: \"GetAppConfig\", guard: \"noInternalError\" },\n \"Error\",\n ],\n },\n GetAppConfig: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n }),\n invoke: {\n id: \"getAppConfig\",\n src: \"getAppConfig\",\n onDone: {\n target: \"BuildContext\",\n actions: assign({\n _internalState: ({ event, context }) => ({\n ...context._internalState,\n appConfig: isSuccessCommandResult(event.output)\n ? event.output.data\n : null,\n }),\n }),\n },\n onError: { target: \"BuildContext\" },\n },\n },\n BuildContext: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXT,\n },\n }),\n invoke: {\n id: \"buildContext\",\n src: \"buildContext\",\n input: ({ context }) => ({\n transaction: context.input.transaction,\n }),\n onDone: {\n target: \"ProvideContact\",\n actions: assign({\n _internalState: ({ event, context }) => ({\n ...context._internalState,\n tokenPayloads: event.output,\n }),\n }),\n },\n // The task already folds a failed lookup into an empty set, so a\n // rejection is a host-side fault: review without the token name\n // rather than fail the signature.\n onError: {\n target: \"ProvideContact\",\n actions: assign({\n _internalState: ({ context }) => ({\n ...context._internalState,\n tokenPayloads: [],\n }),\n }),\n },\n },\n },\n ProvideContact: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.PROVIDE_CONTACT,\n },\n }),\n invoke: {\n id: \"provideContact\",\n src: \"provideContact\",\n input: ({ context }) => ({\n transaction: context.input.transaction,\n appConfig: context._internalState.appConfig,\n }),\n onDone: { target: \"SignTransaction\" },\n onError: { target: \"SignTransaction\" },\n },\n },\n SignTransaction: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: SignTransactionDAStep.SIGN_TRANSACTION,\n },\n }),\n invoke: {\n id: \"signTransaction\",\n src: \"signTransaction\",\n input: ({ context }) => ({\n transaction: context.input.transaction,\n tokenPayloads: context._internalState.tokenPayloads ?? [],\n }),\n onDone: {\n target: \"SignTransactionResultCheck\",\n actions: assign({\n _internalState: ({ event, context }) =>\n isSuccessCommandResult(event.output)\n ? {\n ...context._internalState,\n signature: event.output.data,\n }\n : { ...context._internalState, error: event.output.error },\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n SignTransactionResultCheck: {\n always: [\n { target: \"Success\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n Success: { type: \"final\" },\n Error: { type: \"final\" },\n },\n output: ({ context }) =>\n context._internalState.signature\n ? Right(context._internalState.signature)\n : Left(\n context._internalState.error ||\n new UnknownDAError(\"No error or signature available\"),\n ),\n });\n }\n\n extractDependencies(internalApi: InternalApi): MachineDependencies {\n const { addressBook, contextModule, derivationPath } = this.input;\n\n return {\n getAppConfig: () =>\n internalApi.sendCommand(new GetAppConfigurationCommand()),\n buildContext: (arg0: { input: { transaction: Uint8Array } }) =>\n new GetTokenPayloadsTask({\n contextModule,\n transaction: arg0.input.transaction,\n }).run(),\n provideContact: (arg0: {\n input: {\n transaction: Uint8Array;\n appConfig: AppConfiguration | null;\n };\n }) =>\n new ProvideContactTask(internalApi, {\n addressBook,\n transaction: arg0.input.transaction,\n appConfig: arg0.input.appConfig,\n }).run(),\n signTransaction: (arg0: {\n input: { transaction: Uint8Array; tokenPayloads: Uint8Array[] };\n }) =>\n new SignTransactionTask(internalApi, {\n derivationPath,\n transaction: arg0.input.transaction,\n tokenPayloads: arg0.input.tokenPayloads,\n }).run(),\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_SignTransactionDeviceActionTypes", "import_GetAppConfigurationCommand", "import_constants", "import_GetTokenPayloadsTask", "import_ProvideContactTask", "import_SignTransactionTask", "internalApi", "getAppConfig", "buildContext", "provideContact", "signTransaction", "context", "_", "input", "error", "event", "addressBook", "contextModule", "derivationPath", "arg0"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var e=require("@ledgerhq/device-management-kit"),t=require("../../../../api/app-binder/SignTransactionDeviceActionTypes"),N=require("../../../../api/model/TronAddressBook"),T=require("../../../app-binder/device-action/__test-utils__/makeInternalApi"),o=require("../../../app-binder/device-action/__test-utils__/testDeviceActionStates"),I=require("./SignTransactionDeviceAction");const A="44'/195'/0'/0/0",d=new Uint8Array([10,1,0]),g=new Uint8Array([170,187,204]),u=new Uint8Array([171,205]),C={version:"0.8.0",versionN:800,allowData:!0,allowContract:!0,truncateAddress:!1,signByHash:!1};describe("SignTransactionDeviceAction",()=>{const r=(0,T.makeDeviceActionInternalApiMock)(),l=vi.fn(),m=vi.fn(),a=vi.fn(),s=vi.fn(),c=()=>{const n=new I.SignTransactionDeviceAction({input:{derivationPath:A,transaction:d,contextModule:{},addressBook:N.EMPTY_TRON_ADDRESS_BOOK,skipOpenApp:!0}});return vi.spyOn(n,"extractDependencies").mockReturnValue({getAppConfig:l,buildContext:m,provideContact:a,signTransaction:s}),n};beforeEach(()=>{vi.clearAllMocks(),l.mockResolvedValue((0,e.CommandResultFactory)({data:C})),m.mockResolvedValue([g]),a.mockResolvedValue(void 0),s.mockResolvedValue((0,e.CommandResultFactory)({data:u}))}),it("builds the context before announcing the review, then signs",()=>new Promise((n,i)=>{const p=c();(0,o.testDeviceActionStates)(p,[{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:t.SignTransactionDAStep.GET_APP_CONFIG}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:t.SignTransactionDAStep.BUILD_CONTEXT}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:t.SignTransactionDAStep.PROVIDE_CONTACT}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction,step:t.SignTransactionDAStep.SIGN_TRANSACTION}},{status:e.DeviceActionStatus.Completed,output:u}],r,{onDone:()=>{expect(a).toHaveBeenCalledWith(expect.objectContaining({input:{transaction:d,appConfig:C}})),expect(s).toHaveBeenCalledWith(expect.objectContaining({input:{transaction:d,tokenPayloads:[g]}})),n()},onError:i})})),it("signs when app configuration cannot be read",()=>new Promise((n,i)=>{l.mockRejectedValue(new Error("unsupported")),(0,o.testDeviceActionStates)(c(),[{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:t.SignTransactionDAStep.GET_APP_CONFIG}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:t.SignTransactionDAStep.BUILD_CONTEXT}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:t.SignTransactionDAStep.PROVIDE_CONTACT}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction,step:t.SignTransactionDAStep.SIGN_TRANSACTION}},{status:e.DeviceActionStatus.Completed,output:u}],r,{onDone:()=>{expect(a).toHaveBeenCalledWith(expect.objectContaining({input:{transaction:d,appConfig:null}})),n()},onError:i})})),it("signs when contact provisioning throws",()=>new Promise((n,i)=>{a.mockRejectedValue(new Error("rejected")),(0,o.testDeviceActionStates)(c(),[{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:t.SignTransactionDAStep.GET_APP_CONFIG}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:t.SignTransactionDAStep.BUILD_CONTEXT}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:t.SignTransactionDAStep.PROVIDE_CONTACT}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction,step:t.SignTransactionDAStep.SIGN_TRANSACTION}},{status:e.DeviceActionStatus.Completed,output:u}],r,{onDone:n,onError:i})})),it("signs without a token name when building the context throws",()=>new Promise((n,i)=>{m.mockRejectedValue(new Error("boom")),(0,o.testDeviceActionStates)(c(),[{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:t.SignTransactionDAStep.GET_APP_CONFIG}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:t.SignTransactionDAStep.BUILD_CONTEXT}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:t.SignTransactionDAStep.PROVIDE_CONTACT}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction,step:t.SignTransactionDAStep.SIGN_TRANSACTION}},{status:e.DeviceActionStatus.Completed,output:u}],r,{onDone:()=>{expect(s).toHaveBeenCalledWith(expect.objectContaining({input:{transaction:d,tokenPayloads:[]}})),n()},onError:i})})),it("reports the device error when signing fails",()=>new Promise((n,i)=>{const p=new e.UnknownDAError("rejected");s.mockResolvedValue((0,e.CommandResultFactory)({error:p})),(0,o.testDeviceActionStates)(c(),[{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:t.SignTransactionDAStep.GET_APP_CONFIG}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:t.SignTransactionDAStep.BUILD_CONTEXT}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:t.SignTransactionDAStep.PROVIDE_CONTACT}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction,step:t.SignTransactionDAStep.SIGN_TRANSACTION}},{status:e.DeviceActionStatus.Error,error:p}],r,{onDone:n,onError:i})}))});
2
+ //# sourceMappingURL=SignTransactionDeviceAction.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.ts"],
4
+ "sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n DeviceActionStatus,\n UnknownDAError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { SignTransactionDAStep } from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { EMPTY_TRON_ADDRESS_BOOK } from \"@api/model/TronAddressBook\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\n\nimport { SignTransactionDeviceAction } from \"./SignTransactionDeviceAction\";\n\nconst DERIVATION_PATH = \"44'/195'/0'/0/0\";\nconst TRANSACTION = new Uint8Array([0x0a, 0x01, 0x00]);\nconst TOKEN_PAYLOAD = new Uint8Array([0xaa, 0xbb, 0xcc]);\nconst SIGNATURE = new Uint8Array([0xab, 0xcd]);\nconst APP_CONFIG: AppConfiguration = {\n version: \"0.8.0\",\n versionN: 800,\n allowData: true,\n allowContract: true,\n truncateAddress: false,\n signByHash: false,\n};\n\ndescribe(\"SignTransactionDeviceAction\", () => {\n const apiMock = makeDeviceActionInternalApiMock();\n const getAppConfigMock = vi.fn();\n const buildContextMock = vi.fn();\n const provideContactMock = vi.fn();\n const signTransactionMock = vi.fn();\n\n const makeDeviceAction = () => {\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: DERIVATION_PATH,\n transaction: TRANSACTION,\n contextModule: {} as ContextModule,\n addressBook: EMPTY_TRON_ADDRESS_BOOK,\n skipOpenApp: true,\n },\n });\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue({\n getAppConfig: getAppConfigMock,\n buildContext: buildContextMock,\n provideContact: provideContactMock,\n signTransaction: signTransactionMock,\n });\n return deviceAction;\n };\n\n beforeEach(() => {\n vi.clearAllMocks();\n getAppConfigMock.mockResolvedValue(\n CommandResultFactory({ data: APP_CONFIG }),\n );\n buildContextMock.mockResolvedValue([TOKEN_PAYLOAD]);\n provideContactMock.mockResolvedValue(undefined);\n signTransactionMock.mockResolvedValue(\n CommandResultFactory({ data: SIGNATURE }),\n );\n });\n\n it(\"builds the context before announcing the review, then signs\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN a transaction whose token name resolves\n const deviceAction = makeDeviceAction();\n\n // WHEN\n testDeviceActionStates(\n deviceAction,\n [\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n },\n // THEN the review is announced only after the context is fetched\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXT,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.PROVIDE_CONTACT,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: SignTransactionDAStep.SIGN_TRANSACTION,\n },\n },\n { status: DeviceActionStatus.Completed, output: SIGNATURE },\n ],\n apiMock,\n {\n onDone: () => {\n expect(provideContactMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n transaction: TRANSACTION,\n appConfig: APP_CONFIG,\n },\n }),\n );\n expect(signTransactionMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n transaction: TRANSACTION,\n tokenPayloads: [TOKEN_PAYLOAD],\n },\n }),\n );\n resolve();\n },\n onError: reject,\n },\n );\n }));\n\n it(\"signs when app configuration cannot be read\", () =>\n new Promise<void>((resolve, reject) => {\n getAppConfigMock.mockRejectedValue(new Error(\"unsupported\"));\n\n testDeviceActionStates(\n makeDeviceAction(),\n [\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXT,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.PROVIDE_CONTACT,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: SignTransactionDAStep.SIGN_TRANSACTION,\n },\n },\n { status: DeviceActionStatus.Completed, output: SIGNATURE },\n ],\n apiMock,\n {\n onDone: () => {\n expect(provideContactMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: { transaction: TRANSACTION, appConfig: null },\n }),\n );\n resolve();\n },\n onError: reject,\n },\n );\n }));\n\n it(\"signs when contact provisioning throws\", () =>\n new Promise<void>((resolve, reject) => {\n provideContactMock.mockRejectedValue(new Error(\"rejected\"));\n\n testDeviceActionStates(\n makeDeviceAction(),\n [\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXT,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.PROVIDE_CONTACT,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: SignTransactionDAStep.SIGN_TRANSACTION,\n },\n },\n { status: DeviceActionStatus.Completed, output: SIGNATURE },\n ],\n apiMock,\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"signs without a token name when building the context throws\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN a host-side failure while resolving the token name\n buildContextMock.mockRejectedValue(new Error(\"boom\"));\n\n // WHEN\n testDeviceActionStates(\n makeDeviceAction(),\n [\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXT,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.PROVIDE_CONTACT,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: SignTransactionDAStep.SIGN_TRANSACTION,\n },\n },\n { status: DeviceActionStatus.Completed, output: SIGNATURE },\n ],\n apiMock,\n {\n // THEN the transaction is still signed, without a token name\n onDone: () => {\n expect(signTransactionMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: { transaction: TRANSACTION, tokenPayloads: [] },\n }),\n );\n resolve();\n },\n onError: reject,\n },\n );\n }));\n\n it(\"reports the device error when signing fails\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN the device refuses the transaction\n const error = new UnknownDAError(\"rejected\");\n signTransactionMock.mockResolvedValue(\n CommandResultFactory({ error: error as never }),\n );\n\n // WHEN\n testDeviceActionStates(\n makeDeviceAction(),\n [\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXT,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.PROVIDE_CONTACT,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: SignTransactionDAStep.SIGN_TRANSACTION,\n },\n },\n { status: DeviceActionStatus.Error, error },\n ],\n apiMock,\n { onDone: resolve, onError: reject },\n );\n }));\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_device_management_kit", "import_SignTransactionDeviceActionTypes", "import_TronAddressBook", "import_makeInternalApi", "import_testDeviceActionStates", "import_SignTransactionDeviceAction", "DERIVATION_PATH", "TRANSACTION", "TOKEN_PAYLOAD", "SIGNATURE", "APP_CONFIG", "apiMock", "getAppConfigMock", "buildContextMock", "provideContactMock", "signTransactionMock", "makeDeviceAction", "deviceAction", "resolve", "reject", "error"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var r=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var c=(n,e)=>{for(var t in e)r(n,t,{get:e[t],enumerable:!0})},s=(n,e,t,v)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of f(e))!a.call(n,i)&&i!==t&&r(n,i,{get:()=>e[i],enumerable:!(v=o(e,i))||v.enumerable});return n};var d=n=>s(r({},"__esModule",{value:!0}),n);var p={};c(p,{makeDeviceActionInternalApiMock:()=>g});module.exports=d(p);function g(){return{sendApdu:vi.fn(),sendCommand:vi.fn().mockResolvedValue(void 0),getDeviceModel:vi.fn(),getDeviceSessionState:vi.fn(),getDeviceSessionStateObservable:vi.fn(),setDeviceSessionState:vi.fn(),getManagerApiService:vi.fn(),getSecureChannelService:vi.fn(),loggerFactory:vi.fn(n=>({debug:vi.fn(),info:vi.fn(),warn:vi.fn(),error:vi.fn(),subscribers:[]}))}}0&&(module.exports={makeDeviceActionInternalApiMock});
2
+ //# sourceMappingURL=makeInternalApi.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/device-action/__test-utils__/makeInternalApi.ts"],
4
+ "sourcesContent": ["import { type InternalApi } from \"@ledgerhq/device-management-kit\";\nimport { type Mocked } from \"vitest\";\n\nexport function makeDeviceActionInternalApiMock(): Mocked<InternalApi> {\n return {\n sendApdu: vi.fn(),\n sendCommand: vi.fn().mockResolvedValue(undefined),\n getDeviceModel: vi.fn(),\n getDeviceSessionState: vi.fn(),\n getDeviceSessionStateObservable: vi.fn(),\n setDeviceSessionState: vi.fn(),\n getManagerApiService: vi.fn(),\n getSecureChannelService: vi.fn(),\n loggerFactory: vi.fn((_tag: string) => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n })),\n };\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qCAAAE,IAAA,eAAAC,EAAAH,GAGO,SAASE,GAAuD,CACrE,MAAO,CACL,SAAU,GAAG,GAAG,EAChB,YAAa,GAAG,GAAG,EAAE,kBAAkB,MAAS,EAChD,eAAgB,GAAG,GAAG,EACtB,sBAAuB,GAAG,GAAG,EAC7B,gCAAiC,GAAG,GAAG,EACvC,sBAAuB,GAAG,GAAG,EAC7B,qBAAsB,GAAG,GAAG,EAC5B,wBAAyB,GAAG,GAAG,EAC/B,cAAe,GAAG,GAAIE,IAAkB,CACtC,MAAO,GAAG,GAAG,EACb,KAAM,GAAG,GAAG,EACZ,KAAM,GAAG,GAAG,EACZ,MAAO,GAAG,GAAG,EACb,YAAa,CAAC,CAChB,EAAE,CACJ,CACF",
6
+ "names": ["makeInternalApi_exports", "__export", "makeDeviceActionInternalApiMock", "__toCommonJS", "_tag"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var c=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var A=(t,e)=>{for(var o in e)c(t,o,{get:e[o],enumerable:!0})},d=(t,e,o,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of l(e))!v.call(t,r)&&r!==o&&c(t,r,{get:()=>e[r],enumerable:!(i=s(e,r))||i.enumerable});return t};var m=t=>d(c({},"__esModule",{value:!0}),t);var I={};A(I,{testDeviceActionStates:()=>D});module.exports=m(I);function D(t,e,o,{onDone:i,onError:r}){const a=[],{observable:u,cancel:p}=t._execute(o);return u.subscribe({next:n=>{a.push(n)},error:n=>{r(n)},complete:()=>{try{expect(a).toEqual(e),i()}catch(n){r(n)}}}),{observable:u,cancel:p}}0&&(module.exports={testDeviceActionStates});
2
+ //# sourceMappingURL=testDeviceActionStates.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.ts"],
4
+ "sourcesContent": ["import {\n type DeviceAction,\n type DeviceActionIntermediateValue,\n type DeviceActionState,\n type DmkError,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\n\n/**\n * Test that the states emitted by a device action match the expected states.\n * @param deviceAction The device action to test.\n * @param expectedStates The expected states.\n * @param callbacks { onDone, onError } The callbacks to call when the test is done or an error occurs.\n */\nexport function testDeviceActionStates<\n Output,\n Input,\n Error extends DmkError,\n IntermediateValue extends DeviceActionIntermediateValue,\n>(\n deviceAction: DeviceAction<Output, Input, Error, IntermediateValue>,\n expectedStates: Array<DeviceActionState<Output, Error, IntermediateValue>>,\n internalApi: InternalApi,\n {\n onDone,\n onError,\n }: {\n onDone: () => void;\n onError: (error: Error) => void;\n },\n) {\n const observedStates: Array<\n DeviceActionState<Output, Error, IntermediateValue>\n > = [];\n\n const { observable, cancel } = deviceAction._execute(internalApi);\n observable.subscribe({\n next: (state) => {\n observedStates.push(state);\n },\n error: (error) => {\n onError(error);\n },\n complete: () => {\n try {\n expect(observedStates).toEqual(expectedStates);\n onDone();\n } catch (e) {\n onError(e as Error);\n }\n },\n });\n return { observable, cancel };\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,4BAAAE,IAAA,eAAAC,EAAAH,GAcO,SAASE,EAMdE,EACAC,EACAC,EACA,CACE,OAAAC,EACA,QAAAC,CACF,EAIA,CACA,MAAMC,EAEF,CAAC,EAEC,CAAE,WAAAC,EAAY,OAAAC,CAAO,EAAIP,EAAa,SAASE,CAAW,EAChE,OAAAI,EAAW,UAAU,CACnB,KAAOE,GAAU,CACfH,EAAe,KAAKG,CAAK,CAC3B,EACA,MAAQC,GAAU,CAChBL,EAAQK,CAAK,CACf,EACA,SAAU,IAAM,CACd,GAAI,CACF,OAAOJ,CAAc,EAAE,QAAQJ,CAAc,EAC7CE,EAAO,CACT,OAASO,EAAG,CACVN,EAAQM,CAAU,CACpB,CACF,CACF,CAAC,EACM,CAAE,WAAAJ,EAAY,OAAAC,CAAO,CAC9B",
6
+ "names": ["testDeviceActionStates_exports", "__export", "testDeviceActionStates", "__toCommonJS", "deviceAction", "expectedStates", "internalApi", "onDone", "onError", "observedStates", "observable", "cancel", "state", "error", "e"]
7
+ }
@@ -1,2 +1,2 @@
1
- "use strict";var y=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var A=(n,t)=>{for(var r in t)y(n,r,{get:t[r],enumerable:!0})},U=(n,t,r,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of p(t))!c.call(n,e)&&e!==r&&y(n,e,{get:()=>t[e],enumerable:!(a=u(t,e))||a.enumerable});return n};var m=n=>U(y({},"__esModule",{value:!0}),n);var f={};A(f,{serializeTransaction:()=>T});module.exports=m(f);var h=require("../../app-binder/command/utils/protobuf"),i=require("../../app-binder/constants");function g(n,t){const r=new Uint8Array(n.length+t.length);return r.set(n,0),r.set(t,n.length),r}function T(n,t){const r=[];let a=n,e=t;for(;e.length>0;){const o=(0,h.getNextLength)(e);if(o>i.CHUNK_SIZE)throw new Error("Too many bytes to encode.");if(a.length+o>i.CHUNK_SIZE){r.push(a),a=new Uint8Array(0);continue}a=g(a,e.subarray(0,o)),e=e.subarray(o)}r.push(a);const s=[];if(r.length===1)s.push(i.SIGN_TRANSACTION_P1.SINGLE);else{s.push(i.SIGN_TRANSACTION_P1.FIRST);for(let o=1;o<r.length-1;o+=1)s.push(i.SIGN_TRANSACTION_P1.SUBSEQUENT);s.push(i.SIGN_TRANSACTION_P1.LAST)}return r.map((o,l)=>({p1:s[l],payload:o}))}0&&(module.exports={serializeTransaction});
1
+ "use strict";var l=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var g=(r,t)=>{for(var n in t)l(r,n,{get:t[n],enumerable:!0})},U=(r,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of T(t))!c.call(r,e)&&e!==n&&l(r,e,{get:()=>t[e],enumerable:!(o=p(t,e))||o.enumerable});return r};var m=r=>U(l({},"__esModule",{value:!0}),r);var S={};g(S,{serializeTransaction:()=>N});module.exports=m(S);var y=require("../../app-binder/command/utils/protobuf"),i=require("../../app-binder/constants");function f(r,t){const n=new Uint8Array(r.length+t.length);return n.set(r,0),n.set(t,r.length),n}function N(r,t,n=[]){const o=[];let e=r,s=t;for(;s.length>0;){const a=(0,y.getNextLength)(s);if(a>i.CHUNK_SIZE)throw new Error("Too many bytes to encode.");if(e.length+a>i.CHUNK_SIZE){o.push(e),e=new Uint8Array(0);continue}e=f(e,s.subarray(0,a)),s=s.subarray(a)}o.push(e);const u=o.length;o.push(...n);const h=[];if(o.length===1)h.push(i.SIGN_TRANSACTION_P1.SINGLE);else{h.push(i.SIGN_TRANSACTION_P1.FIRST);for(let a=1;a<o.length-1;a+=1)h.push(a<u?i.SIGN_TRANSACTION_P1.SUBSEQUENT:i.SIGN_TRANSACTION_P1.TRC10_NAME|a-u);h.push(n.length>0?i.SIGN_TRANSACTION_P1.TRC10_NAME|i.SIGN_TRANSACTION_P1.LAST_TOKEN_FLAG|n.length-1:i.SIGN_TRANSACTION_P1.LAST)}return o.map((a,A)=>({p1:h[A],payload:a}))}0&&(module.exports={serializeTransaction});
2
2
  //# sourceMappingURL=TransactionSerializer.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/services/TransactionSerializer.ts"],
4
- "sourcesContent": ["import { getNextLength } from \"@internal/app-binder/command/utils/protobuf\";\nimport {\n CHUNK_SIZE,\n SIGN_TRANSACTION_P1,\n} from \"@internal/app-binder/constants\";\n\nexport type TransactionFrame = {\n readonly p1: number;\n readonly payload: Uint8Array;\n};\n\nfunction concat(a: Uint8Array, b: Uint8Array): Uint8Array {\n const out = new Uint8Array(a.length + b.length);\n out.set(a, 0);\n out.set(b, a.length);\n return out;\n}\n\n/**\n * Frame a raw (already protobuf-serialized) Tron transaction into the ordered\n * list of APDU frames expected by the Tron app's SIGN_TRANSACTION instruction.\n *\n * The framing rules:\n * - the first frame starts with the encoded derivation path, then transaction\n * fields are packed onto frames without ever splitting a protobuf field,\n * - each frame's P1 \"start byte\" encodes its position.\n *\n * @param encodedPath the derivation path bytes (length byte + BE32 elements)\n * @param rawTransaction the protobuf-serialized `raw_data` bytes\n * @throws if a single protobuf field is larger than {@link CHUNK_SIZE}\n */\nexport function serializeTransaction(\n encodedPath: Uint8Array,\n rawTransaction: Uint8Array,\n): TransactionFrame[] {\n const frames: Uint8Array[] = [];\n\n // The first frame carries the derivation path header; overflow frames carry\n // transaction bytes only.\n let data = encodedPath;\n let rawTx = rawTransaction;\n\n while (rawTx.length > 0) {\n const nextLength = getNextLength(rawTx);\n if (nextLength > CHUNK_SIZE) {\n throw new Error(\"Too many bytes to encode.\");\n }\n\n if (data.length + nextLength > CHUNK_SIZE) {\n frames.push(data);\n data = new Uint8Array(0);\n continue;\n }\n\n data = concat(data, rawTx.subarray(0, nextLength));\n rawTx = rawTx.subarray(nextLength);\n }\n frames.push(data);\n\n const startBytes: number[] = [];\n if (frames.length === 1) {\n startBytes.push(SIGN_TRANSACTION_P1.SINGLE);\n } else {\n startBytes.push(SIGN_TRANSACTION_P1.FIRST);\n\n for (let i = 1; i < frames.length - 1; i += 1) {\n startBytes.push(SIGN_TRANSACTION_P1.SUBSEQUENT);\n }\n\n startBytes.push(SIGN_TRANSACTION_P1.LAST);\n }\n\n return frames.map((payload, i) => ({ p1: startBytes[i]!, payload }));\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,0BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAA8B,uDAC9BC,EAGO,0CAOP,SAASC,EAAOC,EAAeC,EAA2B,CACxD,MAAMC,EAAM,IAAI,WAAWF,EAAE,OAASC,EAAE,MAAM,EAC9C,OAAAC,EAAI,IAAIF,EAAG,CAAC,EACZE,EAAI,IAAID,EAAGD,EAAE,MAAM,EACZE,CACT,CAeO,SAASP,EACdQ,EACAC,EACoB,CACpB,MAAMC,EAAuB,CAAC,EAI9B,IAAIC,EAAOH,EACPI,EAAQH,EAEZ,KAAOG,EAAM,OAAS,GAAG,CACvB,MAAMC,KAAa,iBAAcD,CAAK,EACtC,GAAIC,EAAa,aACf,MAAM,IAAI,MAAM,2BAA2B,EAG7C,GAAIF,EAAK,OAASE,EAAa,aAAY,CACzCH,EAAO,KAAKC,CAAI,EAChBA,EAAO,IAAI,WAAW,CAAC,EACvB,QACF,CAEAA,EAAOP,EAAOO,EAAMC,EAAM,SAAS,EAAGC,CAAU,CAAC,EACjDD,EAAQA,EAAM,SAASC,CAAU,CACnC,CACAH,EAAO,KAAKC,CAAI,EAEhB,MAAMG,EAAuB,CAAC,EAC9B,GAAIJ,EAAO,SAAW,EACpBI,EAAW,KAAK,sBAAoB,MAAM,MACrC,CACLA,EAAW,KAAK,sBAAoB,KAAK,EAEzC,QAASC,EAAI,EAAGA,EAAIL,EAAO,OAAS,EAAGK,GAAK,EAC1CD,EAAW,KAAK,sBAAoB,UAAU,EAGhDA,EAAW,KAAK,sBAAoB,IAAI,CAC1C,CAEA,OAAOJ,EAAO,IAAI,CAACM,EAASD,KAAO,CAAE,GAAID,EAAWC,CAAC,EAAI,QAAAC,CAAQ,EAAE,CACrE",
6
- "names": ["TransactionSerializer_exports", "__export", "serializeTransaction", "__toCommonJS", "import_protobuf", "import_constants", "concat", "a", "b", "out", "encodedPath", "rawTransaction", "frames", "data", "rawTx", "nextLength", "startBytes", "i", "payload"]
4
+ "sourcesContent": ["import { getNextLength } from \"@internal/app-binder/command/utils/protobuf\";\nimport {\n CHUNK_SIZE,\n SIGN_TRANSACTION_P1,\n} from \"@internal/app-binder/constants\";\n\nexport type TransactionFrame = {\n readonly p1: number;\n readonly payload: Uint8Array;\n};\n\nfunction concat(a: Uint8Array, b: Uint8Array): Uint8Array {\n const out = new Uint8Array(a.length + b.length);\n out.set(a, 0);\n out.set(b, a.length);\n return out;\n}\n\n/**\n * Frame a raw (already protobuf-serialized) Tron transaction into the ordered\n * list of APDU frames expected by the Tron app's SIGN_TRANSACTION instruction.\n *\n * The framing rules:\n * - the first frame starts with the encoded derivation path, then transaction\n * fields are packed onto frames without ever splitting a protobuf field,\n * - TRC10 token-name frames, when present, are appended after the transaction\n * frames and the device only signs on the last of them,\n * - each frame's P1 \"start byte\" encodes its position.\n *\n * @param encodedPath the derivation path bytes (length byte + BE32 elements)\n * @param rawTransaction the protobuf-serialized `raw_data` bytes\n * @param tokenPayloads the TRC10 token-name descriptors to provide, if any\n * @throws if a single protobuf field is larger than {@link CHUNK_SIZE}\n */\nexport function serializeTransaction(\n encodedPath: Uint8Array,\n rawTransaction: Uint8Array,\n tokenPayloads: Uint8Array[] = [],\n): TransactionFrame[] {\n const frames: Uint8Array[] = [];\n\n // The first frame carries the derivation path header; overflow frames carry\n // transaction bytes only.\n let data = encodedPath;\n let rawTx = rawTransaction;\n\n while (rawTx.length > 0) {\n const nextLength = getNextLength(rawTx);\n if (nextLength > CHUNK_SIZE) {\n throw new Error(\"Too many bytes to encode.\");\n }\n\n if (data.length + nextLength > CHUNK_SIZE) {\n frames.push(data);\n data = new Uint8Array(0);\n continue;\n }\n\n data = concat(data, rawTx.subarray(0, nextLength));\n rawTx = rawTx.subarray(nextLength);\n }\n frames.push(data);\n\n // Token frames shift the P1 sequence of the transaction frames too: the last\n // transaction frame is no longer the one the device signs on, so it drops\n // from LAST back to SUBSEQUENT, and a lone transaction frame drops from\n // SINGLE to FIRST.\n const firstTokenIndex = frames.length;\n frames.push(...tokenPayloads);\n\n const startBytes: number[] = [];\n if (frames.length === 1) {\n startBytes.push(SIGN_TRANSACTION_P1.SINGLE);\n } else {\n startBytes.push(SIGN_TRANSACTION_P1.FIRST);\n\n for (let i = 1; i < frames.length - 1; i += 1) {\n startBytes.push(\n i < firstTokenIndex\n ? SIGN_TRANSACTION_P1.SUBSEQUENT\n : SIGN_TRANSACTION_P1.TRC10_NAME | (i - firstTokenIndex),\n );\n }\n\n startBytes.push(\n tokenPayloads.length > 0\n ? SIGN_TRANSACTION_P1.TRC10_NAME |\n SIGN_TRANSACTION_P1.LAST_TOKEN_FLAG |\n (tokenPayloads.length - 1)\n : SIGN_TRANSACTION_P1.LAST,\n );\n }\n\n return frames.map((payload, i) => ({ p1: startBytes[i]!, payload }));\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,0BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAA8B,uDAC9BC,EAGO,0CAOP,SAASC,EAAOC,EAAeC,EAA2B,CACxD,MAAMC,EAAM,IAAI,WAAWF,EAAE,OAASC,EAAE,MAAM,EAC9C,OAAAC,EAAI,IAAIF,EAAG,CAAC,EACZE,EAAI,IAAID,EAAGD,EAAE,MAAM,EACZE,CACT,CAkBO,SAASP,EACdQ,EACAC,EACAC,EAA8B,CAAC,EACX,CACpB,MAAMC,EAAuB,CAAC,EAI9B,IAAIC,EAAOJ,EACPK,EAAQJ,EAEZ,KAAOI,EAAM,OAAS,GAAG,CACvB,MAAMC,KAAa,iBAAcD,CAAK,EACtC,GAAIC,EAAa,aACf,MAAM,IAAI,MAAM,2BAA2B,EAG7C,GAAIF,EAAK,OAASE,EAAa,aAAY,CACzCH,EAAO,KAAKC,CAAI,EAChBA,EAAO,IAAI,WAAW,CAAC,EACvB,QACF,CAEAA,EAAOR,EAAOQ,EAAMC,EAAM,SAAS,EAAGC,CAAU,CAAC,EACjDD,EAAQA,EAAM,SAASC,CAAU,CACnC,CACAH,EAAO,KAAKC,CAAI,EAMhB,MAAMG,EAAkBJ,EAAO,OAC/BA,EAAO,KAAK,GAAGD,CAAa,EAE5B,MAAMM,EAAuB,CAAC,EAC9B,GAAIL,EAAO,SAAW,EACpBK,EAAW,KAAK,sBAAoB,MAAM,MACrC,CACLA,EAAW,KAAK,sBAAoB,KAAK,EAEzC,QAASC,EAAI,EAAGA,EAAIN,EAAO,OAAS,EAAGM,GAAK,EAC1CD,EAAW,KACTC,EAAIF,EACA,sBAAoB,WACpB,sBAAoB,WAAcE,EAAIF,CAC5C,EAGFC,EAAW,KACTN,EAAc,OAAS,EACnB,sBAAoB,WAClB,sBAAoB,gBACnBA,EAAc,OAAS,EAC1B,sBAAoB,IAC1B,CACF,CAEA,OAAOC,EAAO,IAAI,CAACO,EAASD,KAAO,CAAE,GAAID,EAAWC,CAAC,EAAI,QAAAC,CAAQ,EAAE,CACrE",
6
+ "names": ["TransactionSerializer_exports", "__export", "serializeTransaction", "__toCommonJS", "import_protobuf", "import_constants", "concat", "a", "b", "out", "encodedPath", "rawTransaction", "tokenPayloads", "frames", "data", "rawTx", "nextLength", "firstTokenIndex", "startBytes", "i", "payload"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var o=require("../../app-binder/command/utils/encodeDerivationPath"),n=require("./TransactionSerializer");const r="44'/195'/0'/0/0",f="058000002c800000c3800000000000000000000000",s=a=>Array.from(a,e=>e.toString(16).padStart(2,"0")).join(""),c=a=>Uint8Array.from(a.match(/.{1,2}/g).map(e=>parseInt(e,16)));describe("serializeTransaction",()=>{it("frames a small transaction into a single frame (golden vector from hw-app-trx)",()=>{const a="0a023dce220895da42177db0050740d8e0a5feed2d522c43727970746f436861696e2d54726f6e5352204c6564676572205472616e73616374696f6e732054657374735a68080112640a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412330a1541c8599111f29c1e1e061265b4af93ea1f274ad78a121541c8599111f29c1e1e061265b4af93ea1f274ad78a1880c2d72f709d94a2feed2d",e=(0,n.serializeTransaction)((0,o.encodeDerivationPath)(r),c(a));expect(e).toHaveLength(1),expect(e[0].p1).toBe(16),expect(s(e[0].payload)).toBe(f+a)}),it("splits a large transaction on protobuf field boundaries without splitting a field",()=>{const a="0801".repeat(200),e=(0,n.serializeTransaction)((0,o.encodeDerivationPath)(r),c(a));expect(e.map(t=>t.p1)).toEqual([0,144]),e.forEach(t=>expect(t.payload.length).toBeLessThanOrEqual(250));const i=s(e[0].payload).slice(f.length);expect(i+s(e[1].payload)).toBe(a),expect(e[1].payload.length%2).toBe(0)}),it("marks intermediate frames as subsequent on transactions spanning many frames",()=>{const a="0801".repeat(400),e=(0,n.serializeTransaction)((0,o.encodeDerivationPath)(r),c(a));expect(e.map(t=>t.p1)).toEqual([0,128,128,144]),e.forEach(t=>expect(t.payload.length).toBeLessThanOrEqual(250));const i=e.map(t=>s(t.payload)).join("").slice(f.length);expect(i).toBe(a)}),it("throws when a single protobuf field exceeds the chunk size",()=>{const a="0afb01"+"00".repeat(251);expect(()=>(0,n.serializeTransaction)((0,o.encodeDerivationPath)(r),c(a))).toThrow("Too many bytes to encode.")})});
1
+ "use strict";var s=require("../../app-binder/command/utils/encodeDerivationPath"),r=require("./TransactionSerializer");const c="44'/195'/0'/0/0",i="058000002c800000c3800000000000000000000000",p=e=>Array.from(e,a=>a.toString(16).padStart(2,"0")).join(""),n=e=>Uint8Array.from(e.match(/.{1,2}/g).map(a=>parseInt(a,16)));describe("serializeTransaction",()=>{it("frames a small transaction into a single frame (golden vector from hw-app-trx)",()=>{const e="0a023dce220895da42177db0050740d8e0a5feed2d522c43727970746f436861696e2d54726f6e5352204c6564676572205472616e73616374696f6e732054657374735a68080112640a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412330a1541c8599111f29c1e1e061265b4af93ea1f274ad78a121541c8599111f29c1e1e061265b4af93ea1f274ad78a1880c2d72f709d94a2feed2d",a=(0,r.serializeTransaction)((0,s.encodeDerivationPath)(c),n(e));expect(a).toHaveLength(1),expect(a[0].p1).toBe(16),expect(p(a[0].payload)).toBe(i+e)}),it("splits a large transaction on protobuf field boundaries without splitting a field",()=>{const e="0801".repeat(200),a=(0,r.serializeTransaction)((0,s.encodeDerivationPath)(c),n(e));expect(a.map(t=>t.p1)).toEqual([0,144]),a.forEach(t=>expect(t.payload.length).toBeLessThanOrEqual(250));const o=p(a[0].payload).slice(i.length);expect(o+p(a[1].payload)).toBe(e),expect(a[1].payload.length%2).toBe(0)}),it("marks intermediate frames as subsequent on transactions spanning many frames",()=>{const e="0801".repeat(400),a=(0,r.serializeTransaction)((0,s.encodeDerivationPath)(c),n(e));expect(a.map(t=>t.p1)).toEqual([0,128,128,144]),a.forEach(t=>expect(t.payload.length).toBeLessThanOrEqual(250));const o=a.map(t=>p(t.payload)).join("").slice(i.length);expect(o).toBe(e)}),it("throws when a single protobuf field exceeds the chunk size",()=>{const e="0afb01"+"00".repeat(251);expect(()=>(0,r.serializeTransaction)((0,s.encodeDerivationPath)(c),n(e))).toThrow("Too many bytes to encode.")}),describe("with TRC10 token frames",()=>{const e=n("aa".repeat(10)),a=n("bb".repeat(10));it("appends one token frame to a single-frame transaction",()=>{const o="0a0100",t=(0,r.serializeTransaction)((0,s.encodeDerivationPath)(c),n(o),[e]);expect(t.map(x=>x.p1)).toEqual([0,168]),expect(p(t[0].payload)).toBe(i+o),expect(t[1].payload).toEqual(e)}),it("appends two token frames to a single-frame transaction",()=>{const o=(0,r.serializeTransaction)((0,s.encodeDerivationPath)(c),n("0a0100"),[e,a]);expect(o.map(t=>t.p1)).toEqual([0,160,169]),expect(o[1].payload).toEqual(e),expect(o[2].payload).toEqual(a)}),it("demotes the last transaction frame from LAST to SUBSEQUENT",()=>{const o="0801".repeat(200),t=(0,r.serializeTransaction)((0,s.encodeDerivationPath)(c),n(o),[e]);expect(t.map(f=>f.p1)).toEqual([0,128,168]);const x=t.slice(0,2).map(f=>p(f.payload)).join("").slice(i.length);expect(x).toBe(o)}),it("indexes token frames after a multi-frame transaction",()=>{const o=(0,r.serializeTransaction)((0,s.encodeDerivationPath)(c),n("0801".repeat(400)),[e,a]);expect(o.map(t=>t.p1)).toEqual([0,128,128,128,160,169])}),it("frames a transaction unchanged when no token payload is given",()=>{const o="0a0100";expect((0,r.serializeTransaction)((0,s.encodeDerivationPath)(c),n(o),[])).toEqual((0,r.serializeTransaction)((0,s.encodeDerivationPath)(c),n(o)))})})});
2
2
  //# sourceMappingURL=TransactionSerializer.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/services/TransactionSerializer.test.ts"],
4
- "sourcesContent": ["import { encodeDerivationPath } from \"@internal/app-binder/command/utils/encodeDerivationPath\";\n\nimport { serializeTransaction } from \"./TransactionSerializer\";\n\nconst PATH = \"44'/195'/0'/0/0\";\n// Encoded \"44'/195'/0'/0/0\": length byte (05) + 5 BE32 path elements.\nconst PATH_HEX = \"058000002c800000c3800000000000000000000000\";\n\nconst toHex = (bytes: Uint8Array): string =>\n Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n\nconst fromHex = (hex: string): Uint8Array =>\n Uint8Array.from(hex.match(/.{1,2}/g)!.map((b) => parseInt(b, 16)));\n\ndescribe(\"serializeTransaction\", () => {\n it(\"frames a small transaction into a single frame (golden vector from hw-app-trx)\", () => {\n // Vector: `=> e0041000c9` + path + rawTx, from hw-app-trx Trx.test.ts.\n const rawTxHex =\n \"0a023dce220895da42177db0050740d8e0a5feed2d522c43727970746f436861696e2d54726f6e5352204c6564676572205472616e73616374696f6e732054657374735a68080112640a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412330a1541c8599111f29c1e1e061265b4af93ea1f274ad78a121541c8599111f29c1e1e061265b4af93ea1f274ad78a1880c2d72f709d94a2feed2d\";\n\n const frames = serializeTransaction(\n encodeDerivationPath(PATH),\n fromHex(rawTxHex),\n );\n\n expect(frames).toHaveLength(1);\n expect(frames[0]!.p1).toBe(0x10);\n expect(toHex(frames[0]!.payload)).toBe(PATH_HEX + rawTxHex);\n });\n\n it(\"splits a large transaction on protobuf field boundaries without splitting a field\", () => {\n // 200 two-byte varint fields (0x08 0x01); too big for one 250-byte frame.\n const rawTxHex = \"0801\".repeat(200);\n const frames = serializeTransaction(\n encodeDerivationPath(PATH),\n fromHex(rawTxHex),\n );\n\n expect(frames.map((f) => f.p1)).toEqual([0x00, 0x90]);\n // First frame holds the path header; no frame exceeds the chunk size.\n frames.forEach((f) => expect(f.payload.length).toBeLessThanOrEqual(250));\n // Reassembled payload (minus the path header on frame 0) equals the rawTx.\n const body = toHex(frames[0]!.payload).slice(PATH_HEX.length);\n expect(body + toHex(frames[1]!.payload)).toBe(rawTxHex);\n // Every continuation frame starts on a whole field (even byte length).\n expect(frames[1]!.payload.length % 2).toBe(0);\n });\n\n it(\"marks intermediate frames as subsequent on transactions spanning many frames\", () => {\n // 400 two-byte varint fields (0x08 0x01) -> 800 bytes, needing 4 frames.\n const rawTxHex = \"0801\".repeat(400);\n const frames = serializeTransaction(\n encodeDerivationPath(PATH),\n fromHex(rawTxHex),\n );\n\n expect(frames.map((f) => f.p1)).toEqual([0x00, 0x80, 0x80, 0x90]);\n frames.forEach((f) => expect(f.payload.length).toBeLessThanOrEqual(250));\n // Reassembled payload (minus the path header on frame 0) equals the rawTx.\n const reassembled = frames\n .map((f) => toHex(f.payload))\n .join(\"\")\n .slice(PATH_HEX.length);\n expect(reassembled).toBe(rawTxHex);\n });\n\n it(\"throws when a single protobuf field exceeds the chunk size\", () => {\n // Field key 0x0a (length-delimited), declared length 251, 251 payload bytes.\n const oversized = \"0a\" + \"fb01\" + \"00\".repeat(251);\n expect(() =>\n serializeTransaction(encodeDerivationPath(PATH), fromHex(oversized)),\n ).toThrow(\"Too many bytes to encode.\");\n });\n});\n"],
5
- "mappings": "aAAA,IAAAA,EAAqC,mEAErCC,EAAqC,mCAErC,MAAMC,EAAO,kBAEPC,EAAW,6CAEXC,EAASC,GACb,MAAM,KAAKA,EAAQC,GAAMA,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAAE,KAAK,EAAE,EAE7DC,EAAWC,GACf,WAAW,KAAKA,EAAI,MAAM,SAAS,EAAG,IAAKF,GAAM,SAASA,EAAG,EAAE,CAAC,CAAC,EAEnE,SAAS,uBAAwB,IAAM,CACrC,GAAG,iFAAkF,IAAM,CAEzF,MAAMG,EACJ,2WAEIC,KAAS,2BACb,wBAAqBR,CAAI,EACzBK,EAAQE,CAAQ,CAClB,EAEA,OAAOC,CAAM,EAAE,aAAa,CAAC,EAC7B,OAAOA,EAAO,CAAC,EAAG,EAAE,EAAE,KAAK,EAAI,EAC/B,OAAON,EAAMM,EAAO,CAAC,EAAG,OAAO,CAAC,EAAE,KAAKP,EAAWM,CAAQ,CAC5D,CAAC,EAED,GAAG,oFAAqF,IAAM,CAE5F,MAAMA,EAAW,OAAO,OAAO,GAAG,EAC5BC,KAAS,2BACb,wBAAqBR,CAAI,EACzBK,EAAQE,CAAQ,CAClB,EAEA,OAAOC,EAAO,IAAKC,GAAMA,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAM,GAAI,CAAC,EAEpDD,EAAO,QAASC,GAAM,OAAOA,EAAE,QAAQ,MAAM,EAAE,oBAAoB,GAAG,CAAC,EAEvE,MAAMC,EAAOR,EAAMM,EAAO,CAAC,EAAG,OAAO,EAAE,MAAMP,EAAS,MAAM,EAC5D,OAAOS,EAAOR,EAAMM,EAAO,CAAC,EAAG,OAAO,CAAC,EAAE,KAAKD,CAAQ,EAEtD,OAAOC,EAAO,CAAC,EAAG,QAAQ,OAAS,CAAC,EAAE,KAAK,CAAC,CAC9C,CAAC,EAED,GAAG,+EAAgF,IAAM,CAEvF,MAAMD,EAAW,OAAO,OAAO,GAAG,EAC5BC,KAAS,2BACb,wBAAqBR,CAAI,EACzBK,EAAQE,CAAQ,CAClB,EAEA,OAAOC,EAAO,IAAKC,GAAMA,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAM,IAAM,IAAM,GAAI,CAAC,EAChED,EAAO,QAASC,GAAM,OAAOA,EAAE,QAAQ,MAAM,EAAE,oBAAoB,GAAG,CAAC,EAEvE,MAAME,EAAcH,EACjB,IAAKC,GAAMP,EAAMO,EAAE,OAAO,CAAC,EAC3B,KAAK,EAAE,EACP,MAAMR,EAAS,MAAM,EACxB,OAAOU,CAAW,EAAE,KAAKJ,CAAQ,CACnC,CAAC,EAED,GAAG,6DAA8D,IAAM,CAErE,MAAMK,EAAY,SAAgB,KAAK,OAAO,GAAG,EACjD,OAAO,OACL,2BAAqB,wBAAqBZ,CAAI,EAAGK,EAAQO,CAAS,CAAC,CACrE,EAAE,QAAQ,2BAA2B,CACvC,CAAC,CACH,CAAC",
6
- "names": ["import_encodeDerivationPath", "import_TransactionSerializer", "PATH", "PATH_HEX", "toHex", "bytes", "b", "fromHex", "hex", "rawTxHex", "frames", "f", "body", "reassembled", "oversized"]
4
+ "sourcesContent": ["import { encodeDerivationPath } from \"@internal/app-binder/command/utils/encodeDerivationPath\";\n\nimport { serializeTransaction } from \"./TransactionSerializer\";\n\nconst PATH = \"44'/195'/0'/0/0\";\n// Encoded \"44'/195'/0'/0/0\": length byte (05) + 5 BE32 path elements.\nconst PATH_HEX = \"058000002c800000c3800000000000000000000000\";\n\nconst toHex = (bytes: Uint8Array): string =>\n Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n\nconst fromHex = (hex: string): Uint8Array =>\n Uint8Array.from(hex.match(/.{1,2}/g)!.map((b) => parseInt(b, 16)));\n\ndescribe(\"serializeTransaction\", () => {\n it(\"frames a small transaction into a single frame (golden vector from hw-app-trx)\", () => {\n // Vector: `=> e0041000c9` + path + rawTx, from hw-app-trx Trx.test.ts.\n const rawTxHex =\n \"0a023dce220895da42177db0050740d8e0a5feed2d522c43727970746f436861696e2d54726f6e5352204c6564676572205472616e73616374696f6e732054657374735a68080112640a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412330a1541c8599111f29c1e1e061265b4af93ea1f274ad78a121541c8599111f29c1e1e061265b4af93ea1f274ad78a1880c2d72f709d94a2feed2d\";\n\n const frames = serializeTransaction(\n encodeDerivationPath(PATH),\n fromHex(rawTxHex),\n );\n\n expect(frames).toHaveLength(1);\n expect(frames[0]!.p1).toBe(0x10);\n expect(toHex(frames[0]!.payload)).toBe(PATH_HEX + rawTxHex);\n });\n\n it(\"splits a large transaction on protobuf field boundaries without splitting a field\", () => {\n // 200 two-byte varint fields (0x08 0x01); too big for one 250-byte frame.\n const rawTxHex = \"0801\".repeat(200);\n const frames = serializeTransaction(\n encodeDerivationPath(PATH),\n fromHex(rawTxHex),\n );\n\n expect(frames.map((f) => f.p1)).toEqual([0x00, 0x90]);\n // First frame holds the path header; no frame exceeds the chunk size.\n frames.forEach((f) => expect(f.payload.length).toBeLessThanOrEqual(250));\n // Reassembled payload (minus the path header on frame 0) equals the rawTx.\n const body = toHex(frames[0]!.payload).slice(PATH_HEX.length);\n expect(body + toHex(frames[1]!.payload)).toBe(rawTxHex);\n // Every continuation frame starts on a whole field (even byte length).\n expect(frames[1]!.payload.length % 2).toBe(0);\n });\n\n it(\"marks intermediate frames as subsequent on transactions spanning many frames\", () => {\n // 400 two-byte varint fields (0x08 0x01) -> 800 bytes, needing 4 frames.\n const rawTxHex = \"0801\".repeat(400);\n const frames = serializeTransaction(\n encodeDerivationPath(PATH),\n fromHex(rawTxHex),\n );\n\n expect(frames.map((f) => f.p1)).toEqual([0x00, 0x80, 0x80, 0x90]);\n frames.forEach((f) => expect(f.payload.length).toBeLessThanOrEqual(250));\n // Reassembled payload (minus the path header on frame 0) equals the rawTx.\n const reassembled = frames\n .map((f) => toHex(f.payload))\n .join(\"\")\n .slice(PATH_HEX.length);\n expect(reassembled).toBe(rawTxHex);\n });\n\n it(\"throws when a single protobuf field exceeds the chunk size\", () => {\n // Field key 0x0a (length-delimited), declared length 251, 251 payload bytes.\n const oversized = \"0a\" + \"fb01\" + \"00\".repeat(251);\n expect(() =>\n serializeTransaction(encodeDerivationPath(PATH), fromHex(oversized)),\n ).toThrow(\"Too many bytes to encode.\");\n });\n\n describe(\"with TRC10 token frames\", () => {\n const TOKEN_A = fromHex(\"aa\".repeat(10));\n const TOKEN_B = fromHex(\"bb\".repeat(10));\n\n it(\"appends one token frame to a single-frame transaction\", () => {\n const rawTxHex = \"0a0100\";\n\n const frames = serializeTransaction(\n encodeDerivationPath(PATH),\n fromHex(rawTxHex),\n [TOKEN_A],\n );\n\n // The lone transaction frame is no longer the signing frame, so it drops\n // from SINGLE (0x10) to FIRST (0x00).\n expect(frames.map((f) => f.p1)).toEqual([0x00, 0xa8]);\n expect(toHex(frames[0]!.payload)).toBe(PATH_HEX + rawTxHex);\n expect(frames[1]!.payload).toEqual(TOKEN_A);\n });\n\n it(\"appends two token frames to a single-frame transaction\", () => {\n const frames = serializeTransaction(\n encodeDerivationPath(PATH),\n fromHex(\"0a0100\"),\n [TOKEN_A, TOKEN_B],\n );\n\n expect(frames.map((f) => f.p1)).toEqual([0x00, 0xa0, 0xa9]);\n expect(frames[1]!.payload).toEqual(TOKEN_A);\n expect(frames[2]!.payload).toEqual(TOKEN_B);\n });\n\n it(\"demotes the last transaction frame from LAST to SUBSEQUENT\", () => {\n const rawTxHex = \"0801\".repeat(200);\n\n const frames = serializeTransaction(\n encodeDerivationPath(PATH),\n fromHex(rawTxHex),\n [TOKEN_A],\n );\n\n // Without tokens this transaction frames as [0x00, 0x90].\n expect(frames.map((f) => f.p1)).toEqual([0x00, 0x80, 0xa8]);\n const reassembled = frames\n .slice(0, 2)\n .map((f) => toHex(f.payload))\n .join(\"\")\n .slice(PATH_HEX.length);\n expect(reassembled).toBe(rawTxHex);\n });\n\n it(\"indexes token frames after a multi-frame transaction\", () => {\n const frames = serializeTransaction(\n encodeDerivationPath(PATH),\n fromHex(\"0801\".repeat(400)),\n [TOKEN_A, TOKEN_B],\n );\n\n expect(frames.map((f) => f.p1)).toEqual([\n 0x00, 0x80, 0x80, 0x80, 0xa0, 0xa9,\n ]);\n });\n\n it(\"frames a transaction unchanged when no token payload is given\", () => {\n const rawTxHex = \"0a0100\";\n\n expect(\n serializeTransaction(encodeDerivationPath(PATH), fromHex(rawTxHex), []),\n ).toEqual(\n serializeTransaction(encodeDerivationPath(PATH), fromHex(rawTxHex)),\n );\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_encodeDerivationPath", "import_TransactionSerializer", "PATH", "PATH_HEX", "toHex", "bytes", "b", "fromHex", "hex", "rawTxHex", "frames", "f", "body", "reassembled", "oversized", "TOKEN_A", "TOKEN_B"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ "use strict";var e=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var p=(a,t)=>{for(var n in t)e(a,n,{get:t[n],enumerable:!0})},u=(a,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of y(t))!T.call(a,o)&&o!==n&&e(a,o,{get:()=>t[o],enumerable:!(r=c(t,o))||r.enumerable});return a};var d=a=>u(e({},"__esModule",{value:!0}),a);var x={};p(x,{GetTokenPayloadsTask:()=>g});module.exports=d(x);var s=require("@ledgerhq/context-module"),l=require("@ledgerhq/device-management-kit"),i=require("../../app-binder/constants");class g{constructor(t){this.args=t}async run(){const t=await this.args.contextModule.getContexts({rawTransaction:this.args.transaction},[s.ClearSignContextType.TRON_TOKEN]),n=[];for(const r of t){const o=r.type===s.ClearSignContextType.TRON_TOKEN?(0,l.hexaStringToBuffer)(r.payload):null;if(o===null||o.length===0)return[];n.push(o)}return n.length<=i.MAX_TOKEN_FRAMES?n:[]}}0&&(module.exports={GetTokenPayloadsTask});
2
+ //# sourceMappingURL=GetTokenPayloadsTask.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/GetTokenPayloadsTask.ts"],
4
+ "sourcesContent": ["import {\n ClearSignContextType,\n type ContextModule,\n} from \"@ledgerhq/context-module\";\nimport { hexaStringToBuffer } from \"@ledgerhq/device-management-kit\";\n\nimport { MAX_TOKEN_FRAMES } from \"@internal/app-binder/constants\";\n\ntype GetTokenPayloadsTaskArgs = {\n contextModule: ContextModule;\n transaction: Uint8Array;\n};\n\n/**\n * A descriptor the device cannot verify makes it abort the whole signature, so\n * anything short of a complete, well-formed set is dropped: the device then\n * reviews the transaction without the token name.\n */\nexport class GetTokenPayloadsTask {\n constructor(private readonly args: GetTokenPayloadsTaskArgs) {}\n\n async run(): Promise<Uint8Array[]> {\n const contexts = await this.args.contextModule.getContexts(\n { rawTransaction: this.args.transaction },\n [ClearSignContextType.TRON_TOKEN],\n );\n\n const payloads: Uint8Array[] = [];\n for (const context of contexts) {\n const payload =\n context.type === ClearSignContextType.TRON_TOKEN\n ? hexaStringToBuffer(context.payload)\n : null;\n if (payload === null || payload.length === 0) {\n return [];\n }\n payloads.push(payload);\n }\n\n return payloads.length <= MAX_TOKEN_FRAMES ? payloads : [];\n }\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,0BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAGO,oCACPC,EAAmC,2CAEnCC,EAAiC,0CAY1B,MAAMJ,CAAqB,CAChC,YAA6BK,EAAgC,CAAhC,UAAAA,CAAiC,CAE9D,MAAM,KAA6B,CACjC,MAAMC,EAAW,MAAM,KAAK,KAAK,cAAc,YAC7C,CAAE,eAAgB,KAAK,KAAK,WAAY,EACxC,CAAC,uBAAqB,UAAU,CAClC,EAEMC,EAAyB,CAAC,EAChC,UAAWC,KAAWF,EAAU,CAC9B,MAAMG,EACJD,EAAQ,OAAS,uBAAqB,cAClC,sBAAmBA,EAAQ,OAAO,EAClC,KACN,GAAIC,IAAY,MAAQA,EAAQ,SAAW,EACzC,MAAO,CAAC,EAEVF,EAAS,KAAKE,CAAO,CACvB,CAEA,OAAOF,EAAS,QAAU,mBAAmBA,EAAW,CAAC,CAC3D,CACF",
6
+ "names": ["GetTokenPayloadsTask_exports", "__export", "GetTokenPayloadsTask", "__toCommonJS", "import_context_module", "import_device_management_kit", "import_constants", "args", "contexts", "payloads", "context", "payload"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var e=require("@ledgerhq/context-module"),s=require("./GetTokenPayloadsTask");const c=o=>Uint8Array.from(o.match(/.{1,2}/g).map(a=>parseInt(a,16))),r=c("0a0100");describe("GetTokenPayloadsTask",()=>{const o=vi.fn(),a={getContexts:o},t=()=>new s.GetTokenPayloadsTask({contextModule:a,transaction:r}).run();beforeEach(()=>{vi.clearAllMocks()}),it("returns the resolved token descriptors as bytes",async()=>{o.mockResolvedValue([{type:e.ClearSignContextType.TRON_TOKEN,payload:"aabbcc"}]);const n=await t();expect(o).toHaveBeenCalledWith({rawTransaction:r},[e.ClearSignContextType.TRON_TOKEN]),expect(n).toEqual([c("aabbcc")])}),it.each([["no context is resolved",[]],["a context failed to load",[{type:e.ClearSignContextType.ERROR,error:new Error("boom")}]],["a resolved payload is empty",[{type:e.ClearSignContextType.TRON_TOKEN,payload:""}]],["a resolved payload is not hexadecimal",[{type:e.ClearSignContextType.TRON_TOKEN,payload:"nothex"}]],["more token names are resolved than the app accepts",Array.from({length:3},()=>({type:e.ClearSignContextType.TRON_TOKEN,payload:"aabbcc"}))],["only part of the set resolved",[{type:e.ClearSignContextType.TRON_TOKEN,payload:"aabbcc"},{type:e.ClearSignContextType.ERROR,error:new Error("boom")}]]])("provides nothing when %s",async(n,l)=>{o.mockResolvedValue(l);const p=await t();expect(p).toEqual([])})});
2
+ //# sourceMappingURL=GetTokenPayloadsTask.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/GetTokenPayloadsTask.test.ts"],
4
+ "sourcesContent": ["import {\n ClearSignContextType,\n type ContextModule,\n} from \"@ledgerhq/context-module\";\n\nimport { GetTokenPayloadsTask } from \"./GetTokenPayloadsTask\";\n\nconst fromHex = (hex: string): Uint8Array =>\n Uint8Array.from(hex.match(/.{1,2}/g)!.map((b) => parseInt(b, 16)));\n\nconst TRANSACTION = fromHex(\"0a0100\");\n\ndescribe(\"GetTokenPayloadsTask\", () => {\n const getContextsMock = vi.fn();\n const contextModule = {\n getContexts: getContextsMock,\n } as unknown as ContextModule;\n\n const run = () =>\n new GetTokenPayloadsTask({ contextModule, transaction: TRANSACTION }).run();\n\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"returns the resolved token descriptors as bytes\", async () => {\n // GIVEN the context module resolves a TRC10 token descriptor\n getContextsMock.mockResolvedValue([\n { type: ClearSignContextType.TRON_TOKEN, payload: \"aabbcc\" },\n ]);\n\n // WHEN\n const payloads = await run();\n\n // THEN the transaction is queried for TRON_TOKEN contexts only\n expect(getContextsMock).toHaveBeenCalledWith(\n { rawTransaction: TRANSACTION },\n [ClearSignContextType.TRON_TOKEN],\n );\n expect(payloads).toEqual([fromHex(\"aabbcc\")]);\n });\n\n it.each([\n [\"no context is resolved\", []],\n [\n \"a context failed to load\",\n [{ type: ClearSignContextType.ERROR, error: new Error(\"boom\") }],\n ],\n [\n \"a resolved payload is empty\",\n [{ type: ClearSignContextType.TRON_TOKEN, payload: \"\" }],\n ],\n [\n \"a resolved payload is not hexadecimal\",\n [{ type: ClearSignContextType.TRON_TOKEN, payload: \"nothex\" }],\n ],\n [\n \"more token names are resolved than the app accepts\",\n Array.from({ length: 3 }, () => ({\n type: ClearSignContextType.TRON_TOKEN,\n payload: \"aabbcc\",\n })),\n ],\n [\n \"only part of the set resolved\",\n [\n { type: ClearSignContextType.TRON_TOKEN, payload: \"aabbcc\" },\n { type: ClearSignContextType.ERROR, error: new Error(\"boom\") },\n ],\n ],\n ])(\"provides nothing when %s\", async (_case, contexts) => {\n // GIVEN a context set the device could not be trusted to verify\n getContextsMock.mockResolvedValue(contexts);\n\n // WHEN\n const payloads = await run();\n\n // THEN the transaction is left to be reviewed without a token name\n expect(payloads).toEqual([]);\n });\n});\n"],
5
+ "mappings": "aAAA,IAAAA,EAGO,oCAEPC,EAAqC,kCAErC,MAAMC,EAAWC,GACf,WAAW,KAAKA,EAAI,MAAM,SAAS,EAAG,IAAKC,GAAM,SAASA,EAAG,EAAE,CAAC,CAAC,EAE7DC,EAAcH,EAAQ,QAAQ,EAEpC,SAAS,uBAAwB,IAAM,CACrC,MAAMI,EAAkB,GAAG,GAAG,EACxBC,EAAgB,CACpB,YAAaD,CACf,EAEME,EAAM,IACV,IAAI,uBAAqB,CAAE,cAAAD,EAAe,YAAaF,CAAY,CAAC,EAAE,IAAI,EAE5E,WAAW,IAAM,CACf,GAAG,cAAc,CACnB,CAAC,EAED,GAAG,kDAAmD,SAAY,CAEhEC,EAAgB,kBAAkB,CAChC,CAAE,KAAM,uBAAqB,WAAY,QAAS,QAAS,CAC7D,CAAC,EAGD,MAAMG,EAAW,MAAMD,EAAI,EAG3B,OAAOF,CAAe,EAAE,qBACtB,CAAE,eAAgBD,CAAY,EAC9B,CAAC,uBAAqB,UAAU,CAClC,EACA,OAAOI,CAAQ,EAAE,QAAQ,CAACP,EAAQ,QAAQ,CAAC,CAAC,CAC9C,CAAC,EAED,GAAG,KAAK,CACN,CAAC,yBAA0B,CAAC,CAAC,EAC7B,CACE,2BACA,CAAC,CAAE,KAAM,uBAAqB,MAAO,MAAO,IAAI,MAAM,MAAM,CAAE,CAAC,CACjE,EACA,CACE,8BACA,CAAC,CAAE,KAAM,uBAAqB,WAAY,QAAS,EAAG,CAAC,CACzD,EACA,CACE,wCACA,CAAC,CAAE,KAAM,uBAAqB,WAAY,QAAS,QAAS,CAAC,CAC/D,EACA,CACE,qDACA,MAAM,KAAK,CAAE,OAAQ,CAAE,EAAG,KAAO,CAC/B,KAAM,uBAAqB,WAC3B,QAAS,QACX,EAAE,CACJ,EACA,CACE,gCACA,CACE,CAAE,KAAM,uBAAqB,WAAY,QAAS,QAAS,EAC3D,CAAE,KAAM,uBAAqB,MAAO,MAAO,IAAI,MAAM,MAAM,CAAE,CAC/D,CACF,CACF,CAAC,EAAE,2BAA4B,MAAOQ,EAAOC,IAAa,CAExDL,EAAgB,kBAAkBK,CAAQ,EAG1C,MAAMF,EAAW,MAAMD,EAAI,EAG3B,OAAOC,CAAQ,EAAE,QAAQ,CAAC,CAAC,CAC7B,CAAC,CACH,CAAC",
6
+ "names": ["import_context_module", "import_GetTokenPayloadsTask", "fromHex", "hex", "b", "TRANSACTION", "getContextsMock", "contextModule", "run", "payloads", "_case", "contexts"]
7
+ }