@ledgerhq/device-signer-kit-solana 0.0.0-wrong-error-when-in-experimental-provider-20251021162636 → 0.0.0-z-intent-queue-7-20251204111630
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
- package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js.map +3 -3
- package/lib/cjs/api/model/TransactionResolutionContext.js +1 -1
- package/lib/cjs/api/model/TransactionResolutionContext.js.map +1 -1
- package/lib/cjs/internal/DefaultSignerSolana.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/GetAppConfigurationCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/GetAppConfigurationCommand.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/GetAppConfigurationCommand.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/GetAppConfigurationCommand.test.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/GetChallengeCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/GetChallengeCommand.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/GetChallengeCommand.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/GetChallengeCommand.test.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/GetPubKeyCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/GetPubKeyCommand.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/GetPubKeyCommand.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/GetPubKeyCommand.test.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/ProvideTLVDescriptorCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/ProvideTLVDescriptorCommand.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/ProvideTLVDescriptorCommand.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/ProvideTLVDescriptorCommand.test.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js +2 -0
- package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js.map +7 -0
- package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js +2 -0
- package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/command/SignOffChainMessageCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/SignOffChainMessageCommand.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/SignOffChainMessageCommand.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/SignOffChainMessageCommand.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/SignTransactionCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/SignTransactionCommand.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/SignTransactionCommand.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/SignTransactionCommand.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
- package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +3 -3
- package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
- package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +1 -1
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +2 -2
- package/lib/cjs/internal/app-binder/services/TransactionInspector.js +1 -1
- package/lib/cjs/internal/app-binder/services/TransactionInspector.js.map +3 -3
- package/lib/cjs/internal/app-binder/services/TransactionInspector.test.js +1 -1
- package/lib/cjs/internal/app-binder/services/TransactionInspector.test.js.map +2 -2
- package/lib/cjs/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.js +2 -0
- package/lib/cjs/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.js.map +7 -0
- package/lib/cjs/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.js +2 -0
- package/lib/cjs/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js +1 -1
- package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js.map +2 -2
- package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js +1 -1
- package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js +1 -1
- package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js +1 -1
- package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +3 -3
- package/lib/cjs/package.json +44 -40
- package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js +1 -0
- package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js.map +4 -4
- package/lib/esm/internal/DefaultSignerSolana.js.map +2 -2
- package/lib/esm/internal/app-binder/command/GetAppConfigurationCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/GetAppConfigurationCommand.js.map +2 -2
- package/lib/esm/internal/app-binder/command/GetAppConfigurationCommand.test.js +1 -1
- package/lib/esm/internal/app-binder/command/GetAppConfigurationCommand.test.js.map +2 -2
- package/lib/esm/internal/app-binder/command/GetChallengeCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/GetChallengeCommand.js.map +2 -2
- package/lib/esm/internal/app-binder/command/GetChallengeCommand.test.js +1 -1
- package/lib/esm/internal/app-binder/command/GetChallengeCommand.test.js.map +2 -2
- package/lib/esm/internal/app-binder/command/GetPubKeyCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/GetPubKeyCommand.js.map +2 -2
- package/lib/esm/internal/app-binder/command/GetPubKeyCommand.test.js +1 -1
- package/lib/esm/internal/app-binder/command/GetPubKeyCommand.test.js.map +2 -2
- package/lib/esm/internal/app-binder/command/ProvideTLVDescriptorCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/ProvideTLVDescriptorCommand.js.map +2 -2
- package/lib/esm/internal/app-binder/command/ProvideTLVDescriptorCommand.test.js +1 -1
- package/lib/esm/internal/app-binder/command/ProvideTLVDescriptorCommand.test.js.map +2 -2
- package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js +2 -0
- package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js.map +7 -0
- package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js +2 -0
- package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js.map +7 -0
- package/lib/esm/internal/app-binder/command/SignOffChainMessageCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/SignOffChainMessageCommand.js.map +2 -2
- package/lib/esm/internal/app-binder/command/SignOffChainMessageCommand.test.js +1 -1
- package/lib/esm/internal/app-binder/command/SignOffChainMessageCommand.test.js.map +3 -3
- package/lib/esm/internal/app-binder/command/SignTransactionCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/SignTransactionCommand.js.map +2 -2
- package/lib/esm/internal/app-binder/command/SignTransactionCommand.test.js +1 -1
- package/lib/esm/internal/app-binder/command/SignTransactionCommand.test.js.map +3 -3
- package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
- package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +3 -3
- package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
- package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +3 -3
- package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +1 -1
- package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +2 -2
- package/lib/esm/internal/app-binder/services/TransactionInspector.js +1 -1
- package/lib/esm/internal/app-binder/services/TransactionInspector.js.map +3 -3
- package/lib/esm/internal/app-binder/services/TransactionInspector.test.js +1 -1
- package/lib/esm/internal/app-binder/services/TransactionInspector.test.js.map +2 -2
- package/lib/esm/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.js +2 -0
- package/lib/esm/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.js.map +7 -0
- package/lib/esm/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.js +2 -0
- package/lib/esm/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.js.map +7 -0
- package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js +1 -1
- package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js.map +2 -2
- package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js +1 -1
- package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js.map +3 -3
- package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js +1 -1
- package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js.map +3 -3
- package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js +1 -1
- package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +3 -3
- package/lib/esm/package.json +44 -40
- package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts +10 -0
- package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts.map +1 -1
- package/lib/types/api/model/TransactionResolutionContext.d.ts +2 -0
- package/lib/types/api/model/TransactionResolutionContext.d.ts.map +1 -1
- package/lib/types/internal/DefaultSignerSolana.d.ts +3 -0
- package/lib/types/internal/DefaultSignerSolana.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/GetAppConfigurationCommand.d.ts +1 -0
- package/lib/types/internal/app-binder/command/GetAppConfigurationCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/GetChallengeCommand.d.ts +1 -0
- package/lib/types/internal/app-binder/command/GetChallengeCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/GetPubKeyCommand.d.ts +1 -0
- package/lib/types/internal/app-binder/command/GetPubKeyCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/ProvideTLVDescriptorCommand.d.ts +1 -0
- package/lib/types/internal/app-binder/command/ProvideTLVDescriptorCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.d.ts +29 -0
- package/lib/types/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.d.ts.map +1 -0
- package/lib/types/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.d.ts +2 -0
- package/lib/types/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/command/SignOffChainMessageCommand.d.ts +1 -0
- package/lib/types/internal/app-binder/command/SignOffChainMessageCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/SignTransactionCommand.d.ts +1 -0
- package/lib/types/internal/app-binder/command/SignTransactionCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts +2 -2
- package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts.map +1 -1
- package/lib/types/internal/app-binder/device-action/__test-utils__/makeInternalApi.d.ts.map +1 -1
- package/lib/types/internal/app-binder/services/TransactionInspector.d.ts +7 -10
- package/lib/types/internal/app-binder/services/TransactionInspector.d.ts.map +1 -1
- package/lib/types/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.d.ts +8 -0
- package/lib/types/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.d.ts.map +1 -0
- package/lib/types/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.d.ts +2 -0
- package/lib/types/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts +4 -9
- package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts.map +1 -1
- package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts +9 -5
- package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts.map +1 -1
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +37 -33
- package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.js +0 -2
- package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.js.map +0 -7
- package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js +0 -2
- package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js.map +0 -7
- package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.js +0 -2
- package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.js.map +0 -7
- package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js +0 -2
- package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js.map +0 -7
- package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.d.ts +0 -13
- package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.d.ts.map +0 -1
- package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.test.d.ts +0 -2
- package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.test.d.ts.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/task/ProvideTransactionContextTask.test.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { CommandResultFactory } from \"@ledgerhq/device-management-kit\";\nimport { Maybe, Nothing } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, type Mock, vi } from \"vitest\";\n\nimport { ProvideTLVDescriptorCommand } from \"@internal/app-binder/command/ProvideTLVDescriptorCommand\";\nimport { ProvideTrustedNamePKICommand } from \"@internal/app-binder/command/ProvideTrustedNamePKICommand\";\n\nimport {\n ProvideSolanaTransactionContextTask,\n type SolanaContextForDevice,\n} from \"./ProvideTransactionContextTask\";\n\ndescribe(\"ProvideSolanaTransactionContextTask\", () => {\n let fakeApi: { sendCommand: Mock };\n let context: SolanaContextForDevice;\n\n const dummyDescriptor = Uint8Array.from([0xaa, 0xaa, 0xaa]);\n const dummyCertificate: any = {\n payload: Uint8Array.from([0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef]),\n };\n\n const mockError = { _tag: \"SomeError\", errorCode: 0, message: \"SomeError\" };\n\n beforeEach(() => {\n vi.resetAllMocks();\n fakeApi = {\n sendCommand: vi.fn(),\n };\n context = {\n descriptor: dummyDescriptor,\n certificate: dummyCertificate,\n };\n });\n\n it(\"returns Nothing when both commands succeed\", async () => {\n // given\n const successResult = CommandResultFactory({ data: Maybe.of(null) });\n fakeApi.sendCommand.mockResolvedValue(successResult);\n\n const task = new ProvideSolanaTransactionContextTask(\n fakeApi as unknown as any,\n context,\n );\n\n // when\n const result = await task.run();\n\n // then\n expect(fakeApi.sendCommand).toHaveBeenCalledTimes(2);\n\n const firstCallCall = fakeApi.sendCommand.mock.calls[0];\n expect(firstCallCall).toBeDefined();\n const firstCallArg = firstCallCall![0];\n expect(firstCallArg).toBeInstanceOf(ProvideTrustedNamePKICommand);\n expect(\n (firstCallArg as ProvideTrustedNamePKICommand).args.pkiBlob,\n ).toStrictEqual(dummyCertificate.payload);\n\n const secondCallArg = fakeApi.sendCommand.mock.calls[1]![0]!;\n expect(secondCallArg).toBeInstanceOf(ProvideTLVDescriptorCommand);\n expect(\n (secondCallArg as ProvideTLVDescriptorCommand).args.payload,\n ).toStrictEqual(dummyDescriptor);\n\n expect(result).toStrictEqual(Nothing);\n });\n\n it(\"throws error if PKI command fails\", async () => {\n const errorResult = CommandResultFactory({ error: mockError });\n fakeApi.sendCommand.mockResolvedValueOnce(errorResult);\n\n const task = new ProvideSolanaTransactionContextTask(\n fakeApi as unknown as any,\n context,\n );\n\n await expect(task.run()).rejects.toBe(errorResult);\n expect(fakeApi.sendCommand).toHaveBeenCalledTimes(1);\n });\n\n it(\"throws error if TLV command fails\", async () => {\n const successResult = CommandResultFactory({ data: Maybe.of(null) });\n const tlvErrorResult = CommandResultFactory({ error: mockError });\n\n fakeApi.sendCommand\n .mockResolvedValueOnce(successResult)\n .mockResolvedValueOnce(tlvErrorResult);\n\n const task = new ProvideSolanaTransactionContextTask(\n fakeApi as unknown as any,\n context,\n );\n\n await expect(task.run()).rejects.toBe(tlvErrorResult);\n expect(fakeApi.sendCommand).toHaveBeenCalledTimes(2);\n });\n});\n"],
|
|
5
|
-
"mappings": "aAGA,IAAAA,EAAqC,2CACrCC,EAA+B,qBAC/BC,EAAgE,kBAEhEC,EAA4C,oEAC5CC,EAA6C,qEAE7CC,EAGO,8CAEP,YAAS,sCAAuC,IAAM,CACpD,IAAIC,EACAC,EAEJ,MAAMC,EAAkB,WAAW,KAAK,CAAC,IAAM,IAAM,GAAI,CAAC,EACpDC,EAAwB,CAC5B,QAAS,WAAW,KAAK,CAAC,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAAI,CAAC,CAC3E,EAEMC,EAAY,CAAE,KAAM,YAAa,UAAW,EAAG,QAAS,WAAY,KAE1E,cAAW,IAAM,CACf,KAAG,cAAc,EACjBJ,EAAU,CACR,YAAa,KAAG,GAAG,CACrB,EACAC,EAAU,CACR,WAAYC,EACZ,YAAaC,CACf,CACF,CAAC,KAED,MAAG,6CAA8C,SAAY,CAE3D,MAAME,KAAgB,wBAAqB,CAAE,KAAM,QAAM,GAAG,IAAI,CAAE,CAAC,EACnEL,EAAQ,YAAY,kBAAkBK,CAAa,EAQnD,MAAMC,EAAS,MANF,IAAI,sCACfN,EACAC,CACF,EAG0B,IAAI,KAG9B,UAAOD,EAAQ,WAAW,EAAE,sBAAsB,CAAC,EAEnD,MAAMO,EAAgBP,EAAQ,YAAY,KAAK,MAAM,CAAC,KACtD,UAAOO,CAAa,EAAE,YAAY,EAClC,MAAMC,EAAeD,EAAe,CAAC,KACrC,UAAOC,CAAY,EAAE,eAAe,8BAA4B,KAChE,UACGA,EAA8C,KAAK,OACtD,EAAE,cAAcL,EAAiB,OAAO,EAExC,MAAMM,EAAgBT,EAAQ,YAAY,KAAK,MAAM,CAAC,EAAG,CAAC,KAC1D,UAAOS,CAAa,EAAE,eAAe,6BAA2B,KAChE,UACGA,EAA8C,KAAK,OACtD,EAAE,cAAcP,CAAe,KAE/B,UAAOI,CAAM,EAAE,cAAc,SAAO,CACtC,CAAC,KAED,MAAG,oCAAqC,SAAY,CAClD,MAAMI,KAAc,wBAAqB,CAAE,MAAON,CAAU,CAAC,EAC7DJ,EAAQ,YAAY,sBAAsBU,CAAW,EAErD,MAAMC,EAAO,IAAI,sCACfX,EACAC,CACF,EAEA,QAAM,UAAOU,EAAK,IAAI,CAAC,EAAE,QAAQ,KAAKD,CAAW,KACjD,UAAOV,EAAQ,WAAW,EAAE,sBAAsB,CAAC,CACrD,CAAC,KAED,MAAG,oCAAqC,SAAY,CAClD,MAAMK,KAAgB,wBAAqB,CAAE,KAAM,QAAM,GAAG,IAAI,CAAE,CAAC,EAC7DO,KAAiB,wBAAqB,CAAE,MAAOR,CAAU,CAAC,EAEhEJ,EAAQ,YACL,sBAAsBK,CAAa,EACnC,sBAAsBO,CAAc,EAEvC,MAAMD,EAAO,IAAI,sCACfX,EACAC,CACF,EAEA,QAAM,UAAOU,EAAK,IAAI,CAAC,EAAE,QAAQ,KAAKC,CAAc,KACpD,UAAOZ,EAAQ,WAAW,EAAE,sBAAsB,CAAC,CACrD,CAAC,CACH,CAAC",
|
|
6
|
-
"names": ["import_device_management_kit", "import_purify_ts", "import_vitest", "import_ProvideTLVDescriptorCommand", "
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/require-await */\n/* eslint-disable @typescript-eslint/no-unsafe-return */\n\nimport { SolanaContextTypes } from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n LoadCertificateCommand,\n} from \"@ledgerhq/device-management-kit\";\nimport {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n createAssociatedTokenAccountInstruction,\n createTransferInstruction,\n getAssociatedTokenAddressSync,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport {\n Keypair,\n PublicKey,\n SystemProgram,\n Transaction,\n TransactionInstruction,\n TransactionMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport bs58 from \"bs58\";\nimport { Buffer } from \"buffer\";\nimport { Nothing } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, type Mock, vi } from \"vitest\";\n\nimport { ProvideTLVDescriptorCommand } from \"@internal/app-binder/command/ProvideTLVDescriptorCommand\";\nimport { ProvideTLVTransactionInstructionDescriptorCommand } from \"@internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand\";\nimport { DefaultSolanaMessageNormaliser } from \"@internal/app-binder/services/utils/DefaultSolanaMessageNormaliser\";\n\nimport {\n ProvideSolanaTransactionContextTask,\n SWAP_MODE,\n} from \"./ProvideTransactionContextTask\";\n\nconst DUMMY_BLOCKHASH = bs58.encode(new Uint8Array(32).fill(0xaa));\n\nfunction makeSignedRawLegacy(\n ixs: TransactionInstruction[],\n signers: Keypair[],\n feePayer?: Keypair,\n) {\n const payer = feePayer ?? signers[0] ?? Keypair.generate();\n const tx = new Transaction();\n tx.recentBlockhash = DUMMY_BLOCKHASH;\n tx.feePayer = payer.publicKey;\n tx.add(...ixs);\n const seen = new Set<string>();\n const uniq = [payer, ...signers].filter((kp) => {\n const k = kp.publicKey.toBase58();\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n tx.sign(...uniq);\n return { raw: tx.serialize(), payer };\n}\n\nfunction makeSignedRawV0(\n ixs: TransactionInstruction[],\n signers: Keypair[],\n feePayer?: Keypair,\n) {\n const payer = feePayer ?? signers[0] ?? Keypair.generate();\n const messageV0 = new TransactionMessage({\n payerKey: payer.publicKey,\n recentBlockhash: DUMMY_BLOCKHASH,\n instructions: ixs,\n }).compileToV0Message(); // no ALTs -> offline-safe\n\n const vtx = new VersionedTransaction(messageV0);\n vtx.sign([payer, ...signers]);\n return { raw: vtx.serialize(), payer };\n}\n\nconst makeKey = (base58: string) => ({ toBase58: () => base58 });\n\nconst buildNormaliser = (message: any) =>\n ({\n normaliseMessage: vi.fn(async () => message),\n }) as const;\n\ndescribe(\"ProvideSolanaTransactionContextTask (merged)\", () => {\n let api: { sendCommand: Mock };\n const success = CommandResultFactory({ data: undefined });\n\n const baseCert = {\n payload: new Uint8Array([0xf0, 0xca, 0xcc, 0x1a]),\n keyUsageNumber: 1,\n } as const;\n const tlvDescriptor = new Uint8Array([0xaa, 0xbb, 0xcc]);\n\n const tokenCert = {\n payload: new Uint8Array([0xf0, 0xca, 0xcc, 0x1a]),\n keyUsageNumber: 2,\n } as const;\n\n const tokenDescriptor = {\n data: \"f0cacc1a\",\n signature: \"01020304\",\n } as const;\n\n const SIG = \"f0cacc1a\";\n\n beforeEach(() => {\n vi.resetAllMocks();\n api = {\n sendCommand: vi.fn(),\n };\n });\n\n // basic context\n describe(\"basic context\", () => {\n it(\"sends PKI certificate then TLV descriptor and returns Nothing (no loaders results)\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // LoadCertificateCommand (trusted name PKI)\n .mockResolvedValueOnce(success); // ProvideTLVDescriptorCommand\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults: [],\n transactionBytes: new Uint8Array([0xf0]), // unused in this path\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n // when\n const result = await task.run();\n\n // then\n expect(api.sendCommand).toHaveBeenCalledTimes(2);\n\n const first = api.sendCommand.mock.calls[0]![0]!;\n expect(first).toBeInstanceOf(LoadCertificateCommand);\n expect(first.args.certificate).toStrictEqual(baseCert.payload);\n expect(first.args.keyUsage).toBe(baseCert.keyUsageNumber);\n\n const second = api.sendCommand.mock.calls[1]![0]!;\n expect(second).toBeInstanceOf(ProvideTLVDescriptorCommand);\n expect(second.args.payload).toStrictEqual(tlvDescriptor);\n\n expect(result).toStrictEqual(Nothing);\n });\n\n it(\"propagates a rejection thrown by InternalApi.sendCommand\", async () => {\n // given\n api.sendCommand.mockRejectedValueOnce(new Error(\"oupsy\"));\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults: [],\n transactionBytes: new Uint8Array([0xca]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n await expect(task.run()).rejects.toThrow(\"oupsy\");\n expect(api.sendCommand).toHaveBeenCalledTimes(1);\n });\n\n it(\"ignores SolanaContextTypes.ERROR entries (no extra APDUs beyond base context)\", async () => {\n // given: include an ERROR loader which should be ignored\n api.sendCommand\n .mockResolvedValueOnce(success) // PKI\n .mockResolvedValueOnce(success); // TLV\n\n const loadersResults = [\n { type: SolanaContextTypes.ERROR, error: { message: \"err\" } as any },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0x1a]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n expect(api.sendCommand).toHaveBeenCalledTimes(2);\n expect(api.sendCommand.mock.calls[0]![0]!).toBeInstanceOf(\n LoadCertificateCommand,\n );\n expect(api.sendCommand.mock.calls[1]![0]!).toBeInstanceOf(\n ProvideTLVDescriptorCommand,\n );\n });\n });\n\n // basic context + token metadata\n\n describe(\"basic context + token\", () => {\n it(\"when token metadata present, sends token certificate then TLV transaction-instruction descriptor\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI certificate\n .mockResolvedValueOnce(success) // TLV descriptor\n .mockResolvedValueOnce(success) // token metadata certificate\n .mockResolvedValueOnce(success); // token descriptor via TLVTransactionInstructionDescriptor\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: {\n solanaTokenDescriptor: tokenDescriptor,\n },\n certificate: tokenCert,\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0x1a]), // unused in this path\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n // when\n const result = await task.run();\n\n // then\n expect(api.sendCommand).toHaveBeenCalledTimes(4);\n\n const third = api.sendCommand.mock.calls[2]![0]!;\n expect(third).toBeInstanceOf(LoadCertificateCommand);\n expect(third.args.certificate).toStrictEqual(tokenCert.payload);\n expect(third.args.keyUsage).toBe(tokenCert.keyUsageNumber);\n\n const fourth = api.sendCommand.mock.calls[3]![0]!;\n expect(fourth).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(fourth.args.kind).toBe(\"descriptor\");\n expect(fourth.args.dataHex).toBe(tokenDescriptor.data);\n expect(fourth.args.signatureHex).toBe(tokenDescriptor.signature);\n expect(fourth.args.isFirstMessage).toBe(true);\n expect(fourth.args.swapSignatureTag).toBe(false);\n\n expect(result).toStrictEqual(Nothing);\n });\n\n it(\"does not send token commands if token payload is missing\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // PKI\n .mockResolvedValueOnce(success); // TLV\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: undefined,\n certificate: tokenCert,\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xf0]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n // when\n const result = await task.run();\n\n // then\n expect(api.sendCommand).toHaveBeenCalledTimes(2);\n expect(result).toStrictEqual(Nothing);\n });\n\n it(\"does not send token commands if token certificate is missing\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // PKI\n .mockResolvedValueOnce(success); // TLV\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: undefined,\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xca]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n // when\n const result = await task.run();\n\n // then\n expect(api.sendCommand).toHaveBeenCalledTimes(2);\n expect(result).toStrictEqual(Nothing);\n });\n\n it(\"throws a mapped error when sending token certificate returns a CommandErrorResult\", async () => {\n // given\n const errorResult = CommandResultFactory({\n error: { _tag: \"SomeError\", errorCode: 0x6a80, message: \"bad\" },\n });\n\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(errorResult); // token certificate -> error\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xcc]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n // when + then\n await expect(task.run()).rejects.toThrow(\n \"[SignerSolana] ProvideSolanaTransactionContextTask: Failed to send tokenMetadataCertificate to device, latest firmware version required\",\n );\n\n // ensure the TLVTransactionInstructionDescriptor was NOT attempted\n expect(api.sendCommand).toHaveBeenCalledTimes(3);\n const third = api.sendCommand.mock.calls[2]![0]!;\n expect(third).toBeInstanceOf(LoadCertificateCommand);\n });\n\n it(\"does not send swap APDUs when SOLANA_LIFI context is missing (token present)\", async () => {\n // given: base + token succeed, but no LIFI in loadersResults\n api.sendCommand\n .mockResolvedValueOnce(success) // PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success); // token TLVTransactionInstructionDescriptor\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n // no SOLANA_LIFI entry\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0x1a]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n { normaliseMessage: vi.fn() } as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token only\n expect(api.sendCommand).toHaveBeenCalledTimes(4);\n expect(api.sendCommand.mock.calls[0]![0]!).toBeInstanceOf(\n LoadCertificateCommand,\n );\n expect(api.sendCommand.mock.calls[1]![0]!).toBeInstanceOf(\n ProvideTLVDescriptorCommand,\n );\n expect(api.sendCommand.mock.calls[2]![0]!).toBeInstanceOf(\n LoadCertificateCommand,\n );\n const tokenCmd = api.sendCommand.mock.calls[3]![0]!;\n expect(tokenCmd).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(tokenCmd.args.swapSignatureTag).toBe(false);\n expect(tokenCmd.args.isFirstMessage).toBe(true);\n });\n });\n\n // basic context + token + lifi (swap)\n describe(\"basic context + token + lifi\", () => {\n it(\"sends one APDU per instruction in order (descriptor/empty/descriptor) after base + token are sent\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValue(success); // swap APDUs\n\n const message = {\n compiledInstructions: [\n { programIdIndex: 0 },\n { programIdIndex: 1 },\n { programIdIndex: 2 },\n ],\n allKeys: [makeKey(\"A_PID\"), makeKey(\"B_PID\"), makeKey(\"C_PID\")],\n };\n const normaliser = buildNormaliser(message);\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n A_PID: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n // B missing -> empty\n C_PID: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xf0]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n normaliser as any,\n );\n\n // when\n const result = await task.run();\n\n // then\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token + 3 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(7);\n\n // swap calls start at index 4\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"descriptor\");\n expect(c0.args.dataHex).toBe(SIG);\n expect(c0.args.signatureHex).toBe(SIG);\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n\n const c1 = api.sendCommand.mock.calls[5]![0]!;\n expect(c1).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c1.args.kind).toBe(\"empty\");\n expect(c1.args.isFirstMessage).toBe(false);\n expect(c1.args.swapSignatureTag).toBe(true);\n\n const c2 = api.sendCommand.mock.calls[6]![0]!;\n expect(c2).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c2.args.kind).toBe(\"descriptor\");\n expect(c2.args.dataHex).toBe(SIG);\n expect(c2.args.signatureHex).toBe(SIG);\n expect(c2.args.isFirstMessage).toBe(false);\n expect(c2.args.swapSignatureTag).toBe(true);\n\n expect((normaliser as any).normaliseMessage).toHaveBeenCalledOnce();\n });\n\n it(\"sends empty when descriptor exists but signatures[SWAP_MODE] is missing\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValue(success);\n\n const message = {\n compiledInstructions: [{ programIdIndex: 0 }],\n allKeys: [makeKey(\"ONLY_PID\")],\n };\n const normaliser = buildNormaliser(message);\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n ONLY_PID: {\n data: SIG,\n signatures: {\n // no [SWAP_MODE] key\n },\n },\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xca]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n normaliser as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token + 1 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(5);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"empty\");\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n });\n\n it(\"sends empty when programId is missing for an instruction\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValue(success);\n\n const message = {\n compiledInstructions: [{ programIdIndex: 5 }], // out-of-range\n allKeys: [makeKey(\"X\")],\n };\n const normaliser = buildNormaliser(message);\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n { type: SolanaContextTypes.SOLANA_LIFI, payload: {} },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xcc]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n normaliser as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token + 1 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(5);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"empty\");\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n });\n\n it(\"propagates a rejection thrown by InternalApi.sendCommand on the second swap APDU (after base + token succeed)\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValueOnce(success) // 1st swap ok\n .mockRejectedValueOnce(new Error(\"err\")); // 2nd swap fails\n\n const message = {\n compiledInstructions: [\n { programIdIndex: 0 }, // descriptor\n { programIdIndex: 1 }, // empty -> rejects\n { programIdIndex: 2 }, // not reached\n ],\n allKeys: [makeKey(\"A_PID\"), makeKey(\"B_PID\"), makeKey(\"C_PID\")],\n };\n const normaliser = buildNormaliser(message);\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n A_PID: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n // B missing -> empty\n C_PID: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0x1a]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n normaliser as any,\n );\n\n await expect(task.run()).rejects.toThrow(\"err\");\n // 2 base + 2 token + 2 swap (failed on 2nd)\n expect(api.sendCommand).toHaveBeenCalledTimes(6);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"descriptor\");\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n\n const c1 = api.sendCommand.mock.calls[5]![0]!;\n expect(c1).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c1.args.kind).toBe(\"empty\");\n expect(c1.args.isFirstMessage).toBe(false);\n expect(c1.args.swapSignatureTag).toBe(true);\n });\n\n it(\"uses signatures[SWAP_MODE] specifically when present\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValue(success);\n\n const message = {\n compiledInstructions: [{ programIdIndex: 0 }],\n allKeys: [makeKey(\"SIG_PID\")],\n };\n const normaliser = buildNormaliser(message);\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n SIG_PID: {\n data: SIG,\n signatures: { prod: \"deadbeef\", [SWAP_MODE]: SIG },\n },\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xf0]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n normaliser as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token + 1 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(5);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"descriptor\");\n expect(c0.args.dataHex).toBe(SIG);\n expect(c0.args.signatureHex).toBe(SIG);\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n });\n\n it(\"parses a real *legacy* tx via DefaultSolanaMessageNormaliser and preserves APDU order (descriptor, empty, descriptor) after base + token\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValue(success);\n\n const payer = Keypair.generate();\n const dest1 = Keypair.generate().publicKey;\n const ix1 = SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: dest1,\n lamports: 1234,\n });\n\n const owner = Keypair.generate();\n const srcToken = Keypair.generate().publicKey;\n const dstToken = Keypair.generate().publicKey;\n const ix2 = createTransferInstruction(\n srcToken,\n dstToken,\n owner.publicKey,\n 42n,\n [],\n TOKEN_PROGRAM_ID,\n );\n\n const MEMO_PROGRAM_ID = new PublicKey(\n \"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\",\n );\n const ix3 = new TransactionInstruction({\n programId: MEMO_PROGRAM_ID,\n keys: [],\n data: Buffer.from(\"hi\"),\n });\n\n const { raw } = makeSignedRawLegacy(\n [ix1, ix2, ix3],\n [payer, owner],\n payer,\n );\n\n const SYSTEM_PID = SystemProgram.programId.toBase58();\n const MEMO_PID = MEMO_PROGRAM_ID.toBase58();\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n [SYSTEM_PID]: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n // Tokenkeg missing -> empty\n [MEMO_PID]: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: raw,\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n DefaultSolanaMessageNormaliser as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token + 3 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(7);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0.args.kind).toBe(\"descriptor\");\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n\n const c1 = api.sendCommand.mock.calls[5]![0]!;\n expect(c1.args.kind).toBe(\"empty\");\n expect(c1.args.isFirstMessage).toBe(false);\n expect(c1.args.swapSignatureTag).toBe(true);\n\n const c2 = api.sendCommand.mock.calls[6]![0]!;\n expect(c2.args.kind).toBe(\"descriptor\");\n expect(c2.args.isFirstMessage).toBe(false);\n expect(c2.args.swapSignatureTag).toBe(true);\n });\n\n it(\"parses a real *v0* tx via DefaultSolanaMessageNormaliser (no ALTs) and preserves APDU order (descriptor, descriptor, empty) after base + token\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValue(success);\n\n const payer = Keypair.generate();\n const sysDest = Keypair.generate().publicKey;\n const sysIx = SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: sysDest,\n lamports: 5_678,\n });\n\n const owner = Keypair.generate().publicKey;\n const mint = Keypair.generate().publicKey;\n const ata = getAssociatedTokenAddressSync(\n mint,\n owner,\n true,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n const ataIx = createAssociatedTokenAccountInstruction(\n payer.publicKey,\n ata,\n owner,\n mint,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const MEMO_PROGRAM_ID = new PublicKey(\n \"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\",\n );\n const memoIx = new TransactionInstruction({\n programId: MEMO_PROGRAM_ID,\n keys: [],\n data: Buffer.from(\"hello\"),\n });\n\n // IMPORTANT: sign only with the payer (no PublicKey in signers array)\n const { raw } = makeSignedRawV0([sysIx, ataIx, memoIx], [], payer);\n\n const SYSTEM_PID = SystemProgram.programId.toBase58();\n const ATA_PID = ASSOCIATED_TOKEN_PROGRAM_ID.toBase58();\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n [SYSTEM_PID]: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n [ATA_PID]: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n // Memo intentionally missing -> empty\n },\n },\n ];\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: raw,\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as any,\n context as any,\n DefaultSolanaMessageNormaliser as any,\n );\n\n const res = await task.run();\n\n expect(res).toEqual(Nothing);\n // 2 base + 2 token + 3 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(7);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"descriptor\"); // System\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n\n const c1 = api.sendCommand.mock.calls[5]![0]!;\n expect(c1).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c1.args.kind).toBe(\"descriptor\"); // ATA\n expect(c1.args.isFirstMessage).toBe(false);\n expect(c1.args.swapSignatureTag).toBe(true);\n\n const c2 = api.sendCommand.mock.calls[6]![0]!;\n expect(c2).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c2.args.kind).toBe(\"empty\"); // Memo missing\n expect(c2.args.isFirstMessage).toBe(false);\n expect(c2.args.swapSignatureTag).toBe(true);\n });\n\n it(\"parses a real *v0* tx via DefaultSolanaMessageNormaliser and preserves APDU order System, createATA, token transfer (descriptor, descriptor, empty) after base + token\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValue(success); // swap APDUs\n\n const payer = Keypair.generate();\n\n const sysDest = Keypair.generate().publicKey;\n const sysIx = SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: sysDest,\n lamports: 7_777,\n });\n\n const tokenOwner = Keypair.generate(); // owner of the source SPL token account (signer)\n const mint = Keypair.generate().publicKey;\n\n const recipientOwner = Keypair.generate().publicKey; // unfunded account (no ATA yet)\n const recipientATA = getAssociatedTokenAddressSync(\n mint,\n recipientOwner,\n true,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const createAtaIx = createAssociatedTokenAccountInstruction(\n payer.publicKey, // funder\n recipientATA, // ata to be created\n recipientOwner, // owner of the ATA\n mint,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const srcTokenAcc = Keypair.generate().publicKey; // pretend this is an existing token account\n const transferIx = createTransferInstruction(\n srcTokenAcc,\n recipientATA,\n tokenOwner.publicKey, // authority of srcTokenAcc (we will sign with tokenOwner)\n 9n,\n [],\n TOKEN_PROGRAM_ID,\n );\n\n // sign v0 with payer + tokenOwner (NO PublicKey objects in the signers array)\n const { raw } = makeSignedRawV0(\n [sysIx, createAtaIx, transferIx],\n [tokenOwner],\n payer,\n );\n\n const SYSTEM_PID = SystemProgram.programId.toBase58();\n const ATA_PID = ASSOCIATED_TOKEN_PROGRAM_ID.toBase58();\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n [SYSTEM_PID]: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n [ATA_PID]: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n // Token Program intentionally missing -> \"empty\"\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: raw,\n };\n\n // when\n const task = new ProvideSolanaTransactionContextTask(\n api as any,\n context as any,\n DefaultSolanaMessageNormaliser as any,\n );\n\n const res = await task.run();\n\n // then\n expect(res).toEqual(Nothing);\n // 2 base + 2 token + 3 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(7);\n\n // swap calls start at index 4\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"descriptor\"); // System\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n\n const c1 = api.sendCommand.mock.calls[5]![0]!;\n expect(c1).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c1.args.kind).toBe(\"descriptor\"); // ATA\n expect(c1.args.isFirstMessage).toBe(false);\n expect(c1.args.swapSignatureTag).toBe(true);\n\n const c2 = api.sendCommand.mock.calls[6]![0]!;\n expect(c2).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c2.args.kind).toBe(\"empty\"); // Token Program missing\n expect(c2.args.isFirstMessage).toBe(false);\n expect(c2.args.swapSignatureTag).toBe(true);\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_context_module", "import_device_management_kit", "import_spl_token", "import_web3", "import_bs58", "import_buffer", "import_purify_ts", "import_vitest", "import_ProvideTLVDescriptorCommand", "import_ProvideTLVTransactionInstructionDescriptorCommand", "import_DefaultSolanaMessageNormaliser", "import_ProvideTransactionContextTask", "DUMMY_BLOCKHASH", "bs58", "makeSignedRawLegacy", "ixs", "signers", "feePayer", "payer", "tx", "seen", "uniq", "kp", "k", "makeSignedRawV0", "messageV0", "vtx", "makeKey", "base58", "buildNormaliser", "message", "api", "success", "baseCert", "tlvDescriptor", "tokenCert", "tokenDescriptor", "SIG", "context", "result", "first", "second", "task", "loadersResults", "third", "fourth", "errorResult", "tokenCmd", "normaliser", "c0", "c1", "c2", "dest1", "ix1", "owner", "srcToken", "dstToken", "ix2", "MEMO_PROGRAM_ID", "ix3", "raw", "SYSTEM_PID", "MEMO_PID", "sysDest", "sysIx", "mint", "ata", "ataIx", "memoIx", "ATA_PID", "res", "tokenOwner", "recipientOwner", "recipientATA", "createAtaIx", "srcTokenAcc", "transferIx"]
|
|
7
7
|
}
|
package/lib/cjs/package.json
CHANGED
|
@@ -1,64 +1,68 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
"dependencies": {
|
|
3
|
+
"@ledgerhq/context-module": "workspace:^",
|
|
4
|
+
"@ledgerhq/signer-utils": "workspace:^",
|
|
5
|
+
"@solana/spl-token": "catalog:",
|
|
6
|
+
"@solana/web3.js": "catalog:",
|
|
7
|
+
"bs58": "catalog:",
|
|
8
|
+
"buffer": "catalog:",
|
|
9
|
+
"inversify": "catalog:",
|
|
10
|
+
"purify-ts": "catalog:",
|
|
11
|
+
"reflect-metadata": "catalog:",
|
|
12
|
+
"semver": "catalog:",
|
|
13
|
+
"xstate": "catalog:"
|
|
14
|
+
},
|
|
15
|
+
"devDependencies": {
|
|
16
|
+
"@ledgerhq/device-management-kit": "workspace:^",
|
|
17
|
+
"@ledgerhq/eslint-config-dsdk": "workspace:^",
|
|
18
|
+
"@ledgerhq/ldmk-tool": "workspace:^",
|
|
19
|
+
"@ledgerhq/prettier-config-dsdk": "workspace:^",
|
|
20
|
+
"@ledgerhq/tsconfig-dsdk": "workspace:^",
|
|
21
|
+
"@ledgerhq/vitest-config-dmk": "workspace:^",
|
|
22
|
+
"@types/semver": "catalog:",
|
|
23
|
+
"rxjs": "catalog:",
|
|
24
|
+
"ts-node": "catalog:"
|
|
25
|
+
},
|
|
6
26
|
"exports": {
|
|
7
27
|
".": {
|
|
8
|
-
"types": "./lib/types/index.d.ts",
|
|
9
28
|
"import": "./lib/esm/index.js",
|
|
10
|
-
"require": "./lib/cjs/index.js"
|
|
29
|
+
"require": "./lib/cjs/index.js",
|
|
30
|
+
"types": "./lib/types/index.d.ts"
|
|
11
31
|
},
|
|
12
32
|
"./*": {
|
|
13
|
-
"types": "./lib/types/*",
|
|
14
33
|
"import": "./lib/esm/*",
|
|
15
|
-
"require": "./lib/cjs/*"
|
|
34
|
+
"require": "./lib/cjs/*",
|
|
35
|
+
"types": "./lib/types/*"
|
|
16
36
|
}
|
|
17
37
|
},
|
|
18
38
|
"files": [
|
|
19
39
|
"./lib"
|
|
20
40
|
],
|
|
41
|
+
"license": "Apache-2.0",
|
|
42
|
+
"name": "@ledgerhq/device-signer-kit-solana",
|
|
43
|
+
"peerDependencies": {
|
|
44
|
+
"@ledgerhq/device-management-kit": "workspace:^"
|
|
45
|
+
},
|
|
46
|
+
"private": false,
|
|
47
|
+
"repository": {
|
|
48
|
+
"type": "git",
|
|
49
|
+
"url": "https://github.com/LedgerHQ/device-sdk-ts.git"
|
|
50
|
+
},
|
|
21
51
|
"scripts": {
|
|
22
|
-
"prebuild": "rimraf lib",
|
|
23
52
|
"build": "pnpm ldmk-tool build --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
|
|
24
53
|
"dev": "concurrently \"pnpm watch:builds\" \"pnpm watch:types\"",
|
|
25
|
-
"watch:builds": "pnpm ldmk-tool watch --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
|
|
26
|
-
"watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\"",
|
|
27
54
|
"lint": "eslint",
|
|
28
55
|
"lint:fix": "pnpm lint --fix",
|
|
29
56
|
"postpack": "find . -name '*.tgz' -exec cp {} ../../../dist/ \\; ",
|
|
57
|
+
"prebuild": "rimraf lib",
|
|
30
58
|
"prettier": "prettier . --check",
|
|
31
59
|
"prettier:fix": "prettier . --write",
|
|
32
|
-
"typecheck": "tsc --noEmit",
|
|
33
60
|
"test": "vitest run",
|
|
61
|
+
"test:coverage": "vitest run --coverage",
|
|
34
62
|
"test:watch": "vitest",
|
|
35
|
-
"
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
"@ledgerhq/context-module": "workspace:*",
|
|
39
|
-
"@ledgerhq/signer-utils": "workspace:*",
|
|
40
|
-
"@solana/spl-token": "catalog:",
|
|
41
|
-
"@solana/web3.js": "catalog:",
|
|
42
|
-
"bs58": "catalog:",
|
|
43
|
-
"buffer": "catalog:",
|
|
44
|
-
"inversify": "catalog:",
|
|
45
|
-
"purify-ts": "catalog:",
|
|
46
|
-
"reflect-metadata": "catalog:",
|
|
47
|
-
"semver": "catalog:",
|
|
48
|
-
"xstate": "catalog:"
|
|
49
|
-
},
|
|
50
|
-
"devDependencies": {
|
|
51
|
-
"@ledgerhq/device-management-kit": "workspace:*",
|
|
52
|
-
"@ledgerhq/eslint-config-dsdk": "workspace:*",
|
|
53
|
-
"@ledgerhq/ldmk-tool": "workspace:*",
|
|
54
|
-
"@ledgerhq/prettier-config-dsdk": "workspace:*",
|
|
55
|
-
"@ledgerhq/tsconfig-dsdk": "workspace:*",
|
|
56
|
-
"@ledgerhq/vitest-config-dmk": "workspace:*",
|
|
57
|
-
"@types/semver": "catalog:",
|
|
58
|
-
"rxjs": "catalog:",
|
|
59
|
-
"ts-node": "catalog:"
|
|
63
|
+
"typecheck": "tsc --noEmit",
|
|
64
|
+
"watch:builds": "pnpm ldmk-tool watch --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
|
|
65
|
+
"watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
|
|
60
66
|
},
|
|
61
|
-
"
|
|
62
|
-
"@ledgerhq/device-management-kit": "workspace:*"
|
|
63
|
-
}
|
|
67
|
+
"version": "0.0.0-z-intent-queue-7-20251204111630"
|
|
64
68
|
}
|
|
@@ -1 +1,2 @@
|
|
|
1
|
+
const t=Object.freeze({OPEN_APP:"signer.sol.steps.openApp",GET_APP_CONFIG:"signer.sol.steps.getAppConfig",INSPECT_TRANSACTION:"signer.sol.steps.inspectTransaction",BUILD_TRANSACTION_CONTEXT:"signer.sol.steps.buildTransactionContext",PROVIDE_TRANSACTION_CONTEXT:"signer.sol.steps.provideTransactionContext",SIGN_TRANSACTION:"signer.sol.steps.signTransaction"});export{t as signTransactionDAStateSteps};
|
|
1
2
|
//# sourceMappingURL=SignTransactionDeviceActionTypes.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": [],
|
|
4
|
-
"sourcesContent": [],
|
|
5
|
-
"mappings": "",
|
|
6
|
-
"names": []
|
|
3
|
+
"sources": ["../../../../src/api/app-binder/SignTransactionDeviceActionTypes.ts"],
|
|
4
|
+
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport { type SolanaTransactionContextResultSuccess } from \"@ledgerhq/context-module/src/solana/domain/solanaContextTypes.js\";\nimport {\n type DeviceActionState,\n type ExecuteDeviceActionReturnType,\n type OpenAppDAError,\n type OpenAppDARequiredInteraction,\n type SendCommandInAppDAError,\n type UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { type SolanaTransactionOptionalConfig } from \"@api/model/SolanaTransactionOptionalConfig\";\nimport { type Transaction } from \"@api/model/Transaction\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { type TxInspectorResult } from \"@internal/app-binder/services/TransactionInspector\";\n\nexport const signTransactionDAStateSteps = Object.freeze({\n OPEN_APP: \"signer.sol.steps.openApp\",\n GET_APP_CONFIG: \"signer.sol.steps.getAppConfig\",\n INSPECT_TRANSACTION: \"signer.sol.steps.inspectTransaction\",\n BUILD_TRANSACTION_CONTEXT: \"signer.sol.steps.buildTransactionContext\",\n PROVIDE_TRANSACTION_CONTEXT: \"signer.sol.steps.provideTransactionContext\",\n SIGN_TRANSACTION: \"signer.sol.steps.signTransaction\",\n} as const);\n\nexport type SignTransactionDAStateStep =\n (typeof signTransactionDAStateSteps)[keyof typeof signTransactionDAStateSteps];\n\nexport type SignTransactionDAOutput = Signature;\n\nexport type SignTransactionDAInput = {\n readonly derivationPath: string;\n readonly transaction: Transaction;\n readonly transactionOptions?: SolanaTransactionOptionalConfig;\n readonly contextModule: ContextModule;\n};\n\nexport type SignTransactionDAError =\n | OpenAppDAError\n | SendCommandInAppDAError<SolanaAppErrorCodes>;\n\ntype SignTransactionDARequiredInteraction =\n | UserInteractionRequired\n | OpenAppDARequiredInteraction;\n\nexport type SignTransactionDAIntermediateValue = {\n requiredUserInteraction: SignTransactionDARequiredInteraction;\n step: SignTransactionDAStateStep;\n};\n\nexport type SignTransactionDAState = DeviceActionState<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n>;\n\nexport type SignTransactionDAInternalState = {\n readonly error: SignTransactionDAError | null;\n readonly signature: Signature | null;\n readonly appConfig: AppConfiguration | null;\n readonly solanaTransactionContext: SolanaTransactionContextResultSuccess | null;\n readonly inspectorResult: TxInspectorResult | null;\n};\n\nexport type SignTransactionDAReturnType = ExecuteDeviceActionReturnType<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n>;\n"],
|
|
5
|
+
"mappings": "AAkBO,MAAMA,EAA8B,OAAO,OAAO,CACvD,SAAU,2BACV,eAAgB,gCAChB,oBAAqB,sCACrB,0BAA2B,2CAC3B,4BAA6B,6CAC7B,iBAAkB,kCACpB,CAAU",
|
|
6
|
+
"names": ["signTransactionDAStateSteps"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/internal/DefaultSignerSolana.ts"],
|
|
4
|
-
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n type DeviceManagementKit,\n type DeviceSessionId,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Container } from \"inversify\";\n\nimport { type GetAddressDAReturnType } from \"@api/app-binder/GetAddressDeviceActionTypes\";\nimport { type GetAppConfigurationDAReturnType } from \"@api/app-binder/GetAppConfigurationDeviceActionTypes\";\nimport { type SignMessageDAReturnType } from \"@api/app-binder/SignMessageDeviceActionTypes\";\nimport { type SignTransactionDAReturnType } from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type AddressOptions } from \"@api/model/AddressOption\";\nimport { type MessageOptions } from \"@api/model/MessageOptions\";\nimport { type SolanaTransactionOptionalConfig } from \"@api/model/SolanaTransactionOptionalConfig\";\nimport { type Transaction } from \"@api/model/Transaction\";\nimport { type SignerSolana } from \"@api/SignerSolana\";\n\nimport { type GetAddressUseCase } from \"./use-cases/address/GetAddressUseCase\";\nimport { type GetAppConfigurationUseCase } from \"./use-cases/app-configuration/GetAppConfigurationUseCase\";\nimport { useCasesTypes } from \"./use-cases/di/useCasesTypes\";\nimport { type SignMessageUseCase } from \"./use-cases/message/SignMessageUseCase\";\nimport { type SignTransactionUseCase } from \"./use-cases/transaction/SignTransactionUseCase\";\nimport { makeContainer } from \"./di\";\n\nexport type DefaultSignerSolanaConstructorArgs = {\n dmk: DeviceManagementKit;\n sessionId: DeviceSessionId;\n contextModule: ContextModule;\n};\n\nexport class DefaultSignerSolana implements SignerSolana {\n private _container: Container;\n\n constructor({\n dmk,\n sessionId,\n contextModule,\n }: DefaultSignerSolanaConstructorArgs) {\n this._container = makeContainer({ dmk, sessionId, contextModule });\n }\n\n /**\n * ## signTransaction\n * #### Securely sign a Solana or SPL transaction using **clear signing** on Ledger devices.\n * ---\n * ### Parameters\n *\n * **Required**\n * - **derivationPath** `string`\n * The derivation path used in the transaction.\n *\n * - **transaction** `Uint8Array`\n * The serialised transaction to sign.\n *\n * **Optional**\n * - **options** `SolanaTransactionOptionalConfig`\n * Provides additional context for transaction signing.\n *\n * - **transactionResolutionContext** `object`\n * Lets you explicitly pass `tokenAddress` and ATA details, bypassing extraction from the transaction itself.\n *\n * - **tokenAddress** `string`\n * SPL token address being transferred.\n *\n * - **createATA** `object`\n * Information about creating an associated token account (ATA).\n *\n * - **address** `string` \u2013 Address (owner) of the ATA.\n * - **mintAddress** `string` \u2013 Mint address of the ATA.\n *\n * - **solanaRPCURL** `string`\n * RPC endpoint to use if `transactionResolutionContext` is not provided\n * and parsing requires network lookups.\n * In browser environments, use a CORS-enabled RPC URL.\n * Defaults to: `\"https://api.mainnet-beta.solana.com/\"`.\n *\n * - **skipOpenApp** `boolean`\n * If `true`, skips opening the Solana app on the device.\n *\n * ---\n * ### Returns\n *\n * - `observable` That emits DeviceActionState updates\n * - `cancel` A function to cancel the action on the Ledger device.\n *\n * ---\n * ### Internal Flow\n *\n * Under the hood, this method subscribes to an\n * `Observable<DeviceActionState<Uint8Array, SignTransactionDAError, IntermediateValue>>`.\n *\n * #### DeviceActionState\n * Represents the lifecycle of a device action:\n *\n * ```ts\n * type DeviceActionState<Output, Error, IntermediateValue> =\n * | { status: DeviceActionStatus.NotStarted }\n * | { status: DeviceActionStatus.Pending; intermediateValue: IntermediateValue }\n * | { status: DeviceActionStatus.Stopped }\n * | { status: DeviceActionStatus.Completed; output: Output }\n * | { status: DeviceActionStatus.Error; error: Error };\n *\n * enum DeviceActionStatus {\n * NotStarted = \"not-started\",\n * Pending = \"pending\",\n * Stopped = \"stopped\",\n * Completed = \"completed\",\n * Error = \"error\"\n * }\n * ```\n *\n * - **NotStarted** \u2192 Action hasn\u2019t begun.\n * - **Pending** \u2192 Waiting for user confirmation on the device.\n * Includes an `intermediateValue` of type `IntermediateValue`.\n * - **Stopped** \u2192 Action was cancelled before completion.\n * - **Completed** \u2192 Provides the signed transaction bytes (`Uint8Array`).\n * - **Error** \u2192 The device or signing operation failed (`SignTransactionDAError`).\n *\n * ---\n * ### Example\n *\n * ```ts\n * const { observable } = signerSolana.signTransaction(\"m/44'/501'/0'/0'\", serializedTx, {\n * transactionResolutionContext: resolution,\n * });\n * observable.subscribe({\n * next: state => {\n * if (state.status === DeviceActionStatus.Pending) {\n * console.log(\"Waiting for user action...\", state.intermediateValue);\n * }\n * if (state.status === DeviceActionStatus.Completed) {\n * console.log(\"Signature:\", state.output);\n * }\n * },\n * error: err => console.error(\"Error:\", err),\n * });\n * ```\n */\n signTransaction(\n derivationPath: string,\n transaction: Transaction,\n solanaTransactionOptionalConfig?: SolanaTransactionOptionalConfig,\n ): SignTransactionDAReturnType {\n return this._container\n .get<SignTransactionUseCase>(useCasesTypes.SignTransactionUseCase)\n .execute(derivationPath, transaction, solanaTransactionOptionalConfig);\n }\n\n /**\n * ## signMessage\n * #### Securely sign an arbitrary message on Ledger devices.\n * ---\n * ### Parameters\n *\n * **Required**\n * - **derivationPath** `string`\n * The derivation path used for signing.\n *\n * - **message** `string (hex-encoded)`\n * The message to sign, provided as a hex string.\n *\n * **Optional**\n * - **options** `MessageOptions`\n * - **skipOpenApp** `boolean`\n * If `true`, skips opening the Solana app on the device.\n *\n * ---\n * ### Returns\n *\n * - `observable` That emits DeviceActionState updates\n * - `cancel` A function to cancel the action on the Ledger device.\n *\n * ---\n * ### Internal Flow\n *\n * Under the hood, this method subscribes to an\n * `Observable<DeviceActionState<Uint8Array, SignMessageDAError, IntermediateValue>>`.\n *\n * #### DeviceActionState\n * Represents the lifecycle of a device action:\n *\n * ```ts\n * type DeviceActionState<Output, Error, IntermediateValue> =\n * | { status: DeviceActionStatus.NotStarted }\n * | { status: DeviceActionStatus.Pending; intermediateValue: IntermediateValue }\n * | { status: DeviceActionStatus.Stopped }\n * | { status: DeviceActionStatus.Completed; output: Output }\n * | { status: DeviceActionStatus.Error; error: Error };\n *\n * enum DeviceActionStatus {\n * NotStarted = \"not-started\",\n * Pending = \"pending\",\n * Stopped = \"stopped\",\n * Completed = \"completed\",\n * Error = \"error\"\n * }\n * ```\n *\n * - **NotStarted** \u2192 Action hasn\u2019t begun.\n * - **Pending** \u2192 Waiting for user confirmation on the device.\n * Includes an `intermediateValue` of type `IntermediateValue`.\n * - **Stopped** \u2192 Action was cancelled before completion.\n * - **Completed** \u2192 Provides the signed message bytes (`Uint8Array`).\n * - **Error** \u2192 The device or signing operation failed (`SignMessageDAError`).\n *\n * ---\n * ### Example\n *\n * ```ts\n * const { observable } = signerSolana.signMessage(\n * \"m/44'/501'/0'/0'\",\n * \"48656c6c6f20576f726c64\" // hex string\n * );\n * observable.subscribe({\n * next: state => {\n * if (state.status === DeviceActionStatus.Pending) {\n * console.log(\"Waiting for user action...\", state.intermediateValue);\n * }\n * if (state.status === DeviceActionStatus.Completed) {\n * console.log(\"Signature:\", state.output);\n * }\n * },\n * error: err => console.error(\"Error:\", err),\n * });\n * ```\n */\n signMessage(\n derivationPath: string,\n message: string,\n options?: MessageOptions,\n ): SignMessageDAReturnType {\n return this._container\n .get<SignMessageUseCase>(useCasesTypes.SignMessageUseCase)\n .execute(derivationPath, message, options);\n }\n\n /**\n * ## getAddress\n * #### Retrieve a Solana address from Ledger devices.\n * ---\n * ### Parameters\n *\n * **Required**\n * - **derivationPath** `string`\n * The derivation path of the account to retrieve the address from.\n *\n * **Optional**\n * - **options** `AddressOptions`\n * - **checkOnDevice** `boolean`\n * If `true`, prompts the user to verify the address on the device.\n *\n * - **skipOpenApp** `boolean`\n * If `true`, skips opening the Solana app on the device.\n *\n * ---\n * ### Returns\n *\n * - `observable` That emits DeviceActionState updates\n * - `cancel` A function to cancel the action on the Ledger device.\n *\n * ---\n * ### Internal Flow\n *\n * Under the hood, this method subscribes to an\n * `Observable<DeviceActionState<string, GetAddressDAError, IntermediateValue>>`.\n *\n * #### DeviceActionState\n * Represents the lifecycle of a device action:\n *\n * ```ts\n * type DeviceActionState<Output, Error, IntermediateValue> =\n * | { status: DeviceActionStatus.NotStarted }\n * | { status: DeviceActionStatus.Pending; intermediateValue: IntermediateValue }\n * | { status: DeviceActionStatus.Stopped }\n * | { status: DeviceActionStatus.Completed; output: Output }\n * | { status: DeviceActionStatus.Error; error: Error };\n *\n * enum DeviceActionStatus {\n * NotStarted = \"not-started\",\n * Pending = \"pending\",\n * Stopped = \"stopped\",\n * Completed = \"completed\",\n * Error = \"error\"\n * }\n * ```\n *\n * - **NotStarted** \u2192 Action hasn\u2019t begun.\n * - **Pending** \u2192 Waiting for user confirmation on the device.\n * Includes an `intermediateValue` of type `IntermediateValue`.\n * - **Stopped** \u2192 Action was cancelled before completion.\n * - **Completed** \u2192 Provides the base58-encoded address string, decoded to `Uint8Array`.\n * - **Error** \u2192 The device or signing operation failed (`GetAddressDAError`).\n *\n */\n getAddress(\n derivationPath: string,\n options?: AddressOptions,\n ): GetAddressDAReturnType {\n return this._container\n .get<GetAddressUseCase>(useCasesTypes.GetAddressUseCase)\n .execute(derivationPath, options);\n }\n\n /**\n * ## getAppConfiguration\n * #### Retrieve the current Solana app configuration from a Ledger device.\n * ---\n * ### Parameters\n *\n * This method does not require any parameters.\n *\n * ---\n * ### Returns\n *\n * - `observable` That emits DeviceActionState updates\n * - `cancel` A function to cancel the action on the Ledger device.\n *\n * ---\n * ### Internal Flow\n *\n * Under the hood, this method subscribes to an\n * `Observable<DeviceActionState<GetAppConfigurationResult, Error, IntermediateValue>>`.\n *\n * #### DeviceActionState\n * Represents the lifecycle of a device action:\n *\n * ```ts\n * type DeviceActionState<Output, Error, IntermediateValue> =\n * | { status: DeviceActionStatus.NotStarted }\n * | { status: DeviceActionStatus.Pending; intermediateValue: IntermediateValue }\n * | { status: DeviceActionStatus.Stopped }\n * | { status: DeviceActionStatus.Completed; output: Output }\n * | { status: DeviceActionStatus.Error; error: Error };\n *\n * enum DeviceActionStatus {\n * NotStarted = \"not-started\",\n * Pending = \"pending\",\n * Stopped = \"stopped\",\n * Completed = \"completed\",\n * Error = \"error\"\n * }\n * ```\n *\n * - **NotStarted** \u2192 Action hasn\u2019t begun.\n * - **Pending** \u2192 Waiting for user confirmation on the device.\n * Includes an `intermediateValue` of type `IntermediateValue`.\n * - **Stopped** \u2192 Action was cancelled before completion.\n * - **Completed** \u2192 Provides the app configuration object.\n * - **Error** \u2192 The device or signing operation failed.\n *\n * ---\n * ### Example\n *\n * ```ts\n * const config = await signerSolana.getAppConfiguration();\n * console.log(config.version, config.flags);\n * ```\n */\n getAppConfiguration(): GetAppConfigurationDAReturnType {\n return this._container\n .get<GetAppConfigurationUseCase>(useCasesTypes.GetAppConfigurationUseCase)\n .execute();\n }\n}\n"],
|
|
5
|
-
"mappings": "AAmBA,OAAS,iBAAAA,MAAqB,+BAG9B,OAAS,iBAAAC,MAAqB,OAQvB,MAAMC,CAA4C,CAC/C,WAER,YAAY,CACV,IAAAC,EACA,UAAAC,EACA,cAAAC,CACF,EAAuC,CACrC,KAAK,WAAaJ,EAAc,CAAE,IAAAE,EAAK,UAAAC,EAAW,cAAAC,CAAc,CAAC,CACnE,
|
|
4
|
+
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n type DeviceManagementKit,\n type DeviceSessionId,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Container } from \"inversify\";\n\nimport { type GetAddressDAReturnType } from \"@api/app-binder/GetAddressDeviceActionTypes\";\nimport { type GetAppConfigurationDAReturnType } from \"@api/app-binder/GetAppConfigurationDeviceActionTypes\";\nimport { type SignMessageDAReturnType } from \"@api/app-binder/SignMessageDeviceActionTypes\";\nimport { type SignTransactionDAReturnType } from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type AddressOptions } from \"@api/model/AddressOption\";\nimport { type MessageOptions } from \"@api/model/MessageOptions\";\nimport { type SolanaTransactionOptionalConfig } from \"@api/model/SolanaTransactionOptionalConfig\";\nimport { type Transaction } from \"@api/model/Transaction\";\nimport { type SignerSolana } from \"@api/SignerSolana\";\n\nimport { type GetAddressUseCase } from \"./use-cases/address/GetAddressUseCase\";\nimport { type GetAppConfigurationUseCase } from \"./use-cases/app-configuration/GetAppConfigurationUseCase\";\nimport { useCasesTypes } from \"./use-cases/di/useCasesTypes\";\nimport { type SignMessageUseCase } from \"./use-cases/message/SignMessageUseCase\";\nimport { type SignTransactionUseCase } from \"./use-cases/transaction/SignTransactionUseCase\";\nimport { makeContainer } from \"./di\";\n\nexport type DefaultSignerSolanaConstructorArgs = {\n dmk: DeviceManagementKit;\n sessionId: DeviceSessionId;\n contextModule: ContextModule;\n};\n\nexport class DefaultSignerSolana implements SignerSolana {\n private _container: Container;\n\n constructor({\n dmk,\n sessionId,\n contextModule,\n }: DefaultSignerSolanaConstructorArgs) {\n this._container = makeContainer({ dmk, sessionId, contextModule });\n }\n\n /**\n * ## signTransaction\n * #### Securely sign a Solana or SPL transaction using **clear signing** on Ledger devices.\n * ---\n * ### Parameters\n *\n * **Required**\n * - **derivationPath** `string`\n * The derivation path used in the transaction.\n *\n * - **transaction** `Uint8Array`\n * The serialised transaction to sign.\n *\n * **Optional**\n * - **options** `SolanaTransactionOptionalConfig`\n * Provides additional context for transaction signing.\n *\n * - **transactionResolutionContext** `object`\n * Lets you explicitly pass `tokenAddress` and ATA details, bypassing extraction from the transaction itself.\n *\n * - **tokenAddress** `string`\n * SPL token address being transferred.\n *\n * - **createATA** `object`\n * Information about creating an associated token account (ATA).\n *\n * - **address** `string` \u2013 Address (owner) of the ATA.\n * - **mintAddress** `string` \u2013 Mint address of the ATA.\n *\n * - **tokenInternalId** `string`\n * Ledger internal token ID\n *\n * - **solanaRPCURL** `string`\n * RPC endpoint to use if `transactionResolutionContext` is not provided\n * and parsing requires network lookups.\n * In browser environments, use a CORS-enabled RPC URL.\n * Defaults to: `\"https://api.mainnet-beta.solana.com/\"`.\n *\n * - **skipOpenApp** `boolean`\n * If `true`, skips opening the Solana app on the device.\n *\n * ---\n * ### Returns\n *\n * - `observable` That emits DeviceActionState updates\n * - `cancel` A function to cancel the action on the Ledger device.\n *\n * ---\n * ### Internal Flow\n *\n * Under the hood, this method subscribes to an\n * `Observable<DeviceActionState<Uint8Array, SignTransactionDAError, IntermediateValue>>`.\n *\n * #### DeviceActionState\n * Represents the lifecycle of a device action:\n *\n * ```ts\n * type DeviceActionState<Output, Error, IntermediateValue> =\n * | { status: DeviceActionStatus.NotStarted }\n * | { status: DeviceActionStatus.Pending; intermediateValue: IntermediateValue }\n * | { status: DeviceActionStatus.Stopped }\n * | { status: DeviceActionStatus.Completed; output: Output }\n * | { status: DeviceActionStatus.Error; error: Error };\n *\n * enum DeviceActionStatus {\n * NotStarted = \"not-started\",\n * Pending = \"pending\",\n * Stopped = \"stopped\",\n * Completed = \"completed\",\n * Error = \"error\"\n * }\n * ```\n *\n * - **NotStarted** \u2192 Action hasn\u2019t begun.\n * - **Pending** \u2192 Waiting for user confirmation on the device.\n * Includes an `intermediateValue` of type `IntermediateValue`.\n * - **Stopped** \u2192 Action was cancelled before completion.\n * - **Completed** \u2192 Provides the signed transaction bytes (`Uint8Array`).\n * - **Error** \u2192 The device or signing operation failed (`SignTransactionDAError`).\n *\n * ---\n * ### Example\n *\n * ```ts\n * const { observable } = signerSolana.signTransaction(\"m/44'/501'/0'/0'\", serializedTx, {\n * transactionResolutionContext: resolution,\n * });\n * observable.subscribe({\n * next: state => {\n * if (state.status === DeviceActionStatus.Pending) {\n * console.log(\"Waiting for user action...\", state.intermediateValue);\n * }\n * if (state.status === DeviceActionStatus.Completed) {\n * console.log(\"Signature:\", state.output);\n * }\n * },\n * error: err => console.error(\"Error:\", err),\n * });\n * ```\n */\n signTransaction(\n derivationPath: string,\n transaction: Transaction,\n solanaTransactionOptionalConfig?: SolanaTransactionOptionalConfig,\n ): SignTransactionDAReturnType {\n return this._container\n .get<SignTransactionUseCase>(useCasesTypes.SignTransactionUseCase)\n .execute(derivationPath, transaction, solanaTransactionOptionalConfig);\n }\n\n /**\n * ## signMessage\n * #### Securely sign an arbitrary message on Ledger devices.\n * ---\n * ### Parameters\n *\n * **Required**\n * - **derivationPath** `string`\n * The derivation path used for signing.\n *\n * - **message** `string (hex-encoded)`\n * The message to sign, provided as a hex string.\n *\n * **Optional**\n * - **options** `MessageOptions`\n * - **skipOpenApp** `boolean`\n * If `true`, skips opening the Solana app on the device.\n *\n * ---\n * ### Returns\n *\n * - `observable` That emits DeviceActionState updates\n * - `cancel` A function to cancel the action on the Ledger device.\n *\n * ---\n * ### Internal Flow\n *\n * Under the hood, this method subscribes to an\n * `Observable<DeviceActionState<Uint8Array, SignMessageDAError, IntermediateValue>>`.\n *\n * #### DeviceActionState\n * Represents the lifecycle of a device action:\n *\n * ```ts\n * type DeviceActionState<Output, Error, IntermediateValue> =\n * | { status: DeviceActionStatus.NotStarted }\n * | { status: DeviceActionStatus.Pending; intermediateValue: IntermediateValue }\n * | { status: DeviceActionStatus.Stopped }\n * | { status: DeviceActionStatus.Completed; output: Output }\n * | { status: DeviceActionStatus.Error; error: Error };\n *\n * enum DeviceActionStatus {\n * NotStarted = \"not-started\",\n * Pending = \"pending\",\n * Stopped = \"stopped\",\n * Completed = \"completed\",\n * Error = \"error\"\n * }\n * ```\n *\n * - **NotStarted** \u2192 Action hasn\u2019t begun.\n * - **Pending** \u2192 Waiting for user confirmation on the device.\n * Includes an `intermediateValue` of type `IntermediateValue`.\n * - **Stopped** \u2192 Action was cancelled before completion.\n * - **Completed** \u2192 Provides the signed message bytes (`Uint8Array`).\n * - **Error** \u2192 The device or signing operation failed (`SignMessageDAError`).\n *\n * ---\n * ### Example\n *\n * ```ts\n * const { observable } = signerSolana.signMessage(\n * \"m/44'/501'/0'/0'\",\n * \"48656c6c6f20576f726c64\" // hex string\n * );\n * observable.subscribe({\n * next: state => {\n * if (state.status === DeviceActionStatus.Pending) {\n * console.log(\"Waiting for user action...\", state.intermediateValue);\n * }\n * if (state.status === DeviceActionStatus.Completed) {\n * console.log(\"Signature:\", state.output);\n * }\n * },\n * error: err => console.error(\"Error:\", err),\n * });\n * ```\n */\n signMessage(\n derivationPath: string,\n message: string,\n options?: MessageOptions,\n ): SignMessageDAReturnType {\n return this._container\n .get<SignMessageUseCase>(useCasesTypes.SignMessageUseCase)\n .execute(derivationPath, message, options);\n }\n\n /**\n * ## getAddress\n * #### Retrieve a Solana address from Ledger devices.\n * ---\n * ### Parameters\n *\n * **Required**\n * - **derivationPath** `string`\n * The derivation path of the account to retrieve the address from.\n *\n * **Optional**\n * - **options** `AddressOptions`\n * - **checkOnDevice** `boolean`\n * If `true`, prompts the user to verify the address on the device.\n *\n * - **skipOpenApp** `boolean`\n * If `true`, skips opening the Solana app on the device.\n *\n * ---\n * ### Returns\n *\n * - `observable` That emits DeviceActionState updates\n * - `cancel` A function to cancel the action on the Ledger device.\n *\n * ---\n * ### Internal Flow\n *\n * Under the hood, this method subscribes to an\n * `Observable<DeviceActionState<string, GetAddressDAError, IntermediateValue>>`.\n *\n * #### DeviceActionState\n * Represents the lifecycle of a device action:\n *\n * ```ts\n * type DeviceActionState<Output, Error, IntermediateValue> =\n * | { status: DeviceActionStatus.NotStarted }\n * | { status: DeviceActionStatus.Pending; intermediateValue: IntermediateValue }\n * | { status: DeviceActionStatus.Stopped }\n * | { status: DeviceActionStatus.Completed; output: Output }\n * | { status: DeviceActionStatus.Error; error: Error };\n *\n * enum DeviceActionStatus {\n * NotStarted = \"not-started\",\n * Pending = \"pending\",\n * Stopped = \"stopped\",\n * Completed = \"completed\",\n * Error = \"error\"\n * }\n * ```\n *\n * - **NotStarted** \u2192 Action hasn\u2019t begun.\n * - **Pending** \u2192 Waiting for user confirmation on the device.\n * Includes an `intermediateValue` of type `IntermediateValue`.\n * - **Stopped** \u2192 Action was cancelled before completion.\n * - **Completed** \u2192 Provides the base58-encoded address string, decoded to `Uint8Array`.\n * - **Error** \u2192 The device or signing operation failed (`GetAddressDAError`).\n *\n */\n getAddress(\n derivationPath: string,\n options?: AddressOptions,\n ): GetAddressDAReturnType {\n return this._container\n .get<GetAddressUseCase>(useCasesTypes.GetAddressUseCase)\n .execute(derivationPath, options);\n }\n\n /**\n * ## getAppConfiguration\n * #### Retrieve the current Solana app configuration from a Ledger device.\n * ---\n * ### Parameters\n *\n * This method does not require any parameters.\n *\n * ---\n * ### Returns\n *\n * - `observable` That emits DeviceActionState updates\n * - `cancel` A function to cancel the action on the Ledger device.\n *\n * ---\n * ### Internal Flow\n *\n * Under the hood, this method subscribes to an\n * `Observable<DeviceActionState<GetAppConfigurationResult, Error, IntermediateValue>>`.\n *\n * #### DeviceActionState\n * Represents the lifecycle of a device action:\n *\n * ```ts\n * type DeviceActionState<Output, Error, IntermediateValue> =\n * | { status: DeviceActionStatus.NotStarted }\n * | { status: DeviceActionStatus.Pending; intermediateValue: IntermediateValue }\n * | { status: DeviceActionStatus.Stopped }\n * | { status: DeviceActionStatus.Completed; output: Output }\n * | { status: DeviceActionStatus.Error; error: Error };\n *\n * enum DeviceActionStatus {\n * NotStarted = \"not-started\",\n * Pending = \"pending\",\n * Stopped = \"stopped\",\n * Completed = \"completed\",\n * Error = \"error\"\n * }\n * ```\n *\n * - **NotStarted** \u2192 Action hasn\u2019t begun.\n * - **Pending** \u2192 Waiting for user confirmation on the device.\n * Includes an `intermediateValue` of type `IntermediateValue`.\n * - **Stopped** \u2192 Action was cancelled before completion.\n * - **Completed** \u2192 Provides the app configuration object.\n * - **Error** \u2192 The device or signing operation failed.\n *\n * ---\n * ### Example\n *\n * ```ts\n * const config = await signerSolana.getAppConfiguration();\n * console.log(config.version, config.flags);\n * ```\n */\n getAppConfiguration(): GetAppConfigurationDAReturnType {\n return this._container\n .get<GetAppConfigurationUseCase>(useCasesTypes.GetAppConfigurationUseCase)\n .execute();\n }\n}\n"],
|
|
5
|
+
"mappings": "AAmBA,OAAS,iBAAAA,MAAqB,+BAG9B,OAAS,iBAAAC,MAAqB,OAQvB,MAAMC,CAA4C,CAC/C,WAER,YAAY,CACV,IAAAC,EACA,UAAAC,EACA,cAAAC,CACF,EAAuC,CACrC,KAAK,WAAaJ,EAAc,CAAE,IAAAE,EAAK,UAAAC,EAAW,cAAAC,CAAc,CAAC,CACnE,CAsGA,gBACEC,EACAC,EACAC,EAC6B,CAC7B,OAAO,KAAK,WACT,IAA4BR,EAAc,sBAAsB,EAChE,QAAQM,EAAgBC,EAAaC,CAA+B,CACzE,CAgFA,YACEF,EACAG,EACAC,EACyB,CACzB,OAAO,KAAK,WACT,IAAwBV,EAAc,kBAAkB,EACxD,QAAQM,EAAgBG,EAASC,CAAO,CAC7C,CA4DA,WACEJ,EACAI,EACwB,CACxB,OAAO,KAAK,WACT,IAAuBV,EAAc,iBAAiB,EACtD,QAAQM,EAAgBI,CAAO,CACpC,CAyDA,qBAAuD,CACrD,OAAO,KAAK,WACT,IAAgCV,EAAc,0BAA0B,EACxE,QAAQ,CACb,CACF",
|
|
6
6
|
"names": ["useCasesTypes", "makeContainer", "DefaultSignerSolana", "dmk", "sessionId", "contextModule", "derivationPath", "transaction", "solanaTransactionOptionalConfig", "message", "options"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ApduBuilder as t,ApduParser as i,CommandResultFactory as e,InvalidStatusWordError as m}from"@ledgerhq/device-management-kit";import{CommandErrorHelper as d}from"@ledgerhq/signer-utils";import{Maybe as s}from"purify-ts";import{PublicKeyDisplayMode as n}from"../../../api/model/PublicKeyDisplayMode";import{SOLANA_APP_ERRORS as u,SolanaAppCommandErrorFactory as l}from"./utils/SolanaApplicationErrors";class R{errorHelper=new d(u,l);args;constructor(o){this.args=o}getApdu(){return new t({cla:224,ins:4,p1:0,p2:0}).build()}parseResponse(o){return s.fromNullable(this.errorHelper.getError(o)).orDefaultLazy(()=>{const r=new i(o).extractFieldByLength(5);if(!r||r.length!==5||r.some(a=>a===void 0))return e({error:new m("Invalid response")});const p={blindSigningEnabled:!!r[0],pubKeyDisplayMode:r[1]===0?n.LONG:n.SHORT,version:`${r[2]}.${r[3]}.${r[4]}`};return e({data:p})})}}export{R as GetAppConfigurationCommand};
|
|
1
|
+
import{ApduBuilder as t,ApduParser as i,CommandResultFactory as e,InvalidStatusWordError as m}from"@ledgerhq/device-management-kit";import{CommandErrorHelper as d}from"@ledgerhq/signer-utils";import{Maybe as s}from"purify-ts";import{PublicKeyDisplayMode as n}from"../../../api/model/PublicKeyDisplayMode";import{SOLANA_APP_ERRORS as u,SolanaAppCommandErrorFactory as l}from"./utils/SolanaApplicationErrors";class R{name="getAppConfiguration";errorHelper=new d(u,l);args;constructor(o){this.args=o}getApdu(){return new t({cla:224,ins:4,p1:0,p2:0}).build()}parseResponse(o){return s.fromNullable(this.errorHelper.getError(o)).orDefaultLazy(()=>{const r=new i(o).extractFieldByLength(5);if(!r||r.length!==5||r.some(a=>a===void 0))return e({error:new m("Invalid response")});const p={blindSigningEnabled:!!r[0],pubKeyDisplayMode:r[1]===0?n.LONG:n.SHORT,version:`${r[2]}.${r[3]}.${r[4]}`};return e({data:p})})}}export{R as GetAppConfigurationCommand};
|
|
2
2
|
//# sourceMappingURL=GetAppConfigurationCommand.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/command/GetAppConfigurationCommand.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\nimport { CommandErrorHelper } from \"@ledgerhq/signer-utils\";\nimport { Maybe } from \"purify-ts\";\n\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { PublicKeyDisplayMode } from \"@api/model/PublicKeyDisplayMode\";\n\nimport {\n SOLANA_APP_ERRORS,\n SolanaAppCommandErrorFactory,\n type SolanaAppErrorCodes,\n} from \"./utils/SolanaApplicationErrors\";\n\ntype GetAppConfigurationCommandArgs = void;\n\nexport class GetAppConfigurationCommand\n implements\n Command<\n AppConfiguration,\n GetAppConfigurationCommandArgs,\n SolanaAppErrorCodes\n >\n{\n private readonly errorHelper = new CommandErrorHelper<\n AppConfiguration,\n SolanaAppErrorCodes\n >(SOLANA_APP_ERRORS, SolanaAppCommandErrorFactory);\n\n args: GetAppConfigurationCommandArgs;\n\n constructor(args: GetAppConfigurationCommandArgs) {\n this.args = args;\n }\n\n getApdu(): Apdu {\n return new ApduBuilder({\n cla: 0xe0,\n ins: 0x04,\n p1: 0x00,\n p2: 0x00,\n }).build();\n }\n\n parseResponse(\n response: ApduResponse,\n ): CommandResult<AppConfiguration, SolanaAppErrorCodes> {\n return Maybe.fromNullable(\n this.errorHelper.getError(response),\n ).orDefaultLazy(() => {\n const parser = new ApduParser(response);\n const buffer = parser.extractFieldByLength(5);\n if (\n !buffer ||\n buffer.length !== 5 ||\n buffer.some((element) => element === undefined)\n ) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"Invalid response\"),\n });\n }\n\n const config: AppConfiguration = {\n blindSigningEnabled: Boolean(buffer[0]),\n pubKeyDisplayMode:\n buffer[1] === 0\n ? PublicKeyDisplayMode.LONG\n : PublicKeyDisplayMode.SHORT,\n version: `${buffer[2]}.${buffer[3]}.${buffer[4]}`,\n };\n\n return CommandResultFactory({\n data: config,\n });\n });\n }\n}\n"],
|
|
5
|
-
"mappings": "AAAA,OAEE,eAAAA,EACA,cAAAC,EAIA,wBAAAC,EACA,0BAAAC,MACK,kCACP,OAAS,sBAAAC,MAA0B,yBACnC,OAAS,SAAAC,MAAa,YAGtB,OAAS,wBAAAC,MAA4B,kCAErC,OACE,qBAAAC,EACA,gCAAAC,MAEK,kCAIA,MAAMC,CAOb,
|
|
4
|
+
"sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\nimport { CommandErrorHelper } from \"@ledgerhq/signer-utils\";\nimport { Maybe } from \"purify-ts\";\n\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { PublicKeyDisplayMode } from \"@api/model/PublicKeyDisplayMode\";\n\nimport {\n SOLANA_APP_ERRORS,\n SolanaAppCommandErrorFactory,\n type SolanaAppErrorCodes,\n} from \"./utils/SolanaApplicationErrors\";\n\ntype GetAppConfigurationCommandArgs = void;\n\nexport class GetAppConfigurationCommand\n implements\n Command<\n AppConfiguration,\n GetAppConfigurationCommandArgs,\n SolanaAppErrorCodes\n >\n{\n readonly name = \"getAppConfiguration\";\n private readonly errorHelper = new CommandErrorHelper<\n AppConfiguration,\n SolanaAppErrorCodes\n >(SOLANA_APP_ERRORS, SolanaAppCommandErrorFactory);\n\n args: GetAppConfigurationCommandArgs;\n\n constructor(args: GetAppConfigurationCommandArgs) {\n this.args = args;\n }\n\n getApdu(): Apdu {\n return new ApduBuilder({\n cla: 0xe0,\n ins: 0x04,\n p1: 0x00,\n p2: 0x00,\n }).build();\n }\n\n parseResponse(\n response: ApduResponse,\n ): CommandResult<AppConfiguration, SolanaAppErrorCodes> {\n return Maybe.fromNullable(\n this.errorHelper.getError(response),\n ).orDefaultLazy(() => {\n const parser = new ApduParser(response);\n const buffer = parser.extractFieldByLength(5);\n if (\n !buffer ||\n buffer.length !== 5 ||\n buffer.some((element) => element === undefined)\n ) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"Invalid response\"),\n });\n }\n\n const config: AppConfiguration = {\n blindSigningEnabled: Boolean(buffer[0]),\n pubKeyDisplayMode:\n buffer[1] === 0\n ? PublicKeyDisplayMode.LONG\n : PublicKeyDisplayMode.SHORT,\n version: `${buffer[2]}.${buffer[3]}.${buffer[4]}`,\n };\n\n return CommandResultFactory({\n data: config,\n });\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAEE,eAAAA,EACA,cAAAC,EAIA,wBAAAC,EACA,0BAAAC,MACK,kCACP,OAAS,sBAAAC,MAA0B,yBACnC,OAAS,SAAAC,MAAa,YAGtB,OAAS,wBAAAC,MAA4B,kCAErC,OACE,qBAAAC,EACA,gCAAAC,MAEK,kCAIA,MAAMC,CAOb,CACW,KAAO,sBACC,YAAc,IAAIL,EAGjCG,EAAmBC,CAA4B,EAEjD,KAEA,YAAYE,EAAsC,CAChD,KAAK,KAAOA,CACd,CAEA,SAAgB,CACd,OAAO,IAAIV,EAAY,CACrB,IAAK,IACL,IAAK,EACL,GAAI,EACJ,GAAI,CACN,CAAC,EAAE,MAAM,CACX,CAEA,cACEW,EACsD,CACtD,OAAON,EAAM,aACX,KAAK,YAAY,SAASM,CAAQ,CACpC,EAAE,cAAc,IAAM,CAEpB,MAAMC,EADS,IAAIX,EAAWU,CAAQ,EAChB,qBAAqB,CAAC,EAC5C,GACE,CAACC,GACDA,EAAO,SAAW,GAClBA,EAAO,KAAMC,GAAYA,IAAY,MAAS,EAE9C,OAAOX,EAAqB,CAC1B,MAAO,IAAIC,EAAuB,kBAAkB,CACtD,CAAC,EAGH,MAAMW,EAA2B,CAC/B,oBAAqB,EAAQF,EAAO,CAAC,EACrC,kBACEA,EAAO,CAAC,IAAM,EACVN,EAAqB,KACrBA,EAAqB,MAC3B,QAAS,GAAGM,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,CAAC,EACjD,EAEA,OAAOV,EAAqB,CAC1B,KAAMY,CACR,CAAC,CACH,CAAC,CACH,CACF",
|
|
6
6
|
"names": ["ApduBuilder", "ApduParser", "CommandResultFactory", "InvalidStatusWordError", "CommandErrorHelper", "Maybe", "PublicKeyDisplayMode", "SOLANA_APP_ERRORS", "SolanaAppCommandErrorFactory", "GetAppConfigurationCommand", "args", "response", "buffer", "element", "config"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ApduResponse as s,CommandResultFactory as a,isSuccessCommandResult as o}from"@ledgerhq/device-management-kit";import{PublicKeyDisplayMode as n}from"../../../api/model/PublicKeyDisplayMode";import{GetAppConfigurationCommand as i}from"./GetAppConfigurationCommand";const p=new Uint8Array([224,4,0,0,0]),c=new Uint8Array([1,0,2,5,10]),d=new s({statusCode:Uint8Array.from([144,0]),data:c}),l=new Uint8Array([1,1,2,5,10]),u=new s({statusCode:Uint8Array.from([144,0]),data:l});describe("GetAppConfigurationCommand",()=>{let
|
|
1
|
+
import{ApduResponse as s,CommandResultFactory as a,isSuccessCommandResult as o}from"@ledgerhq/device-management-kit";import{PublicKeyDisplayMode as n}from"../../../api/model/PublicKeyDisplayMode";import{GetAppConfigurationCommand as i}from"./GetAppConfigurationCommand";const p=new Uint8Array([224,4,0,0,0]),c=new Uint8Array([1,0,2,5,10]),d=new s({statusCode:Uint8Array.from([144,0]),data:c}),l=new Uint8Array([1,1,2,5,10]),u=new s({statusCode:Uint8Array.from([144,0]),data:l});describe("GetAppConfigurationCommand",()=>{let r;beforeEach(()=>{r=new i,vi.clearAllMocks(),vi.importActual("@ledgerhq/device-management-kit")}),describe("name",()=>{it("should be 'getAppConfiguration'",()=>{expect(r.name).toBe("getAppConfiguration")})}),describe("getApdu",()=>{it("should return the correct APDU",()=>{const e=r.getApdu();expect(e.getRawApdu()).toEqual(p)})}),describe("parseResponse",()=>{it("should parse the response correctly",()=>{const e=r.parseResponse(d);expect(e).toStrictEqual(a({data:{blindSigningEnabled:!0,pubKeyDisplayMode:n.LONG,version:"2.5.10"}}))}),it("should parse the response correctly with short pub key display mode",()=>{const e=r.parseResponse(u);expect(e).toStrictEqual(a({data:{blindSigningEnabled:!0,pubKeyDisplayMode:n.SHORT,version:"2.5.10"}}))}),describe("error handling",()=>{it("should return error if response is not success",()=>{const e=new s({statusCode:Uint8Array.from([106,130]),data:new Uint8Array(0)}),t=r.parseResponse(e);expect(o(t)).toBe(!1),o(t)?assert.fail("Expected error"):expect(t.error).toEqual(expect.objectContaining({_tag:"SolanaAppCommandError",errorCode:"6a82",message:"Invalid off-chain message format"}))}),it("should return error if response is not success",()=>{const e=new s({statusCode:Uint8Array.from([106,130]),data:new Uint8Array(0)}),t=r.parseResponse(e);expect(o(t)).toBe(!1),o(t)?assert.fail("Expected error"):expect(t.error).toEqual(expect.objectContaining({_tag:"SolanaAppCommandError",errorCode:"6a82",message:"Invalid off-chain message format"}))})})})});
|
|
2
2
|
//# sourceMappingURL=GetAppConfigurationCommand.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/command/GetAppConfigurationCommand.test.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n ApduResponse,\n CommandResultFactory,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { PublicKeyDisplayMode } from \"@api/model/PublicKeyDisplayMode\";\n\nimport { GetAppConfigurationCommand } from \"./GetAppConfigurationCommand\";\n\nconst GET_APP_CONFIG_APDU = new Uint8Array([0xe0, 0x04, 0x00, 0x00, 0x00]);\n\nconst GET_APP_CONFIG_RESPONSE_DATA = new Uint8Array([\n 0x01, 0x00, 0x02, 0x05, 0x0a,\n]);\n\nconst GET_APP_CONFIG_RESPONSE = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: GET_APP_CONFIG_RESPONSE_DATA,\n});\n\nconst GET_APP_CONFIG_RESPONSE_DATA_SHORT_PUB_KEY_DISPLAY_MODE = new Uint8Array([\n 0x01, 0x01, 0x02, 0x05, 0x0a,\n]);\n\nconst GET_APP_CONFIG_RESPONSE_SHORT_PUB_KEY_DISPLAY_MODE = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: GET_APP_CONFIG_RESPONSE_DATA_SHORT_PUB_KEY_DISPLAY_MODE,\n});\n\ndescribe(\"GetAppConfigurationCommand\", () => {\n let command: GetAppConfigurationCommand;\n\n beforeEach(() => {\n command = new GetAppConfigurationCommand();\n vi.clearAllMocks();\n vi.importActual(\"@ledgerhq/device-management-kit\");\n });\n\n describe(\"getApdu\", () => {\n it(\"should return the correct APDU\", () => {\n const apdu = command.getApdu();\n expect(apdu.getRawApdu()).toEqual(GET_APP_CONFIG_APDU);\n });\n });\n\n describe(\"parseResponse\", () => {\n it(\"should parse the response correctly\", () => {\n const parsed = command.parseResponse(GET_APP_CONFIG_RESPONSE);\n expect(parsed).toStrictEqual(\n CommandResultFactory({\n data: {\n blindSigningEnabled: true,\n pubKeyDisplayMode: PublicKeyDisplayMode.LONG,\n version: \"2.5.10\",\n },\n }),\n );\n });\n\n it(\"should parse the response correctly with short pub key display mode\", () => {\n const parsed = command.parseResponse(\n GET_APP_CONFIG_RESPONSE_SHORT_PUB_KEY_DISPLAY_MODE,\n );\n expect(parsed).toStrictEqual(\n CommandResultFactory({\n data: {\n blindSigningEnabled: true,\n pubKeyDisplayMode: PublicKeyDisplayMode.SHORT,\n version: \"2.5.10\",\n },\n }),\n );\n });\n\n describe(\"error handling\", () => {\n it(\"should return error if response is not success\", () => {\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x6a, 0x82]),\n data: new Uint8Array(0),\n });\n const result = command.parseResponse(response);\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect(result.error).toEqual(\n expect.objectContaining({\n _tag: \"SolanaAppCommandError\",\n errorCode: \"6a82\",\n message: \"Invalid off-chain message format\",\n }),\n );\n } else {\n assert.fail(\"Expected error\");\n }\n });\n\n it(\"should return error if response is not success\", () => {\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x6a, 0x82]),\n data: new Uint8Array(0),\n });\n const result = command.parseResponse(response);\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect(result.error).toEqual(\n expect.objectContaining({\n _tag: \"SolanaAppCommandError\",\n errorCode: \"6a82\",\n message: \"Invalid off-chain message format\",\n }),\n );\n } else {\n assert.fail(\"Expected error\");\n }\n });\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "AAAA,OACE,gBAAAA,EACA,wBAAAC,EACA,0BAAAC,MACK,kCAEP,OAAS,wBAAAC,MAA4B,kCAErC,OAAS,8BAAAC,MAAkC,+BAE3C,MAAMC,EAAsB,IAAI,WAAW,CAAC,IAAM,EAAM,EAAM,EAAM,CAAI,CAAC,EAEnEC,EAA+B,IAAI,WAAW,CAClD,EAAM,EAAM,EAAM,EAAM,EAC1B,CAAC,EAEKC,EAA0B,IAAIP,EAAa,CAC/C,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAMM,CACR,CAAC,EAEKE,EAA0D,IAAI,WAAW,CAC7E,EAAM,EAAM,EAAM,EAAM,EAC1B,CAAC,EAEKC,EAAqD,IAAIT,EAAa,CAC1E,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAMQ,CACR,CAAC,EAED,SAAS,6BAA8B,IAAM,CAC3C,IAAIE,EAEJ,WAAW,IAAM,CACfA,EAAU,IAAIN,EACd,GAAG,cAAc,EACjB,GAAG,aAAa,iCAAiC,CACnD,CAAC,EAED,SAAS,UAAW,IAAM,CACxB,GAAG,iCAAkC,IAAM,CACzC,
|
|
4
|
+
"sourcesContent": ["import {\n ApduResponse,\n CommandResultFactory,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { PublicKeyDisplayMode } from \"@api/model/PublicKeyDisplayMode\";\n\nimport { GetAppConfigurationCommand } from \"./GetAppConfigurationCommand\";\n\nconst GET_APP_CONFIG_APDU = new Uint8Array([0xe0, 0x04, 0x00, 0x00, 0x00]);\n\nconst GET_APP_CONFIG_RESPONSE_DATA = new Uint8Array([\n 0x01, 0x00, 0x02, 0x05, 0x0a,\n]);\n\nconst GET_APP_CONFIG_RESPONSE = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: GET_APP_CONFIG_RESPONSE_DATA,\n});\n\nconst GET_APP_CONFIG_RESPONSE_DATA_SHORT_PUB_KEY_DISPLAY_MODE = new Uint8Array([\n 0x01, 0x01, 0x02, 0x05, 0x0a,\n]);\n\nconst GET_APP_CONFIG_RESPONSE_SHORT_PUB_KEY_DISPLAY_MODE = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: GET_APP_CONFIG_RESPONSE_DATA_SHORT_PUB_KEY_DISPLAY_MODE,\n});\n\ndescribe(\"GetAppConfigurationCommand\", () => {\n let command: GetAppConfigurationCommand;\n\n beforeEach(() => {\n command = new GetAppConfigurationCommand();\n vi.clearAllMocks();\n vi.importActual(\"@ledgerhq/device-management-kit\");\n });\n\n describe(\"name\", () => {\n it(\"should be 'getAppConfiguration'\", () => {\n expect(command.name).toBe(\"getAppConfiguration\");\n });\n });\n\n describe(\"getApdu\", () => {\n it(\"should return the correct APDU\", () => {\n const apdu = command.getApdu();\n expect(apdu.getRawApdu()).toEqual(GET_APP_CONFIG_APDU);\n });\n });\n\n describe(\"parseResponse\", () => {\n it(\"should parse the response correctly\", () => {\n const parsed = command.parseResponse(GET_APP_CONFIG_RESPONSE);\n expect(parsed).toStrictEqual(\n CommandResultFactory({\n data: {\n blindSigningEnabled: true,\n pubKeyDisplayMode: PublicKeyDisplayMode.LONG,\n version: \"2.5.10\",\n },\n }),\n );\n });\n\n it(\"should parse the response correctly with short pub key display mode\", () => {\n const parsed = command.parseResponse(\n GET_APP_CONFIG_RESPONSE_SHORT_PUB_KEY_DISPLAY_MODE,\n );\n expect(parsed).toStrictEqual(\n CommandResultFactory({\n data: {\n blindSigningEnabled: true,\n pubKeyDisplayMode: PublicKeyDisplayMode.SHORT,\n version: \"2.5.10\",\n },\n }),\n );\n });\n\n describe(\"error handling\", () => {\n it(\"should return error if response is not success\", () => {\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x6a, 0x82]),\n data: new Uint8Array(0),\n });\n const result = command.parseResponse(response);\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect(result.error).toEqual(\n expect.objectContaining({\n _tag: \"SolanaAppCommandError\",\n errorCode: \"6a82\",\n message: \"Invalid off-chain message format\",\n }),\n );\n } else {\n assert.fail(\"Expected error\");\n }\n });\n\n it(\"should return error if response is not success\", () => {\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x6a, 0x82]),\n data: new Uint8Array(0),\n });\n const result = command.parseResponse(response);\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect(result.error).toEqual(\n expect.objectContaining({\n _tag: \"SolanaAppCommandError\",\n errorCode: \"6a82\",\n message: \"Invalid off-chain message format\",\n }),\n );\n } else {\n assert.fail(\"Expected error\");\n }\n });\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "AAAA,OACE,gBAAAA,EACA,wBAAAC,EACA,0BAAAC,MACK,kCAEP,OAAS,wBAAAC,MAA4B,kCAErC,OAAS,8BAAAC,MAAkC,+BAE3C,MAAMC,EAAsB,IAAI,WAAW,CAAC,IAAM,EAAM,EAAM,EAAM,CAAI,CAAC,EAEnEC,EAA+B,IAAI,WAAW,CAClD,EAAM,EAAM,EAAM,EAAM,EAC1B,CAAC,EAEKC,EAA0B,IAAIP,EAAa,CAC/C,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAMM,CACR,CAAC,EAEKE,EAA0D,IAAI,WAAW,CAC7E,EAAM,EAAM,EAAM,EAAM,EAC1B,CAAC,EAEKC,EAAqD,IAAIT,EAAa,CAC1E,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAMQ,CACR,CAAC,EAED,SAAS,6BAA8B,IAAM,CAC3C,IAAIE,EAEJ,WAAW,IAAM,CACfA,EAAU,IAAIN,EACd,GAAG,cAAc,EACjB,GAAG,aAAa,iCAAiC,CACnD,CAAC,EAED,SAAS,OAAQ,IAAM,CACrB,GAAG,kCAAmC,IAAM,CAC1C,OAAOM,EAAQ,IAAI,EAAE,KAAK,qBAAqB,CACjD,CAAC,CACH,CAAC,EAED,SAAS,UAAW,IAAM,CACxB,GAAG,iCAAkC,IAAM,CACzC,MAAMC,EAAOD,EAAQ,QAAQ,EAC7B,OAAOC,EAAK,WAAW,CAAC,EAAE,QAAQN,CAAmB,CACvD,CAAC,CACH,CAAC,EAED,SAAS,gBAAiB,IAAM,CAC9B,GAAG,sCAAuC,IAAM,CAC9C,MAAMO,EAASF,EAAQ,cAAcH,CAAuB,EAC5D,OAAOK,CAAM,EAAE,cACbX,EAAqB,CACnB,KAAM,CACJ,oBAAqB,GACrB,kBAAmBE,EAAqB,KACxC,QAAS,QACX,CACF,CAAC,CACH,CACF,CAAC,EAED,GAAG,sEAAuE,IAAM,CAC9E,MAAMS,EAASF,EAAQ,cACrBD,CACF,EACA,OAAOG,CAAM,EAAE,cACbX,EAAqB,CACnB,KAAM,CACJ,oBAAqB,GACrB,kBAAmBE,EAAqB,MACxC,QAAS,QACX,CACF,CAAC,CACH,CACF,CAAC,EAED,SAAS,iBAAkB,IAAM,CAC/B,GAAG,iDAAkD,IAAM,CACzD,MAAMU,EAAW,IAAIb,EAAa,CAChC,WAAY,WAAW,KAAK,CAAC,IAAM,GAAI,CAAC,EACxC,KAAM,IAAI,WAAW,CAAC,CACxB,CAAC,EACKc,EAASJ,EAAQ,cAAcG,CAAQ,EAC7C,OAAOX,EAAuBY,CAAM,CAAC,EAAE,KAAK,EAAK,EAC5CZ,EAAuBY,CAAM,EAShC,OAAO,KAAK,gBAAgB,EAR5B,OAAOA,EAAO,KAAK,EAAE,QACnB,OAAO,iBAAiB,CACtB,KAAM,wBACN,UAAW,OACX,QAAS,kCACX,CAAC,CACH,CAIJ,CAAC,EAED,GAAG,iDAAkD,IAAM,CACzD,MAAMD,EAAW,IAAIb,EAAa,CAChC,WAAY,WAAW,KAAK,CAAC,IAAM,GAAI,CAAC,EACxC,KAAM,IAAI,WAAW,CAAC,CACxB,CAAC,EACKc,EAASJ,EAAQ,cAAcG,CAAQ,EAC7C,OAAOX,EAAuBY,CAAM,CAAC,EAAE,KAAK,EAAK,EAC5CZ,EAAuBY,CAAM,EAShC,OAAO,KAAK,gBAAgB,EAR5B,OAAOA,EAAO,KAAK,EAAE,QACnB,OAAO,iBAAiB,CACtB,KAAM,wBACN,UAAW,OACX,QAAS,kCACX,CAAC,CACH,CAIJ,CAAC,CACH,CAAC,CACH,CAAC,CACH,CAAC",
|
|
6
6
|
"names": ["ApduResponse", "CommandResultFactory", "isSuccessCommandResult", "PublicKeyDisplayMode", "GetAppConfigurationCommand", "GET_APP_CONFIG_APDU", "GET_APP_CONFIG_RESPONSE_DATA", "GET_APP_CONFIG_RESPONSE", "GET_APP_CONFIG_RESPONSE_DATA_SHORT_PUB_KEY_DISPLAY_MODE", "GET_APP_CONFIG_RESPONSE_SHORT_PUB_KEY_DISPLAY_MODE", "command", "apdu", "parsed", "response", "result"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ApduBuilder as t,ApduParser as
|
|
1
|
+
import{ApduBuilder as t,ApduParser as l,CommandResultFactory as o,InvalidStatusWordError as p}from"@ledgerhq/device-management-kit";import{CommandErrorHelper as s}from"@ledgerhq/signer-utils";import{Maybe as m}from"purify-ts";import{SOLANA_APP_ERRORS as d,SolanaAppCommandErrorFactory as C}from"./utils/SolanaApplicationErrors";const i=224,u=32,g=0,A=0,n=4;class S{name="getChallenge";errorHelper=new s(d,C);getApdu(){return new t({cla:i,ins:u,p1:g,p2:A}).build()}parseResponse(r){return m.fromNullable(this.errorHelper.getError(r)).orDefaultLazy(()=>{const e=new l(r);if(e.testMinimalLength(n)===!1)return o({error:new p("Challenge key is missing")});const a=e.encodeToHexaString(e.extractFieldByLength(n));return o({data:{challenge:a}})})}}export{S as GetChallengeCommand};
|
|
2
2
|
//# sourceMappingURL=GetChallengeCommand.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/command/GetChallengeCommand.ts"],
|
|
4
|
-
"sourcesContent": ["// https://github.com/LedgerHQ/app-solana/blob/develop/doc/api.md#get-challenge\nimport {\n type Apdu,\n ApduBuilder,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\nimport { CommandErrorHelper } from \"@ledgerhq/signer-utils\";\nimport { Maybe } from \"purify-ts\";\n\nimport {\n SOLANA_APP_ERRORS,\n SolanaAppCommandErrorFactory,\n type SolanaAppErrorCodes,\n} from \"./utils/SolanaApplicationErrors\";\n\nconst CLA = 0xe0;\nconst INS = 0x20;\nconst P1 = 0x00;\nconst P2 = 0x00;\nconst CHALLENGE_LENGTH = 4;\n\nexport type GetChallengeCommandResponse = {\n challenge: string;\n};\n\nexport class GetChallengeCommand\n implements Command<GetChallengeCommandResponse, void, SolanaAppErrorCodes>\n{\n private readonly errorHelper = new CommandErrorHelper<\n GetChallengeCommandResponse,\n SolanaAppErrorCodes\n >(SOLANA_APP_ERRORS, SolanaAppCommandErrorFactory);\n\n getApdu(): Apdu {\n return new ApduBuilder({\n cla: CLA,\n ins: INS,\n p1: P1,\n p2: P2,\n }).build();\n }\n\n parseResponse(\n response: ApduResponse,\n ): CommandResult<GetChallengeCommandResponse, SolanaAppErrorCodes> {\n return Maybe.fromNullable(\n this.errorHelper.getError(response),\n ).orDefaultLazy(() => {\n const parser = new ApduParser(response);\n\n if (parser.testMinimalLength(CHALLENGE_LENGTH) === false) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"Challenge key is missing\"),\n });\n }\n\n const challenge = parser.encodeToHexaString(\n parser.extractFieldByLength(CHALLENGE_LENGTH),\n );\n\n return CommandResultFactory({\n data: {\n challenge,\n },\n });\n });\n }\n}\n"],
|
|
5
|
-
"mappings": "AACA,OAEE,eAAAA,EACA,cAAAC,EAIA,wBAAAC,EACA,0BAAAC,MACK,kCACP,OAAS,sBAAAC,MAA0B,yBACnC,OAAS,SAAAC,MAAa,YAEtB,OACE,qBAAAC,EACA,gCAAAC,MAEK,kCAEP,MAAMC,EAAM,IACNC,EAAM,GACNC,EAAK,EACLC,EAAK,EACLC,EAAmB,EAMlB,MAAMC,CAEb,
|
|
4
|
+
"sourcesContent": ["// https://github.com/LedgerHQ/app-solana/blob/develop/doc/api.md#get-challenge\nimport {\n type Apdu,\n ApduBuilder,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\nimport { CommandErrorHelper } from \"@ledgerhq/signer-utils\";\nimport { Maybe } from \"purify-ts\";\n\nimport {\n SOLANA_APP_ERRORS,\n SolanaAppCommandErrorFactory,\n type SolanaAppErrorCodes,\n} from \"./utils/SolanaApplicationErrors\";\n\nconst CLA = 0xe0;\nconst INS = 0x20;\nconst P1 = 0x00;\nconst P2 = 0x00;\nconst CHALLENGE_LENGTH = 4;\n\nexport type GetChallengeCommandResponse = {\n challenge: string;\n};\n\nexport class GetChallengeCommand\n implements Command<GetChallengeCommandResponse, void, SolanaAppErrorCodes>\n{\n readonly name = \"getChallenge\";\n private readonly errorHelper = new CommandErrorHelper<\n GetChallengeCommandResponse,\n SolanaAppErrorCodes\n >(SOLANA_APP_ERRORS, SolanaAppCommandErrorFactory);\n\n getApdu(): Apdu {\n return new ApduBuilder({\n cla: CLA,\n ins: INS,\n p1: P1,\n p2: P2,\n }).build();\n }\n\n parseResponse(\n response: ApduResponse,\n ): CommandResult<GetChallengeCommandResponse, SolanaAppErrorCodes> {\n return Maybe.fromNullable(\n this.errorHelper.getError(response),\n ).orDefaultLazy(() => {\n const parser = new ApduParser(response);\n\n if (parser.testMinimalLength(CHALLENGE_LENGTH) === false) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"Challenge key is missing\"),\n });\n }\n\n const challenge = parser.encodeToHexaString(\n parser.extractFieldByLength(CHALLENGE_LENGTH),\n );\n\n return CommandResultFactory({\n data: {\n challenge,\n },\n });\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "AACA,OAEE,eAAAA,EACA,cAAAC,EAIA,wBAAAC,EACA,0BAAAC,MACK,kCACP,OAAS,sBAAAC,MAA0B,yBACnC,OAAS,SAAAC,MAAa,YAEtB,OACE,qBAAAC,EACA,gCAAAC,MAEK,kCAEP,MAAMC,EAAM,IACNC,EAAM,GACNC,EAAK,EACLC,EAAK,EACLC,EAAmB,EAMlB,MAAMC,CAEb,CACW,KAAO,eACC,YAAc,IAAIT,EAGjCE,EAAmBC,CAA4B,EAEjD,SAAgB,CACd,OAAO,IAAIP,EAAY,CACrB,IAAKQ,EACL,IAAKC,EACL,GAAIC,EACJ,GAAIC,CACN,CAAC,EAAE,MAAM,CACX,CAEA,cACEG,EACiE,CACjE,OAAOT,EAAM,aACX,KAAK,YAAY,SAASS,CAAQ,CACpC,EAAE,cAAc,IAAM,CACpB,MAAMC,EAAS,IAAId,EAAWa,CAAQ,EAEtC,GAAIC,EAAO,kBAAkBH,CAAgB,IAAM,GACjD,OAAOV,EAAqB,CAC1B,MAAO,IAAIC,EAAuB,0BAA0B,CAC9D,CAAC,EAGH,MAAMa,EAAYD,EAAO,mBACvBA,EAAO,qBAAqBH,CAAgB,CAC9C,EAEA,OAAOV,EAAqB,CAC1B,KAAM,CACJ,UAAAc,CACF,CACF,CAAC,CACH,CAAC,CACH,CACF",
|
|
6
6
|
"names": ["ApduBuilder", "ApduParser", "CommandResultFactory", "InvalidStatusWordError", "CommandErrorHelper", "Maybe", "SOLANA_APP_ERRORS", "SolanaAppCommandErrorFactory", "CLA", "INS", "P1", "P2", "CHALLENGE_LENGTH", "GetChallengeCommand", "response", "parser", "challenge"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{CommandResultFactory as
|
|
1
|
+
import{CommandResultFactory as r,InvalidStatusWordError as o,isSuccessCommandResult as s}from"@ledgerhq/device-management-kit";import{GetChallengeCommand as a}from"./GetChallengeCommand";const n=Uint8Array.from([224,32,0,0,0]),c=Uint8Array.from([1,2,3,4]),d={statusCode:Uint8Array.from([144,0]),data:c},l={statusCode:Uint8Array.from([85,21]),data:new Uint8Array},p=Uint8Array.from([1,2]),i={statusCode:Uint8Array.from([144,0]),data:p};describe("GetChallengeCommand",()=>{let t;beforeEach(()=>{t=new a}),describe("name",()=>{it("should be 'getChallenge'",()=>{expect(t.name).toBe("getChallenge")})}),describe("getApdu",()=>{it("should return the challenge apdu",()=>{const e=t.getApdu();expect(e.getRawApdu()).toStrictEqual(n)})}),describe("parseResponse",()=>{it("should parse the response",()=>{const e=t.parseResponse(d);expect(e).toStrictEqual(r({data:{challenge:"01020304"}}))}),it("should return an error if the response is not successful",()=>{const e=t.parseResponse(l);expect(s(e)).toBe(!1)}),it("should return an error if the response is too short",()=>{const e=t.parseResponse(i);expect(s(e)).toBe(!1),expect(e.error).toBeInstanceOf(o)})})});
|
|
2
2
|
//# sourceMappingURL=GetChallengeCommand.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/command/GetChallengeCommand.test.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n CommandResultFactory,\n InvalidStatusWordError,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { GetChallengeCommand } from \"./GetChallengeCommand\";\n\nconst GET_CHALLENGE_APDU = Uint8Array.from([0xe0, 0x20, 0x00, 0x00, 0x00]);\n\nconst LNX_RESPONSE_DATA_GOOD = Uint8Array.from([0x01, 0x02, 0x03, 0x04]);\n\nconst LNX_RESPONSE_GOOD = {\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: LNX_RESPONSE_DATA_GOOD,\n};\n\nconst LNX_RESPONSE_LOCKED = {\n statusCode: Uint8Array.from([0x55, 0x15]),\n data: new Uint8Array(),\n};\n\nconst LNX_RESPONSE_DATA_TOO_SHORT = Uint8Array.from([0x01, 0x02]);\n\nconst LNX_RESPONSE_TOO_SHORT = {\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: LNX_RESPONSE_DATA_TOO_SHORT,\n};\n\ndescribe(\"GetChallengeCommand\", () => {\n let command: GetChallengeCommand;\n\n beforeEach(() => {\n command = new GetChallengeCommand();\n });\n\n describe(\"getApdu\", () => {\n it(\"should return the challenge apdu\", () => {\n const apdu = command.getApdu();\n expect(apdu.getRawApdu()).toStrictEqual(GET_CHALLENGE_APDU);\n });\n });\n\n describe(\"parseResponse\", () => {\n it(\"should parse the response\", () => {\n const parsedResponse = command.parseResponse(LNX_RESPONSE_GOOD);\n expect(parsedResponse).toStrictEqual(\n CommandResultFactory({\n data: {\n challenge: \"01020304\",\n },\n }),\n );\n });\n\n it(\"should return an error if the response is not successful\", () => {\n const result = command.parseResponse(LNX_RESPONSE_LOCKED);\n expect(isSuccessCommandResult(result)).toBe(false);\n });\n\n it(\"should return an error if the response is too short\", () => {\n const result = command.parseResponse(LNX_RESPONSE_TOO_SHORT);\n\n expect(isSuccessCommandResult(result)).toBe(false);\n // @ts-ignore\n expect(result.error).toBeInstanceOf(InvalidStatusWordError);\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "AAAA,OACE,wBAAAA,EACA,0BAAAC,EACA,0BAAAC,MACK,kCAEP,OAAS,uBAAAC,MAA2B,wBAEpC,MAAMC,EAAqB,WAAW,KAAK,CAAC,IAAM,GAAM,EAAM,EAAM,CAAI,CAAC,EAEnEC,EAAyB,WAAW,KAAK,CAAC,EAAM,EAAM,EAAM,CAAI,CAAC,EAEjEC,EAAoB,CACxB,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAMD,CACR,EAEME,EAAsB,CAC1B,WAAY,WAAW,KAAK,CAAC,GAAM,EAAI,CAAC,EACxC,KAAM,IAAI,UACZ,EAEMC,EAA8B,WAAW,KAAK,CAAC,EAAM,CAAI,CAAC,EAE1DC,EAAyB,CAC7B,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAMD,CACR,EAEA,SAAS,sBAAuB,IAAM,CACpC,IAAIE,EAEJ,WAAW,IAAM,CACfA,EAAU,IAAIP,CAChB,CAAC,EAED,SAAS,UAAW,IAAM,CACxB,GAAG,mCAAoC,IAAM,CAC3C,
|
|
4
|
+
"sourcesContent": ["import {\n CommandResultFactory,\n InvalidStatusWordError,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { GetChallengeCommand } from \"./GetChallengeCommand\";\n\nconst GET_CHALLENGE_APDU = Uint8Array.from([0xe0, 0x20, 0x00, 0x00, 0x00]);\n\nconst LNX_RESPONSE_DATA_GOOD = Uint8Array.from([0x01, 0x02, 0x03, 0x04]);\n\nconst LNX_RESPONSE_GOOD = {\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: LNX_RESPONSE_DATA_GOOD,\n};\n\nconst LNX_RESPONSE_LOCKED = {\n statusCode: Uint8Array.from([0x55, 0x15]),\n data: new Uint8Array(),\n};\n\nconst LNX_RESPONSE_DATA_TOO_SHORT = Uint8Array.from([0x01, 0x02]);\n\nconst LNX_RESPONSE_TOO_SHORT = {\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: LNX_RESPONSE_DATA_TOO_SHORT,\n};\n\ndescribe(\"GetChallengeCommand\", () => {\n let command: GetChallengeCommand;\n\n beforeEach(() => {\n command = new GetChallengeCommand();\n });\n\n describe(\"name\", () => {\n it(\"should be 'getChallenge'\", () => {\n expect(command.name).toBe(\"getChallenge\");\n });\n });\n\n describe(\"getApdu\", () => {\n it(\"should return the challenge apdu\", () => {\n const apdu = command.getApdu();\n expect(apdu.getRawApdu()).toStrictEqual(GET_CHALLENGE_APDU);\n });\n });\n\n describe(\"parseResponse\", () => {\n it(\"should parse the response\", () => {\n const parsedResponse = command.parseResponse(LNX_RESPONSE_GOOD);\n expect(parsedResponse).toStrictEqual(\n CommandResultFactory({\n data: {\n challenge: \"01020304\",\n },\n }),\n );\n });\n\n it(\"should return an error if the response is not successful\", () => {\n const result = command.parseResponse(LNX_RESPONSE_LOCKED);\n expect(isSuccessCommandResult(result)).toBe(false);\n });\n\n it(\"should return an error if the response is too short\", () => {\n const result = command.parseResponse(LNX_RESPONSE_TOO_SHORT);\n\n expect(isSuccessCommandResult(result)).toBe(false);\n // @ts-ignore\n expect(result.error).toBeInstanceOf(InvalidStatusWordError);\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "AAAA,OACE,wBAAAA,EACA,0BAAAC,EACA,0BAAAC,MACK,kCAEP,OAAS,uBAAAC,MAA2B,wBAEpC,MAAMC,EAAqB,WAAW,KAAK,CAAC,IAAM,GAAM,EAAM,EAAM,CAAI,CAAC,EAEnEC,EAAyB,WAAW,KAAK,CAAC,EAAM,EAAM,EAAM,CAAI,CAAC,EAEjEC,EAAoB,CACxB,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAMD,CACR,EAEME,EAAsB,CAC1B,WAAY,WAAW,KAAK,CAAC,GAAM,EAAI,CAAC,EACxC,KAAM,IAAI,UACZ,EAEMC,EAA8B,WAAW,KAAK,CAAC,EAAM,CAAI,CAAC,EAE1DC,EAAyB,CAC7B,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAMD,CACR,EAEA,SAAS,sBAAuB,IAAM,CACpC,IAAIE,EAEJ,WAAW,IAAM,CACfA,EAAU,IAAIP,CAChB,CAAC,EAED,SAAS,OAAQ,IAAM,CACrB,GAAG,2BAA4B,IAAM,CACnC,OAAOO,EAAQ,IAAI,EAAE,KAAK,cAAc,CAC1C,CAAC,CACH,CAAC,EAED,SAAS,UAAW,IAAM,CACxB,GAAG,mCAAoC,IAAM,CAC3C,MAAMC,EAAOD,EAAQ,QAAQ,EAC7B,OAAOC,EAAK,WAAW,CAAC,EAAE,cAAcP,CAAkB,CAC5D,CAAC,CACH,CAAC,EAED,SAAS,gBAAiB,IAAM,CAC9B,GAAG,4BAA6B,IAAM,CACpC,MAAMQ,EAAiBF,EAAQ,cAAcJ,CAAiB,EAC9D,OAAOM,CAAc,EAAE,cACrBZ,EAAqB,CACnB,KAAM,CACJ,UAAW,UACb,CACF,CAAC,CACH,CACF,CAAC,EAED,GAAG,2DAA4D,IAAM,CACnE,MAAMa,EAASH,EAAQ,cAAcH,CAAmB,EACxD,OAAOL,EAAuBW,CAAM,CAAC,EAAE,KAAK,EAAK,CACnD,CAAC,EAED,GAAG,sDAAuD,IAAM,CAC9D,MAAMA,EAASH,EAAQ,cAAcD,CAAsB,EAE3D,OAAOP,EAAuBW,CAAM,CAAC,EAAE,KAAK,EAAK,EAEjD,OAAOA,EAAO,KAAK,EAAE,eAAeZ,CAAsB,CAC5D,CAAC,CACH,CAAC,CACH,CAAC",
|
|
6
6
|
"names": ["CommandResultFactory", "InvalidStatusWordError", "isSuccessCommandResult", "GetChallengeCommand", "GET_CHALLENGE_APDU", "LNX_RESPONSE_DATA_GOOD", "LNX_RESPONSE_GOOD", "LNX_RESPONSE_LOCKED", "LNX_RESPONSE_DATA_TOO_SHORT", "LNX_RESPONSE_TOO_SHORT", "command", "apdu", "parsedResponse", "result"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ApduBuilder as d,ApduParser as
|
|
1
|
+
import{ApduBuilder as d,ApduParser as m,CommandResultFactory as o,InvalidStatusWordError as a}from"@ledgerhq/device-management-kit";import{CommandErrorHelper as i,DerivationPathUtils as u}from"@ledgerhq/signer-utils";import{Maybe as l}from"purify-ts";import{DefaultBs58Encoder as y}from"../../app-binder/services/bs58Encoder";import{SOLANA_APP_ERRORS as c,SolanaAppCommandErrorFactory as b}from"./utils/SolanaApplicationErrors";const s=32;class f{constructor(r,e=y){this.bs58Encoder=e;this.args=r}name="getPubKey";errorHelper=new i(c,b);args;getApdu(){const r={cla:224,ins:5,p1:this.args.checkOnDevice?1:0,p2:0},e=new d(r),t=this.args.derivationPath,n=u.splitPath(t);return e.add8BitUIntToData(n.length),n.forEach(p=>{e.add32BitUIntToData(p)}),e.build()}parseResponse(r){return l.fromNullable(this.errorHelper.getError(r)).orDefaultLazy(()=>{const e=new m(r);if(e.testMinimalLength(s)===!1)return o({error:new a("Public key is missing")});const t=e.extractFieldByLength(s);return t===void 0?o({error:new a("Unable to extract public key")}):o({data:this.bs58Encoder.encode(t)})})}}export{f as GetPubKeyCommand};
|
|
2
2
|
//# sourceMappingURL=GetPubKeyCommand.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/command/GetPubKeyCommand.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n type ApduBuilderArgs,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\nimport {\n CommandErrorHelper,\n DerivationPathUtils,\n} from \"@ledgerhq/signer-utils\";\nimport { Maybe } from \"purify-ts\";\n\nimport { type PublicKey } from \"@api/model/PublicKey\";\nimport {\n type Bs58Encoder,\n DefaultBs58Encoder,\n} from \"@internal/app-binder/services/bs58Encoder\";\n\nimport {\n SOLANA_APP_ERRORS,\n SolanaAppCommandErrorFactory,\n type SolanaAppErrorCodes,\n} from \"./utils/SolanaApplicationErrors\";\n\nconst PUBKEY_LENGTH = 32;\n\nexport type GetPubKeyCommandResponse = PublicKey;\n\nexport type GetPubKeyCommandArgs = {\n derivationPath: string;\n checkOnDevice: boolean;\n};\n\nexport class GetPubKeyCommand\n implements\n Command<GetPubKeyCommandResponse, GetPubKeyCommandArgs, SolanaAppErrorCodes>\n{\n private readonly errorHelper = new CommandErrorHelper<\n GetPubKeyCommandResponse,\n SolanaAppErrorCodes\n >(SOLANA_APP_ERRORS, SolanaAppCommandErrorFactory);\n\n args: GetPubKeyCommandArgs;\n\n constructor(\n args: GetPubKeyCommandArgs,\n private readonly bs58Encoder: Bs58Encoder = DefaultBs58Encoder,\n ) {\n this.args = args;\n }\n\n getApdu(): Apdu {\n const getPubKeyArgs: ApduBuilderArgs = {\n cla: 0xe0,\n ins: 0x05,\n p1: this.args.checkOnDevice ? 0x01 : 0x00,\n p2: 0x00,\n };\n const builder = new ApduBuilder(getPubKeyArgs);\n const derivationPath = this.args.derivationPath;\n\n const path = DerivationPathUtils.splitPath(derivationPath);\n builder.add8BitUIntToData(path.length);\n path.forEach((element) => {\n builder.add32BitUIntToData(element);\n });\n\n return builder.build();\n }\n\n parseResponse(\n response: ApduResponse,\n ): CommandResult<GetPubKeyCommandResponse, SolanaAppErrorCodes> {\n return Maybe.fromNullable(\n this.errorHelper.getError(response),\n ).orDefaultLazy(() => {\n const parser = new ApduParser(response);\n\n if (parser.testMinimalLength(PUBKEY_LENGTH) === false) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"Public key is missing\"),\n });\n }\n\n const buffer = parser.extractFieldByLength(PUBKEY_LENGTH);\n if (buffer === undefined) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"Unable to extract public key\"),\n });\n }\n\n return CommandResultFactory({\n data: this.bs58Encoder.encode(buffer),\n });\n });\n }\n}\n"],
|
|
5
|
-
"mappings": "AAAA,OAEE,eAAAA,EAEA,cAAAC,EAIA,wBAAAC,EACA,0BAAAC,MACK,kCACP,OACE,sBAAAC,EACA,uBAAAC,MACK,yBACP,OAAS,SAAAC,MAAa,YAGtB,OAEE,sBAAAC,MACK,4CAEP,OACE,qBAAAC,EACA,gCAAAC,MAEK,kCAEP,MAAMC,EAAgB,GASf,MAAMC,CAGb,
|
|
4
|
+
"sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n type ApduBuilderArgs,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\nimport {\n CommandErrorHelper,\n DerivationPathUtils,\n} from \"@ledgerhq/signer-utils\";\nimport { Maybe } from \"purify-ts\";\n\nimport { type PublicKey } from \"@api/model/PublicKey\";\nimport {\n type Bs58Encoder,\n DefaultBs58Encoder,\n} from \"@internal/app-binder/services/bs58Encoder\";\n\nimport {\n SOLANA_APP_ERRORS,\n SolanaAppCommandErrorFactory,\n type SolanaAppErrorCodes,\n} from \"./utils/SolanaApplicationErrors\";\n\nconst PUBKEY_LENGTH = 32;\n\nexport type GetPubKeyCommandResponse = PublicKey;\n\nexport type GetPubKeyCommandArgs = {\n derivationPath: string;\n checkOnDevice: boolean;\n};\n\nexport class GetPubKeyCommand\n implements\n Command<GetPubKeyCommandResponse, GetPubKeyCommandArgs, SolanaAppErrorCodes>\n{\n readonly name = \"getPubKey\";\n private readonly errorHelper = new CommandErrorHelper<\n GetPubKeyCommandResponse,\n SolanaAppErrorCodes\n >(SOLANA_APP_ERRORS, SolanaAppCommandErrorFactory);\n\n args: GetPubKeyCommandArgs;\n\n constructor(\n args: GetPubKeyCommandArgs,\n private readonly bs58Encoder: Bs58Encoder = DefaultBs58Encoder,\n ) {\n this.args = args;\n }\n\n getApdu(): Apdu {\n const getPubKeyArgs: ApduBuilderArgs = {\n cla: 0xe0,\n ins: 0x05,\n p1: this.args.checkOnDevice ? 0x01 : 0x00,\n p2: 0x00,\n };\n const builder = new ApduBuilder(getPubKeyArgs);\n const derivationPath = this.args.derivationPath;\n\n const path = DerivationPathUtils.splitPath(derivationPath);\n builder.add8BitUIntToData(path.length);\n path.forEach((element) => {\n builder.add32BitUIntToData(element);\n });\n\n return builder.build();\n }\n\n parseResponse(\n response: ApduResponse,\n ): CommandResult<GetPubKeyCommandResponse, SolanaAppErrorCodes> {\n return Maybe.fromNullable(\n this.errorHelper.getError(response),\n ).orDefaultLazy(() => {\n const parser = new ApduParser(response);\n\n if (parser.testMinimalLength(PUBKEY_LENGTH) === false) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"Public key is missing\"),\n });\n }\n\n const buffer = parser.extractFieldByLength(PUBKEY_LENGTH);\n if (buffer === undefined) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"Unable to extract public key\"),\n });\n }\n\n return CommandResultFactory({\n data: this.bs58Encoder.encode(buffer),\n });\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAEE,eAAAA,EAEA,cAAAC,EAIA,wBAAAC,EACA,0BAAAC,MACK,kCACP,OACE,sBAAAC,EACA,uBAAAC,MACK,yBACP,OAAS,SAAAC,MAAa,YAGtB,OAEE,sBAAAC,MACK,4CAEP,OACE,qBAAAC,EACA,gCAAAC,MAEK,kCAEP,MAAMC,EAAgB,GASf,MAAMC,CAGb,CASE,YACEC,EACiBC,EAA2BN,EAC5C,CADiB,iBAAAM,EAEjB,KAAK,KAAOD,CACd,CAbS,KAAO,YACC,YAAc,IAAIR,EAGjCI,EAAmBC,CAA4B,EAEjD,KASA,SAAgB,CACd,MAAMK,EAAiC,CACrC,IAAK,IACL,IAAK,EACL,GAAI,KAAK,KAAK,cAAgB,EAAO,EACrC,GAAI,CACN,EACMC,EAAU,IAAIf,EAAYc,CAAa,EACvCE,EAAiB,KAAK,KAAK,eAE3BC,EAAOZ,EAAoB,UAAUW,CAAc,EACzD,OAAAD,EAAQ,kBAAkBE,EAAK,MAAM,EACrCA,EAAK,QAASC,GAAY,CACxBH,EAAQ,mBAAmBG,CAAO,CACpC,CAAC,EAEMH,EAAQ,MAAM,CACvB,CAEA,cACEI,EAC8D,CAC9D,OAAOb,EAAM,aACX,KAAK,YAAY,SAASa,CAAQ,CACpC,EAAE,cAAc,IAAM,CACpB,MAAMC,EAAS,IAAInB,EAAWkB,CAAQ,EAEtC,GAAIC,EAAO,kBAAkBV,CAAa,IAAM,GAC9C,OAAOR,EAAqB,CAC1B,MAAO,IAAIC,EAAuB,uBAAuB,CAC3D,CAAC,EAGH,MAAMkB,EAASD,EAAO,qBAAqBV,CAAa,EACxD,OAAIW,IAAW,OACNnB,EAAqB,CAC1B,MAAO,IAAIC,EAAuB,8BAA8B,CAClE,CAAC,EAGID,EAAqB,CAC1B,KAAM,KAAK,YAAY,OAAOmB,CAAM,CACtC,CAAC,CACH,CAAC,CACH,CACF",
|
|
6
6
|
"names": ["ApduBuilder", "ApduParser", "CommandResultFactory", "InvalidStatusWordError", "CommandErrorHelper", "DerivationPathUtils", "Maybe", "DefaultBs58Encoder", "SOLANA_APP_ERRORS", "SolanaAppCommandErrorFactory", "PUBKEY_LENGTH", "GetPubKeyCommand", "args", "bs58Encoder", "getPubKeyArgs", "builder", "derivationPath", "path", "element", "response", "parser", "buffer"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ApduResponse as a,CommandResultFactory as n,isSuccessCommandResult as x}from"@ledgerhq/device-management-kit";import{GetPubKeyCommand as o}from"./GetPubKeyCommand";const c=new Uint8Array([224,5,1,0,9,2,128,0,0,44,128,0,1,245]),i=new Uint8Array([224,5,0,0,9,2,128,0,0,44,128,0,1,245]),d=new Uint8Array([224,5,1,0,9,2,128,0,0,44,128,0,1,246]),u=new Uint8Array([178,167,34,220,24,221,92,73,195,244,142,155,7,38,241,27,230,103,134,233,28,172,87,52,152,214,238,136,57,44,201,106,144,0]),p=new a({statusCode:Uint8Array.from([144,0]),data:u});describe("GetPubKeyCommand",()=>{let t;const s={derivationPath:"44'/501'",checkOnDevice:!0};beforeEach(()=>{t=new o(s),vi.clearAllMocks(),vi.importActual("@ledgerhq/device-management-kit")}),describe("getApdu",()=>{it("should return APDU",()=>{const e=t.getApdu();expect(e.getRawApdu()).toEqual(c)}),it("should return APDU without confirm",()=>{t=new o({...s,checkOnDevice:!1});const e=t.getApdu();expect(e.getRawApdu()).toEqual(i)}),it("should return APDU with different path",()=>{t=new o({...s,derivationPath:"44'/502'"});const e=t.getApdu();expect(e.getRawApdu()).toEqual(d)})}),describe("parseResponse",()=>{it("should parse the response",()=>{const e=t.parseResponse(p);expect(e).toStrictEqual(n({data:"D2PPQSYFe83nDzk96FqGumVU8JA7J8vj2Rhjc2oXzEi5"}))}),describe("error handling",()=>{it("should return error if response is not success",()=>{const e=new a({statusCode:Uint8Array.from([106,130]),data:new Uint8Array(0)}),r=t.parseResponse(e);expect(x(r)).toBe(!1),x(r)?assert.fail("Expected error"):expect(r.error).toEqual(expect.objectContaining({_tag:"SolanaAppCommandError",errorCode:"6a82",message:"Invalid off-chain message format"}))}),it("should return error if public key is missing",()=>{const e=new a({statusCode:Uint8Array.from([144,0]),data:new Uint8Array(0)}),r=t.parseResponse(e);expect(x(r)).toBe(!1),x(r)?assert.fail("Expected error"):expect(r.error.originalError).toEqual(expect.objectContaining({message:"Public key is missing"}))})})})});
|
|
1
|
+
import{ApduResponse as a,CommandResultFactory as n,isSuccessCommandResult as x}from"@ledgerhq/device-management-kit";import{GetPubKeyCommand as o}from"./GetPubKeyCommand";const c=new Uint8Array([224,5,1,0,9,2,128,0,0,44,128,0,1,245]),i=new Uint8Array([224,5,0,0,9,2,128,0,0,44,128,0,1,245]),d=new Uint8Array([224,5,1,0,9,2,128,0,0,44,128,0,1,246]),u=new Uint8Array([178,167,34,220,24,221,92,73,195,244,142,155,7,38,241,27,230,103,134,233,28,172,87,52,152,214,238,136,57,44,201,106,144,0]),p=new a({statusCode:Uint8Array.from([144,0]),data:u});describe("GetPubKeyCommand",()=>{let t;const s={derivationPath:"44'/501'",checkOnDevice:!0};beforeEach(()=>{t=new o(s),vi.clearAllMocks(),vi.importActual("@ledgerhq/device-management-kit")}),describe("name",()=>{it("should be 'getPubKey'",()=>{expect(t.name).toBe("getPubKey")})}),describe("getApdu",()=>{it("should return APDU",()=>{const e=t.getApdu();expect(e.getRawApdu()).toEqual(c)}),it("should return APDU without confirm",()=>{t=new o({...s,checkOnDevice:!1});const e=t.getApdu();expect(e.getRawApdu()).toEqual(i)}),it("should return APDU with different path",()=>{t=new o({...s,derivationPath:"44'/502'"});const e=t.getApdu();expect(e.getRawApdu()).toEqual(d)})}),describe("parseResponse",()=>{it("should parse the response",()=>{const e=t.parseResponse(p);expect(e).toStrictEqual(n({data:"D2PPQSYFe83nDzk96FqGumVU8JA7J8vj2Rhjc2oXzEi5"}))}),describe("error handling",()=>{it("should return error if response is not success",()=>{const e=new a({statusCode:Uint8Array.from([106,130]),data:new Uint8Array(0)}),r=t.parseResponse(e);expect(x(r)).toBe(!1),x(r)?assert.fail("Expected error"):expect(r.error).toEqual(expect.objectContaining({_tag:"SolanaAppCommandError",errorCode:"6a82",message:"Invalid off-chain message format"}))}),it("should return error if public key is missing",()=>{const e=new a({statusCode:Uint8Array.from([144,0]),data:new Uint8Array(0)}),r=t.parseResponse(e);expect(x(r)).toBe(!1),x(r)?assert.fail("Expected error"):expect(r.error.originalError).toEqual(expect.objectContaining({message:"Public key is missing"}))})})})});
|
|
2
2
|
//# sourceMappingURL=GetPubKeyCommand.test.js.map
|