@ledgerhq/device-signer-kit-ethereum 0.0.0-rn-ble-pairing-removed-while-reconnecting-20250731133348 → 0.0.0-rn-ble-pairing-removed-while-reconnecting-20250807094338
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/app-binder/SignTransactionDeviceActionTypes.js +1 -1
- package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js.map +2 -2
- package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js +1 -1
- package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js.map +3 -3
- package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js +1 -1
- package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/BuildSubContextTask.js +1 -1
- package/lib/cjs/internal/app-binder/task/BuildSubContextTask.js.map +2 -2
- package/lib/cjs/internal/app-binder/task/BuildSubContextTask.test.js +1 -1
- package/lib/cjs/internal/app-binder/task/BuildSubContextTask.test.js.map +2 -2
- 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/GetWeb3CheckTask.js +1 -1
- package/lib/cjs/internal/app-binder/task/GetWeb3CheckTask.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/GetWeb3CheckTask.test.js +1 -1
- package/lib/cjs/internal/app-binder/task/GetWeb3CheckTask.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/PreBuildContextTask.js +2 -0
- package/lib/cjs/internal/app-binder/task/PreBuildContextTask.js.map +7 -0
- package/lib/cjs/internal/transaction/service/mapper/EthersTransactionMapperService.js +1 -1
- package/lib/cjs/internal/transaction/service/mapper/EthersTransactionMapperService.js.map +3 -3
- package/lib/cjs/internal/transaction/service/mapper/EthersTransactionMapperService.test.js +1 -1
- package/lib/cjs/internal/transaction/service/mapper/EthersTransactionMapperService.test.js.map +2 -2
- package/lib/cjs/internal/transaction/service/parser/TransactionParserService.js +1 -1
- package/lib/cjs/internal/transaction/service/parser/TransactionParserService.js.map +3 -3
- package/lib/cjs/internal/transaction/service/parser/TransactionParserService.test.js +1 -1
- package/lib/cjs/internal/transaction/service/parser/TransactionParserService.test.js.map +3 -3
- package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
- package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js.map +2 -2
- package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js +1 -1
- package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js.map +3 -3
- package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js +1 -1
- package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js.map +3 -3
- package/lib/esm/internal/app-binder/task/BuildSubContextTask.js +1 -1
- package/lib/esm/internal/app-binder/task/BuildSubContextTask.js.map +3 -3
- package/lib/esm/internal/app-binder/task/BuildSubContextTask.test.js +1 -1
- package/lib/esm/internal/app-binder/task/BuildSubContextTask.test.js.map +2 -2
- 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/GetWeb3CheckTask.js +1 -1
- package/lib/esm/internal/app-binder/task/GetWeb3CheckTask.js.map +3 -3
- package/lib/esm/internal/app-binder/task/GetWeb3CheckTask.test.js +1 -1
- package/lib/esm/internal/app-binder/task/GetWeb3CheckTask.test.js.map +3 -3
- package/lib/esm/internal/app-binder/task/PreBuildContextTask.js +2 -0
- package/lib/esm/internal/app-binder/task/PreBuildContextTask.js.map +7 -0
- package/lib/esm/internal/transaction/service/mapper/EthersTransactionMapperService.js +1 -1
- package/lib/esm/internal/transaction/service/mapper/EthersTransactionMapperService.js.map +3 -3
- package/lib/esm/internal/transaction/service/mapper/EthersTransactionMapperService.test.js +1 -1
- package/lib/esm/internal/transaction/service/mapper/EthersTransactionMapperService.test.js.map +2 -2
- package/lib/esm/internal/transaction/service/parser/TransactionParserService.js +1 -1
- package/lib/esm/internal/transaction/service/parser/TransactionParserService.js.map +3 -3
- package/lib/esm/internal/transaction/service/parser/TransactionParserService.test.js +1 -1
- package/lib/esm/internal/transaction/service/parser/TransactionParserService.test.js.map +3 -3
- package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts +3 -3
- package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts.map +1 -1
- package/lib/types/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.d.ts +9 -20
- package/lib/types/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.d.ts.map +1 -1
- package/lib/types/internal/app-binder/task/BuildSubContextTask.d.ts +2 -3
- package/lib/types/internal/app-binder/task/BuildSubContextTask.d.ts.map +1 -1
- package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts +3 -8
- package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts.map +1 -1
- package/lib/types/internal/app-binder/task/GetWeb3CheckTask.d.ts +2 -3
- package/lib/types/internal/app-binder/task/GetWeb3CheckTask.d.ts.map +1 -1
- package/lib/types/internal/app-binder/task/PreBuildContextTask.d.ts +17 -0
- package/lib/types/internal/app-binder/task/PreBuildContextTask.d.ts.map +1 -0
- package/lib/types/internal/transaction/service/mapper/EthersTransactionMapperService.d.ts.map +1 -1
- package/lib/types/internal/transaction/service/parser/TransactionParserService.d.ts +2 -2
- package/lib/types/internal/transaction/service/parser/TransactionParserService.d.ts.map +1 -1
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +6 -6
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint @typescript-eslint/consistent-type-imports: 0 */\nimport {\n ClearSignContextType,\n type ContextModule,\n} from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n hexaStringToBuffer,\n UnknownDAError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { InvalidStatusWordError } from \"@ledgerhq/device-management-kit\";\nimport { Transaction } from \"ethers\";\nimport { Just, Left } from \"purify-ts\";\n\nimport {\n type SignTransactionDAState,\n SignTransactionDAStep,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { ClearSigningType } from \"@api/model/ClearSigningType\";\nimport { TransactionType } from \"@api/model/TransactionType\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { setupOpenAppDAMock } from \"@internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport { type TransactionMapperService } from \"@internal/transaction/service/mapper/TransactionMapperService\";\nimport { type TransactionParserService } from \"@internal/transaction/service/parser/TransactionParserService\";\n\nimport { SignTransactionDeviceAction } from \"./SignTransactionDeviceAction\";\n\nvi.mock(\"@ledgerhq/device-management-kit\", async (importOriginal) => {\n const original =\n await importOriginal<typeof import(\"@ledgerhq/device-management-kit\")>();\n return {\n ...original,\n OpenAppDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n };\n});\n\ndescribe(\"SignTransactionDeviceAction\", () => {\n const contextModuleMock: ContextModule = {\n getContext: vi.fn(),\n getContexts: vi.fn(),\n getTypedDataFilters: vi.fn(),\n getWeb3Checks: vi.fn(),\n getSolanaContext: vi.fn(),\n };\n const mapperMock: TransactionMapperService = {\n mapTransactionToSubset: vi.fn(),\n } as unknown as TransactionMapperService;\n const parserMock: TransactionParserService = {\n extractValue: vi.fn(),\n } as unknown as TransactionParserService;\n const getAppConfigMock = vi.fn();\n const web3CheckOptInMock = vi.fn();\n const buildContextMock = vi.fn();\n const buildSubContextAndProvideMock = vi.fn();\n const signTransactionMock = vi.fn();\n function extractDependenciesMock() {\n return {\n getAppConfig: getAppConfigMock,\n web3CheckOptIn: web3CheckOptInMock,\n buildContext: buildContextMock,\n buildSubContextAndProvide: buildSubContextAndProvideMock,\n signTransaction: signTransactionMock,\n };\n }\n const apiMock = makeDeviceActionInternalApiMock();\n const defaultOptions = {\n domain: \"domain-name.eth\",\n };\n const defaultTransaction: Uint8Array = hexaStringToBuffer(\n Transaction.from({\n chainId: 1n,\n nonce: 0,\n data: \"0x\",\n }).unsignedSerialized,\n )!;\n\n function createAppConfig(\n version: string,\n web3ChecksEnabled: boolean,\n web3ChecksOptIn: boolean,\n ) {\n return {\n blindSigningEnabled: false,\n web3ChecksEnabled,\n web3ChecksOptIn,\n version,\n };\n }\n\n function setupAppConfig(\n version: string,\n web3ChecksEnabled: boolean,\n web3ChecksOptIn: boolean,\n ) {\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n getAppConfigMock.mockResolvedValue(\n CommandResultFactory({\n data: createAppConfig(version, web3ChecksEnabled, web3ChecksOptIn),\n }),\n );\n }\n\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n describe(\"Happy path\", () => {\n it(\"should call external dependencies with the correct parameters\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n transaction: defaultTransaction,\n options: defaultOptions,\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n },\n });\n\n // Mock the dependencies to return some sample data\n buildContextMock.mockResolvedValueOnce({\n clearSignContexts: [\n {\n type: \"token\",\n payload: \"payload-1\",\n },\n ],\n clearSignContextsOptional: [],\n serializedTransaction: new Uint8Array([0x01, 0x02, 0x03]),\n chainId: 1,\n transactionType: TransactionType.LEGACY,\n clearSigningType: ClearSigningType.BASIC,\n });\n buildSubContextAndProvideMock.mockResolvedValueOnce(Just(void 0));\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> BuildContext -> ProvideContext -> SignTransaction\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // GetAppConfig state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // ProvideContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_SUB_CONTEXT_AND_PROVIDE,\n },\n status: DeviceActionStatus.Pending,\n },\n // SignTransaction state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: SignTransactionDAStep.SIGN_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // Final state\n {\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onDone: () => {\n // Verify mocks calls parameters\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: contextModuleMock,\n mapper: mapperMock,\n options: defaultOptions,\n transaction: defaultTransaction,\n appConfig: createAppConfig(\"1.15.0\", false, false),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n\n expect(buildSubContextAndProvideMock).toHaveBeenCalledWith(\n expect.objectContaining({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n input: expect.objectContaining({\n context: {\n type: \"token\",\n payload: \"payload-1\",\n },\n contextOptional: [],\n transactionParser: parserMock,\n serializedTransaction: new Uint8Array([0x01, 0x02, 0x03]),\n contextModule: contextModuleMock,\n chainId: 1,\n derivationPath: \"44'/60'/0'/0/0\",\n }),\n }),\n );\n\n expect(signTransactionMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n serializedTransaction: new Uint8Array([0x01, 0x02, 0x03]),\n chainId: 1,\n transactionType: TransactionType.LEGACY,\n clearSigningType: ClearSigningType.BASIC,\n },\n }),\n );\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"should be successful while skipping OpenApp\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n transaction: defaultTransaction,\n options: {\n ...defaultOptions,\n skipOpenApp: true,\n },\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n },\n });\n\n // Mock the dependencies to return some sample data\n buildContextMock.mockResolvedValueOnce({\n clearSignContexts: [\n {\n type: \"token\",\n payload: \"payload-1\",\n },\n ],\n serializedTransaction: new Uint8Array([0x01, 0x02, 0x03]),\n chainId: 1,\n transactionType: TransactionType.LEGACY,\n clearSigningType: ClearSigningType.BASIC,\n });\n buildSubContextAndProvideMock.mockResolvedValueOnce(Just(void 0));\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> BuildContext -> ProvideContext -> SignTransaction\n const expectedStates: Array<SignTransactionDAState> = [\n // GetAppConfig state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // ProvideContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_SUB_CONTEXT_AND_PROVIDE,\n },\n status: DeviceActionStatus.Pending,\n },\n // SignTransaction state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: SignTransactionDAStep.SIGN_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // Final state\n {\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n }));\n\n it(\"should call external dependencies with the correct parameters with the generic parser\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n transaction: defaultTransaction,\n options: defaultOptions,\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n },\n });\n\n // Mock the dependencies to return some sample data\n buildContextMock.mockResolvedValueOnce({\n clearSignContexts: [\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-1\",\n },\n {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"payload-2\",\n },\n ],\n serializedTransaction: new Uint8Array([0x01, 0x02, 0x03]),\n chainId: 7,\n transactionType: TransactionType.EIP1559,\n clearSigningType: ClearSigningType.EIP7730,\n clearSignContextsOptional: [],\n });\n buildSubContextAndProvideMock.mockResolvedValueOnce(Just(void 0));\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> BuildContext -> ProvideGenericContext -> SignTransaction\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // GetAppConfig state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // ProvideContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_SUB_CONTEXT_AND_PROVIDE,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_SUB_CONTEXT_AND_PROVIDE,\n },\n status: DeviceActionStatus.Pending,\n },\n // SignTransaction state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: SignTransactionDAStep.SIGN_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // Final state\n {\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: () => {\n // Verify mocks calls parameters\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: contextModuleMock,\n mapper: mapperMock,\n options: defaultOptions,\n transaction: defaultTransaction,\n appConfig: createAppConfig(\"1.15.0\", false, false),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n\n expect(buildSubContextAndProvideMock).toHaveBeenCalledTimes(2);\n expect(buildSubContextAndProvideMock).toHaveBeenNthCalledWith(\n 1,\n expect.objectContaining({\n input: {\n chainId: 7,\n context: {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-1\",\n },\n contextModule: contextModuleMock,\n derivationPath: \"44'/60'/0'/0/0\",\n serializedTransaction: new Uint8Array([0x01, 0x02, 0x03]),\n transactionParser: parserMock,\n contextOptional: [],\n },\n }),\n );\n expect(buildSubContextAndProvideMock).toHaveBeenNthCalledWith(\n 2,\n expect.objectContaining({\n input: {\n chainId: 7,\n context: {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"payload-2\",\n },\n contextModule: contextModuleMock,\n derivationPath: \"44'/60'/0'/0/0\",\n serializedTransaction: new Uint8Array([0x01, 0x02, 0x03]),\n transactionParser: parserMock,\n contextOptional: [],\n },\n }),\n );\n expect(signTransactionMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n serializedTransaction: new Uint8Array([0x01, 0x02, 0x03]),\n chainId: 7,\n transactionType: TransactionType.EIP1559,\n clearSigningType: ClearSigningType.EIP7730,\n },\n }),\n );\n resolve();\n },\n });\n }));\n\n it(\"should fallback to blind signing if provideContext return an error\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n transaction: defaultTransaction,\n options: defaultOptions,\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n },\n });\n\n // Mock the dependencies to return some sample data\n buildContextMock.mockResolvedValueOnce({\n clearSignContexts: [\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-1\",\n },\n ],\n serializedTransaction: new Uint8Array([0x01, 0x02, 0x03]),\n chainId: 1,\n transactionType: TransactionType.LEGACY,\n clearSigningType: ClearSigningType.EIP7730,\n clearSignContextsOptional: [],\n });\n buildSubContextAndProvideMock.mockResolvedValueOnce(\n Left(new Error(\"provideContext error\")),\n );\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> BuildContext -> ProvideContext -> SignTransaction\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // GetAppConfig state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // ProvideContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_SUB_CONTEXT_AND_PROVIDE,\n },\n status: DeviceActionStatus.Pending,\n },\n // SignTransaction state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: SignTransactionDAStep.SIGN_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // Final state\n {\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: () => {\n // Verify mocks calls parameters\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: contextModuleMock,\n mapper: mapperMock,\n options: defaultOptions,\n transaction: defaultTransaction,\n appConfig: createAppConfig(\"1.15.0\", false, false),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n expect(buildSubContextAndProvideMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n context: {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-1\",\n },\n contextOptional: [],\n transactionParser: parserMock,\n serializedTransaction: new Uint8Array([0x01, 0x02, 0x03]),\n contextModule: contextModuleMock,\n chainId: 1,\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n expect(signTransactionMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n serializedTransaction: new Uint8Array([0x01, 0x02, 0x03]),\n chainId: 1,\n transactionType: TransactionType.LEGACY,\n clearSigningType: ClearSigningType.EIP7730, // TODO: should be standard\n },\n }),\n );\n resolve();\n },\n });\n }));\n });\n\n describe(\"Web3Checks\", () => {\n it(\"should call external dependencies with web3Checks enabled and supported\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.16.0\", true, true);\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n transaction: defaultTransaction,\n options: defaultOptions,\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n },\n });\n\n // Mock the dependencies to return some sample data\n buildContextMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"buildContext error\"),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> GetAppConfig -> BuildContext\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // GetAppConfig state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext error\n {\n error: new InvalidStatusWordError(\"buildContext error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onDone: () => {\n // Verify mocks calls parameters\n expect(getAppConfigMock).toHaveBeenCalled();\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: contextModuleMock,\n mapper: mapperMock,\n options: defaultOptions,\n transaction: defaultTransaction,\n appConfig: createAppConfig(\"1.16.0\", true, true),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"should call external dependencies with web3Checks supported but disabled\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.16.0\", false, true);\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n transaction: defaultTransaction,\n options: defaultOptions,\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n },\n });\n\n // Mock the dependencies to return some sample data\n buildContextMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"buildContext error\"),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> GetAppConfig -> BuildContext\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // GetAppConfig state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext error\n {\n error: new InvalidStatusWordError(\"buildContext error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onDone: () => {\n // Verify mocks calls parameters\n expect(getAppConfigMock).toHaveBeenCalled();\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: contextModuleMock,\n mapper: mapperMock,\n options: defaultOptions,\n transaction: defaultTransaction,\n appConfig: createAppConfig(\"1.16.0\", false, true),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"should call external dependencies with web3Checks opt-in, then enabled\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.16.0\", false, false);\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n transaction: defaultTransaction,\n options: defaultOptions,\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n },\n });\n\n // Mock the dependencies to return some sample data\n web3CheckOptInMock.mockResolvedValueOnce(\n CommandResultFactory({ data: { enabled: true } }),\n );\n buildContextMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"buildContext error\"),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> GetAppConfig -> Web3ChecksOptIn -> BuildContext\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // GetAppConfig state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // Web3ChecksOptIn state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.Web3ChecksOptIn,\n step: SignTransactionDAStep.WEB3_CHECKS_OPT_IN,\n },\n status: DeviceActionStatus.Pending,\n },\n // Web3ChecksOptInResultCheck state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.WEB3_CHECKS_OPT_IN_RESULT,\n result: true,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext error\n {\n error: new InvalidStatusWordError(\"buildContext error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onDone: () => {\n // Verify mocks calls parameters\n expect(getAppConfigMock).toHaveBeenCalled();\n expect(web3CheckOptInMock).toHaveBeenCalled();\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: contextModuleMock,\n mapper: mapperMock,\n options: defaultOptions,\n transaction: defaultTransaction,\n appConfig: createAppConfig(\"1.16.0\", true, false),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"should call external dependencies with web3Checks opt-in, then disabled\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.16.0\", false, false);\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n transaction: defaultTransaction,\n options: defaultOptions,\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n },\n });\n\n // Mock the dependencies to return some sample data\n web3CheckOptInMock.mockResolvedValueOnce(\n CommandResultFactory({ data: { enabled: false } }),\n );\n buildContextMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"buildContext error\"),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> GetAppConfig -> Web3ChecksOptIn -> BuildContext\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // GetAppConfig state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // Web3ChecksOptIn state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.Web3ChecksOptIn,\n step: SignTransactionDAStep.WEB3_CHECKS_OPT_IN,\n },\n status: DeviceActionStatus.Pending,\n },\n // Web3ChecksOptInResultCheck state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.WEB3_CHECKS_OPT_IN_RESULT,\n result: false,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext error\n {\n error: new InvalidStatusWordError(\"buildContext error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onDone: () => {\n // Verify mocks calls parameters\n expect(getAppConfigMock).toHaveBeenCalled();\n expect(web3CheckOptInMock).toHaveBeenCalled();\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: contextModuleMock,\n mapper: mapperMock,\n options: defaultOptions,\n transaction: defaultTransaction,\n appConfig: createAppConfig(\"1.16.0\", false, false),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"should provide web3Checks context if getWeb3Check return a value\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n transaction: defaultTransaction,\n options: defaultOptions,\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n },\n });\n\n // Mock the dependencies to return some sample data\n buildContextMock.mockResolvedValueOnce({\n clearSignContexts: [\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-1\",\n },\n {\n type: ClearSignContextType.WEB3_CHECK,\n payload: \"0x01020304\",\n certificate: {\n payload: new Uint8Array(),\n keyUsageNumber: 1,\n },\n },\n ],\n serializedTransaction: new Uint8Array([0x01, 0x02, 0x03]),\n chainId: 1,\n transactionType: TransactionType.LEGACY,\n clearSigningType: ClearSigningType.EIP7730,\n clearSignContextsOptional: [],\n });\n buildSubContextAndProvideMock.mockResolvedValueOnce(Just(void 0));\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> BuildContext -> ProvideContext -> SignTransaction\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // GetAppConfig state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // ProvideContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_SUB_CONTEXT_AND_PROVIDE,\n },\n status: DeviceActionStatus.Pending,\n },\n // ProvideContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_SUB_CONTEXT_AND_PROVIDE,\n },\n status: DeviceActionStatus.Pending,\n },\n // SignTransaction state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: SignTransactionDAStep.SIGN_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // Final state\n {\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: () => {\n // Verify mocks calls parameters\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: contextModuleMock,\n mapper: mapperMock,\n options: defaultOptions,\n transaction: defaultTransaction,\n appConfig: createAppConfig(\"1.15.0\", false, false),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n expect(buildSubContextAndProvideMock).toHaveBeenCalledTimes(2);\n expect(buildSubContextAndProvideMock).toHaveBeenNthCalledWith(\n 1,\n expect.objectContaining({\n input: {\n context: {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-1\",\n },\n contextOptional: [],\n transactionParser: parserMock,\n serializedTransaction: new Uint8Array([0x01, 0x02, 0x03]),\n contextModule: contextModuleMock,\n chainId: 1,\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n expect(buildSubContextAndProvideMock).toHaveBeenNthCalledWith(\n 2,\n expect.objectContaining({\n input: {\n context: {\n type: ClearSignContextType.WEB3_CHECK,\n payload: \"0x01020304\",\n certificate: {\n payload: new Uint8Array(),\n keyUsageNumber: 1,\n },\n },\n contextOptional: [],\n transactionParser: parserMock,\n serializedTransaction: new Uint8Array([0x01, 0x02, 0x03]),\n contextModule: contextModuleMock,\n chainId: 1,\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n expect(signTransactionMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n serializedTransaction: new Uint8Array([0x01, 0x02, 0x03]),\n chainId: 1,\n transactionType: TransactionType.LEGACY,\n clearSigningType: ClearSigningType.EIP7730,\n },\n }),\n );\n resolve();\n },\n });\n }));\n });\n\n describe(\"OpenApp errors\", () => {\n it(\"should fail if OpenApp throw an error\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock(new UnknownDAError(\"OpenApp error\"));\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n transaction: defaultTransaction,\n options: defaultOptions,\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n },\n });\n\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp error\n {\n error: new UnknownDAError(\"OpenApp error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: () => {\n resolve();\n },\n });\n }));\n });\n\n describe(\"BuildContext errors\", () => {\n it(\"should fail if buildContext throws an error\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n transaction: defaultTransaction,\n options: defaultOptions,\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n },\n });\n\n buildContextMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"buildContext error\"),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // GetAppConfig state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext error\n {\n error: new InvalidStatusWordError(\"buildContext error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n });\n\n describe(\"SignTransaction errors\", () => {\n it(\"should fail if signTransaction returns an error\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n transaction: defaultTransaction,\n options: defaultOptions,\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n },\n });\n\n buildContextMock.mockResolvedValueOnce({\n clearSignContexts: [\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-1\",\n },\n ],\n serializedTransaction: new Uint8Array([0x01, 0x02, 0x03]),\n web3Check: null,\n });\n buildSubContextAndProvideMock.mockResolvedValueOnce(Just(void 0));\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"signTransaction error\"),\n }),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // GetAppConfig state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // ProvideContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_SUB_CONTEXT_AND_PROVIDE,\n },\n status: DeviceActionStatus.Pending,\n },\n // SignTransaction state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: SignTransactionDAStep.SIGN_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // SignTransaction error\n {\n error: new InvalidStatusWordError(\"signTransaction error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n });\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["ClearSignContextType", "CommandResultFactory", "DeviceActionStatus", "DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "hexaStringToBuffer", "UnknownDAError", "UserInteractionRequired", "InvalidStatusWordError", "Transaction", "Just", "Left", "SignTransactionDAStep", "ClearSigningType", "TransactionType", "makeDeviceActionInternalApiMock", "setupOpenAppDAMock", "testDeviceActionStates", "SignTransactionDeviceAction", "importOriginal", "contextModuleMock", "mapperMock", "parserMock", "getAppConfigMock", "web3CheckOptInMock", "buildContextMock", "buildSubContextAndProvideMock", "signTransactionMock", "extractDependenciesMock", "apiMock", "defaultOptions", "defaultTransaction", "createAppConfig", "version", "web3ChecksEnabled", "web3ChecksOptIn", "setupAppConfig", "resolve", "reject", "deviceAction", "expectedStates"]
|
|
4
|
+
"sourcesContent": ["/* eslint @typescript-eslint/consistent-type-imports: 0 */\nimport {\n ClearSignContextType,\n type ContextModule,\n TransactionSubset,\n} from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n hexaStringToBuffer,\n UnknownDAError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { InvalidStatusWordError } from \"@ledgerhq/device-management-kit\";\nimport { Transaction } from \"ethers\";\nimport { Just, Left } from \"purify-ts\";\n\nimport {\n type SignTransactionDAState,\n SignTransactionDAStep,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { ClearSigningType } from \"@api/model/ClearSigningType\";\nimport { TransactionType } from \"@api/model/TransactionType\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { setupOpenAppDAMock } from \"@internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport { type TransactionMapperService } from \"@internal/transaction/service/mapper/TransactionMapperService\";\nimport { type TransactionParserService } from \"@internal/transaction/service/parser/TransactionParserService\";\n\nimport { SignTransactionDeviceAction } from \"./SignTransactionDeviceAction\";\n\nvi.mock(\"@ledgerhq/device-management-kit\", async (importOriginal) => {\n const original =\n await importOriginal<typeof import(\"@ledgerhq/device-management-kit\")>();\n return {\n ...original,\n OpenAppDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n };\n});\n\ndescribe(\"SignTransactionDeviceAction\", () => {\n const contextModuleMock: ContextModule = {\n getContext: vi.fn(),\n getContexts: vi.fn(),\n getTypedDataFilters: vi.fn(),\n getWeb3Checks: vi.fn(),\n getSolanaContext: vi.fn(),\n };\n const mapperMock: TransactionMapperService = {\n mapTransactionToSubset: vi.fn(),\n } as unknown as TransactionMapperService;\n const parserMock: TransactionParserService = {\n extractValue: vi.fn(),\n } as unknown as TransactionParserService;\n const getAppConfigMock = vi.fn();\n const web3CheckOptInMock = vi.fn();\n const preBuildContextMock = vi.fn();\n const buildContextMock = vi.fn();\n const buildSubContextAndProvideMock = vi.fn();\n const signTransactionMock = vi.fn();\n function extractDependenciesMock() {\n return {\n getAppConfig: getAppConfigMock,\n web3CheckOptIn: web3CheckOptInMock,\n preBuildContext: preBuildContextMock,\n buildContext: buildContextMock,\n buildSubContextAndProvide: buildSubContextAndProvideMock,\n signTransaction: signTransactionMock,\n };\n }\n const apiMock = makeDeviceActionInternalApiMock();\n const defaultOptions = {\n domain: \"domain-name.eth\",\n };\n const defaultTransaction: Uint8Array = hexaStringToBuffer(\n Transaction.from({\n chainId: 1n,\n nonce: 0,\n data: \"0x\",\n }).unsignedSerialized,\n )!;\n const defaultSubset: TransactionSubset = {\n chainId: 1,\n data: \"0x\",\n selector: \"0x\",\n to: \"0x\",\n value: 0n,\n };\n\n function createAppConfig(\n version: string,\n web3ChecksEnabled: boolean,\n web3ChecksOptIn: boolean,\n ) {\n return {\n blindSigningEnabled: false,\n web3ChecksEnabled,\n web3ChecksOptIn,\n version,\n };\n }\n\n function setupAppConfig(\n version: string,\n web3ChecksEnabled: boolean,\n web3ChecksOptIn: boolean,\n ) {\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n getAppConfigMock.mockResolvedValue(\n CommandResultFactory({\n data: createAppConfig(version, web3ChecksEnabled, web3ChecksOptIn),\n }),\n );\n }\n\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n describe(\"Happy path\", () => {\n it(\"should call external dependencies with the correct parameters\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n transaction: defaultTransaction,\n options: defaultOptions,\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n },\n });\n\n // Mock the dependencies to return some sample data\n preBuildContextMock.mockResolvedValueOnce({\n subset: defaultSubset,\n type: TransactionType.LEGACY,\n });\n buildContextMock.mockResolvedValueOnce({\n clearSignContexts: [\n {\n type: \"token\",\n payload: \"payload-1\",\n },\n ],\n clearSignContextsOptional: [],\n clearSigningType: ClearSigningType.BASIC,\n });\n buildSubContextAndProvideMock.mockResolvedValueOnce(Just(void 0));\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> BuildContext -> ProvideContext -> SignTransaction\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // GetAppConfig state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // PreBuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.PRE_BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // ProvideContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_SUB_CONTEXT_AND_PROVIDE,\n },\n status: DeviceActionStatus.Pending,\n },\n // SignTransaction state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: SignTransactionDAStep.SIGN_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // Final state\n {\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onDone: () => {\n expect(preBuildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n mapper: mapperMock,\n transaction: defaultTransaction,\n },\n }),\n );\n // Verify mocks calls parameters\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: contextModuleMock,\n options: defaultOptions,\n subset: defaultSubset,\n transaction: defaultTransaction,\n appConfig: createAppConfig(\"1.15.0\", false, false),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n\n expect(buildSubContextAndProvideMock).toHaveBeenCalledWith(\n expect.objectContaining({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n input: expect.objectContaining({\n context: {\n type: \"token\",\n payload: \"payload-1\",\n },\n contextOptional: [],\n transactionParser: parserMock,\n subset: defaultSubset,\n contextModule: contextModuleMock,\n derivationPath: \"44'/60'/0'/0/0\",\n transaction: defaultTransaction,\n }),\n }),\n );\n\n expect(signTransactionMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n serializedTransaction: defaultTransaction,\n chainId: 1,\n transactionType: TransactionType.LEGACY,\n clearSigningType: ClearSigningType.BASIC,\n },\n }),\n );\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"should be successful while skipping OpenApp\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n transaction: defaultTransaction,\n options: {\n ...defaultOptions,\n skipOpenApp: true,\n },\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n },\n });\n\n // Mock the dependencies to return some sample data\n preBuildContextMock.mockResolvedValueOnce({\n subset: defaultSubset,\n type: TransactionType.LEGACY,\n });\n buildContextMock.mockResolvedValueOnce({\n clearSignContexts: [\n {\n type: \"token\",\n payload: \"payload-1\",\n },\n ],\n clearSignContextsOptional: [],\n clearSigningType: ClearSigningType.BASIC,\n });\n buildSubContextAndProvideMock.mockResolvedValueOnce(Just(void 0));\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> BuildContext -> ProvideContext -> SignTransaction\n const expectedStates: Array<SignTransactionDAState> = [\n // GetAppConfig state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // PreBuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.PRE_BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // ProvideContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_SUB_CONTEXT_AND_PROVIDE,\n },\n status: DeviceActionStatus.Pending,\n },\n // SignTransaction state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: SignTransactionDAStep.SIGN_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // Final state\n {\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n }));\n\n it(\"should call external dependencies with the correct parameters with the generic parser\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n const subset = { ...defaultSubset, chainId: 17 };\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n transaction: defaultTransaction,\n options: defaultOptions,\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n },\n });\n\n // Mock the dependencies to return some sample data\n preBuildContextMock.mockResolvedValueOnce({\n subset,\n type: TransactionType.EIP1559,\n });\n buildContextMock.mockResolvedValueOnce({\n clearSignContexts: [\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-1\",\n },\n {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"payload-2\",\n },\n ],\n clearSigningType: ClearSigningType.EIP7730,\n clearSignContextsOptional: [],\n });\n buildSubContextAndProvideMock.mockResolvedValueOnce(Just(void 0));\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> BuildContext -> ProvideGenericContext -> SignTransaction\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // GetAppConfig state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // PreBuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.PRE_BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // ProvideContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_SUB_CONTEXT_AND_PROVIDE,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_SUB_CONTEXT_AND_PROVIDE,\n },\n status: DeviceActionStatus.Pending,\n },\n // SignTransaction state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: SignTransactionDAStep.SIGN_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // Final state\n {\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: () => {\n // Verify mocks calls parameters\n expect(preBuildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n mapper: mapperMock,\n transaction: defaultTransaction,\n },\n }),\n );\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: contextModuleMock,\n options: defaultOptions,\n subset,\n transaction: defaultTransaction,\n appConfig: createAppConfig(\"1.15.0\", false, false),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n\n expect(buildSubContextAndProvideMock).toHaveBeenCalledTimes(2);\n expect(buildSubContextAndProvideMock).toHaveBeenNthCalledWith(\n 1,\n expect.objectContaining({\n input: {\n context: {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-1\",\n },\n contextOptional: [],\n transactionParser: parserMock,\n subset,\n contextModule: contextModuleMock,\n derivationPath: \"44'/60'/0'/0/0\",\n transaction: defaultTransaction,\n },\n }),\n );\n expect(buildSubContextAndProvideMock).toHaveBeenNthCalledWith(\n 2,\n expect.objectContaining({\n input: {\n context: {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"payload-2\",\n },\n contextOptional: [],\n transactionParser: parserMock,\n subset,\n contextModule: contextModuleMock,\n derivationPath: \"44'/60'/0'/0/0\",\n transaction: defaultTransaction,\n },\n }),\n );\n expect(signTransactionMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n serializedTransaction: defaultTransaction,\n chainId: subset.chainId,\n transactionType: TransactionType.EIP1559,\n clearSigningType: ClearSigningType.EIP7730,\n },\n }),\n );\n resolve();\n },\n });\n }));\n\n it(\"should fallback to blind signing if provideContext return an error\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n transaction: defaultTransaction,\n options: defaultOptions,\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n },\n });\n\n // Mock the dependencies to return some sample data\n preBuildContextMock.mockResolvedValueOnce({\n subset: defaultSubset,\n type: TransactionType.LEGACY,\n });\n buildContextMock.mockResolvedValueOnce({\n clearSignContexts: [\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-1\",\n },\n ],\n clearSigningType: ClearSigningType.EIP7730,\n clearSignContextsOptional: [],\n });\n buildSubContextAndProvideMock.mockResolvedValueOnce(\n Left(new Error(\"provideContext error\")),\n );\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> BuildContext -> ProvideContext -> SignTransaction\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // GetAppConfig state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // PreBuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.PRE_BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // ProvideContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_SUB_CONTEXT_AND_PROVIDE,\n },\n status: DeviceActionStatus.Pending,\n },\n // SignTransaction state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: SignTransactionDAStep.SIGN_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // Final state\n {\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: () => {\n // Verify mocks calls parameters\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: contextModuleMock,\n options: defaultOptions,\n subset: defaultSubset,\n transaction: defaultTransaction,\n appConfig: createAppConfig(\"1.15.0\", false, false),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n expect(buildSubContextAndProvideMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n context: {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-1\",\n },\n contextOptional: [],\n transactionParser: parserMock,\n subset: defaultSubset,\n contextModule: contextModuleMock,\n derivationPath: \"44'/60'/0'/0/0\",\n transaction: defaultTransaction,\n },\n }),\n );\n expect(signTransactionMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n serializedTransaction: defaultTransaction,\n chainId: defaultSubset.chainId,\n transactionType: TransactionType.LEGACY,\n clearSigningType: ClearSigningType.EIP7730,\n },\n }),\n );\n resolve();\n },\n });\n }));\n });\n\n describe(\"Web3Checks\", () => {\n it(\"should call external dependencies with web3Checks enabled and supported\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.16.0\", true, true);\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n transaction: defaultTransaction,\n options: defaultOptions,\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n },\n });\n\n // Mock the dependencies to return some sample data\n preBuildContextMock.mockResolvedValueOnce({\n subset: defaultSubset,\n type: TransactionType.LEGACY,\n });\n buildContextMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"buildContext error\"),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> GetAppConfig -> BuildContext\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // GetAppConfig state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // PreBuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.PRE_BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext error\n {\n error: new InvalidStatusWordError(\"buildContext error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onDone: () => {\n // Verify mocks calls parameters\n expect(getAppConfigMock).toHaveBeenCalled();\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: contextModuleMock,\n options: defaultOptions,\n subset: defaultSubset,\n transaction: defaultTransaction,\n appConfig: createAppConfig(\"1.16.0\", true, true),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"should call external dependencies with web3Checks supported but disabled\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.16.0\", false, true);\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n transaction: defaultTransaction,\n options: defaultOptions,\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n },\n });\n\n // Mock the dependencies to return some sample data\n preBuildContextMock.mockResolvedValueOnce({\n subset: defaultSubset,\n type: TransactionType.LEGACY,\n });\n buildContextMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"buildContext error\"),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> GetAppConfig -> BuildContext\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // GetAppConfig state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // PreBuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.PRE_BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext error\n {\n error: new InvalidStatusWordError(\"buildContext error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onDone: () => {\n // Verify mocks calls parameters\n expect(getAppConfigMock).toHaveBeenCalled();\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: contextModuleMock,\n options: defaultOptions,\n subset: defaultSubset,\n transaction: defaultTransaction,\n appConfig: createAppConfig(\"1.16.0\", false, true),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"should call external dependencies with web3Checks opt-in, then enabled\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.16.0\", false, false);\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n transaction: defaultTransaction,\n options: defaultOptions,\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n },\n });\n\n // Mock the dependencies to return some sample data\n preBuildContextMock.mockResolvedValueOnce({\n subset: defaultSubset,\n type: TransactionType.LEGACY,\n });\n web3CheckOptInMock.mockResolvedValueOnce(\n CommandResultFactory({ data: { enabled: true } }),\n );\n buildContextMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"buildContext error\"),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> GetAppConfig -> Web3ChecksOptIn -> BuildContext\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // GetAppConfig state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // Web3ChecksOptIn state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.Web3ChecksOptIn,\n step: SignTransactionDAStep.WEB3_CHECKS_OPT_IN,\n },\n status: DeviceActionStatus.Pending,\n },\n // Web3ChecksOptInResultCheck state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.WEB3_CHECKS_OPT_IN_RESULT,\n result: true,\n },\n status: DeviceActionStatus.Pending,\n },\n // PreBuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.PRE_BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext error\n {\n error: new InvalidStatusWordError(\"buildContext error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onDone: () => {\n // Verify mocks calls parameters\n expect(getAppConfigMock).toHaveBeenCalled();\n expect(web3CheckOptInMock).toHaveBeenCalled();\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: contextModuleMock,\n options: defaultOptions,\n subset: defaultSubset,\n transaction: defaultTransaction,\n appConfig: createAppConfig(\"1.16.0\", true, false),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"should call external dependencies with web3Checks opt-in, then disabled\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.16.0\", false, false);\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n transaction: defaultTransaction,\n options: defaultOptions,\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n },\n });\n\n // Mock the dependencies to return some sample data\n preBuildContextMock.mockResolvedValueOnce({\n subset: defaultSubset,\n type: TransactionType.LEGACY,\n });\n web3CheckOptInMock.mockResolvedValueOnce(\n CommandResultFactory({ data: { enabled: false } }),\n );\n buildContextMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"buildContext error\"),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> GetAppConfig -> Web3ChecksOptIn -> BuildContext\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // GetAppConfig state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // Web3ChecksOptIn state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.Web3ChecksOptIn,\n step: SignTransactionDAStep.WEB3_CHECKS_OPT_IN,\n },\n status: DeviceActionStatus.Pending,\n },\n // Web3ChecksOptInResultCheck state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.WEB3_CHECKS_OPT_IN_RESULT,\n result: false,\n },\n status: DeviceActionStatus.Pending,\n },\n // PreBuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.PRE_BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext error\n {\n error: new InvalidStatusWordError(\"buildContext error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onDone: () => {\n // Verify mocks calls parameters\n expect(getAppConfigMock).toHaveBeenCalled();\n expect(web3CheckOptInMock).toHaveBeenCalled();\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: contextModuleMock,\n options: defaultOptions,\n subset: defaultSubset,\n transaction: defaultTransaction,\n appConfig: createAppConfig(\"1.16.0\", false, false),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"should provide web3Checks context if getWeb3Check return a value\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n transaction: defaultTransaction,\n options: defaultOptions,\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n },\n });\n\n // Mock the dependencies to return some sample data\n preBuildContextMock.mockResolvedValueOnce({\n subset: defaultSubset,\n type: TransactionType.EIP4844,\n });\n buildContextMock.mockResolvedValueOnce({\n clearSignContexts: [\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-1\",\n },\n {\n type: ClearSignContextType.WEB3_CHECK,\n payload: \"0x01020304\",\n certificate: {\n payload: new Uint8Array(),\n keyUsageNumber: 1,\n },\n },\n ],\n clearSigningType: ClearSigningType.EIP7730,\n clearSignContextsOptional: [],\n });\n buildSubContextAndProvideMock.mockResolvedValueOnce(Just(void 0));\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> BuildContext -> ProvideContext -> SignTransaction\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // GetAppConfig state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // PreBuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.PRE_BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // ProvideContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_SUB_CONTEXT_AND_PROVIDE,\n },\n status: DeviceActionStatus.Pending,\n },\n // ProvideContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_SUB_CONTEXT_AND_PROVIDE,\n },\n status: DeviceActionStatus.Pending,\n },\n // SignTransaction state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: SignTransactionDAStep.SIGN_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // Final state\n {\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: () => {\n // Verify mocks calls parameters\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: contextModuleMock,\n options: defaultOptions,\n subset: defaultSubset,\n transaction: defaultTransaction,\n appConfig: createAppConfig(\"1.15.0\", false, false),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n expect(buildSubContextAndProvideMock).toHaveBeenCalledTimes(2);\n expect(buildSubContextAndProvideMock).toHaveBeenNthCalledWith(\n 1,\n expect.objectContaining({\n input: {\n context: {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-1\",\n },\n contextOptional: [],\n transactionParser: parserMock,\n subset: defaultSubset,\n transaction: defaultTransaction,\n contextModule: contextModuleMock,\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n expect(buildSubContextAndProvideMock).toHaveBeenNthCalledWith(\n 2,\n expect.objectContaining({\n input: {\n context: {\n type: ClearSignContextType.WEB3_CHECK,\n payload: \"0x01020304\",\n certificate: {\n payload: new Uint8Array(),\n keyUsageNumber: 1,\n },\n },\n contextOptional: [],\n transactionParser: parserMock,\n subset: defaultSubset,\n transaction: defaultTransaction,\n contextModule: contextModuleMock,\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n expect(signTransactionMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n serializedTransaction: defaultTransaction,\n chainId: defaultSubset.chainId,\n transactionType: TransactionType.EIP4844,\n clearSigningType: ClearSigningType.EIP7730,\n },\n }),\n );\n resolve();\n },\n });\n }));\n });\n\n describe(\"OpenApp errors\", () => {\n it(\"should fail if OpenApp throw an error\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock(new UnknownDAError(\"OpenApp error\"));\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n transaction: defaultTransaction,\n options: defaultOptions,\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n },\n });\n\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp error\n {\n error: new UnknownDAError(\"OpenApp error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: () => {\n resolve();\n },\n });\n }));\n });\n\n describe(\"PreBuildContext errors\", () => {\n it(\"should fail if buildContext throws an error\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n transaction: defaultTransaction,\n options: defaultOptions,\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n },\n });\n\n preBuildContextMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"preBuildContext error\"),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // GetAppConfig state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // PreBuildContext error\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.PRE_BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext error\n {\n error: new InvalidStatusWordError(\"preBuildContext error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n });\n\n describe(\"BuildContext errors\", () => {\n it(\"should fail if buildContext throws an error\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n transaction: defaultTransaction,\n options: defaultOptions,\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n },\n });\n\n preBuildContextMock.mockResolvedValueOnce({\n subset: defaultSubset,\n type: TransactionType.LEGACY,\n });\n buildContextMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"buildContext error\"),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // GetAppConfig state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // PreBuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.PRE_BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext error\n {\n error: new InvalidStatusWordError(\"buildContext error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n });\n\n describe(\"SignTransaction errors\", () => {\n it(\"should fail if signTransaction returns an error\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n transaction: defaultTransaction,\n options: defaultOptions,\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n },\n });\n\n preBuildContextMock.mockResolvedValueOnce({\n subset: defaultSubset,\n type: TransactionType.LEGACY,\n });\n buildContextMock.mockResolvedValueOnce({\n clearSignContexts: [\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-1\",\n },\n ],\n clearSignContextsOptional: [],\n clearSigningType: ClearSigningType.EIP7730,\n });\n buildSubContextAndProvideMock.mockResolvedValueOnce(Just(void 0));\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"signTransaction error\"),\n }),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTransactionDAStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n // GetAppConfig state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // PreBuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.PRE_BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // BuildContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // ProvideContext state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_SUB_CONTEXT_AND_PROVIDE,\n },\n status: DeviceActionStatus.Pending,\n },\n // SignTransaction state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: SignTransactionDAStep.SIGN_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // SignTransaction error\n {\n error: new InvalidStatusWordError(\"signTransaction error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["ClearSignContextType", "CommandResultFactory", "DeviceActionStatus", "DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "hexaStringToBuffer", "UnknownDAError", "UserInteractionRequired", "InvalidStatusWordError", "Transaction", "Just", "Left", "SignTransactionDAStep", "ClearSigningType", "TransactionType", "makeDeviceActionInternalApiMock", "setupOpenAppDAMock", "testDeviceActionStates", "SignTransactionDeviceAction", "importOriginal", "contextModuleMock", "mapperMock", "parserMock", "getAppConfigMock", "web3CheckOptInMock", "preBuildContextMock", "buildContextMock", "buildSubContextAndProvideMock", "signTransactionMock", "extractDependenciesMock", "apiMock", "defaultOptions", "defaultTransaction", "defaultSubset", "createAppConfig", "version", "web3ChecksEnabled", "web3ChecksOptIn", "setupAppConfig", "resolve", "reject", "deviceAction", "expectedStates", "subset"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ClearSignContextType as t}from"@ledgerhq/context-module";import{bufferToHexaString as u,isSuccessCommandResult as C}from"@ledgerhq/device-management-kit";import{GetChallengeCommand as
|
|
1
|
+
import{ClearSignContextType as t}from"@ledgerhq/context-module";import{bufferToHexaString as u,isSuccessCommandResult as C}from"@ledgerhq/device-management-kit";import{GetChallengeCommand as x}from"../../app-binder/command/GetChallengeCommand";class y{constructor(e,a){this.api=e;this.args=a}run(){const e=this.args.context;if(e.type===t.TRANSACTION_INFO||e.type===t.ENUM||e.type===t.WEB3_CHECK||e.type===t.PLUGIN||e.type===t.EXTERNAL_PLUGIN)return{subcontextCallbacks:[]};if(e.reference!==void 0&&"value"in e.reference&&e.reference.value!==void 0){const a={type:e.reference.type,chainId:this.args.subset.chainId,address:e.reference.value};return{subcontextCallbacks:[()=>this.args.contextModule.getContext(a)]}}if(e.reference!==void 0&&e.reference.valuePath!==void 0){const a=this.args.transactionParser.extractValue(this.args.subset,e.reference.valuePath);if(a.isRight()){const o=[];for(const r of a.extract()){if(e.reference.type===t.ENUM){const n=e.reference,s=r[r.length-1];if(!s)continue;const l=this.args.contextOptional.filter(c=>c.type===t.ENUM).find(c=>c.value===s&&c.id===n.id);l&&o.push(()=>Promise.resolve(l))}if(e.reference.type===t.TOKEN||e.reference.type===t.NFT){const n=e.reference,s=u(r.slice(Math.max(0,r.length-20)));o.push(()=>this.args.contextModule.getContext({type:n.type,chainId:this.args.subset.chainId,address:s}))}if(e.reference.type===t.TRUSTED_NAME){const n=e.reference;o.push(async()=>{const s=u(r.slice(Math.max(0,r.length-20))),i=await this.api.sendCommand(new x);return C(i)?await this.args.contextModule.getContext({type:n.type,chainId:this.args.subset.chainId,address:s,challenge:i.data.challenge,types:n.types,sources:n.sources}):{type:t.ERROR,error:new Error("Failed to get challenge")}})}}return{subcontextCallbacks:o}}}return{subcontextCallbacks:[]}}}export{y as BuildSubContextTask};
|
|
2
2
|
//# sourceMappingURL=BuildSubContextTask.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/task/BuildSubContextTask.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type ClearSignContext,\n type ClearSignContextReference,\n type ClearSignContextSuccess,\n ClearSignContextType,\n type ContextModule,\n type TransactionFieldContext,\n} from \"@ledgerhq/context-module\";\nimport {\n bufferToHexaString,\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\nimport { type TransactionParserService } from \"@internal/transaction/service/parser/TransactionParserService\";\n\nexport type BuildSubContextTaskArgs = {\n readonly context: ClearSignContextSuccess;\n readonly contextOptional: ClearSignContextSuccess[];\n readonly transactionParser: TransactionParserService;\n readonly
|
|
5
|
-
"mappings": "AAAA,OAIE,wBAAAA,
|
|
6
|
-
"names": ["ClearSignContextType", "bufferToHexaString", "isSuccessCommandResult", "GetChallengeCommand", "BuildSubContextTask", "api", "args", "context", "transactionFieldContext", "referenceValues", "subcontextCallbacks", "value", "reference", "enumValue", "subcontext", "
|
|
4
|
+
"sourcesContent": ["import {\n type ClearSignContext,\n type ClearSignContextReference,\n type ClearSignContextSuccess,\n ClearSignContextType,\n type ContextModule,\n type TransactionFieldContext,\n type TransactionSubset,\n} from \"@ledgerhq/context-module\";\nimport {\n bufferToHexaString,\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\nimport { type TransactionParserService } from \"@internal/transaction/service/parser/TransactionParserService\";\n\nexport type BuildSubContextTaskArgs = {\n readonly context: ClearSignContextSuccess;\n readonly contextOptional: ClearSignContextSuccess[];\n readonly transactionParser: TransactionParserService;\n readonly subset: TransactionSubset;\n readonly contextModule: ContextModule;\n};\n\nexport type BuildSubContextTaskResult = {\n subcontextCallbacks: (() => Promise<ClearSignContext>)[];\n};\n\nexport class BuildSubContextTask {\n constructor(\n private readonly api: InternalApi,\n private readonly args: BuildSubContextTaskArgs,\n ) {}\n\n run(): BuildSubContextTaskResult {\n const context = this.args.context;\n\n if (\n context.type === ClearSignContextType.TRANSACTION_INFO ||\n context.type === ClearSignContextType.ENUM ||\n context.type === ClearSignContextType.WEB3_CHECK ||\n context.type === ClearSignContextType.PLUGIN ||\n context.type === ClearSignContextType.EXTERNAL_PLUGIN\n ) {\n return {\n subcontextCallbacks: [],\n };\n }\n\n // if the reference is a string, it means it is a direct address\n // and we don't need to extract the value from the transaction\n // as it is already provided in the reference\n if (\n context.reference !== undefined &&\n \"value\" in context.reference &&\n context.reference.value !== undefined\n ) {\n const transactionFieldContext: TransactionFieldContext = {\n type: context.reference.type,\n chainId: this.args.subset.chainId,\n address: context.reference.value,\n };\n\n return {\n subcontextCallbacks: [\n () => this.args.contextModule.getContext(transactionFieldContext),\n ],\n };\n }\n\n // if the reference is a path, it means we need to extract the value\n // from the transaction and provide it to the device\n if (\n context.reference !== undefined &&\n context.reference.valuePath !== undefined\n ) {\n // iterate on each reference and provide the context\n const referenceValues = this.args.transactionParser.extractValue(\n this.args.subset,\n context.reference.valuePath,\n );\n\n if (referenceValues.isRight()) {\n const subcontextCallbacks: (() => Promise<ClearSignContext>)[] = [];\n\n for (const value of referenceValues.extract()) {\n if (context.reference.type === ClearSignContextType.ENUM) {\n const reference: ClearSignContextReference<ClearSignContextType.ENUM> =\n context.reference;\n const enumValue = value[value.length - 1];\n if (!enumValue) continue;\n\n const enumsContext = this.args.contextOptional.filter(\n (c) => c.type === ClearSignContextType.ENUM,\n );\n\n const subcontext = enumsContext.find(\n (enumContext) =>\n enumContext.value === enumValue &&\n enumContext.id === reference.id,\n );\n\n if (subcontext) {\n subcontextCallbacks.push(() => Promise.resolve(subcontext));\n }\n }\n\n if (\n context.reference.type === ClearSignContextType.TOKEN ||\n context.reference.type === ClearSignContextType.NFT\n ) {\n const reference: ClearSignContextReference<\n ClearSignContextType.TOKEN | ClearSignContextType.NFT\n > = context.reference;\n const address = bufferToHexaString(\n value.slice(Math.max(0, value.length - 20)),\n );\n\n subcontextCallbacks.push(() =>\n this.args.contextModule.getContext({\n type: reference.type,\n chainId: this.args.subset.chainId,\n address,\n }),\n );\n }\n\n if (context.reference.type === ClearSignContextType.TRUSTED_NAME) {\n const reference: ClearSignContextReference<ClearSignContextType.TRUSTED_NAME> =\n context.reference;\n subcontextCallbacks.push(async () => {\n const address = bufferToHexaString(\n value.slice(Math.max(0, value.length - 20)),\n );\n\n const getChallengeResult = await this.api.sendCommand(\n new GetChallengeCommand(),\n );\n if (!isSuccessCommandResult(getChallengeResult)) {\n // TODO: we need to return an error here\n return {\n type: ClearSignContextType.ERROR,\n error: new Error(\"Failed to get challenge\"),\n };\n }\n\n const subcontext = await this.args.contextModule.getContext({\n type: reference.type,\n chainId: this.args.subset.chainId,\n address,\n challenge: getChallengeResult.data.challenge,\n types: reference.types,\n sources: reference.sources,\n });\n\n return subcontext;\n });\n }\n }\n\n return {\n subcontextCallbacks,\n };\n }\n }\n\n return {\n subcontextCallbacks: [],\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAIE,wBAAAA,MAIK,2BACP,OACE,sBAAAC,EAEA,0BAAAC,MACK,kCAEP,OAAS,uBAAAC,MAA2B,mDAe7B,MAAMC,CAAoB,CAC/B,YACmBC,EACAC,EACjB,CAFiB,SAAAD,EACA,UAAAC,CAChB,CAEH,KAAiC,CAC/B,MAAMC,EAAU,KAAK,KAAK,QAE1B,GACEA,EAAQ,OAASP,EAAqB,kBACtCO,EAAQ,OAASP,EAAqB,MACtCO,EAAQ,OAASP,EAAqB,YACtCO,EAAQ,OAASP,EAAqB,QACtCO,EAAQ,OAASP,EAAqB,gBAEtC,MAAO,CACL,oBAAqB,CAAC,CACxB,EAMF,GACEO,EAAQ,YAAc,QACtB,UAAWA,EAAQ,WACnBA,EAAQ,UAAU,QAAU,OAC5B,CACA,MAAMC,EAAmD,CACvD,KAAMD,EAAQ,UAAU,KACxB,QAAS,KAAK,KAAK,OAAO,QAC1B,QAASA,EAAQ,UAAU,KAC7B,EAEA,MAAO,CACL,oBAAqB,CACnB,IAAM,KAAK,KAAK,cAAc,WAAWC,CAAuB,CAClE,CACF,CACF,CAIA,GACED,EAAQ,YAAc,QACtBA,EAAQ,UAAU,YAAc,OAChC,CAEA,MAAME,EAAkB,KAAK,KAAK,kBAAkB,aAClD,KAAK,KAAK,OACVF,EAAQ,UAAU,SACpB,EAEA,GAAIE,EAAgB,QAAQ,EAAG,CAC7B,MAAMC,EAA2D,CAAC,EAElE,UAAWC,KAASF,EAAgB,QAAQ,EAAG,CAC7C,GAAIF,EAAQ,UAAU,OAASP,EAAqB,KAAM,CACxD,MAAMY,EACJL,EAAQ,UACJM,EAAYF,EAAMA,EAAM,OAAS,CAAC,EACxC,GAAI,CAACE,EAAW,SAMhB,MAAMC,EAJe,KAAK,KAAK,gBAAgB,OAC5C,GAAM,EAAE,OAASd,EAAqB,IACzC,EAEgC,KAC7Be,GACCA,EAAY,QAAUF,GACtBE,EAAY,KAAOH,EAAU,EACjC,EAEIE,GACFJ,EAAoB,KAAK,IAAM,QAAQ,QAAQI,CAAU,CAAC,CAE9D,CAEA,GACEP,EAAQ,UAAU,OAASP,EAAqB,OAChDO,EAAQ,UAAU,OAASP,EAAqB,IAChD,CACA,MAAMY,EAEFL,EAAQ,UACNS,EAAUf,EACdU,EAAM,MAAM,KAAK,IAAI,EAAGA,EAAM,OAAS,EAAE,CAAC,CAC5C,EAEAD,EAAoB,KAAK,IACvB,KAAK,KAAK,cAAc,WAAW,CACjC,KAAME,EAAU,KAChB,QAAS,KAAK,KAAK,OAAO,QAC1B,QAAAI,CACF,CAAC,CACH,CACF,CAEA,GAAIT,EAAQ,UAAU,OAASP,EAAqB,aAAc,CAChE,MAAMY,EACJL,EAAQ,UACVG,EAAoB,KAAK,SAAY,CACnC,MAAMM,EAAUf,EACdU,EAAM,MAAM,KAAK,IAAI,EAAGA,EAAM,OAAS,EAAE,CAAC,CAC5C,EAEMM,EAAqB,MAAM,KAAK,IAAI,YACxC,IAAId,CACN,EACA,OAAKD,EAAuBe,CAAkB,EAQ3B,MAAM,KAAK,KAAK,cAAc,WAAW,CAC1D,KAAML,EAAU,KAChB,QAAS,KAAK,KAAK,OAAO,QAC1B,QAAAI,EACA,UAAWC,EAAmB,KAAK,UACnC,MAAOL,EAAU,MACjB,QAASA,EAAU,OACrB,CAAC,EAbQ,CACL,KAAMZ,EAAqB,MAC3B,MAAO,IAAI,MAAM,yBAAyB,CAC5C,CAaJ,CAAC,CACH,CACF,CAEA,MAAO,CACL,oBAAAU,CACF,CACF,CACF,CAEA,MAAO,CACL,oBAAqB,CAAC,CACxB,CACF,CACF",
|
|
6
|
+
"names": ["ClearSignContextType", "bufferToHexaString", "isSuccessCommandResult", "GetChallengeCommand", "BuildSubContextTask", "api", "args", "context", "transactionFieldContext", "referenceValues", "subcontextCallbacks", "value", "reference", "enumValue", "subcontext", "enumContext", "address", "getChallengeResult"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ClearSignContextType as e}from"@ledgerhq/context-module";import{CommandResultFactory as b,UnknownDeviceExchangeError as g}from"@ledgerhq/device-management-kit";import{Left as E,Right as p}from"purify-ts";import{GetChallengeCommand as T}from"../../app-binder/command/GetChallengeCommand";import{makeDeviceActionInternalApiMock as f}from"../../app-binder/device-action/__test-utils__/makeInternalApi";import{BuildSubContextTask as u}from"./BuildSubContextTask";describe("BuildSubContextTask",()=>{const x={getContext:vi.fn()},d={extractValue:vi.fn()},s=f();let l;beforeEach(()=>{vi.resetAllMocks(),l={context:{type:e.TRANSACTION_INFO,payload:"test payload"},contextOptional:[],transactionParser:d,serializedTransaction:new Uint8Array([1,2,3]),contextModule:x,chainId:1}}),describe("when context type is a simple type",()=>{const n=[e.TRANSACTION_INFO,e.WEB3_CHECK,e.PLUGIN,e.EXTERNAL_PLUGIN,e.TRANSACTION_FIELD_DESCRIPTION];it.each(n)("should return context with empty subcontextCallbacks for %s",t=>{const c={...l,context:{type:t,payload:"test payload"}},o=new u(s,c).run();expect(o.subcontextCallbacks).toHaveLength(0)})}),describe("when context has a direct value reference",()=>{it("should create a callback to get context with the direct value",async()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.TOKEN,value:"0x1234567890123456789012345678901234567890"}},t={...l,context:n},a={type:e.TOKEN,chainId:1,address:"0x1234567890123456789012345678901234567890"},c=new u(s,t).run();expect(c.subcontextCallbacks).toHaveLength(1);const o=c.subcontextCallbacks[0];await o(),expect(x.getContext).toHaveBeenCalledWith(a)}),it("should handle undefined value in reference",()=>{const n={type:e.TOKEN,payload:"test payload",reference:void 0},t={...l,context:n},a=new u(s,t).run();expect(a.subcontextCallbacks).toHaveLength(0)})}),describe("when context has a valuePath reference",()=>{beforeEach(()=>{s.sendCommand.mockResolvedValue(b({data:{challenge:"test-challenge"}}))}),describe("when extractValue returns Left (error)",()=>{it("should return context with empty subcontextCallbacks",()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.TOKEN,valuePath:[{type:"SLICE",start:0,end:20}]}},t={...l,context:n};d.extractValue.mockReturnValue(E(new Error("Extraction failed")));const a=new u(s,t).run();expect(a.subcontextCallbacks).toHaveLength(0)})}),describe("when extractValue returns Right with values",()=>{describe("for ENUM type",()=>{it("should create callbacks for matching enum contexts",async()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.ENUM,id:1,valuePath:[{type:"TUPLE",offset:0}]}},t={type:e.ENUM,id:1,value:1,payload:"enum context 1"},a={type:e.ENUM,id:1,value:2,payload:"enum context 2"},c={type:e.ENUM,id:2,value:2,payload:"enum context 3"},o={...l,context:n,contextOptional:[t,a,c]},r=[new Uint8Array([1,2])];d.extractValue.mockReturnValue(p(r));const i=new u(s,o).run();expect(i.subcontextCallbacks).toHaveLength(1);const y=i.subcontextCallbacks[0],C=await y();expect(C).toEqual(a)}),it("should create callbacks for matching enum contexts with two values",async()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.ENUM,id:1,valuePath:[{type:"TUPLE",offset:0}]}},t={type:e.ENUM,id:1,value:1,payload:"enum context 1"},a={type:e.ENUM,id:1,value:2,payload:"enum context 2"},c={type:e.ENUM,id:2,value:2,payload:"enum context 3"},o={...l,context:n,contextOptional:[t,a,c]},r=[new Uint8Array([1,2]),new Uint8Array([3,2,1])];d.extractValue.mockReturnValue(p(r));const i=new u(s,o).run();expect(i.subcontextCallbacks).toHaveLength(2);const y=i.subcontextCallbacks[0],C=i.subcontextCallbacks[1],h=await y(),k=await C();expect(h).toEqual(a),expect(k).toEqual(t)}),it("should skip when enum value is undefined",()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.ENUM,id:1,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:n},a=[new Uint8Array([])];d.extractValue.mockReturnValue(p(a));const c=new u(s,t).run();expect(c.subcontextCallbacks).toHaveLength(0)}),it("should skip when no matching enum context found",()=>{const n={type:e.NFT,payload:"test payload",reference:{type:e.ENUM,id:1,valuePath:[{type:"TUPLE",offset:0}]}},t={type:e.ENUM,id:2,value:2,payload:"enum context"},a={...l,context:n,contextOptional:[t]},c=[new Uint8Array([1,2])];d.extractValue.mockReturnValue(p(c));const o=new u(s,a).run();expect(o.subcontextCallbacks).toHaveLength(0)})}),describe("for TOKEN type",()=>{it("should create callbacks to get token context",async()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.TOKEN,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:n},a=[new Uint8Array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22])];d.extractValue.mockReturnValue(p(a)),x.getContext.mockResolvedValue({type:e.TOKEN,payload:"token result"});const c=new u(s,t).run();expect(c.subcontextCallbacks).toHaveLength(1);const o=c.subcontextCallbacks[0],r=await o();expect(r).toEqual({type:e.TOKEN,payload:"token result"}),expect(x.getContext).toHaveBeenCalledWith({type:e.TOKEN,chainId:1,address:"0x030405060708090a0b0c0d0e0f10111213141516"})})}),describe("for NFT type",()=>{it("should create callbacks to get NFT context",async()=>{const n={type:e.NFT,payload:"test payload",reference:{type:e.NFT,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:n},a=[new Uint8Array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22])];d.extractValue.mockReturnValue(p(a)),x.getContext.mockResolvedValue({type:e.NFT,payload:"nft result"});const c=new u(s,t).run();expect(c.subcontextCallbacks).toHaveLength(1);const o=c.subcontextCallbacks[0],r=await o();expect(r).toEqual({type:e.NFT,payload:"nft result"}),expect(x.getContext).toHaveBeenCalledWith({type:e.NFT,chainId:1,address:"0x030405060708090a0b0c0d0e0f10111213141516"})})}),describe("for TRUSTED_NAME type",()=>{it("should create callbacks to get trusted name context with challenge",async()=>{const n={type:e.TRUSTED_NAME,payload:"test payload",reference:{type:e.TRUSTED_NAME,valuePath:[{type:"TUPLE",offset:0}],types:["type1","type2"],sources:["source1","source2"]}},t={...l,context:n},a=[new Uint8Array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22])];d.extractValue.mockReturnValue(p(a)),x.getContext.mockResolvedValue({type:e.TRUSTED_NAME,payload:"trusted name result"});const c=new u(s,t).run();expect(c.subcontextCallbacks).toHaveLength(1);const o=c.subcontextCallbacks[0],r=await o();expect(r).toEqual({type:e.TRUSTED_NAME,payload:"trusted name result"}),expect(s.sendCommand).toHaveBeenCalledWith(expect.any(T)),expect(x.getContext).toHaveBeenCalledWith({type:e.TRUSTED_NAME,chainId:1,address:"0x030405060708090a0b0c0d0e0f10111213141516",challenge:"test-challenge",types:["type1","type2"],sources:["source1","source2"]})}),it("should handle challenge command failure",async()=>{const n={type:e.TRUSTED_NAME,payload:"test payload",reference:{type:e.TRUSTED_NAME,valuePath:[{type:"TUPLE",offset:0}],types:["type1"],sources:["source1"]}},t={...l,context:n},a=[new Uint8Array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22])];d.extractValue.mockReturnValue(p(a));const c=new g("Failed");s.sendCommand.mockResolvedValueOnce(b({error:c}));const o=new u(s,t).run();expect(o.subcontextCallbacks).toHaveLength(1);const r=o.subcontextCallbacks[0],i=await r();expect(i).toEqual({error:new Error("Failed to get challenge"),type:e.ERROR})})}),describe("for multiple values",()=>{it("should create callbacks for each extracted value",async()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.TOKEN,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:n},a=[new Uint8Array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]),new Uint8Array([33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54])];d.extractValue.mockReturnValue(p(a)),x.getContext.mockResolvedValueOnce({type:e.TOKEN,payload:"token result 1"}),x.getContext.mockResolvedValueOnce({type:e.TOKEN,payload:"token result 2"});const c=new u(s,t).run();expect(c.subcontextCallbacks).toHaveLength(2);const o=c.subcontextCallbacks[0],r=c.subcontextCallbacks[1],i=await o(),y=await r();expect(i).toEqual({type:e.TOKEN,payload:"token result 1"}),expect(y).toEqual({type:e.TOKEN,payload:"token result 2"}),expect(x.getContext).toHaveBeenCalledTimes(2),expect(x.getContext).toHaveBeenNthCalledWith(1,{type:e.TOKEN,chainId:1,address:"0x030405060708090a0b0c0d0e0f10111213141516"}),expect(x.getContext).toHaveBeenNthCalledWith(2,{type:e.TOKEN,chainId:1,address:"0x232425262728292a2b2c2d2e2f30313233343536"})})})})}),describe("when context has no reference",()=>{it("should return context with empty subcontextCallbacks",()=>{const n={type:e.TOKEN,payload:"test payload"},t={...l,context:n},a=new u(s,t).run();expect(a.subcontextCallbacks).toHaveLength(0)})}),describe("when context has reference but no valuePath",()=>{it("should return context with empty subcontextCallbacks",()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.TOKEN}},t={...l,context:n},a=new u(s,t).run();expect(a.subcontextCallbacks).toHaveLength(0)})}),describe("edge cases",()=>{it("should handle value array shorter than 20 bytes for address extraction",async()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.TOKEN,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:n},a=[new Uint8Array([1,2,3])];d.extractValue.mockReturnValue(p(a)),x.getContext.mockResolvedValue({type:e.ERROR,message:"Invalid address"});const c=new u(s,t).run();expect(c.subcontextCallbacks).toHaveLength(1);const o=c.subcontextCallbacks[0],r=await o();expect(r).toEqual({type:e.ERROR,message:"Invalid address"}),expect(x.getContext).toHaveBeenCalledWith({type:e.TOKEN,chainId:1,address:"0x010203"})}),it("should handle empty value array",async()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.TOKEN,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:n},a=[new Uint8Array([])];d.extractValue.mockReturnValue(p(a)),x.getContext.mockResolvedValue({type:e.TOKEN,payload:"token result"});const c=new u(s,t).run();expect(c.subcontextCallbacks).toHaveLength(1);const o=c.subcontextCallbacks[0],r=await o();expect(r).toEqual({type:e.TOKEN,payload:"token result"}),expect(x.getContext).toHaveBeenCalledWith({type:e.TOKEN,chainId:1,address:"0x"})})})});
|
|
1
|
+
import{ClearSignContextType as e}from"@ledgerhq/context-module";import{CommandResultFactory as b,UnknownDeviceExchangeError as k}from"@ledgerhq/device-management-kit";import{Left as E,Right as p}from"purify-ts";import{GetChallengeCommand as T}from"../../app-binder/command/GetChallengeCommand";import{makeDeviceActionInternalApiMock as f}from"../../app-binder/device-action/__test-utils__/makeInternalApi";import{BuildSubContextTask as u}from"./BuildSubContextTask";describe("BuildSubContextTask",()=>{const x={getContext:vi.fn()},d={extractValue:vi.fn()},s=f();let l;beforeEach(()=>{vi.resetAllMocks(),l={context:{type:e.TRANSACTION_INFO,payload:"test payload"},contextOptional:[],transactionParser:d,subset:{chainId:1,data:"0x",selector:"0x",to:"0x",value:BigInt(0)},contextModule:x}}),describe("when context type is a simple type",()=>{const n=[e.TRANSACTION_INFO,e.WEB3_CHECK,e.PLUGIN,e.EXTERNAL_PLUGIN,e.TRANSACTION_FIELD_DESCRIPTION];it.each(n)("should return context with empty subcontextCallbacks for %s",t=>{const c={...l,context:{type:t,payload:"test payload"}},o=new u(s,c).run();expect(o.subcontextCallbacks).toHaveLength(0)})}),describe("when context has a direct value reference",()=>{it("should create a callback to get context with the direct value",async()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.TOKEN,value:"0x1234567890123456789012345678901234567890"}},t={...l,context:n},a={type:e.TOKEN,chainId:1,address:"0x1234567890123456789012345678901234567890"},c=new u(s,t).run();expect(c.subcontextCallbacks).toHaveLength(1);const o=c.subcontextCallbacks[0];await o(),expect(x.getContext).toHaveBeenCalledWith(a)}),it("should handle undefined value in reference",()=>{const n={type:e.TOKEN,payload:"test payload",reference:void 0},t={...l,context:n},a=new u(s,t).run();expect(a.subcontextCallbacks).toHaveLength(0)})}),describe("when context has a valuePath reference",()=>{beforeEach(()=>{s.sendCommand.mockResolvedValue(b({data:{challenge:"test-challenge"}}))}),describe("when extractValue returns Left (error)",()=>{it("should return context with empty subcontextCallbacks",()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.TOKEN,valuePath:[{type:"SLICE",start:0,end:20}]}},t={...l,context:n};d.extractValue.mockReturnValue(E(new Error("Extraction failed")));const a=new u(s,t).run();expect(a.subcontextCallbacks).toHaveLength(0)})}),describe("when extractValue returns Right with values",()=>{describe("for ENUM type",()=>{it("should create callbacks for matching enum contexts",async()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.ENUM,id:1,valuePath:[{type:"TUPLE",offset:0}]}},t={type:e.ENUM,id:1,value:1,payload:"enum context 1"},a={type:e.ENUM,id:1,value:2,payload:"enum context 2"},c={type:e.ENUM,id:2,value:2,payload:"enum context 3"},o={...l,context:n,contextOptional:[t,a,c]},r=[new Uint8Array([1,2])];d.extractValue.mockReturnValue(p(r));const i=new u(s,o).run();expect(i.subcontextCallbacks).toHaveLength(1);const y=i.subcontextCallbacks[0],C=await y();expect(C).toEqual(a)}),it("should create callbacks for matching enum contexts with two values",async()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.ENUM,id:1,valuePath:[{type:"TUPLE",offset:0}]}},t={type:e.ENUM,id:1,value:1,payload:"enum context 1"},a={type:e.ENUM,id:1,value:2,payload:"enum context 2"},c={type:e.ENUM,id:2,value:2,payload:"enum context 3"},o={...l,context:n,contextOptional:[t,a,c]},r=[new Uint8Array([1,2]),new Uint8Array([3,2,1])];d.extractValue.mockReturnValue(p(r));const i=new u(s,o).run();expect(i.subcontextCallbacks).toHaveLength(2);const y=i.subcontextCallbacks[0],C=i.subcontextCallbacks[1],h=await y(),g=await C();expect(h).toEqual(a),expect(g).toEqual(t)}),it("should skip when enum value is undefined",()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.ENUM,id:1,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:n},a=[new Uint8Array([])];d.extractValue.mockReturnValue(p(a));const c=new u(s,t).run();expect(c.subcontextCallbacks).toHaveLength(0)}),it("should skip when no matching enum context found",()=>{const n={type:e.NFT,payload:"test payload",reference:{type:e.ENUM,id:1,valuePath:[{type:"TUPLE",offset:0}]}},t={type:e.ENUM,id:2,value:2,payload:"enum context"},a={...l,context:n,contextOptional:[t]},c=[new Uint8Array([1,2])];d.extractValue.mockReturnValue(p(c));const o=new u(s,a).run();expect(o.subcontextCallbacks).toHaveLength(0)})}),describe("for TOKEN type",()=>{it("should create callbacks to get token context",async()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.TOKEN,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:n},a=[new Uint8Array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22])];d.extractValue.mockReturnValue(p(a)),x.getContext.mockResolvedValue({type:e.TOKEN,payload:"token result"});const c=new u(s,t).run();expect(c.subcontextCallbacks).toHaveLength(1);const o=c.subcontextCallbacks[0],r=await o();expect(r).toEqual({type:e.TOKEN,payload:"token result"}),expect(x.getContext).toHaveBeenCalledWith({type:e.TOKEN,chainId:1,address:"0x030405060708090a0b0c0d0e0f10111213141516"})})}),describe("for NFT type",()=>{it("should create callbacks to get NFT context",async()=>{const n={type:e.NFT,payload:"test payload",reference:{type:e.NFT,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:n},a=[new Uint8Array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22])];d.extractValue.mockReturnValue(p(a)),x.getContext.mockResolvedValue({type:e.NFT,payload:"nft result"});const c=new u(s,t).run();expect(c.subcontextCallbacks).toHaveLength(1);const o=c.subcontextCallbacks[0],r=await o();expect(r).toEqual({type:e.NFT,payload:"nft result"}),expect(x.getContext).toHaveBeenCalledWith({type:e.NFT,chainId:1,address:"0x030405060708090a0b0c0d0e0f10111213141516"})})}),describe("for TRUSTED_NAME type",()=>{it("should create callbacks to get trusted name context with challenge",async()=>{const n={type:e.TRUSTED_NAME,payload:"test payload",reference:{type:e.TRUSTED_NAME,valuePath:[{type:"TUPLE",offset:0}],types:["type1","type2"],sources:["source1","source2"]}},t={...l,context:n},a=[new Uint8Array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22])];d.extractValue.mockReturnValue(p(a)),x.getContext.mockResolvedValue({type:e.TRUSTED_NAME,payload:"trusted name result"});const c=new u(s,t).run();expect(c.subcontextCallbacks).toHaveLength(1);const o=c.subcontextCallbacks[0],r=await o();expect(r).toEqual({type:e.TRUSTED_NAME,payload:"trusted name result"}),expect(s.sendCommand).toHaveBeenCalledWith(expect.any(T)),expect(x.getContext).toHaveBeenCalledWith({type:e.TRUSTED_NAME,chainId:1,address:"0x030405060708090a0b0c0d0e0f10111213141516",challenge:"test-challenge",types:["type1","type2"],sources:["source1","source2"]})}),it("should handle challenge command failure",async()=>{const n={type:e.TRUSTED_NAME,payload:"test payload",reference:{type:e.TRUSTED_NAME,valuePath:[{type:"TUPLE",offset:0}],types:["type1"],sources:["source1"]}},t={...l,context:n},a=[new Uint8Array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22])];d.extractValue.mockReturnValue(p(a));const c=new k("Failed");s.sendCommand.mockResolvedValueOnce(b({error:c}));const o=new u(s,t).run();expect(o.subcontextCallbacks).toHaveLength(1);const r=o.subcontextCallbacks[0],i=await r();expect(i).toEqual({error:new Error("Failed to get challenge"),type:e.ERROR})})}),describe("for multiple values",()=>{it("should create callbacks for each extracted value",async()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.TOKEN,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:n},a=[new Uint8Array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]),new Uint8Array([33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54])];d.extractValue.mockReturnValue(p(a)),x.getContext.mockResolvedValueOnce({type:e.TOKEN,payload:"token result 1"}),x.getContext.mockResolvedValueOnce({type:e.TOKEN,payload:"token result 2"});const c=new u(s,t).run();expect(c.subcontextCallbacks).toHaveLength(2);const o=c.subcontextCallbacks[0],r=c.subcontextCallbacks[1],i=await o(),y=await r();expect(i).toEqual({type:e.TOKEN,payload:"token result 1"}),expect(y).toEqual({type:e.TOKEN,payload:"token result 2"}),expect(x.getContext).toHaveBeenCalledTimes(2),expect(x.getContext).toHaveBeenNthCalledWith(1,{type:e.TOKEN,chainId:1,address:"0x030405060708090a0b0c0d0e0f10111213141516"}),expect(x.getContext).toHaveBeenNthCalledWith(2,{type:e.TOKEN,chainId:1,address:"0x232425262728292a2b2c2d2e2f30313233343536"})})})})}),describe("when context has no reference",()=>{it("should return context with empty subcontextCallbacks",()=>{const n={type:e.TOKEN,payload:"test payload"},t={...l,context:n},a=new u(s,t).run();expect(a.subcontextCallbacks).toHaveLength(0)})}),describe("when context has reference but no valuePath",()=>{it("should return context with empty subcontextCallbacks",()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.TOKEN}},t={...l,context:n},a=new u(s,t).run();expect(a.subcontextCallbacks).toHaveLength(0)})}),describe("edge cases",()=>{it("should handle value array shorter than 20 bytes for address extraction",async()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.TOKEN,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:n},a=[new Uint8Array([1,2,3])];d.extractValue.mockReturnValue(p(a)),x.getContext.mockResolvedValue({type:e.ERROR,message:"Invalid address"});const c=new u(s,t).run();expect(c.subcontextCallbacks).toHaveLength(1);const o=c.subcontextCallbacks[0],r=await o();expect(r).toEqual({type:e.ERROR,message:"Invalid address"}),expect(x.getContext).toHaveBeenCalledWith({type:e.TOKEN,chainId:1,address:"0x010203"})}),it("should handle empty value array",async()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.TOKEN,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:n},a=[new Uint8Array([])];d.extractValue.mockReturnValue(p(a)),x.getContext.mockResolvedValue({type:e.TOKEN,payload:"token result"});const c=new u(s,t).run();expect(c.subcontextCallbacks).toHaveLength(1);const o=c.subcontextCallbacks[0],r=await o();expect(r).toEqual({type:e.TOKEN,payload:"token result"}),expect(x.getContext).toHaveBeenCalledWith({type:e.TOKEN,chainId:1,address:"0x"})})})});
|
|
2
2
|
//# sourceMappingURL=BuildSubContextTask.test.js.map
|