@ledgerhq/device-signer-kit-solana 0.0.0-develop-20260106001100 → 0.0.0-dmk-lifi-20260106144650
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/api/SignerSolanaBuilder.js +1 -1
- package/lib/cjs/api/SignerSolanaBuilder.js.map +3 -3
- package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
- package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js.map +2 -2
- package/lib/cjs/internal/app-binder/SolanaAppBinder.js +1 -1
- package/lib/cjs/internal/app-binder/SolanaAppBinder.js.map +3 -3
- package/lib/cjs/internal/app-binder/SolanaAppBinder.test.js +1 -1
- package/lib/cjs/internal/app-binder/SolanaAppBinder.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/task/BuildTransactionContextTask.js +1 -1
- package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js.map +3 -3
- 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/internal/di.js +1 -1
- package/lib/cjs/internal/di.js.map +3 -3
- package/lib/cjs/internal/externalTypes.js +1 -1
- package/lib/cjs/internal/externalTypes.js.map +2 -2
- package/lib/cjs/package.json +1 -1
- package/lib/esm/api/SignerSolanaBuilder.js +1 -1
- package/lib/esm/api/SignerSolanaBuilder.js.map +3 -3
- package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js.map +2 -2
- package/lib/esm/internal/app-binder/SolanaAppBinder.js +1 -1
- package/lib/esm/internal/app-binder/SolanaAppBinder.js.map +3 -3
- package/lib/esm/internal/app-binder/SolanaAppBinder.test.js +1 -1
- package/lib/esm/internal/app-binder/SolanaAppBinder.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/task/BuildTransactionContextTask.js +1 -1
- package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js.map +3 -3
- 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/internal/di.js +1 -1
- package/lib/esm/internal/di.js.map +3 -3
- package/lib/esm/internal/externalTypes.js +1 -1
- package/lib/esm/internal/externalTypes.js.map +2 -2
- package/lib/esm/package.json +1 -1
- package/lib/types/api/SignerSolanaBuilder.d.ts.map +1 -1
- package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts +3 -2
- package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts.map +1 -1
- package/lib/types/internal/app-binder/SolanaAppBinder.d.ts +3 -2
- package/lib/types/internal/app-binder/SolanaAppBinder.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/task/BuildTransactionContextTask.d.ts +3 -1
- package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts.map +1 -1
- package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts +9 -6
- package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts.map +1 -1
- package/lib/types/internal/di.d.ts.map +1 -1
- package/lib/types/internal/externalTypes.d.ts +1 -0
- package/lib/types/internal/externalTypes.d.ts.map +1 -1
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +7 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/internal/app-binder/SolanaAppBinder.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n type DeviceActionIntermediateValue,\n type DeviceActionState,\n DeviceActionStatus,\n type DeviceManagementKit,\n type DeviceSessionId,\n type DmkError,\n SendCommandInAppDeviceAction,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { from } from \"rxjs\";\n\nimport {\n type GenerateTransactionDAError,\n type GenerateTransactionDAIntermediateValue,\n type GenerateTransactionDAOutput,\n} from \"@api/app-binder/GenerateTransactionDeviceActionTypes\";\nimport {\n type GetAppConfigurationDAError,\n type GetAppConfigurationDAIntermediateValue,\n type GetAppConfigurationDAOutput,\n} from \"@api/app-binder/GetAppConfigurationDeviceActionTypes\";\nimport {\n type GetAddressDAError,\n type GetAddressDAIntermediateValue,\n type GetAddressDAOutput,\n type SignMessageDAOutput,\n type SignTransactionDAError,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAOutput,\n} from \"@api/index\";\n\nimport { GetAppConfigurationCommand } from \"./command/GetAppConfigurationCommand\";\nimport { GetPubKeyCommand } from \"./command/GetPubKeyCommand\";\nimport { GenerateTransactionDeviceAction } from \"./device-action/GenerateTransactionDeviceAction\";\nimport { SignTransactionDeviceAction } from \"./device-action/SignTransactionDeviceAction\";\nimport { SolanaAppBinder } from \"./SolanaAppBinder\";\n\ndescribe(\"SolanaAppBinder\", () => {\n // stub ContextModule for tests\n const contextModuleStub: ContextModule = {} as ContextModule;\n\n const mockedDmk: DeviceManagementKit = {\n sendCommand: vi.fn(),\n executeDeviceAction: vi.fn(),\n } as unknown as DeviceManagementKit;\n\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"should be defined\", () => {\n const binder = new SolanaAppBinder(\n {} as DeviceManagementKit,\n {} as DeviceSessionId,\n contextModuleStub,\n );\n expect(binder).toBeDefined();\n });\n\n describe(\"getAddress\", () => {\n it(\"should return the address\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const address = \"D2PPQSYFe83nDzk96FqGumVU8JA7J8vj2Rhjc2oXzEi5\";\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: address,\n } as DeviceActionState<\n GetAddressDAOutput,\n GetAddressDAError,\n GetAddressDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n );\n const { observable } = appBinder.getAddress({\n derivationPath: \"44'/501'\",\n checkOnDevice: false,\n skipOpenApp: false,\n });\n\n // THEN\n const states: DeviceActionState<\n GetAddressDAOutput,\n GetAddressDAError,\n GetAddressDAIntermediateValue\n >[] = [];\n observable.subscribe({\n next: (state) => {\n states.push(state);\n },\n error: (err) => {\n reject(err);\n },\n complete: () => {\n try {\n expect(states).toEqual([\n {\n status: DeviceActionStatus.Completed,\n output: address,\n },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n describe(\"calls of executeDeviceAction with the correct params\", () => {\n const baseParams = {\n derivationPath: \"44'/60'/3'/2/1\",\n returnChainCode: false,\n skipOpenApp: false,\n };\n\n it(\"when checkOnDevice is true: UserInteractionRequired.VerifyAddress\", () => {\n // GIVEN\n const checkOnDevice = true;\n const params = {\n ...baseParams,\n checkOnDevice,\n };\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n );\n appBinder.getAddress(params);\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith({\n sessionId: \"sessionId\",\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new GetPubKeyCommand(params),\n appName: \"Solana\",\n requiredUserInteraction: UserInteractionRequired.VerifyAddress,\n skipOpenApp: false,\n },\n }),\n });\n });\n\n it(\"when checkOnDevice is false: UserInteractionRequired.None\", () => {\n // GIVEN\n const checkOnDevice = false;\n const params = {\n ...baseParams,\n checkOnDevice,\n };\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n );\n appBinder.getAddress(params);\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith({\n sessionId: \"sessionId\",\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new GetPubKeyCommand(params),\n appName: \"Solana\",\n requiredUserInteraction: UserInteractionRequired.None,\n skipOpenApp: false,\n },\n }),\n });\n });\n });\n });\n\n describe(\"signTransaction\", () => {\n it(\"should return the signature\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const signature = new Uint8Array([0x01, 0x02, 0x03]);\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: signature,\n } as DeviceActionState<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n );\n const { observable } = appBinder.signTransaction({\n derivationPath: \"44'/501'\",\n transaction: new Uint8Array([0x01, 0x02, 0x03, 0x04]),\n solanaTransactionOptionalConfig: { skipOpenApp: false },\n });\n\n // THEN\n const states: DeviceActionState<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[] = [];\n observable.subscribe({\n next: (state) => {\n states.push(state);\n },\n error: (err) => {\n reject(err);\n },\n complete: () => {\n try {\n expect(states).toEqual([\n {\n status: DeviceActionStatus.Completed,\n output: signature,\n },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n it(\"should call executeDeviceAction with the correct params\", () => {\n // GIVEN\n const derivationPath = \"44'/60'/3'/2/1\";\n const transaction = new Uint8Array([0x01, 0x02, 0x03, 0x04]);\n const skipOpenApp = false;\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n );\n appBinder.signTransaction({\n derivationPath,\n transaction,\n solanaTransactionOptionalConfig: { skipOpenApp: false },\n });\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith({\n sessionId: \"sessionId\",\n deviceAction: new SignTransactionDeviceAction({\n input: {\n derivationPath,\n transaction,\n transactionOptions: { skipOpenApp },\n contextModule: contextModuleStub,\n },\n }),\n });\n });\n });\n\n describe(\"signMessage\", () => {\n it(\"should return the signed message\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const signedMessage = {\n signature: \"signature\",\n };\n const signMessageArgs = {\n derivationPath: \"44'/501'/0'/0'\",\n message: \"Hello world\",\n skipOpenApp: false,\n };\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: signedMessage,\n } as DeviceActionState<\n SignMessageDAOutput,\n DmkError,\n DeviceActionIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n );\n const { observable } = appBinder.signMessage(signMessageArgs);\n\n // THEN\n const states: DeviceActionState<\n SignMessageDAOutput,\n unknown,\n unknown\n >[] = [];\n observable.subscribe({\n next: (state) => {\n states.push(state);\n },\n error: (err) => {\n reject(err);\n },\n complete: () => {\n try {\n expect(states).toEqual([\n {\n status: DeviceActionStatus.Completed,\n output: signedMessage,\n },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n });\n\n describe(\"getAppConfiguration\", () => {\n it(\"should return the app configuration\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const appConfiguration = {\n blindSigningEnabled: true,\n pubKeyDisplayMode: \"LONG\",\n version: \"2.5.10\",\n };\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: appConfiguration,\n } as DeviceActionState<\n GetAppConfigurationDAOutput,\n GetAppConfigurationDAError,\n GetAppConfigurationDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n );\n const { observable } = appBinder.getAppConfiguration();\n\n // THEN\n const states: DeviceActionState<\n GetAppConfigurationDAOutput,\n GetAppConfigurationDAError,\n GetAppConfigurationDAIntermediateValue\n >[] = [];\n\n observable.subscribe({\n next: (state) => {\n states.push(state);\n },\n error: (err) => {\n reject(err);\n },\n complete: () => {\n try {\n expect(states).toEqual([\n {\n status: DeviceActionStatus.Completed,\n output: appConfiguration,\n },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n it(\"should call executeDeviceAction with the correct params\", () => {\n // GIVEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n );\n\n // WHEN\n appBinder.getAppConfiguration();\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith({\n sessionId: \"sessionId\",\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new GetAppConfigurationCommand(),\n appName: \"Solana\",\n requiredUserInteraction: UserInteractionRequired.None,\n skipOpenApp: false,\n },\n }),\n });\n });\n });\n\n describe(\"generateTransaction\", () => {\n it(\"should return the serialized transaction\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const serializedTx = \"BASE64_OR_HEX_TX\";\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: serializedTx,\n } as DeviceActionState<\n GenerateTransactionDAOutput,\n GenerateTransactionDAError,\n GenerateTransactionDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n );\n const { observable } = appBinder.generateTransaction({\n derivationPath: \"44'/501'/0'/0'\",\n skipOpenApp: false,\n });\n\n // THEN\n const states: DeviceActionState<\n GenerateTransactionDAOutput,\n GenerateTransactionDAError,\n GenerateTransactionDAIntermediateValue\n >[] = [];\n observable.subscribe({\n next: (state) => states.push(state),\n error: (err) => reject(err),\n complete: () => {\n try {\n expect(states).toEqual([\n { status: DeviceActionStatus.Completed, output: serializedTx },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n it(\"should call executeDeviceAction with the correct params\", () => {\n // GIVEN\n const derivationPath = \"44'/501'/0'/0'\";\n const skipOpenApp = true;\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n );\n appBinder.generateTransaction({ derivationPath, skipOpenApp });\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith({\n sessionId: \"sessionId\",\n deviceAction: new GenerateTransactionDeviceAction({\n input: {\n derivationPath,\n skipOpenApp,\n contextModule: contextModuleStub,\n },\n }),\n });\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["DeviceActionStatus", "SendCommandInAppDeviceAction", "UserInteractionRequired", "from", "GetAppConfigurationCommand", "GetPubKeyCommand", "GenerateTransactionDeviceAction", "SignTransactionDeviceAction", "SolanaAppBinder", "contextModuleStub", "mockedDmk", "binder", "resolve", "reject", "address", "appBinder", "observable", "states", "state", "err", "baseParams", "params", "signature", "derivationPath", "transaction", "skipOpenApp", "signedMessage", "signMessageArgs", "appConfiguration", "serializedTx"]
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n type DeviceActionIntermediateValue,\n type DeviceActionState,\n DeviceActionStatus,\n type DeviceManagementKit,\n type DeviceSessionId,\n type DmkError,\n type LoggerPublisherService,\n SendCommandInAppDeviceAction,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { from } from \"rxjs\";\n\nimport {\n type GenerateTransactionDAError,\n type GenerateTransactionDAIntermediateValue,\n type GenerateTransactionDAOutput,\n} from \"@api/app-binder/GenerateTransactionDeviceActionTypes\";\nimport {\n type GetAppConfigurationDAError,\n type GetAppConfigurationDAIntermediateValue,\n type GetAppConfigurationDAOutput,\n} from \"@api/app-binder/GetAppConfigurationDeviceActionTypes\";\nimport {\n type GetAddressDAError,\n type GetAddressDAIntermediateValue,\n type GetAddressDAOutput,\n type SignMessageDAOutput,\n type SignTransactionDAError,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAOutput,\n} from \"@api/index\";\n\nimport { GetAppConfigurationCommand } from \"./command/GetAppConfigurationCommand\";\nimport { GetPubKeyCommand } from \"./command/GetPubKeyCommand\";\nimport { GenerateTransactionDeviceAction } from \"./device-action/GenerateTransactionDeviceAction\";\nimport { SignTransactionDeviceAction } from \"./device-action/SignTransactionDeviceAction\";\nimport { SolanaAppBinder } from \"./SolanaAppBinder\";\n\ndescribe(\"SolanaAppBinder\", () => {\n // stub ContextModule for tests\n const contextModuleStub: ContextModule = {} as ContextModule;\n\n const mockedDmk: DeviceManagementKit = {\n sendCommand: vi.fn(),\n executeDeviceAction: vi.fn(),\n } as unknown as DeviceManagementKit;\n\n const dmkLoggerFactoryMock: (tag: string) => LoggerPublisherService = vi.fn(\n () => ({}) as any,\n );\n\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"should be defined\", () => {\n const binder = new SolanaAppBinder(\n {} as DeviceManagementKit,\n {} as DeviceSessionId,\n contextModuleStub,\n dmkLoggerFactoryMock,\n );\n expect(binder).toBeDefined();\n });\n\n describe(\"getAddress\", () => {\n it(\"should return the address\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const address = \"D2PPQSYFe83nDzk96FqGumVU8JA7J8vj2Rhjc2oXzEi5\";\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: address,\n } as DeviceActionState<\n GetAddressDAOutput,\n GetAddressDAError,\n GetAddressDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n dmkLoggerFactoryMock,\n );\n const { observable } = appBinder.getAddress({\n derivationPath: \"44'/501'\",\n checkOnDevice: false,\n skipOpenApp: false,\n });\n\n // THEN\n const states: DeviceActionState<\n GetAddressDAOutput,\n GetAddressDAError,\n GetAddressDAIntermediateValue\n >[] = [];\n observable.subscribe({\n next: (state) => {\n states.push(state);\n },\n error: (err) => {\n reject(err);\n },\n complete: () => {\n try {\n expect(states).toEqual([\n {\n status: DeviceActionStatus.Completed,\n output: address,\n },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n describe(\"calls of executeDeviceAction with the correct params\", () => {\n const baseParams = {\n derivationPath: \"44'/60'/3'/2/1\",\n returnChainCode: false,\n skipOpenApp: false,\n };\n\n it(\"when checkOnDevice is true: UserInteractionRequired.VerifyAddress\", () => {\n // GIVEN\n const checkOnDevice = true;\n const params = {\n ...baseParams,\n checkOnDevice,\n };\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n dmkLoggerFactoryMock,\n );\n appBinder.getAddress(params);\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith({\n sessionId: \"sessionId\",\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new GetPubKeyCommand(params),\n appName: \"Solana\",\n requiredUserInteraction: UserInteractionRequired.VerifyAddress,\n skipOpenApp: false,\n },\n }),\n });\n });\n\n it(\"when checkOnDevice is false: UserInteractionRequired.None\", () => {\n // GIVEN\n const checkOnDevice = false;\n const params = {\n ...baseParams,\n checkOnDevice,\n };\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n dmkLoggerFactoryMock,\n );\n appBinder.getAddress(params);\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith({\n sessionId: \"sessionId\",\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new GetPubKeyCommand(params),\n appName: \"Solana\",\n requiredUserInteraction: UserInteractionRequired.None,\n skipOpenApp: false,\n },\n }),\n });\n });\n });\n });\n\n describe(\"signTransaction\", () => {\n it(\"should return the signature\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const signature = new Uint8Array([0x01, 0x02, 0x03]);\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: signature,\n } as DeviceActionState<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n dmkLoggerFactoryMock,\n );\n const { observable } = appBinder.signTransaction({\n derivationPath: \"44'/501'\",\n transaction: new Uint8Array([0x01, 0x02, 0x03, 0x04]),\n solanaTransactionOptionalConfig: { skipOpenApp: false },\n });\n\n // THEN\n const states: DeviceActionState<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[] = [];\n observable.subscribe({\n next: (state) => {\n states.push(state);\n },\n error: (err) => {\n reject(err);\n },\n complete: () => {\n try {\n expect(states).toEqual([\n {\n status: DeviceActionStatus.Completed,\n output: signature,\n },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n it(\"should call executeDeviceAction with the correct params\", () => {\n // GIVEN\n const derivationPath = \"44'/60'/3'/2/1\";\n const transaction = new Uint8Array([0x01, 0x02, 0x03, 0x04]);\n const skipOpenApp = false;\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n dmkLoggerFactoryMock,\n );\n appBinder.signTransaction({\n derivationPath,\n transaction,\n solanaTransactionOptionalConfig: { skipOpenApp: false },\n });\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith({\n sessionId: \"sessionId\",\n deviceAction: new SignTransactionDeviceAction({\n input: {\n derivationPath,\n transaction,\n transactionOptions: { skipOpenApp },\n contextModule: contextModuleStub,\n loggerFactory: dmkLoggerFactoryMock,\n },\n }),\n });\n });\n });\n\n describe(\"signMessage\", () => {\n it(\"should return the signed message\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const signedMessage = {\n signature: \"signature\",\n };\n const signMessageArgs = {\n derivationPath: \"44'/501'/0'/0'\",\n message: \"Hello world\",\n skipOpenApp: false,\n };\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: signedMessage,\n } as DeviceActionState<\n SignMessageDAOutput,\n DmkError,\n DeviceActionIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n dmkLoggerFactoryMock,\n );\n const { observable } = appBinder.signMessage(signMessageArgs);\n\n // THEN\n const states: DeviceActionState<\n SignMessageDAOutput,\n unknown,\n unknown\n >[] = [];\n observable.subscribe({\n next: (state) => {\n states.push(state);\n },\n error: (err) => {\n reject(err);\n },\n complete: () => {\n try {\n expect(states).toEqual([\n {\n status: DeviceActionStatus.Completed,\n output: signedMessage,\n },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n });\n\n describe(\"getAppConfiguration\", () => {\n it(\"should return the app configuration\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const appConfiguration = {\n blindSigningEnabled: true,\n pubKeyDisplayMode: \"LONG\",\n version: \"2.5.10\",\n };\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: appConfiguration,\n } as DeviceActionState<\n GetAppConfigurationDAOutput,\n GetAppConfigurationDAError,\n GetAppConfigurationDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n dmkLoggerFactoryMock,\n );\n const { observable } = appBinder.getAppConfiguration();\n\n // THEN\n const states: DeviceActionState<\n GetAppConfigurationDAOutput,\n GetAppConfigurationDAError,\n GetAppConfigurationDAIntermediateValue\n >[] = [];\n\n observable.subscribe({\n next: (state) => {\n states.push(state);\n },\n error: (err) => {\n reject(err);\n },\n complete: () => {\n try {\n expect(states).toEqual([\n {\n status: DeviceActionStatus.Completed,\n output: appConfiguration,\n },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n it(\"should call executeDeviceAction with the correct params\", () => {\n // GIVEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n dmkLoggerFactoryMock,\n );\n\n // WHEN\n appBinder.getAppConfiguration();\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith({\n sessionId: \"sessionId\",\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new GetAppConfigurationCommand(),\n appName: \"Solana\",\n requiredUserInteraction: UserInteractionRequired.None,\n skipOpenApp: false,\n },\n }),\n });\n });\n });\n\n describe(\"generateTransaction\", () => {\n it(\"should return the serialized transaction\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const serializedTx = \"BASE64_OR_HEX_TX\";\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: serializedTx,\n } as DeviceActionState<\n GenerateTransactionDAOutput,\n GenerateTransactionDAError,\n GenerateTransactionDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n dmkLoggerFactoryMock,\n );\n const { observable } = appBinder.generateTransaction({\n derivationPath: \"44'/501'/0'/0'\",\n skipOpenApp: false,\n });\n\n // THEN\n const states: DeviceActionState<\n GenerateTransactionDAOutput,\n GenerateTransactionDAError,\n GenerateTransactionDAIntermediateValue\n >[] = [];\n observable.subscribe({\n next: (state) => states.push(state),\n error: (err) => reject(err),\n complete: () => {\n try {\n expect(states).toEqual([\n { status: DeviceActionStatus.Completed, output: serializedTx },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n it(\"should call executeDeviceAction with the correct params\", () => {\n // GIVEN\n const derivationPath = \"44'/501'/0'/0'\";\n const skipOpenApp = true;\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n dmkLoggerFactoryMock,\n );\n appBinder.generateTransaction({ derivationPath, skipOpenApp });\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith({\n sessionId: \"sessionId\",\n deviceAction: new GenerateTransactionDeviceAction({\n input: {\n derivationPath,\n skipOpenApp,\n contextModule: contextModuleStub,\n },\n }),\n });\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "AAEA,OAGE,sBAAAA,EAKA,gCAAAC,EACA,2BAAAC,MACK,kCACP,OAAS,QAAAC,MAAY,OAsBrB,OAAS,8BAAAC,MAAkC,uCAC3C,OAAS,oBAAAC,MAAwB,6BACjC,OAAS,mCAAAC,MAAuC,kDAChD,OAAS,+BAAAC,MAAmC,8CAC5C,OAAS,mBAAAC,MAAuB,oBAEhC,SAAS,kBAAmB,IAAM,CAEhC,MAAMC,EAAmC,CAAC,EAEpCC,EAAiC,CACrC,YAAa,GAAG,GAAG,EACnB,oBAAqB,GAAG,GAAG,CAC7B,EAEMC,EAAgE,GAAG,GACvE,KAAO,CAAC,EACV,EAEA,WAAW,IAAM,CACf,GAAG,cAAc,CACnB,CAAC,EAED,GAAG,oBAAqB,IAAM,CAC5B,MAAMC,EAAS,IAAIJ,EACjB,CAAC,EACD,CAAC,EACDC,EACAE,CACF,EACA,OAAOC,CAAM,EAAE,YAAY,CAC7B,CAAC,EAED,SAAS,aAAc,IAAM,CAC3B,GAAG,4BAA6B,IAC9B,IAAI,QAAc,CAACC,EAASC,IAAW,CAErC,MAAMC,EAAU,+CAEhB,GAAG,MAAML,EAAW,qBAAqB,EAAE,gBAAgB,CACzD,WAAYP,EAAK,CACf,CACE,OAAQH,EAAmB,UAC3B,OAAQe,CACV,CAKF,CAAC,EACD,OAAQ,GAAG,GAAG,CAChB,CAAC,EAGD,MAAMC,EAAY,IAAIR,EACpBE,EACA,YACAD,EACAE,CACF,EACM,CAAE,WAAAM,CAAW,EAAID,EAAU,WAAW,CAC1C,eAAgB,WAChB,cAAe,GACf,YAAa,EACf,CAAC,EAGKE,EAIA,CAAC,EACPD,EAAW,UAAU,CACnB,KAAOE,GAAU,CACfD,EAAO,KAAKC,CAAK,CACnB,EACA,MAAQC,GAAQ,CACdN,EAAOM,CAAG,CACZ,EACA,SAAU,IAAM,CACd,GAAI,CACF,OAAOF,CAAM,EAAE,QAAQ,CACrB,CACE,OAAQlB,EAAmB,UAC3B,OAAQe,CACV,CACF,CAAC,EACDF,EAAQ,CACV,OAASO,EAAK,CACZN,EAAOM,CAAY,CACrB,CACF,CACF,CAAC,CACH,CAAC,CAAC,EAEJ,SAAS,uDAAwD,IAAM,CACrE,MAAMC,EAAa,CACjB,eAAgB,iBAChB,gBAAiB,GACjB,YAAa,EACf,EAEA,GAAG,oEAAqE,IAAM,CAG5E,MAAMC,EAAS,CACb,GAAGD,EACH,gBACF,EAGkB,IAAIb,EACpBE,EACA,YACAD,EACAE,CACF,EACU,WAAWW,CAAM,EAG3B,OAAOZ,EAAU,mBAAmB,EAAE,qBAAqB,CACzD,UAAW,YACX,aAAc,IAAIT,EAA6B,CAC7C,MAAO,CACL,QAAS,IAAII,EAAiBiB,CAAM,EACpC,QAAS,SACT,wBAAyBpB,EAAwB,cACjD,YAAa,EACf,CACF,CAAC,CACH,CAAC,CACH,CAAC,EAED,GAAG,4DAA6D,IAAM,CAGpE,MAAMoB,EAAS,CACb,GAAGD,EACH,gBACF,EAGkB,IAAIb,EACpBE,EACA,YACAD,EACAE,CACF,EACU,WAAWW,CAAM,EAG3B,OAAOZ,EAAU,mBAAmB,EAAE,qBAAqB,CACzD,UAAW,YACX,aAAc,IAAIT,EAA6B,CAC7C,MAAO,CACL,QAAS,IAAII,EAAiBiB,CAAM,EACpC,QAAS,SACT,wBAAyBpB,EAAwB,KACjD,YAAa,EACf,CACF,CAAC,CACH,CAAC,CACH,CAAC,CACH,CAAC,CACH,CAAC,EAED,SAAS,kBAAmB,IAAM,CAChC,GAAG,8BAA+B,IAChC,IAAI,QAAc,CAACW,EAASC,IAAW,CAErC,MAAMS,EAAY,IAAI,WAAW,CAAC,EAAM,EAAM,CAAI,CAAC,EAEnD,GAAG,MAAMb,EAAW,qBAAqB,EAAE,gBAAgB,CACzD,WAAYP,EAAK,CACf,CACE,OAAQH,EAAmB,UAC3B,OAAQuB,CACV,CAKF,CAAC,EACD,OAAQ,GAAG,GAAG,CAChB,CAAC,EAGD,MAAMP,EAAY,IAAIR,EACpBE,EACA,YACAD,EACAE,CACF,EACM,CAAE,WAAAM,CAAW,EAAID,EAAU,gBAAgB,CAC/C,eAAgB,WAChB,YAAa,IAAI,WAAW,CAAC,EAAM,EAAM,EAAM,CAAI,CAAC,EACpD,gCAAiC,CAAE,YAAa,EAAM,CACxD,CAAC,EAGKE,EAIA,CAAC,EACPD,EAAW,UAAU,CACnB,KAAOE,GAAU,CACfD,EAAO,KAAKC,CAAK,CACnB,EACA,MAAQC,GAAQ,CACdN,EAAOM,CAAG,CACZ,EACA,SAAU,IAAM,CACd,GAAI,CACF,OAAOF,CAAM,EAAE,QAAQ,CACrB,CACE,OAAQlB,EAAmB,UAC3B,OAAQuB,CACV,CACF,CAAC,EACDV,EAAQ,CACV,OAASO,EAAK,CACZN,EAAOM,CAAY,CACrB,CACF,CACF,CAAC,CACH,CAAC,CAAC,EAEJ,GAAG,0DAA2D,IAAM,CAElE,MAAMI,EAAiB,iBACjBC,EAAc,IAAI,WAAW,CAAC,EAAM,EAAM,EAAM,CAAI,CAAC,EACrDC,EAAc,GAGF,IAAIlB,EACpBE,EACA,YACAD,EACAE,CACF,EACU,gBAAgB,CACxB,eAAAa,EACA,YAAAC,EACA,gCAAiC,CAAE,YAAa,EAAM,CACxD,CAAC,EAGD,OAAOf,EAAU,mBAAmB,EAAE,qBAAqB,CACzD,UAAW,YACX,aAAc,IAAIH,EAA4B,CAC5C,MAAO,CACL,eAAAiB,EACA,YAAAC,EACA,mBAAoB,CAAE,YAAAC,CAAY,EAClC,cAAejB,EACf,cAAeE,CACjB,CACF,CAAC,CACH,CAAC,CACH,CAAC,CACH,CAAC,EAED,SAAS,cAAe,IAAM,CAC5B,GAAG,mCAAoC,IACrC,IAAI,QAAc,CAACE,EAASC,IAAW,CAErC,MAAMa,EAAgB,CACpB,UAAW,WACb,EACMC,EAAkB,CACtB,eAAgB,iBAChB,QAAS,cACT,YAAa,EACf,EAEA,GAAG,MAAMlB,EAAW,qBAAqB,EAAE,gBAAgB,CACzD,WAAYP,EAAK,CACf,CACE,OAAQH,EAAmB,UAC3B,OAAQ2B,CACV,CAKF,CAAC,EACD,OAAQ,GAAG,GAAG,CAChB,CAAC,EAGD,MAAMX,EAAY,IAAIR,EACpBE,EACA,YACAD,EACAE,CACF,EACM,CAAE,WAAAM,CAAW,EAAID,EAAU,YAAYY,CAAe,EAGtDV,EAIA,CAAC,EACPD,EAAW,UAAU,CACnB,KAAOE,GAAU,CACfD,EAAO,KAAKC,CAAK,CACnB,EACA,MAAQC,GAAQ,CACdN,EAAOM,CAAG,CACZ,EACA,SAAU,IAAM,CACd,GAAI,CACF,OAAOF,CAAM,EAAE,QAAQ,CACrB,CACE,OAAQlB,EAAmB,UAC3B,OAAQ2B,CACV,CACF,CAAC,EACDd,EAAQ,CACV,OAASO,EAAK,CACZN,EAAOM,CAAY,CACrB,CACF,CACF,CAAC,CACH,CAAC,CAAC,CACN,CAAC,EAED,SAAS,sBAAuB,IAAM,CACpC,GAAG,sCAAuC,IACxC,IAAI,QAAc,CAACP,EAASC,IAAW,CAErC,MAAMe,EAAmB,CACvB,oBAAqB,GACrB,kBAAmB,OACnB,QAAS,QACX,EAEA,GAAG,MAAMnB,EAAW,qBAAqB,EAAE,gBAAgB,CACzD,WAAYP,EAAK,CACf,CACE,OAAQH,EAAmB,UAC3B,OAAQ6B,CACV,CAKF,CAAC,EACD,OAAQ,GAAG,GAAG,CAChB,CAAC,EAGD,MAAMb,EAAY,IAAIR,EACpBE,EACA,YACAD,EACAE,CACF,EACM,CAAE,WAAAM,CAAW,EAAID,EAAU,oBAAoB,EAG/CE,EAIA,CAAC,EAEPD,EAAW,UAAU,CACnB,KAAOE,GAAU,CACfD,EAAO,KAAKC,CAAK,CACnB,EACA,MAAQC,GAAQ,CACdN,EAAOM,CAAG,CACZ,EACA,SAAU,IAAM,CACd,GAAI,CACF,OAAOF,CAAM,EAAE,QAAQ,CACrB,CACE,OAAQlB,EAAmB,UAC3B,OAAQ6B,CACV,CACF,CAAC,EACDhB,EAAQ,CACV,OAASO,EAAK,CACZN,EAAOM,CAAY,CACrB,CACF,CACF,CAAC,CACH,CAAC,CAAC,EAEJ,GAAG,0DAA2D,IAAM,CAEhD,IAAIZ,EACpBE,EACA,YACAD,EACAE,CACF,EAGU,oBAAoB,EAG9B,OAAOD,EAAU,mBAAmB,EAAE,qBAAqB,CACzD,UAAW,YACX,aAAc,IAAIT,EAA6B,CAC7C,MAAO,CACL,QAAS,IAAIG,EACb,QAAS,SACT,wBAAyBF,EAAwB,KACjD,YAAa,EACf,CACF,CAAC,CACH,CAAC,CACH,CAAC,CACH,CAAC,EAED,SAAS,sBAAuB,IAAM,CACpC,GAAG,2CAA4C,IAC7C,IAAI,QAAc,CAACW,EAASC,IAAW,CAErC,MAAMgB,EAAe,mBAErB,GAAG,MAAMpB,EAAW,qBAAqB,EAAE,gBAAgB,CACzD,WAAYP,EAAK,CACf,CACE,OAAQH,EAAmB,UAC3B,OAAQ8B,CACV,CAKF,CAAC,EACD,OAAQ,GAAG,GAAG,CAChB,CAAC,EAGD,MAAMd,EAAY,IAAIR,EACpBE,EACA,YACAD,EACAE,CACF,EACM,CAAE,WAAAM,CAAW,EAAID,EAAU,oBAAoB,CACnD,eAAgB,iBAChB,YAAa,EACf,CAAC,EAGKE,EAIA,CAAC,EACPD,EAAW,UAAU,CACnB,KAAOE,GAAUD,EAAO,KAAKC,CAAK,EAClC,MAAQC,GAAQN,EAAOM,CAAG,EAC1B,SAAU,IAAM,CACd,GAAI,CACF,OAAOF,CAAM,EAAE,QAAQ,CACrB,CAAE,OAAQlB,EAAmB,UAAW,OAAQ8B,CAAa,CAC/D,CAAC,EACDjB,EAAQ,CACV,OAASO,EAAK,CACZN,EAAOM,CAAY,CACrB,CACF,CACF,CAAC,CACH,CAAC,CAAC,EAEJ,GAAG,0DAA2D,IAAM,CAElE,MAAMI,EAAiB,iBAIL,IAAIhB,EACpBE,EACA,YACAD,EACAE,CACF,EACU,oBAAoB,CAAE,eAAAa,EAAgB,cAAY,CAAC,EAG7D,OAAOd,EAAU,mBAAmB,EAAE,qBAAqB,CACzD,UAAW,YACX,aAAc,IAAIJ,EAAgC,CAChD,MAAO,CACL,eAAAkB,EACA,eACA,cAAef,CACjB,CACF,CAAC,CACH,CAAC,CACH,CAAC,CACH,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["DeviceActionStatus", "SendCommandInAppDeviceAction", "UserInteractionRequired", "from", "GetAppConfigurationCommand", "GetPubKeyCommand", "GenerateTransactionDeviceAction", "SignTransactionDeviceAction", "SolanaAppBinder", "contextModuleStub", "mockedDmk", "dmkLoggerFactoryMock", "binder", "resolve", "reject", "address", "appBinder", "observable", "states", "state", "err", "baseParams", "params", "signature", "derivationPath", "transaction", "skipOpenApp", "signedMessage", "signMessageArgs", "appConfiguration", "serializedTx"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{DeviceModelId as
|
|
1
|
+
import{DeviceModelId as C,isSuccessCommandResult as A,OpenAppDeviceAction as m,UnknownDAError as u,UserInteractionRequired as o,XStateDeviceAction as y}from"@ledgerhq/device-management-kit";import{Left as I,Right as D}from"purify-ts";import{assign as a,fromPromise as p,setup as f}from"xstate";import{signTransactionDAStateSteps as r}from"../../../api/app-binder/SignTransactionDeviceActionTypes";import{GetAppConfigurationCommand as x}from"../../app-binder/command/GetAppConfigurationCommand";import{SignTransactionCommand as v}from"../../app-binder/command/SignTransactionCommand";import{ApplicationChecker as E}from"../../app-binder/services/ApplicationChecker";import{SolanaTransactionTypes as R,TransactionInspector as P}from"../../app-binder/services/TransactionInspector";import{BuildTransactionContextTask as h}from"../../app-binder/task/BuildTransactionContextTask";import{ProvideSolanaTransactionContextTask as k}from"../../app-binder/task/ProvideTransactionContextTask";import{SignDataTask as _}from"../../app-binder/task/SendSignDataTask";class q extends y{makeStateMachine(i){const{signTransaction:l,getAppConfig:g,buildContext:d,provideContext:S,inspectTransaction:T}=this.extractDependencies(i);let e;const s=t=>{if(!e){const{loggerFactory:n}=t.input;e=n("SignTransactionDeviceAction")}return e};return f({types:{input:{},context:{},output:{}},actors:{openAppStateMachine:new m({input:{appName:"Solana"}}).makeStateMachine(i),getAppConfig:p(g),inspectTransaction:p(({input:t})=>T({serializedTransaction:t.serializedTransaction,resolutionContext:t.resolutionContext,rpcUrl:t.rpcUrl})),buildContext:p(d),provideContext:p(S),signTransaction:p(l)},guards:{noInternalError:({context:t})=>t._internalState.error===null,skipOpenApp:({context:t})=>t.input.transactionOptions?.skipOpenApp||!1,isSPLSupported:({context:t})=>new E(i.getDeviceSessionState(),t._internalState.appConfig).withMinVersionExclusive("1.4.0").excludeDeviceModel(C.NANO_S).check(),isAnSPLTransaction:({context:t})=>t._internalState.inspectorResult?.transactionType===R.SPL,shouldSkipInspection:({context:t})=>t._internalState.error===null&&!!t.input.transactionOptions?.transactionResolutionContext},actions:{assignErrorFromEvent:a({_internalState:t=>({...t.context._internalState,error:new u(t.event.error instanceof Error?t.event.error.message:String(t.event.error))})}),logInput:({context:t},n)=>{s(t).debug(`[makeStateMachine] step ${n.step}`,{data:{input:t.input}})},logInternalState:({context:t},n)=>{s(t).debug(`[makeStateMachine] step ${n.step}`,{data:{internalState:t._internalState}})}}}).createMachine({id:"SignTransactionDeviceAction",initial:"InitialState",context:({input:t})=>({input:t,intermediateValue:{requiredUserInteraction:o.None,step:r.OPEN_APP},_internalState:{error:null,signature:null,appConfig:null,solanaTransactionContext:null,inspectorResult:null}}),states:{InitialState:{entry:[{type:"logInput",params:{step:"InitialState"}}],always:[{target:"GetAppConfig",guard:"skipOpenApp"},{target:"OpenAppDeviceAction"}]},OpenAppDeviceAction:{entry:a({intermediateValue:()=>({requiredUserInteraction:o.None,step:r.OPEN_APP})}),invoke:{id:"openAppStateMachine",src:"openAppStateMachine",input:()=>({appName:"Solana"}),onSnapshot:{actions:a({intermediateValue:({event:t})=>({...t.snapshot.context.intermediateValue,step:r.OPEN_APP})})},onDone:{target:"CheckOpenAppDeviceActionResult",actions:a({_internalState:({event:t,context:n})=>t.output.caseOf({Right:()=>n._internalState,Left:c=>({...n._internalState,error:c})})})}}},CheckOpenAppDeviceActionResult:{always:[{target:"GetAppConfig",guard:"noInternalError"},{target:"Error"}]},GetAppConfig:{entry:a({intermediateValue:()=>({requiredUserInteraction:o.None,step:r.GET_APP_CONFIG})}),invoke:{id:"getAppConfig",src:"getAppConfig",onDone:{target:"GetAppConfigResultCheck",actions:a({_internalState:({event:t,context:n})=>A(t.output)?{...n._internalState,appConfig:t.output.data}:{...n._internalState,error:t.output.error}})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},GetAppConfigResultCheck:{always:[{target:"InspectTransaction",guard:"noInternalError"},{target:"Error"}]},InspectTransaction:{entry:a({intermediateValue:()=>({requiredUserInteraction:o.None,step:r.INSPECT_TRANSACTION})}),invoke:{id:"inspectTransaction",src:"inspectTransaction",input:({context:t})=>({serializedTransaction:t.input.transaction,resolutionContext:t.input.transactionOptions?.transactionResolutionContext,rpcUrl:t.input.transactionOptions?.solanaRPCURL}),onDone:{target:"AfterInspect",actions:[a({_internalState:({context:t,event:n})=>({...t._internalState,inspectorResult:n.output})}),{type:"logInternalState",params:{step:"OnDoneInspectTransaction"}}]},onError:{target:"SignTransaction"}}},AfterInspect:{always:[{target:"BuildContext",guard:"isAnSPLTransaction"},{target:"SignTransaction"}]},BuildContext:{entry:a({intermediateValue:()=>({requiredUserInteraction:o.None,step:r.BUILD_TRANSACTION_CONTEXT})}),invoke:{id:"buildContext",src:"buildContext",input:({context:t})=>{const n=t._internalState.inspectorResult?.data;return{contextModule:t.input.contextModule,loggerFactory:t.input.loggerFactory,options:{tokenAddress:n?.tokenAddress,createATA:n?.createATA,tokenInternalId:t.input.transactionOptions?.transactionResolutionContext?.tokenInternalId,templateId:t.input.transactionOptions?.transactionResolutionContext?.templateId}}},onDone:{target:"ProvideContext",actions:[a({_internalState:({event:t,context:n})=>({...n._internalState,solanaTransactionContext:{tlvDescriptor:t.output.tlvDescriptor,trustedNamePKICertificate:t.output.trustedNamePKICertificate,loadersResults:t.output.loadersResults}})}),{type:"logInternalState",params:{step:"OnDoneBuildContext"}}]},onError:{target:"SignTransaction"}}},ProvideContext:{entry:a({intermediateValue:()=>({requiredUserInteraction:o.None,step:r.PROVIDE_TRANSACTION_CONTEXT})}),invoke:{id:"provideContext",src:"provideContext",input:({context:t})=>{if(!t._internalState.solanaTransactionContext)throw new u("Solana transaction context is not available");return{...t._internalState.solanaTransactionContext,transactionBytes:t.input.transaction,loggerFactory:t.input.loggerFactory}},onDone:{target:"SignTransaction"},onError:{target:"SignTransaction"}}},SignTransaction:{entry:a({intermediateValue:{requiredUserInteraction:o.SignTransaction,step:r.SIGN_TRANSACTION}}),invoke:{id:"signTransaction",src:"signTransaction",input:({context:t})=>({derivationPath:t.input.derivationPath,serializedTransaction:t.input.transaction,userInputType:t.input.transactionOptions?.transactionResolutionContext?.userInputType}),onDone:{target:"SignTransactionResultCheck",actions:[a({_internalState:({event:t,context:n})=>{if(!A(t.output))return{...n._internalState,error:t.output.error};const c=t.output.data.extract();return t.output.data.isJust()&&c instanceof Uint8Array?{...n._internalState,signature:c}:{...n._internalState,error:new u("No Signature available")}},intermediateValue:{requiredUserInteraction:o.None,step:r.SIGN_TRANSACTION}}),{type:"logInternalState",params:{step:"OnDoneSignTransaction"}}]},onError:{target:"Error",actions:"assignErrorFromEvent"}}},SignTransactionResultCheck:{always:[{guard:"noInternalError",target:"Success"},{target:"Error"}]},Success:{type:"final"},Error:{type:"final"}},output:({context:t})=>t._internalState.signature?D(t._internalState.signature):I(t._internalState.error||new u("No error or signature available"))})}extractDependencies(i){return{getAppConfig:async()=>i.sendCommand(new x),buildContext:async e=>new h(i,e.input).run(),provideContext:async e=>new k(i,e.input).run(),signTransaction:async e=>new _(i,{commandFactory:s=>new v({serializedTransaction:s.chunkedData,more:s.more,extend:s.extend,userInputType:e.input.userInputType}),derivationPath:e.input.derivationPath,sendingData:e.input.serializedTransaction}).run(),inspectTransaction:async e=>Promise.resolve(new P(e.rpcUrl).inspectTransactionType(e.serializedTransaction,e.resolutionContext?.tokenAddress,e.resolutionContext?.createATA))}}}export{q as SignTransactionDeviceAction};
|
|
2
2
|
//# sourceMappingURL=SignTransactionDeviceAction.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/device-action/SignTransactionDeviceAction.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type CommandErrorResult,\n type CommandResult,\n type DeviceActionStateMachine,\n DeviceModelId,\n type InternalApi,\n isSuccessCommandResult,\n OpenAppDeviceAction,\n type StateMachineTypes,\n UnknownDAError,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, type Maybe, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAInternalState,\n type SignTransactionDAOutput,\n signTransactionDAStateSteps,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { type Signature } from \"@api/model/Signature\";\nimport {\n type TransactionResolutionContext,\n type UserInputType,\n} from \"@api/model/TransactionResolutionContext\";\nimport { GetAppConfigurationCommand } from \"@internal/app-binder/command/GetAppConfigurationCommand\";\nimport { SignTransactionCommand } from \"@internal/app-binder/command/SignTransactionCommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { ApplicationChecker } from \"@internal/app-binder/services/ApplicationChecker\";\nimport {\n SolanaTransactionTypes,\n TransactionInspector,\n} from \"@internal/app-binder/services/TransactionInspector\";\nimport { type TxInspectorResult } from \"@internal/app-binder/services/TransactionInspector\";\nimport {\n BuildTransactionContextTask,\n type BuildTransactionContextTaskArgs,\n type SolanaBuildContextResult,\n} from \"@internal/app-binder/task/BuildTransactionContextTask\";\nimport {\n ProvideSolanaTransactionContextTask,\n type ProvideSolanaTransactionContextTaskContext,\n} from \"@internal/app-binder/task/ProvideTransactionContextTask\";\nimport { SignDataTask } from \"@internal/app-binder/task/SendSignDataTask\";\n\nexport type MachineDependencies = {\n readonly getAppConfig: () => Promise<\n CommandResult<AppConfiguration, SolanaAppErrorCodes>\n >;\n readonly buildContext: (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => Promise<SolanaBuildContextResult>;\n readonly provideContext: (arg0: {\n input: ProvideSolanaTransactionContextTaskContext;\n }) => Promise<Maybe<CommandErrorResult<SolanaAppErrorCodes>>>;\n readonly inspectTransaction: (arg0: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n rpcUrl?: string;\n }) => Promise<TxInspectorResult>;\n readonly signTransaction: (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) => Promise<\n CommandResult<Maybe<Signature | SolanaAppErrorCodes>, SolanaAppErrorCodes>\n >;\n};\n\nexport class SignTransactionDeviceAction extends XStateDeviceAction<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n > {\n type types = StateMachineTypes<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n >;\n\n const {\n signTransaction,\n getAppConfig,\n buildContext,\n provideContext,\n inspectTransaction,\n } = this.extractDependencies(internalApi);\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n openAppStateMachine: new OpenAppDeviceAction({\n input: { appName: \"Solana\" },\n }).makeStateMachine(internalApi),\n\n getAppConfig: fromPromise(getAppConfig),\n inspectTransaction: fromPromise(\n ({\n input,\n }: {\n input: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n rpcUrl?: string;\n };\n }) =>\n inspectTransaction({\n serializedTransaction: input.serializedTransaction,\n resolutionContext: input.resolutionContext,\n rpcUrl: input.rpcUrl,\n }),\n ),\n buildContext: fromPromise(buildContext),\n provideContext: fromPromise(provideContext),\n signTransaction: fromPromise(signTransaction),\n },\n guards: {\n noInternalError: ({ context }) => context._internalState.error === null,\n skipOpenApp: ({ context }) =>\n context.input.transactionOptions?.skipOpenApp || false,\n isSPLSupported: ({ context }) =>\n new ApplicationChecker(\n internalApi.getDeviceSessionState(),\n context._internalState.appConfig!,\n )\n .withMinVersionExclusive(\"1.4.0\")\n .excludeDeviceModel(DeviceModelId.NANO_S)\n .check(),\n isAnSPLTransaction: ({ context }) =>\n context._internalState.inspectorResult?.transactionType ===\n SolanaTransactionTypes.SPL,\n shouldSkipInspection: ({ context }) =>\n context._internalState.error === null &&\n !!context.input.transactionOptions?.transactionResolutionContext,\n },\n actions: {\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: new UnknownDAError(\n _.event[\"error\"] instanceof Error\n ? _.event[\"error\"].message\n : String(_.event[\"error\"]),\n ),\n }),\n }),\n },\n }).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QGUCWUB2AVATgQw1jwGMAXVAewwBEwA3VYsAQTMowDoBJDVcvADbJSeUmADEAbQAMAXUSgADhVh92CkAA9EARgDsAZg4AOAJzSAbNNOmATNZ0AWPRYA0IAJ67bLjgcfW-hYArNIGpsGOAL5R7miYuAREbFS0DEys5FTcvPxCImJSOvJIIMqqWRga2gj6RmaW1nYOzm6eujqdHNbWPsE6DXq2MXHo2PiEJJVpjCwpnADyimAYzIqKMxnz4hBUYByoGHQUANb7FMur68KiYACyJAAWh2AyJUoqalTViHrBthxbP5-I5HMZjH9gm0vLVpBCOBYnI5bBY9NI4RZjCMQPFxkkpuxNnNKhwAMKPMDEE5LFZrDb0WaZdgAJTgAFcBKQpHINOUvlVSjUdAZhX5HAY9JLbMEDAZMXp3DDOvoOKEXIZgsZ9JrorEcWNEpN5kSmdlyZTqZc6Sb5qzYByuZJirzPpUfrURUZgZKhjK5RDFYgtRxHDZTKCJZjEXosXrcYbktMGVsSQBxMCkOmkqgAM3QOz2ByOp32MEz62zGDzUDeLoq6kFui1plVpgMEIs9kldlsgdq0oBYU6xmkAwh0mCwWx8YmicJyeJ7A46fLikr1fEYBwOAoOA4igEohzu4Athwy1nc+ha6U+W7G7Vm632y4u3oe32dDYOGHzDLLMYEootOBqzgSqQLqanArpeVboHaDrmlS3LvGUroNqANS2D4eh+H8fSvl+eiOJ+tjBnYyKohY5hAtIuqjAkYHGpB8zLhmsHVghnJIScRSoXeGFaIg2GSnh-x-IRpjEX2-g6D+LigqioIyo4kQgYx+LMeki7ZDwsDLGQCbgRgBYYPshzHGcRb6ZSpBGfMN4fPW3wPmRqk-tR6KOE4Oids4pFDAiUmYjYI5gu26l4kaSbaVBOQ2YZTGVJu267vuh6kMeOBnocCV2Ul7COWhzkCphwnGO5pieXRPl+Qq7QII4Vghgp0jqqpOiRfZMWMqxzA5mIOB6QZjo8re6EuWVCAGCJ3SdtRAwxqOvYNZ0IohiEETBKYgHBHowpdQVEGxX1A1bsNtl8XW-LujNPhzSipiLSOOgrUqBgThw752GidHvpqBiHZpPUpku-WDRdZBSLY-ETaVQnTbNliPc9y19lYAKqbY4ZPa9XbDHGoHA-OJ0kgAQmyqACBAlZiJoXK7GZRaWfsABGlPU7TYD00VAmTQjEr9CYr3il+6JOJ+r0WKqQzmDNvk6P8sYMVFc7Hb15MczTVB01yW47nuB5HqeHDs1T2sYLrvNw7dfxyVqtii+Yo4kQ1QzSD+-w7VJIrGCEgOExp0UkxrS4AAo7gwEBgFz9OmeZxZWYokeoNHsekNbJXusibZfQMARO09b0dKiJjGCi6JkdtthOEDwfq6D2QRxQUcxzr3N66lhsZVlZ7Jy3qdt5bHeZzdD450Y+0VXRIo2K9fZ+wCdgRCKvkRPNddqzQLEks3rfp1xpA8Sh133lNrQe-K7ZURjiuS383Shk1fqK8Bgeq8ZNq7ynaft-Th-HydLDLO48XCXwhNfFwt9gifi8j+CcNhsbaklJ1d+3UQ6N04DOYmVB47MxLBwVQQct6jzPgjJWLYIT-DottbyOhSLBjBBERWmp5rGCnGgo629SZLmwfXEy+s0pG0yibIhH8HJjScmPKaFCTD4RoeGToksgQhgQTKCqkJHab0-jvXhRN+EAIpMhUhgkah7URICUIbVpA13FE9T8q8-DlxCJ2Jwjt2HaK0qHbIfCt6GItFdcaICZEuDktKdEaJbHhHoatFEwQnHSmIlJUMM1dR6gwBQaO8BSi+J0Tw-mfN4Y1AALTQkQMU+Jv4qm-gsKpTxIMdKcB4GoQQNwxCn1MYgZEpFMQcH0FjbCgECYq3QQ3RpHAaRXHpPk+GhTbpQkBMCZEnRtpDBCLAiwXoAhVR0BEtqeh6kYPGTxSZ1pdFUEPh0-mQpK7dEVhYaiGiXoGEltYMU1hPJi1WYcsZcUYIVivFAK5RTdChEcICEI5cwT7VUpqUiAwETEXbE0CE4JUEjK4V-Jc-y1yAv8VSYF7p7D3UiGicUyyXA7QCpPcxyItRDCcAczhODuHeKaYQEaozZk21ck1YwgIpK+QCOiJ6VVSILKUtjOe21NkBwxSyrF2RwbnQ5bZQlD4PqBWRoYNqwoXmxPDCGR2q8dq7WVvqYheS2UcApubdO6qpr+FCH0gItT7A2CsJEWBuca6aietQ7y-wfmsswRwPeg97VBOkQLCILYXBKzCJOF8ksujfW8nYKwU96IWvEQ0uK4bf7D3-uybiRiTgOoRqpUciLFb7T9GYSWDyy4oi1G1J6dTmX8MVVg-RW8K01FDELKwP0rHOFBKRD6X0bBNQeaEWeFhg3do4Lk20Jaj5lv7YgSIUkTBkQnB9FJe0HFhEBIrLU4IDCRBFou85WC2TECYLAbJUiyFmMQX0oYOEa751du9OECTMQyn+AEDh8qu23o4AAUS7puhA207AfpEgyn9fZDAtllH7awSaJTghiDEIAA */\n id: \"SignTransactionDeviceAction\",\n initial: \"InitialState\",\n context: ({ input }) => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.OPEN_APP,\n },\n _internalState: {\n error: null,\n signature: null,\n appConfig: null,\n solanaTransactionContext: null,\n inspectorResult: null,\n },\n }),\n states: {\n InitialState: {\n always: [\n { target: \"GetAppConfig\", guard: \"skipOpenApp\" },\n { target: \"OpenAppDeviceAction\" },\n ],\n },\n OpenAppDeviceAction: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.OPEN_APP,\n }),\n }),\n invoke: {\n id: \"openAppStateMachine\",\n src: \"openAppStateMachine\",\n input: () => ({ appName: \"Solana\" }),\n onSnapshot: {\n actions: assign({\n intermediateValue: ({ event }) => ({\n ...event.snapshot.context.intermediateValue,\n step: signTransactionDAStateSteps.OPEN_APP,\n }),\n }),\n },\n onDone: {\n target: \"CheckOpenAppDeviceActionResult\",\n actions: assign({\n _internalState: ({ event, context }) =>\n event.output.caseOf({\n Right: () => context._internalState,\n Left: (error) => ({\n ...context._internalState,\n error,\n }),\n }),\n }),\n },\n },\n },\n CheckOpenAppDeviceActionResult: {\n always: [\n { target: \"GetAppConfig\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n GetAppConfig: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.GET_APP_CONFIG,\n }),\n }),\n invoke: {\n id: \"getAppConfig\",\n src: \"getAppConfig\",\n onDone: {\n target: \"GetAppConfigResultCheck\",\n actions: assign({\n _internalState: ({ event, context }) =>\n isSuccessCommandResult(event.output)\n ? {\n ...context._internalState,\n appConfig: event.output.data,\n }\n : { ...context._internalState, error: event.output.error },\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n GetAppConfigResultCheck: {\n always: [\n { target: \"InspectTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n InspectTransaction: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.INSPECT_TRANSACTION,\n }),\n }),\n invoke: {\n id: \"inspectTransaction\",\n src: \"inspectTransaction\",\n\n input: ({ context }) => ({\n serializedTransaction: context.input.transaction,\n resolutionContext:\n context.input.transactionOptions?.transactionResolutionContext,\n rpcUrl: context.input.transactionOptions?.solanaRPCURL,\n }),\n onDone: {\n target: \"AfterInspect\",\n actions: assign({\n _internalState: ({ context, event }) => ({\n ...context._internalState,\n inspectorResult: event.output,\n }),\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n AfterInspect: {\n always: [\n { target: \"BuildContext\", guard: \"isAnSPLTransaction\" },\n { target: \"SignTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n BuildContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.BUILD_TRANSACTION_CONTEXT,\n }),\n }),\n invoke: {\n id: \"buildContext\",\n src: \"buildContext\",\n input: ({ context }) => {\n const inspectorData =\n context._internalState.inspectorResult?.data;\n return {\n contextModule: context.input.contextModule,\n options: {\n tokenAddress: inspectorData?.tokenAddress,\n createATA: inspectorData?.createATA,\n tokenInternalId:\n context.input.transactionOptions\n ?.transactionResolutionContext?.tokenInternalId,\n templateId:\n context.input.transactionOptions\n ?.transactionResolutionContext?.templateId,\n },\n };\n },\n onDone: {\n target: \"ProvideContext\",\n actions: [\n assign({\n _internalState: ({ event, context }) => ({\n ...context._internalState,\n solanaTransactionContext: {\n tlvDescriptor: event.output.tlvDescriptor,\n trustedNamePKICertificate:\n event.output.trustedNamePKICertificate,\n loadersResults: event.output.loadersResults,\n },\n }),\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.PROVIDE_TRANSACTION_CONTEXT,\n }),\n }),\n invoke: {\n id: \"provideContext\",\n src: \"provideContext\",\n input: ({ context }) => {\n if (!context._internalState.solanaTransactionContext) {\n throw new UnknownDAError(\n \"Solana transaction context is not available\",\n );\n }\n return {\n ...context._internalState.solanaTransactionContext,\n transactionBytes: context.input.transaction,\n };\n },\n onDone: {\n target: \"ProvideContextResultCheck\",\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContextResultCheck: {\n always: [\n { target: \"SignTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n SignTransaction: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: signTransactionDAStateSteps.SIGN_TRANSACTION,\n },\n }),\n invoke: {\n id: \"signTransaction\",\n src: \"signTransaction\",\n input: ({ context }) => {\n return {\n derivationPath: context.input.derivationPath,\n serializedTransaction: context.input.transaction,\n userInputType:\n context.input.transactionOptions?.transactionResolutionContext\n ?.userInputType,\n };\n },\n onDone: {\n target: \"SignTransactionResultCheck\",\n actions: [\n assign({\n _internalState: ({ event, context }) => {\n if (!isSuccessCommandResult(event.output))\n return {\n ...context._internalState,\n error: event.output.error,\n };\n\n const data = event.output.data.extract();\n if (\n event.output.data.isJust() &&\n data instanceof Uint8Array\n )\n return {\n ...context._internalState,\n signature: data,\n };\n\n return {\n ...context._internalState,\n error: new UnknownDAError(\"No Signature available\"),\n };\n },\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.SIGN_TRANSACTION,\n },\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n SignTransactionResultCheck: {\n always: [\n { guard: \"noInternalError\", target: \"Success\" },\n { target: \"Error\" },\n ],\n },\n Success: { type: \"final\" },\n Error: { type: \"final\" },\n },\n output: ({ context }) =>\n context._internalState.signature\n ? Right(context._internalState.signature)\n : Left(\n context._internalState.error ||\n new UnknownDAError(`No error or signature available`),\n ),\n });\n }\n\n extractDependencies(internalApi: InternalApi): MachineDependencies {\n const getAppConfig = async () =>\n internalApi.sendCommand(new GetAppConfigurationCommand());\n\n const buildContext = async (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => new BuildTransactionContextTask(internalApi, arg0.input).run();\n\n const provideContext = async (arg0: {\n input: ProvideSolanaTransactionContextTaskContext;\n }) =>\n new ProvideSolanaTransactionContextTask(internalApi, arg0.input).run();\n\n const inspectTransaction = async (arg0: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n rpcUrl?: string;\n }) =>\n Promise.resolve(\n new TransactionInspector(arg0.rpcUrl).inspectTransactionType(\n arg0.serializedTransaction,\n arg0.resolutionContext?.tokenAddress,\n arg0.resolutionContext?.createATA,\n ),\n );\n\n const signTransaction = async (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n userInputType?: UserInputType;\n };\n }) =>\n new SignDataTask(internalApi, {\n commandFactory: (args) =>\n new SignTransactionCommand({\n serializedTransaction: args.chunkedData,\n more: args.more,\n extend: args.extend,\n userInputType: arg0.input.userInputType,\n }),\n derivationPath: arg0.input.derivationPath,\n sendingData: arg0.input.serializedTransaction,\n }).run();\n\n return {\n getAppConfig,\n buildContext,\n provideContext,\n signTransaction,\n inspectTransaction,\n };\n }\n}\n"],
|
|
5
|
-
"mappings": "AAAA,OAIE,iBAAAA,EAEA,0BAAAC,
|
|
6
|
-
"names": ["DeviceModelId", "isSuccessCommandResult", "OpenAppDeviceAction", "UnknownDAError", "UserInteractionRequired", "XStateDeviceAction", "Left", "Right", "assign", "fromPromise", "setup", "signTransactionDAStateSteps", "GetAppConfigurationCommand", "SignTransactionCommand", "ApplicationChecker", "SolanaTransactionTypes", "TransactionInspector", "BuildTransactionContextTask", "ProvideSolanaTransactionContextTask", "SignDataTask", "SignTransactionDeviceAction", "internalApi", "signTransaction", "getAppConfig", "buildContext", "provideContext", "inspectTransaction", "
|
|
4
|
+
"sourcesContent": ["import {\n type CommandErrorResult,\n type CommandResult,\n type DeviceActionStateMachine,\n DeviceModelId,\n type InternalApi,\n isSuccessCommandResult,\n type LoggerPublisherService,\n OpenAppDeviceAction,\n type StateMachineTypes,\n UnknownDAError,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, type Maybe, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAInternalState,\n type SignTransactionDAOutput,\n signTransactionDAStateSteps,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { type Signature } from \"@api/model/Signature\";\nimport {\n type TransactionResolutionContext,\n type UserInputType,\n} from \"@api/model/TransactionResolutionContext\";\nimport { GetAppConfigurationCommand } from \"@internal/app-binder/command/GetAppConfigurationCommand\";\nimport { SignTransactionCommand } from \"@internal/app-binder/command/SignTransactionCommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { ApplicationChecker } from \"@internal/app-binder/services/ApplicationChecker\";\nimport {\n SolanaTransactionTypes,\n TransactionInspector,\n} from \"@internal/app-binder/services/TransactionInspector\";\nimport { type TxInspectorResult } from \"@internal/app-binder/services/TransactionInspector\";\nimport {\n BuildTransactionContextTask,\n type BuildTransactionContextTaskArgs,\n type SolanaBuildContextResult,\n} from \"@internal/app-binder/task/BuildTransactionContextTask\";\nimport {\n ProvideSolanaTransactionContextTask,\n type ProvideSolanaTransactionContextTaskArgs,\n} from \"@internal/app-binder/task/ProvideTransactionContextTask\";\nimport { SignDataTask } from \"@internal/app-binder/task/SendSignDataTask\";\n\nexport type MachineDependencies = {\n readonly getAppConfig: () => Promise<\n CommandResult<AppConfiguration, SolanaAppErrorCodes>\n >;\n readonly buildContext: (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => Promise<SolanaBuildContextResult>;\n readonly provideContext: (arg0: {\n input: ProvideSolanaTransactionContextTaskArgs;\n }) => Promise<Maybe<CommandErrorResult<SolanaAppErrorCodes>>>;\n readonly inspectTransaction: (arg0: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n rpcUrl?: string;\n }) => Promise<TxInspectorResult>;\n readonly signTransaction: (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) => Promise<\n CommandResult<Maybe<Signature | SolanaAppErrorCodes>, SolanaAppErrorCodes>\n >;\n};\n\nexport class SignTransactionDeviceAction extends XStateDeviceAction<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n > {\n type types = StateMachineTypes<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n >;\n\n const {\n signTransaction,\n getAppConfig,\n buildContext,\n provideContext,\n inspectTransaction,\n } = this.extractDependencies(internalApi);\n\n let loggerSingleton: LoggerPublisherService | undefined;\n\n const getLoggerInstance = (context: types[\"context\"]) => {\n if (!loggerSingleton) {\n const { loggerFactory } = context.input;\n loggerSingleton = loggerFactory(\"SignTransactionDeviceAction\");\n }\n\n return loggerSingleton;\n };\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n openAppStateMachine: new OpenAppDeviceAction({\n input: { appName: \"Solana\" },\n }).makeStateMachine(internalApi),\n getAppConfig: fromPromise(getAppConfig),\n inspectTransaction: fromPromise(\n ({\n input,\n }: {\n input: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n rpcUrl?: string;\n };\n }) =>\n inspectTransaction({\n serializedTransaction: input.serializedTransaction,\n resolutionContext: input.resolutionContext,\n rpcUrl: input.rpcUrl,\n }),\n ),\n buildContext: fromPromise(buildContext),\n provideContext: fromPromise(provideContext),\n signTransaction: fromPromise(signTransaction),\n },\n guards: {\n noInternalError: ({ context }) => context._internalState.error === null,\n skipOpenApp: ({ context }) =>\n context.input.transactionOptions?.skipOpenApp || false,\n isSPLSupported: ({ context }) =>\n new ApplicationChecker(\n internalApi.getDeviceSessionState(),\n context._internalState.appConfig!,\n )\n .withMinVersionExclusive(\"1.4.0\")\n .excludeDeviceModel(DeviceModelId.NANO_S)\n .check(),\n isAnSPLTransaction: ({ context }) =>\n context._internalState.inspectorResult?.transactionType ===\n SolanaTransactionTypes.SPL,\n shouldSkipInspection: ({ context }) =>\n context._internalState.error === null &&\n !!context.input.transactionOptions?.transactionResolutionContext,\n },\n actions: {\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: new UnknownDAError(\n _.event[\"error\"] instanceof Error\n ? _.event[\"error\"].message\n : String(_.event[\"error\"]),\n ),\n }),\n }),\n logInput: ({ context }, params: { step: string }) => {\n getLoggerInstance(context).debug(\n `[makeStateMachine] step ${params.step}`,\n {\n data: { input: context.input },\n },\n );\n },\n\n logInternalState: ({ context }, params: { step: string }) => {\n getLoggerInstance(context).debug(\n `[makeStateMachine] step ${params.step}`,\n {\n data: { internalState: context._internalState },\n },\n );\n },\n },\n }).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QGUCWUB2AVATgQw1jwGMAXVAewwBEwA3VYsAQTMowDoBJDVcvADbJSeUmADEAbQAMAXUSgADhVh92CkAA9EAJgCMADg4BWAGw7jAGhABPRHr3SA7Bx0BONwGYALNOPfvUz1jHQBfUOs0TFwCIjYqWgYmVnIqbl5+IRExKT15JBBlVVSMDW0EfSMzC2s7BDdvHQ5pby9ff0DgsIiQKOx8QhISxMYWeM4AeUUwDGZFRRHk8fEIKjAOVAw6CgBrdYpp2fnhUTAAWRIAC02wGXylFTUqMsQnN1MON2lzK1tEN0MJicOicTlMoM8LXe4Ui6H6sSG7EWYxKHAAwpcwMQdlMZnMFvRRil2AAlOAAVwEpCkcg0RSepQK5T0nmMRmkwR+tX+3iMgVM0mc+j0OgM3Vh0QGcWGhKWqIxWJxh3xyOJVDJsEp1MkeTpjxKLwQLLZzU5NT+CAMeg4rTcBneLN8bx8MN6cJig3GqvGHAA4mBSPi0VQAGboFZrDZbXbrGCB+bBjBhqB3PXFdRM+wGUzeVymaq-OqOMWfe0BHyeNxOPSmV19D3SpGylHsP0BoOh8NgHA4Cg4DiKASiEN9gC2HDjHaT6FTBXpBszRuzuZ0+a5Fr0Hk+HjL2YsLNMtZ69aliISzbVnH98cUieTGq1CuxNPuhX1GdA5R0nh0TRapgMJxC3sBwmgMMVwU8QC3l5Yw63dU8vQvH1ryne8KSpJ8dlyV95w-LRdB-P9AkA4CEB8a0qxzYwnE8H5jW8eDJQRJCkhbNIeFgaYyAbM8MAjDB1k2bY9ijLisVIXjxlnB502eRdRS+Dgc2+c0i2kBoODBUUDA0ytqyPCV4U9GU2MvdJxJ4xCSnEbte37QdhzHMTuMk6z2Bkt85MZT9dHtaRlN8dc6kCALvDBbwzA0jTwqApjjMbc8zJ9ZgQzEHBONcl80wZQ0fyCLSKyA7kjRZa1+UFYFQLFeKpNMokUrS7tMoknCcoXXzyNXa1aO8Txio3SFjC0jwfD8AIghCWr3KShrUVS9KWrIKQdFw995M6-KeqKsiBSaSLIUMYwvgaUFppY+q5VbAAhclUAECBEzETRqVWQSoxE9YACM7oep6wBezy8I2gjyKcbMbQMPqBqLBxPA4HxzD0RpaKhQy3WYkym2S1Fbvux6qGe6k7L7Ach1IEccHHH78f+wHaTndafNB-qId5aGyOBAK3GMQ7aM3KD9HOrHZqutIAAVewYCAwDp17I2EmMByl1AZbloGmcNPrRQRr5gpA8EOHA1daOghoDDg48EIu7G5tbSWKGl2XCYB4me1JxyKecxQVbVl36bW7ytZ-IxK1Usi90+dwaLtAWxT0YXEpoZDUQdp25YfTDMWfDWg8XcKeYR47+rIhwgOaVoxo6SbxQxhK+O9VPfedjAicz0gsLaxm886gvhtZLwYfsQVcz15HvzjoWrcxpPG9bE8baoAShOjUTVBnvjc9yxdeZ0XN-AAoejVXIxVx0vSqxrROG5T+frZF-iSYc8nKfHdf6+khnZO3zrd-3kij6gXhkFZGjhwpWhzNfVids0gLwfu3TuW8OqgxjsNNwlRAGeAcAjMUTgOQjwAryKBl12KcDgUnBB2dsI6kDj-FBbw0EYNLqufuuDpCsnATWRiroMAUBlvAAo5Cb443wsDZm5QAC0pgSpSOaIKeRCiFFOGIbbMWnAeBqEECcMQ7V8LlEaCVRwhs3heErCCSErR0ZCOgWojguIjgEhESDMRWtBSfHDiVMsrhRpmNRpYlRotSHoiofYlUt91QYVILokGzJ-zKVIiVBoAV3CmPQX46E08P4kPMqhBMnYoDRPEfYfwRhB6lyhMpH8wIALHQtpbIydVVFBNybefJlDFSFMNDoIUrhDCALAVpGsgpi6XysffWe4T1GEFco05xmsFLGBFJ8Q+5SnC5lMPlap3xBYGACcnJxnAFrNWmRJTpi4sE1kKhzQxIo3CDIFH4Lwoy9lzzSHjP6-sondzoeUHwUMjYinKV4XpDyRkGU8C8yZHA06qxbkTM5m0PC5muRuBwPUfFpIsRkhpM19kwM4DCv2rdXbtOxAi0GB0Pg7RuYeI2EEtkbLFLszJsy8W2Oscglx+c7QfFFICwxe8jAshNqubZTLIUHI4By0kkSsLkvKMYXeJhDGQnhvoY6e9FU82cGMjeNignIHJMQJgsABHf2QeUAUtKoYlxVdIUOEEPC0QuW4CV+KOAAFF3Y4HlYgK1HwbWAL3vDMwkVumRV0ofcI4QgA */\n id: \"SignTransactionDeviceAction\",\n initial: \"InitialState\",\n context: ({ input }) => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.OPEN_APP,\n },\n _internalState: {\n error: null,\n signature: null,\n appConfig: null,\n solanaTransactionContext: null,\n inspectorResult: null,\n },\n }),\n states: {\n InitialState: {\n entry: [{ type: \"logInput\", params: { step: \"InitialState\" } }],\n always: [\n { target: \"GetAppConfig\", guard: \"skipOpenApp\" },\n { target: \"OpenAppDeviceAction\" },\n ],\n },\n OpenAppDeviceAction: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.OPEN_APP,\n }),\n }),\n invoke: {\n id: \"openAppStateMachine\",\n src: \"openAppStateMachine\",\n input: () => ({ appName: \"Solana\" }),\n onSnapshot: {\n actions: assign({\n intermediateValue: ({ event }) => ({\n ...event.snapshot.context.intermediateValue,\n step: signTransactionDAStateSteps.OPEN_APP,\n }),\n }),\n },\n onDone: {\n target: \"CheckOpenAppDeviceActionResult\",\n actions: assign({\n _internalState: ({ event, context }) =>\n event.output.caseOf({\n Right: () => context._internalState,\n Left: (error) => ({\n ...context._internalState,\n error,\n }),\n }),\n }),\n },\n },\n },\n CheckOpenAppDeviceActionResult: {\n always: [\n { target: \"GetAppConfig\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n GetAppConfig: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.GET_APP_CONFIG,\n }),\n }),\n invoke: {\n id: \"getAppConfig\",\n src: \"getAppConfig\",\n onDone: {\n target: \"GetAppConfigResultCheck\",\n actions: assign({\n _internalState: ({ event, context }) =>\n isSuccessCommandResult(event.output)\n ? {\n ...context._internalState,\n appConfig: event.output.data,\n }\n : { ...context._internalState, error: event.output.error },\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n GetAppConfigResultCheck: {\n always: [\n { target: \"InspectTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n InspectTransaction: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.INSPECT_TRANSACTION,\n }),\n }),\n invoke: {\n id: \"inspectTransaction\",\n src: \"inspectTransaction\",\n\n input: ({ context }) => ({\n serializedTransaction: context.input.transaction,\n resolutionContext:\n context.input.transactionOptions?.transactionResolutionContext,\n rpcUrl: context.input.transactionOptions?.solanaRPCURL,\n }),\n onDone: {\n target: \"AfterInspect\",\n actions: [\n assign({\n _internalState: ({ context, event }) => ({\n ...context._internalState,\n inspectorResult: event.output,\n }),\n }),\n {\n type: \"logInternalState\",\n params: { step: \"OnDoneInspectTransaction\" },\n },\n ],\n },\n onError: {\n target: \"SignTransaction\",\n },\n },\n },\n AfterInspect: {\n always: [\n { target: \"BuildContext\", guard: \"isAnSPLTransaction\" },\n { target: \"SignTransaction\" },\n ],\n },\n BuildContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.BUILD_TRANSACTION_CONTEXT,\n }),\n }),\n invoke: {\n id: \"buildContext\",\n src: \"buildContext\",\n input: ({ context }) => {\n const inspectorData =\n context._internalState.inspectorResult?.data;\n return {\n contextModule: context.input.contextModule,\n loggerFactory: context.input.loggerFactory,\n options: {\n tokenAddress: inspectorData?.tokenAddress,\n createATA: inspectorData?.createATA,\n tokenInternalId:\n context.input.transactionOptions\n ?.transactionResolutionContext?.tokenInternalId,\n templateId:\n context.input.transactionOptions\n ?.transactionResolutionContext?.templateId,\n },\n };\n },\n onDone: {\n target: \"ProvideContext\",\n actions: [\n assign({\n _internalState: ({ event, context }) => ({\n ...context._internalState,\n solanaTransactionContext: {\n tlvDescriptor: event.output.tlvDescriptor,\n trustedNamePKICertificate:\n event.output.trustedNamePKICertificate,\n loadersResults: event.output.loadersResults,\n },\n }),\n }),\n {\n type: \"logInternalState\",\n params: { step: \"OnDoneBuildContext\" },\n },\n ],\n },\n onError: {\n target: \"SignTransaction\",\n },\n },\n },\n ProvideContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.PROVIDE_TRANSACTION_CONTEXT,\n }),\n }),\n invoke: {\n id: \"provideContext\",\n src: \"provideContext\",\n input: ({ context }) => {\n if (!context._internalState.solanaTransactionContext) {\n throw new UnknownDAError(\n \"Solana transaction context is not available\",\n );\n }\n return {\n ...context._internalState.solanaTransactionContext,\n transactionBytes: context.input.transaction,\n loggerFactory: context.input.loggerFactory,\n };\n },\n onDone: {\n target: \"SignTransaction\",\n },\n onError: {\n target: \"SignTransaction\",\n },\n },\n },\n SignTransaction: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: signTransactionDAStateSteps.SIGN_TRANSACTION,\n },\n }),\n invoke: {\n id: \"signTransaction\",\n src: \"signTransaction\",\n input: ({ context }) => {\n return {\n derivationPath: context.input.derivationPath,\n serializedTransaction: context.input.transaction,\n userInputType:\n context.input.transactionOptions?.transactionResolutionContext\n ?.userInputType,\n };\n },\n onDone: {\n target: \"SignTransactionResultCheck\",\n actions: [\n assign({\n _internalState: ({ event, context }) => {\n if (!isSuccessCommandResult(event.output))\n return {\n ...context._internalState,\n error: event.output.error,\n };\n\n const data = event.output.data.extract();\n if (\n event.output.data.isJust() &&\n data instanceof Uint8Array\n )\n return {\n ...context._internalState,\n signature: data,\n };\n\n return {\n ...context._internalState,\n error: new UnknownDAError(\"No Signature available\"),\n };\n },\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.SIGN_TRANSACTION,\n },\n }),\n {\n type: \"logInternalState\",\n params: { step: \"OnDoneSignTransaction\" },\n },\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n SignTransactionResultCheck: {\n always: [\n { guard: \"noInternalError\", target: \"Success\" },\n { target: \"Error\" },\n ],\n },\n Success: { type: \"final\" },\n Error: { type: \"final\" },\n },\n output: ({ context }) =>\n context._internalState.signature\n ? Right(context._internalState.signature)\n : Left(\n context._internalState.error ||\n new UnknownDAError(`No error or signature available`),\n ),\n });\n }\n\n extractDependencies(internalApi: InternalApi): MachineDependencies {\n const getAppConfig = async () =>\n internalApi.sendCommand(new GetAppConfigurationCommand());\n\n const buildContext = async (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => new BuildTransactionContextTask(internalApi, arg0.input).run();\n\n const provideContext = async (arg0: {\n input: ProvideSolanaTransactionContextTaskArgs;\n }) =>\n new ProvideSolanaTransactionContextTask(internalApi, arg0.input).run();\n\n const inspectTransaction = async (arg0: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n rpcUrl?: string;\n }) =>\n Promise.resolve(\n new TransactionInspector(arg0.rpcUrl).inspectTransactionType(\n arg0.serializedTransaction,\n arg0.resolutionContext?.tokenAddress,\n arg0.resolutionContext?.createATA,\n ),\n );\n\n const signTransaction = async (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n userInputType?: UserInputType;\n };\n }) =>\n new SignDataTask(internalApi, {\n commandFactory: (args) =>\n new SignTransactionCommand({\n serializedTransaction: args.chunkedData,\n more: args.more,\n extend: args.extend,\n userInputType: arg0.input.userInputType,\n }),\n derivationPath: arg0.input.derivationPath,\n sendingData: arg0.input.serializedTransaction,\n }).run();\n\n return {\n getAppConfig,\n buildContext,\n provideContext,\n signTransaction,\n inspectTransaction,\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["DeviceModelId", "isSuccessCommandResult", "OpenAppDeviceAction", "UnknownDAError", "UserInteractionRequired", "XStateDeviceAction", "Left", "Right", "assign", "fromPromise", "setup", "signTransactionDAStateSteps", "GetAppConfigurationCommand", "SignTransactionCommand", "ApplicationChecker", "SolanaTransactionTypes", "TransactionInspector", "BuildTransactionContextTask", "ProvideSolanaTransactionContextTask", "SignDataTask", "SignTransactionDeviceAction", "internalApi", "signTransaction", "getAppConfig", "buildContext", "provideContext", "inspectTransaction", "loggerSingleton", "getLoggerInstance", "context", "loggerFactory", "input", "_", "params", "event", "error", "inspectorData", "data", "arg0", "args"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{CommandResultFactory as
|
|
1
|
+
import{CommandResultFactory as s,DeviceActionStatus as e,DeviceModelId as N,DeviceSessionStateType as I,DeviceStatus as v,InvalidStatusWordError as E,UserInteractionRequired as t}from"@ledgerhq/device-management-kit";import{Just as m,Nothing as f}from"purify-ts";import{beforeEach as _,describe as w,it as C,vi as a}from"vitest";import{signTransactionDAStateSteps as n}from"../../../api/app-binder/SignTransactionDeviceActionTypes";import{testDeviceActionStates as D}from"../../app-binder/device-action/__test-utils__/testDeviceActionStates";import{SolanaTransactionTypes as y}from"../../app-binder/services/TransactionInspector";import{makeDeviceActionInternalApiMock as b}from"./__test-utils__/makeInternalApi";import{SignTransactionDeviceAction as R}from"./SignTransactionDeviceAction";const V="44'/501'/0'/0'",P=new Uint8Array([222,173,190,239]),O={getSolanaContext:a.fn()},h=()=>({debug:a.fn(),info:a.fn(),warn:a.fn(),error:a.fn(),subscribers:new Map}),k=a.fn(()=>h());let c,S,l,g,p,T;function x(){return{getAppConfig:S,buildContext:l,provideContext:g,signTransaction:p,inspectTransaction:T}}w("SignTransactionDeviceAction (Solana)",()=>{_(()=>{c=b(),S=a.fn(),l=a.fn(),g=a.fn(),p=a.fn(),T=a.fn().mockResolvedValue({transactionType:y.SPL,data:{tokenAddress:null,createATA:!1}})}),C("happy path (skip open): getAppConfig -> inspect -> build -> provide -> sign",()=>new Promise((u,d)=>{c.getDeviceSessionState.mockReturnValue({sessionStateType:I.ReadyWithoutSecureChannel,deviceStatus:v.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:N.NANO_X,isSecureConnectionAllowed:!0}),S.mockResolvedValue(s({data:{}})),T.mockResolvedValue({transactionType:y.SPL});const i={tlvDescriptor:new Uint8Array([1]),trustedNamePKICertificate:{keyUsageNumber:0,payload:new Uint8Array([1])},loadersResults:[]};l.mockResolvedValue(i),g.mockResolvedValue(f);const r=new Uint8Array([170,187]);p.mockResolvedValue(s({data:m(r)}));const o={derivationPath:V,transaction:P,transactionOptions:{skipOpenApp:!0},contextModule:O,loggerFactory:k},A=new R({input:o});a.spyOn(A,"extractDependencies").mockReturnValue(x());const U=[{intermediateValue:{requiredUserInteraction:t.None,step:n.GET_APP_CONFIG},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None,step:n.INSPECT_TRANSACTION},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None,step:n.BUILD_TRANSACTION_CONTEXT},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None,step:n.PROVIDE_TRANSACTION_CONTEXT},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.SignTransaction,step:n.SIGN_TRANSACTION},status:e.Pending},{output:r,status:e.Completed}];D(A,U,c,{onDone:u,onError:d})})),C("inspectTransaction rejects, still signs (fallback)",()=>new Promise((u,d)=>{c.getDeviceSessionState.mockReturnValue({sessionStateType:I.ReadyWithoutSecureChannel,deviceStatus:v.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:N.NANO_X,isSecureConnectionAllowed:!0}),S.mockResolvedValue(s({data:{}})),T.mockRejectedValue(new E("inspErr"));const i=new Uint8Array([17,34]);p.mockResolvedValue(s({data:m(i)}));const r=new R({input:{derivationPath:V,transaction:P,transactionOptions:{skipOpenApp:!0},contextModule:O,loggerFactory:k}});a.spyOn(r,"extractDependencies").mockReturnValue(x());const o=[{intermediateValue:{requiredUserInteraction:t.None,step:n.GET_APP_CONFIG},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None,step:n.INSPECT_TRANSACTION},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.SignTransaction,step:n.SIGN_TRANSACTION},status:e.Pending},{output:i,status:e.Completed}];D(r,o,c,{onDone:()=>{expect(l).not.toHaveBeenCalled(),expect(g).not.toHaveBeenCalled(),u()},onError:d})})),C("buildContext throws, still signs (fallback)",()=>new Promise((u,d)=>{c.getDeviceSessionState.mockReturnValue({sessionStateType:I.ReadyWithoutSecureChannel,deviceStatus:v.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:N.NANO_X,isSecureConnectionAllowed:!0}),S.mockResolvedValue(s({data:{}})),T.mockResolvedValue({transactionType:y.SPL}),l.mockRejectedValue(new E("bldErr"));const i=new Uint8Array([202,254]);p.mockResolvedValue(s({data:m(i)}));const r=new R({input:{derivationPath:V,transaction:P,transactionOptions:{skipOpenApp:!0},contextModule:O,loggerFactory:k}});a.spyOn(r,"extractDependencies").mockReturnValue(x());const o=[{intermediateValue:{requiredUserInteraction:t.None,step:n.GET_APP_CONFIG},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None,step:n.INSPECT_TRANSACTION},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None,step:n.BUILD_TRANSACTION_CONTEXT},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.SignTransaction,step:n.SIGN_TRANSACTION},status:e.Pending},{output:i,status:e.Completed}];D(r,o,c,{onDone:u,onError:d})})),C("provideContext rejects, still signs (fallback)",()=>new Promise((u,d)=>{c.getDeviceSessionState.mockReturnValue({sessionStateType:I.ReadyWithoutSecureChannel,deviceStatus:v.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:N.NANO_X,isSecureConnectionAllowed:!0}),S.mockResolvedValue(s({data:{}})),T.mockResolvedValue({transactionType:y.SPL});const i={tlvDescriptor:new Uint8Array([1]),trustedNamePKICertificate:{keyUsageNumber:0,payload:new Uint8Array([2])},loadersResults:[]};l.mockResolvedValue(i),g.mockRejectedValue(new E("provErr"));const r=new Uint8Array([51]);p.mockResolvedValue(s({data:m(r)}));const o=new R({input:{derivationPath:V,transaction:P,transactionOptions:{skipOpenApp:!0},contextModule:O,loggerFactory:k}});a.spyOn(o,"extractDependencies").mockReturnValue(x());const A=[{intermediateValue:{requiredUserInteraction:t.None,step:n.GET_APP_CONFIG},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None,step:n.INSPECT_TRANSACTION},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None,step:n.BUILD_TRANSACTION_CONTEXT},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None,step:n.PROVIDE_TRANSACTION_CONTEXT},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.SignTransaction,step:n.SIGN_TRANSACTION},status:e.Pending},{output:r,status:e.Completed}];D(o,A,c,{onDone:()=>{expect(l).toHaveBeenCalledTimes(1),expect(g).toHaveBeenCalledTimes(1),expect(p).toHaveBeenCalledTimes(1),u()},onError:d})})),C("failure in provideContext still signs",()=>new Promise((u,d)=>{c.getDeviceSessionState.mockReturnValue({sessionStateType:I.ReadyWithoutSecureChannel,deviceStatus:v.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:N.NANO_X,isSecureConnectionAllowed:!0}),S.mockResolvedValue(s({data:{}})),T.mockResolvedValue({transactionType:y.SPL}),l.mockResolvedValue({tlvDescriptor:new Uint8Array([2]),trustedNamePKICertificate:{keyUsageNumber:0,payload:new Uint8Array},loadersResults:[]}),g.mockResolvedValue(m(s({error:new E("ctxErr")})));const i=new Uint8Array([254]);p.mockResolvedValue(s({data:m(i)}));const r={derivationPath:V,transaction:P,transactionOptions:{skipOpenApp:!0},contextModule:O,loggerFactory:k},o=new R({input:r});a.spyOn(o,"extractDependencies").mockReturnValue(x());const A=[{intermediateValue:{requiredUserInteraction:t.None,step:n.GET_APP_CONFIG},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None,step:n.INSPECT_TRANSACTION},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None,step:n.BUILD_TRANSACTION_CONTEXT},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None,step:n.PROVIDE_TRANSACTION_CONTEXT},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.SignTransaction,step:n.SIGN_TRANSACTION},status:e.Pending},{output:i,status:e.Completed}];D(o,A,c,{onDone:u,onError:d})})),C("buildContext throws \u2192 error",()=>new Promise((u,d)=>{c.getDeviceSessionState.mockReturnValue({sessionStateType:I.ReadyWithoutSecureChannel,deviceStatus:v.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:N.NANO_X,isSecureConnectionAllowed:!0}),S.mockResolvedValue(s({data:{}})),T.mockResolvedValue({transactionType:y.SPL}),l.mockRejectedValue(new E("bldErr"));const i=new Uint8Array([171,205]);p.mockResolvedValue(s({data:m(i)}));const r={derivationPath:V,transaction:P,transactionOptions:{skipOpenApp:!0},contextModule:O,loggerFactory:k},o=new R({input:r});a.spyOn(o,"extractDependencies").mockReturnValue(x());const A=[{intermediateValue:{requiredUserInteraction:t.None,step:n.GET_APP_CONFIG},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None,step:n.INSPECT_TRANSACTION},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None,step:n.BUILD_TRANSACTION_CONTEXT},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.SignTransaction,step:n.SIGN_TRANSACTION},status:e.Pending},{output:i,status:e.Completed}];D(o,A,c,{onDone:u,onError:d})}))});
|
|
2
2
|
//# sourceMappingURL=SignTransactionDeviceAction.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/device-action/SignTransactionDeviceAction.test.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n type DeviceActionState,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n InvalidStatusWordError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { Just, Nothing } from \"purify-ts\";\nimport { beforeEach, describe, it, vi } from \"vitest\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n signTransactionDAStateSteps,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { UserInputType } from \"@api/model/TransactionResolutionContext\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport { SolanaTransactionTypes } from \"@internal/app-binder/services/TransactionInspector\";\nimport { type SolanaBuildContextResult } from \"@internal/app-binder/task/BuildTransactionContextTask\";\n\nimport { makeDeviceActionInternalApiMock } from \"./__test-utils__/makeInternalApi\";\nimport { SignTransactionDeviceAction } from \"./SignTransactionDeviceAction\";\n\nconst defaultDerivation = \"44'/501'/0'/0'\";\nconst exampleTx = new Uint8Array([0xde, 0xad, 0xbe, 0xef]);\n\nconst contextModuleStub: ContextModule = {\n getSolanaContext: vi.fn(),\n} as unknown as ContextModule;\n\nlet apiMock: ReturnType<typeof makeDeviceActionInternalApiMock>;\nlet getAppConfigMock: ReturnType<typeof vi.fn>;\nlet buildContextMock: ReturnType<typeof vi.fn>;\nlet provideContextMock: ReturnType<typeof vi.fn>;\nlet signMock: ReturnType<typeof vi.fn>;\nlet inspectTransactionMock: ReturnType<typeof vi.fn>;\n\nfunction extractDeps() {\n return {\n getAppConfig: getAppConfigMock,\n buildContext: buildContextMock,\n provideContext: provideContextMock,\n signTransaction: signMock,\n inspectTransaction: inspectTransactionMock,\n };\n}\n\ndescribe(\"SignTransactionDeviceAction (Solana)\", () => {\n beforeEach(() => {\n apiMock = makeDeviceActionInternalApiMock();\n getAppConfigMock = vi.fn();\n buildContextMock = vi.fn();\n provideContextMock = vi.fn();\n signMock = vi.fn();\n inspectTransactionMock = vi.fn().mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n data: { tokenAddress: null, createATA: false },\n });\n });\n\n it(\"happy path (skip open): getAppConfig -> inspect -> build -> provide -> sign\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n const ctx: SolanaBuildContextResult = {\n tlvDescriptor: new Uint8Array([1]),\n trustedNamePKICertificate: {\n keyUsageNumber: 0,\n payload: new Uint8Array([0x01]),\n },\n loadersResults: [],\n };\n buildContextMock.mockResolvedValue(ctx);\n provideContextMock.mockResolvedValue(Nothing);\n\n const signature = new Uint8Array([0xaa, 0xbb]);\n signMock.mockResolvedValue(\n CommandResultFactory({ data: Just(signature) }),\n );\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n transactionOptions: { skipOpenApp: true },\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.INSPECT_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.BUILD_TRANSACTION_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // provideContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.PROVIDE_TRANSACTION_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: signTransactionDAStateSteps.SIGN_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: signature, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n\n it(\"forwards userInputType to signTransaction dependency\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n const ctx: SolanaBuildContextResult = {\n tlvDescriptor: new Uint8Array([1]),\n trustedNamePKICertificate: {\n keyUsageNumber: 0,\n payload: new Uint8Array([0x01]),\n },\n loadersResults: [],\n };\n buildContextMock.mockResolvedValue(ctx);\n provideContextMock.mockResolvedValue(Nothing);\n\n const signature = new Uint8Array([0xaa, 0xbb]);\n signMock.mockResolvedValue(\n CommandResultFactory({ data: Just(signature) }),\n );\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n transactionOptions: {\n skipOpenApp: true,\n transactionResolutionContext: {\n // Only care about userInputType for this test\n userInputType: UserInputType.ATA,\n } as any,\n },\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.INSPECT_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.BUILD_TRANSACTION_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // provideContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.PROVIDE_TRANSACTION_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: signTransactionDAStateSteps.SIGN_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: signature, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, {\n onDone: () => {\n try {\n expect(signMock).toHaveBeenCalledTimes(1);\n const callArg = signMock.mock.calls[0]?.[0];\n expect(callArg?.input.userInputType).toBe(UserInputType.ATA);\n resolve();\n } catch (e) {\n reject(e);\n }\n },\n onError: reject,\n });\n }));\n\n it(\"failure in provideContext still signs\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n buildContextMock.mockResolvedValue({\n descriptor: new Uint8Array([2]),\n trustedNamePKICertificate: {\n keyUsageNumber: 0,\n payload: new Uint8Array(),\n },\n challenge: undefined,\n addressResult: { tokenAccount: \"\", owner: \"\", contract: \"\" },\n loadersResults: [],\n });\n provideContextMock.mockResolvedValue(\n Just(\n CommandResultFactory({ error: new InvalidStatusWordError(\"ctxErr\") }),\n ),\n );\n const sig = new Uint8Array([0xfe]);\n signMock.mockResolvedValue(CommandResultFactory({ data: Just(sig) }));\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n transactionOptions: { skipOpenApp: true },\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.INSPECT_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.BUILD_TRANSACTION_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // provideContext (returns error but continues)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.PROVIDE_TRANSACTION_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: signTransactionDAStateSteps.SIGN_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: sig, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n\n it(\"buildContext throws \u2192 error\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n buildContextMock.mockRejectedValue(new InvalidStatusWordError(\"bldErr\"));\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n transactionOptions: { skipOpenApp: true },\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.INSPECT_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext (throws)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.BUILD_TRANSACTION_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // error raised from buildContext\n {\n error: expect.anything() as unknown as SignTransactionDAError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n});\n"],
|
|
5
|
-
"mappings": "AAEA,OACE,wBAAAA,EAEA,sBAAAC,EACA,iBAAAC,EACA,0BAAAC,EACA,gBAAAC,EACA,0BAAAC,
|
|
6
|
-
"names": ["CommandResultFactory", "DeviceActionStatus", "DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "InvalidStatusWordError", "UserInteractionRequired", "Just", "Nothing", "beforeEach", "describe", "it", "vi", "signTransactionDAStateSteps", "
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n type DeviceActionState,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n InvalidStatusWordError,\n type LoggerPublisherService,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { Just, Nothing } from \"purify-ts\";\nimport { beforeEach, describe, it, vi } from \"vitest\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n signTransactionDAStateSteps,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport { SolanaTransactionTypes } from \"@internal/app-binder/services/TransactionInspector\";\nimport { type SolanaBuildContextResult } from \"@internal/app-binder/task/BuildTransactionContextTask\";\n\nimport { makeDeviceActionInternalApiMock } from \"./__test-utils__/makeInternalApi\";\nimport { SignTransactionDeviceAction } from \"./SignTransactionDeviceAction\";\n\nconst defaultDerivation = \"44'/501'/0'/0'\";\nconst exampleTx = new Uint8Array([0xde, 0xad, 0xbe, 0xef]);\n\nconst contextModuleStub: ContextModule = {\n getSolanaContext: vi.fn(),\n} as unknown as ContextModule;\n\nconst makeLoggerService = (): LoggerPublisherService =>\n ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: new Map(),\n }) as unknown as LoggerPublisherService;\n\nconst loggerFactoryStub: SignTransactionDAInput[\"loggerFactory\"] = vi.fn(() =>\n makeLoggerService(),\n);\n\nlet apiMock: ReturnType<typeof makeDeviceActionInternalApiMock>;\nlet getAppConfigMock: ReturnType<typeof vi.fn>;\nlet buildContextMock: ReturnType<typeof vi.fn>;\nlet provideContextMock: ReturnType<typeof vi.fn>;\nlet signMock: ReturnType<typeof vi.fn>;\nlet inspectTransactionMock: ReturnType<typeof vi.fn>;\n\nfunction extractDeps() {\n return {\n getAppConfig: getAppConfigMock,\n buildContext: buildContextMock,\n provideContext: provideContextMock,\n signTransaction: signMock,\n inspectTransaction: inspectTransactionMock,\n };\n}\n\ndescribe(\"SignTransactionDeviceAction (Solana)\", () => {\n beforeEach(() => {\n apiMock = makeDeviceActionInternalApiMock();\n getAppConfigMock = vi.fn();\n buildContextMock = vi.fn();\n provideContextMock = vi.fn();\n signMock = vi.fn();\n inspectTransactionMock = vi.fn().mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n data: { tokenAddress: null, createATA: false },\n });\n });\n\n it(\"happy path (skip open): getAppConfig -> inspect -> build -> provide -> sign\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n const ctx: SolanaBuildContextResult = {\n tlvDescriptor: new Uint8Array([1]),\n trustedNamePKICertificate: {\n keyUsageNumber: 0,\n payload: new Uint8Array([0x01]),\n },\n loadersResults: [],\n };\n buildContextMock.mockResolvedValue(ctx);\n provideContextMock.mockResolvedValue(Nothing);\n\n const signature = new Uint8Array([0xaa, 0xbb]);\n signMock.mockResolvedValue(\n CommandResultFactory({ data: Just(signature) }),\n );\n\n const input: SignTransactionDAInput = {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n transactionOptions: { skipOpenApp: true },\n contextModule: contextModuleStub,\n loggerFactory: loggerFactoryStub,\n };\n\n const action = new SignTransactionDeviceAction({ input });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.INSPECT_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.BUILD_TRANSACTION_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // provideContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.PROVIDE_TRANSACTION_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: signTransactionDAStateSteps.SIGN_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: signature, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n\n it(\"inspectTransaction rejects, still signs (fallback)\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n\n // InspectTransaction fails, machine transitions to SignTransaction\n inspectTransactionMock.mockRejectedValue(\n new InvalidStatusWordError(\"inspErr\"),\n );\n\n const sig = new Uint8Array([0x11, 0x22]);\n signMock.mockResolvedValue(CommandResultFactory({ data: Just(sig) }));\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n transactionOptions: { skipOpenApp: true },\n contextModule: contextModuleStub,\n loggerFactory: loggerFactoryStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.INSPECT_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction (fallback)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: signTransactionDAStateSteps.SIGN_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: sig, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n // we should not try to build/provide context if inspection failed\n expect(buildContextMock).not.toHaveBeenCalled();\n expect(provideContextMock).not.toHaveBeenCalled();\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"buildContext throws, still signs (fallback)\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n // BuildContext fails, machine transitions to SignTransaction\n buildContextMock.mockRejectedValue(new InvalidStatusWordError(\"bldErr\"));\n\n const sig = new Uint8Array([0xca, 0xfe]);\n signMock.mockResolvedValue(CommandResultFactory({ data: Just(sig) }));\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n transactionOptions: { skipOpenApp: true },\n contextModule: contextModuleStub,\n loggerFactory: loggerFactoryStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.INSPECT_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext (fails, but we still saw the pending step)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.BUILD_TRANSACTION_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction (fallback)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: signTransactionDAStateSteps.SIGN_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: sig, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n\n it(\"provideContext rejects, still signs (fallback)\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n const ctx: SolanaBuildContextResult = {\n tlvDescriptor: new Uint8Array([0x01]),\n trustedNamePKICertificate: {\n keyUsageNumber: 0,\n payload: new Uint8Array([0x02]),\n },\n loadersResults: [],\n };\n buildContextMock.mockResolvedValue(ctx);\n\n // ProvideContext rejects, machine transitions to SignTransaction\n provideContextMock.mockRejectedValue(\n new InvalidStatusWordError(\"provErr\"),\n );\n\n const sig = new Uint8Array([0x33]);\n signMock.mockResolvedValue(CommandResultFactory({ data: Just(sig) }));\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n transactionOptions: { skipOpenApp: true },\n contextModule: contextModuleStub,\n loggerFactory: loggerFactoryStub,\n },\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.INSPECT_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.BUILD_TRANSACTION_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // provideContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.PROVIDE_TRANSACTION_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction (fallback)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: signTransactionDAStateSteps.SIGN_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: sig, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n expect(buildContextMock).toHaveBeenCalledTimes(1);\n expect(provideContextMock).toHaveBeenCalledTimes(1);\n expect(signMock).toHaveBeenCalledTimes(1);\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"failure in provideContext still signs\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n buildContextMock.mockResolvedValue({\n tlvDescriptor: new Uint8Array([2]),\n trustedNamePKICertificate: {\n keyUsageNumber: 0,\n payload: new Uint8Array(),\n },\n loadersResults: [],\n });\n provideContextMock.mockResolvedValue(\n Just(\n CommandResultFactory({ error: new InvalidStatusWordError(\"ctxErr\") }),\n ),\n );\n const sig = new Uint8Array([0xfe]);\n signMock.mockResolvedValue(CommandResultFactory({ data: Just(sig) }));\n\n const input: SignTransactionDAInput = {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n transactionOptions: { skipOpenApp: true },\n contextModule: contextModuleStub,\n loggerFactory: loggerFactoryStub,\n };\n\n const action = new SignTransactionDeviceAction({ input });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.INSPECT_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.BUILD_TRANSACTION_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // provideContext (returns error but continues)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.PROVIDE_TRANSACTION_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: signTransactionDAStateSteps.SIGN_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: sig, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n\n it(\"buildContext throws \u2192 error\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n buildContextMock.mockRejectedValue(new InvalidStatusWordError(\"bldErr\"));\n\n const sig = new Uint8Array([0xab, 0xcd]);\n signMock.mockResolvedValue(CommandResultFactory({ data: Just(sig) }));\n\n const input: SignTransactionDAInput = {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n transactionOptions: { skipOpenApp: true },\n contextModule: contextModuleStub,\n loggerFactory: loggerFactoryStub,\n };\n\n const action = new SignTransactionDeviceAction({ input });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.INSPECT_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext (throws)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.BUILD_TRANSACTION_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction (fallback)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: signTransactionDAStateSteps.SIGN_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: sig, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["CommandResultFactory", "DeviceActionStatus", "DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "InvalidStatusWordError", "UserInteractionRequired", "Just", "Nothing", "beforeEach", "describe", "it", "vi", "signTransactionDAStateSteps", "testDeviceActionStates", "SolanaTransactionTypes", "makeDeviceActionInternalApiMock", "SignTransactionDeviceAction", "defaultDerivation", "exampleTx", "contextModuleStub", "makeLoggerService", "loggerFactoryStub", "apiMock", "getAppConfigMock", "buildContextMock", "provideContextMock", "signMock", "inspectTransactionMock", "extractDeps", "resolve", "reject", "ctx", "signature", "input", "action", "expected", "sig"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{isSuccessCommandResult as
|
|
1
|
+
import{isSuccessCommandResult as l}from"@ledgerhq/device-management-kit";import{GetChallengeCommand as i}from"../../app-binder/command/GetChallengeCommand";class p{constructor(o,t){this.api=o;this.args=t;this._logger=t.loggerFactory("BuildTransactionContextTask")}_logger;async run(){this._logger.debug("[run] Starting BuildTransactionContextTask");const{contextModule:o,options:t}=this.args,s=this.api.getDeviceSessionState();let a;const n=await this.api.sendCommand(new i);if(l(n))a=n.data.challenge;else throw new Error("Failed to get challenge from device");const r={deviceModelId:s.deviceModelId,tokenAddress:t.tokenAddress,challenge:a,createATA:t.createATA,tokenInternalId:t.tokenInternalId,templateId:t.templateId};return this._logger.debug("[run] Calling contextModule.getSolanaContext",{data:{args:r}}),(await o.getSolanaContext(r)).caseOf({Left:e=>{throw this._logger.error("[run] Solana context result",{data:{error:{message:e.message,name:e.name,stack:e.stack}}}),e},Right:e=>(this._logger.debug("[run] Solana context result",{data:{result:e}}),e)})}}export{p as BuildTransactionContextTask};
|
|
2
2
|
//# sourceMappingURL=BuildTransactionContextTask.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/task/BuildTransactionContextTask.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type ContextModule,\n type PkiCertificate,\n type SolanaContextLoaderResults,\n} from \"@ledgerhq/context-module\";\nimport {\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type TransactionResolutionContext } from \"@api/model/TransactionResolutionContext\";\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\n\nexport type SolanaBuildContextResult = {\n trustedNamePKICertificate: PkiCertificate;\n tlvDescriptor: Uint8Array;\n loadersResults: SolanaContextLoaderResults;\n};\n\nexport type BuildTransactionContextTaskArgs = {\n readonly contextModule: ContextModule;\n readonly options: TransactionResolutionContext;\n};\n\nexport class BuildTransactionContextTask {\n constructor(\n private readonly api: InternalApi,\n private readonly args: BuildTransactionContextTaskArgs,\n ) {}\n\n async run(): Promise<SolanaBuildContextResult> {\n const { contextModule, options } = this.args;\n const deviceState = this.api.getDeviceSessionState();\n\n // get challenge\n let challenge: string | undefined;\n const challengeRes = await this.api.sendCommand(new GetChallengeCommand());\n if (isSuccessCommandResult(challengeRes)) {\n challenge = challengeRes.data.challenge;\n }\n\
|
|
5
|
-
"mappings": "AAKA,OAEE,0BAAAA,
|
|
6
|
-
"names": ["isSuccessCommandResult", "GetChallengeCommand", "BuildTransactionContextTask", "api", "args", "contextModule", "options", "deviceState", "challenge", "challengeRes", "err", "ctx"]
|
|
4
|
+
"sourcesContent": ["import {\n type ContextModule,\n type PkiCertificate,\n type SolanaContextLoaderResults,\n} from \"@ledgerhq/context-module\";\nimport {\n type InternalApi,\n isSuccessCommandResult,\n type LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type TransactionResolutionContext } from \"@api/model/TransactionResolutionContext\";\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\n\nexport type SolanaBuildContextResult = {\n trustedNamePKICertificate: PkiCertificate;\n tlvDescriptor: Uint8Array;\n loadersResults: SolanaContextLoaderResults;\n};\n\nexport type BuildTransactionContextTaskArgs = {\n readonly contextModule: ContextModule;\n readonly options: TransactionResolutionContext;\n readonly loggerFactory: (tag: string) => LoggerPublisherService;\n};\n\nexport class BuildTransactionContextTask {\n private readonly _logger: LoggerPublisherService;\n constructor(\n private readonly api: InternalApi,\n private readonly args: BuildTransactionContextTaskArgs,\n ) {\n this._logger = args.loggerFactory(\"BuildTransactionContextTask\");\n }\n\n async run(): Promise<SolanaBuildContextResult> {\n this._logger.debug(\"[run] Starting BuildTransactionContextTask\");\n const { contextModule, options } = this.args;\n const deviceState = this.api.getDeviceSessionState();\n\n // get challenge\n let challenge: string | undefined;\n const challengeRes = await this.api.sendCommand(new GetChallengeCommand());\n if (isSuccessCommandResult(challengeRes)) {\n challenge = challengeRes.data.challenge;\n } else {\n throw new Error(\"Failed to get challenge from device\");\n }\n\n const contextModuleGetSolanaContextArgs = {\n deviceModelId: deviceState.deviceModelId,\n tokenAddress: options.tokenAddress,\n challenge,\n createATA: options.createATA,\n tokenInternalId: options.tokenInternalId,\n templateId: options.templateId,\n };\n // get Solana context\n this._logger.debug(\"[run] Calling contextModule.getSolanaContext\", {\n data: {\n args: contextModuleGetSolanaContextArgs,\n },\n });\n const contextResult = await contextModule.getSolanaContext(\n contextModuleGetSolanaContextArgs,\n );\n\n return contextResult.caseOf({\n Left: (err) => {\n this._logger.error(\"[run] Solana context result\", {\n data: {\n error: {\n message: err.message,\n name: err.name,\n stack: err.stack,\n },\n },\n });\n throw err;\n },\n Right: (ctx) => {\n this._logger.debug(\"[run] Solana context result\", {\n data: {\n result: ctx,\n },\n });\n return ctx;\n },\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "AAKA,OAEE,0BAAAA,MAEK,kCAGP,OAAS,uBAAAC,MAA2B,mDAc7B,MAAMC,CAA4B,CAEvC,YACmBC,EACAC,EACjB,CAFiB,SAAAD,EACA,UAAAC,EAEjB,KAAK,QAAUA,EAAK,cAAc,6BAA6B,CACjE,CANiB,QAQjB,MAAM,KAAyC,CAC7C,KAAK,QAAQ,MAAM,4CAA4C,EAC/D,KAAM,CAAE,cAAAC,EAAe,QAAAC,CAAQ,EAAI,KAAK,KAClCC,EAAc,KAAK,IAAI,sBAAsB,EAGnD,IAAIC,EACJ,MAAMC,EAAe,MAAM,KAAK,IAAI,YAAY,IAAIR,CAAqB,EACzE,GAAID,EAAuBS,CAAY,EACrCD,EAAYC,EAAa,KAAK,cAE9B,OAAM,IAAI,MAAM,qCAAqC,EAGvD,MAAMC,EAAoC,CACxC,cAAeH,EAAY,cAC3B,aAAcD,EAAQ,aACtB,UAAAE,EACA,UAAWF,EAAQ,UACnB,gBAAiBA,EAAQ,gBACzB,WAAYA,EAAQ,UACtB,EAEA,YAAK,QAAQ,MAAM,+CAAgD,CACjE,KAAM,CACJ,KAAMI,CACR,CACF,CAAC,GACqB,MAAML,EAAc,iBACxCK,CACF,GAEqB,OAAO,CAC1B,KAAOC,GAAQ,CACb,WAAK,QAAQ,MAAM,8BAA+B,CAChD,KAAM,CACJ,MAAO,CACL,QAASA,EAAI,QACb,KAAMA,EAAI,KACV,MAAOA,EAAI,KACb,CACF,CACF,CAAC,EACKA,CACR,EACA,MAAQC,IACN,KAAK,QAAQ,MAAM,8BAA+B,CAChD,KAAM,CACJ,OAAQA,CACV,CACF,CAAC,EACMA,EAEX,CAAC,CACH,CACF",
|
|
6
|
+
"names": ["isSuccessCommandResult", "GetChallengeCommand", "BuildTransactionContextTask", "api", "args", "contextModule", "options", "deviceState", "challenge", "challengeRes", "contextModuleGetSolanaContextArgs", "err", "ctx"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{CommandResultStatus as
|
|
1
|
+
import{CommandResultStatus as i,DeviceModelId as u}from"@ledgerhq/device-management-kit";import{Left as f,Right as m}from"purify-ts";import{beforeEach as g,describe as C,expect as t,it as l,vi as e}from"vitest";import{GetChallengeCommand as k}from"../../app-binder/command/GetChallengeCommand";import{BuildTransactionContextTask as c}from"./BuildTransactionContextTask";const a={getSolanaContext:e.fn()},x=e.fn(()=>({debug:e.fn(),info:e.fn(),warn:e.fn(),error:e.fn()})),d={contextModule:a,loggerFactory:x,options:{tokenAddress:"someAddress",createATA:void 0}},s={tlvDescriptor:new Uint8Array([1,2,3]),trustedNamePKICertificate:{payload:new Uint8Array([170,187]),keyUsageNumber:1},loadersResults:[]};let o;C("BuildTransactionContextTask",()=>{g(()=>{e.resetAllMocks(),o={getDeviceSessionState:e.fn().mockReturnValue({deviceModelId:u.NANO_X}),sendCommand:e.fn().mockResolvedValue({status:i.Success,data:{challenge:"someChallenge"}})}}),l("returns context successfully when challenge command succeeds",async()=>{a.getSolanaContext.mockResolvedValue(m(s));const r=await new c(o,d).run();t(o.sendCommand).toHaveBeenCalledWith(t.any(k)),t(a.getSolanaContext).toHaveBeenCalledWith({deviceModelId:u.NANO_X,tokenAddress:"someAddress",challenge:"someChallenge",createATA:void 0}),t(r).toEqual({tlvDescriptor:s.tlvDescriptor,trustedNamePKICertificate:s.trustedNamePKICertificate,loadersResults:[]})}),l("throws if challenge command fails",async()=>{o.sendCommand.mockResolvedValue({status:i.Error,data:{}}),a.getSolanaContext.mockResolvedValue(m(s));const n=new c(o,d);await t(n.run()).rejects.toThrow("Failed to get challenge from device")}),l("throws if getSolanaContext returns Left",async()=>{const n=new Error("Solana context failure");a.getSolanaContext.mockResolvedValue(f(n));const r=new c(o,d);await t(r.run()).rejects.toThrow("Solana context failure")})});
|
|
2
2
|
//# sourceMappingURL=BuildTransactionContextTask.test.js.map
|