@ledgerhq/device-signer-kit-ethereum 0.0.0-multisig-20250910160951 → 0.0.0-no-issue-rn-ble-reconnection-20250916150911
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/api/index.js +1 -1
- package/lib/cjs/api/index.js.map +3 -3
- 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 +2 -2
- package/lib/cjs/internal/app-binder/task/ProvideContextsTask.js +1 -1
- package/lib/cjs/internal/app-binder/task/ProvideContextsTask.js.map +2 -2
- package/lib/cjs/internal/app-binder/task/ProvideContextsTask.test.js +1 -1
- package/lib/cjs/internal/app-binder/task/ProvideContextsTask.test.js.map +2 -2
- package/lib/cjs/internal/app-binder/task/ProvideEIP712ContextTask.js +1 -1
- package/lib/cjs/internal/app-binder/task/ProvideEIP712ContextTask.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/ProvideEIP712ContextTask.test.js +1 -1
- package/lib/cjs/internal/app-binder/task/ProvideEIP712ContextTask.test.js.map +2 -2
- package/lib/cjs/package.json +1 -1
- package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
- package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js.map +2 -2
- package/lib/esm/api/index.js +1 -1
- package/lib/esm/api/index.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 +2 -2
- package/lib/esm/internal/app-binder/task/ProvideContextsTask.js +1 -1
- package/lib/esm/internal/app-binder/task/ProvideContextsTask.js.map +2 -2
- package/lib/esm/internal/app-binder/task/ProvideContextsTask.test.js +1 -1
- package/lib/esm/internal/app-binder/task/ProvideContextsTask.test.js.map +2 -2
- package/lib/esm/internal/app-binder/task/ProvideEIP712ContextTask.js +1 -1
- package/lib/esm/internal/app-binder/task/ProvideEIP712ContextTask.js.map +3 -3
- package/lib/esm/internal/app-binder/task/ProvideEIP712ContextTask.test.js +1 -1
- package/lib/esm/internal/app-binder/task/ProvideEIP712ContextTask.test.js.map +2 -2
- package/lib/esm/package.json +1 -1
- package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts +2 -1
- package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts.map +1 -1
- package/lib/types/api/index.d.ts +5 -9
- package/lib/types/api/index.d.ts.map +1 -1
- package/lib/types/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.d.ts +1 -1
- package/lib/types/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.d.ts.map +1 -1
- package/lib/types/internal/app-binder/task/ProvideContextsTask.d.ts +3 -1
- package/lib/types/internal/app-binder/task/ProvideContextsTask.d.ts.map +1 -1
- package/lib/types/internal/app-binder/task/ProvideEIP712ContextTask.d.ts +1 -1
- package/lib/types/internal/app-binder/task/ProvideEIP712ContextTask.d.ts.map +1 -1
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +7 -7
package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type CommandResult,\n type DeviceActionStateMachine,\n DeviceModelId,\n type InternalApi,\n isSuccessCommandResult,\n OpenAppDeviceAction,\n type StateMachineTypes,\n UnknownDAError,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { and, assign, fromPromise, setup } from \"xstate\";\n\nimport { type GetConfigCommandResponse } from \"@api/app-binder/GetConfigCommandTypes\";\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAInternalState,\n type SignTransactionDAOutput,\n SignTransactionDAStep,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type ClearSigningType } from \"@api/model/ClearSigningType\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { type TransactionType } from \"@api/model/TransactionType\";\nimport { GetAppConfiguration } from \"@internal/app-binder/command/GetAppConfigurationCommand\";\nimport { type EthErrorCodes } from \"@internal/app-binder/command/utils/ethAppErrors\";\nimport {\n Web3CheckOptInCommand,\n type Web3CheckOptInCommandResponse,\n} from \"@internal/app-binder/command/Web3CheckOptInCommand\";\nimport {\n BuildFullContextsTask,\n type BuildFullContextsTaskArgs,\n type BuildFullContextsTaskResult,\n} from \"@internal/app-binder/task/BuildFullContextsTask\";\nimport {\n ParseTransactionTask,\n type ParseTransactionTaskArgs,\n type ParseTransactionTaskResult,\n} from \"@internal/app-binder/task/ParseTransactionTask\";\nimport {\n ProvideContextsTask,\n type ProvideContextsTaskArgs,\n type ProvideContextsTaskResult,\n} from \"@internal/app-binder/task/ProvideContextsTask\";\nimport { SendSignTransactionTask } from \"@internal/app-binder/task/SendSignTransactionTask\";\nimport { ApplicationChecker } from \"@internal/shared/utils/ApplicationChecker\";\n\nexport type MachineDependencies = {\n readonly getAppConfig: () => Promise<\n CommandResult<GetConfigCommandResponse, EthErrorCodes>\n >;\n readonly web3CheckOptIn: () => Promise<\n CommandResult<Web3CheckOptInCommandResponse, EthErrorCodes>\n >;\n readonly parseTransaction: (arg0: {\n input: ParseTransactionTaskArgs;\n }) => Promise<ParseTransactionTaskResult>;\n readonly buildContexts: (arg0: {\n input: BuildFullContextsTaskArgs;\n }) => Promise<BuildFullContextsTaskResult>;\n readonly provideContexts: (arg0: {\n input: ProvideContextsTaskArgs;\n }) => Promise<ProvideContextsTaskResult>;\n readonly signTransaction: (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n chainId: number;\n transactionType: TransactionType;\n clearSigningType: ClearSigningType;\n };\n }) => Promise<CommandResult<Signature, EthErrorCodes>>;\n};\n\nexport class SignTransactionDeviceAction extends XStateDeviceAction<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n > {\n type types = StateMachineTypes<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n >;\n\n const {\n getAppConfig,\n web3CheckOptIn,\n parseTransaction,\n buildContexts,\n signTransaction,\n provideContexts,\n } = this.extractDependencies(internalApi);\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n openAppStateMachine: new OpenAppDeviceAction({\n input: { appName: \"Ethereum\" },\n }).makeStateMachine(internalApi),\n getAppConfig: fromPromise(getAppConfig),\n web3CheckOptIn: fromPromise(web3CheckOptIn),\n parseTransaction: fromPromise(parseTransaction),\n buildContexts: fromPromise(buildContexts),\n provideContexts: fromPromise(provideContexts),\n signTransaction: fromPromise(signTransaction),\n },\n guards: {\n noInternalError: ({ context }) => context._internalState.error === null,\n isWeb3ChecksSupported: ({ context }) =>\n new ApplicationChecker(\n internalApi.getDeviceSessionState(),\n context._internalState.appConfig!,\n )\n .withMinVersionExclusive(\"1.15.0\")\n .excludeDeviceModel(DeviceModelId.NANO_S)\n .excludeDeviceModel(DeviceModelId.NANO_SP)\n .excludeDeviceModel(DeviceModelId.NANO_X)\n .check(),\n shouldOptIn: ({ context }) =>\n !context._internalState.appConfig!.web3ChecksEnabled &&\n !context._internalState.appConfig!.web3ChecksOptIn,\n skipOpenApp: ({ context }) => !!context.input.options.skipOpenApp,\n },\n actions: {\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: _.event[\"error\"], // NOTE: it should never happen, the error is not typed anymore here\n }),\n }),\n },\n }).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QGUCWUB2AVATgQw1jwGMAXVAewwBEwA3VYsAQTMowDoB5ABzA2Y8etBk1bkqAYghUwHVBjoUA1nIp8BQ5KTykwAWRIALBWADaABgC6iUDwqxUEjLZAAPRABYAzAHYOAJwAHACMAb4ArBYWAEw+FkHeADQgAJ6IwRYcAGwRQUG52TF5EcUAvmUpaJi4BERsVCKMLA2cAMJGYMTKvPyCwvTN4uwASnAArgA2pJKWNkgg9o7Orh4IAcEcpRYhvonZAd4byWmIITtZESEhBTHeEVH33hVV6Nj4hCTOTWKtHB1dHoafo-FrOMawKYzMwheZ2BxOdirDKbba7faHY4pdIIUIcG6+bwWbKeXwxIKeTzkl4garvOpfdig4ZUDgAcTApA6eEmk34MGksnkihUchgXKMPL5GBgc1cS0RVGRCBCngC2Q4aqCewCEWyQUyJxx5x2HBiByCsV8AQsaoinhpdNqn1azL+HIlUv5YEkYBwOAoOA4PEmugAZoGALYccXc3neuULBUrBZrVXqzXBHV6g2Wo1nDaasIWXxkwkxW0xXyOt7O+rfQa-Zzszlx6UwCFQgHdWbWeUIlOgNMBTxBDiJby3MkmiK+bFnCzeEL4mLm4m5aLeB2VWm1j71pmNsHsFue+MysCd6bd5SzWH95ZI1MF0fj7yTorT6Kz+cILfLhJEgiDZslVXwLACGsan3RlGiPFlOAAIXGVBJggNoqD0NwZhkDA5AUJRVA4AAjFC0IwjAsNIRN4UfJVnwQOJPCyIJyWLHYqV1bJf3OGJl3yYlfFA0dsiOZ4dydGDXXgv5kNQ9DMLAbDfX9QNg1DUgIxwaNSPkiiqJoxYByfIdECYli2JtDiYi439PGAjhvArVdrT4skDm3V5oIZaTRGPVk5PIxTsKvCVAV7OEjLolwGPJfJMwrUkjkiNUeIsK4OEJLdLWiUI9ig+kXQbPyEI4QKFMopTSFCm870i5MTPcMz8jHNVEsJcJ7QCX88pySJSlKPw7jCAq61gmgZObAAFAMGAgMB9KqwU8OFQi5B4WbUHmxbsMMhr6NMv9RzHFK8kiLdBu405cQSTV32Ym5slAw4YlGqTiqGP4ZooOaFuCmY-QDIMQ3DKNg027b-r24yDqao74tO7UIguu4rpxbJokCA0rmJCDjk83dvKKw8Sq+iGwA5PCcEYHacKFAjRXBn6top-g-RpqG+yTGGYsO7KTvtM7kfs1HfyszLfDCbIySpdzxK8wqDzg0npvJyn2eIWmVKB9TQe0pnfvV6nNc5+qeeVfnMsFpGUe8NGF3snI8liViQlEolIIkvcfI+psT0kn32GW-CRSIxwiaVjBoei5VmL2M1SSCB4KyTykIh6wtDgKcJJbyAIRq9iPxrdZsA+JqRAbUkHNLB8PFfG6PFV5uG47HOI9mThJ7Xs39fCpJ3tRe4JzTewPlc+0vvfLjAas6HtG8HFuuo4YldiXOJQgpdProCGzMvz-VOOYuPR+nkv-anyPZ-CmEzZjhj7LVFfQMJEIN5uHvrvyTxHPJEtgIKKUXIFQdwYAoPNeACwy6R3PrDfazc1gAFp7YIGQSvaIGDMEYNnKfGBk0Ty9E0AMFWjV4GxxiGLPUCc9SlGCKBSsuDi74NZDeQhIJmEzwmNMB8TdlT6n8HxEIeoP5kichQ66JoYgrzytjDBk5qyF3rr5CeJ4PRtm9DwxeaYbhjkHtla0dtRJzh3knfEs53wbHztaHwjDlF+1ZGoyU54OxcLCt0TRjU0zgW8IECCrF872Q2PaNKq4ci7yeuSPINxqSKLGnY-ySEyIVSoh42Gaw+JHHxIcaIGxOIlnzCqb8mV9QZK3McJOtjfYJLKkk2m193Hc3vodc0r47i7xssBEIS40o+EcouZGRQ3ZOSepUkmKjWTfV+rTVJCDEBLicpqAoeYUqLm6tdVyv9JHaiOPnUZ497GcEmSzI2HNKrYRmRbCCUjSzmjfsjCshw0pu3HK5aWfdbSeBGbE96YyDkcGgeNC5DE-DMRXl080fdKShDWTiCkAR8QHDCLsG05JyjfLHhNEhrIAWtHqcoIFh0qSmNyPkEcHc9Riz4o5UCDx3ZbiXBEPZmLxmcGQOMYgTBYCQNorwh+Ql4VUgSD4J6uRPAhEpRqWhYRjoXCCEy2BnAACiqkcAEpbvyzUKdhVPXtOK66oExwY3VEI1Ffhd4gLKEAA */\n id: \"SignTransactionDeviceAction\",\n initial: \"InitialState\",\n context: ({ input }) => {\n return {\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.OPEN_APP,\n },\n _internalState: {\n error: null,\n appConfig: null,\n subset: null,\n contexts: [],\n clearSigningType: null,\n transactionType: null,\n signature: null,\n },\n };\n },\n states: {\n InitialState: {\n always: [\n {\n target: \"GetAppConfig\",\n guard: \"skipOpenApp\",\n },\n \"OpenAppDeviceAction\",\n ],\n },\n OpenAppDeviceAction: {\n invoke: {\n id: \"openAppStateMachine\",\n input: {\n appName: \"Ethereum\",\n },\n src: \"openAppStateMachine\",\n onSnapshot: {\n actions: assign({\n intermediateValue: (_) => ({\n ..._.event.snapshot.context.intermediateValue,\n step: SignTransactionDAStep.OPEN_APP,\n }),\n }),\n },\n onDone: {\n actions: assign({\n _internalState: (_) => {\n return _.event.output.caseOf<SignTransactionDAInternalState>({\n Right: () => _.context._internalState,\n Left: (error) => ({\n ..._.context._internalState,\n error,\n }),\n });\n },\n }),\n target: \"CheckOpenAppDeviceActionResult\",\n },\n },\n },\n CheckOpenAppDeviceActionResult: {\n always: [\n {\n target: \"GetAppConfig\",\n guard: \"noInternalError\",\n },\n \"Error\",\n ],\n },\n GetAppConfig: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n }),\n invoke: {\n id: \"getAppConfig\",\n src: \"getAppConfig\",\n onDone: {\n target: \"GetAppConfigResultCheck\",\n actions: [\n assign({\n _internalState: ({ event, context }) => {\n if (isSuccessCommandResult(event.output)) {\n return {\n ...context._internalState,\n appConfig: event.output.data,\n };\n } else {\n return {\n ...context._internalState,\n error: event.output.error,\n };\n }\n },\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n GetAppConfigResultCheck: {\n always: [\n {\n target: \"Web3ChecksOptIn\",\n guard: and([\n \"noInternalError\",\n \"isWeb3ChecksSupported\",\n \"shouldOptIn\",\n ]),\n },\n {\n target: \"ParseTransaction\",\n guard: \"noInternalError\",\n },\n {\n target: \"Error\",\n },\n ],\n },\n Web3ChecksOptIn: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.Web3ChecksOptIn,\n step: SignTransactionDAStep.WEB3_CHECKS_OPT_IN,\n },\n }),\n invoke: {\n id: \"web3CheckOptIn\",\n src: \"web3CheckOptIn\",\n onDone: {\n target: \"Web3ChecksOptInResult\",\n actions: [\n assign({\n _internalState: ({ event, context }) => {\n if (isSuccessCommandResult(event.output)) {\n return {\n ...context._internalState,\n appConfig: {\n ...context._internalState.appConfig!,\n web3ChecksEnabled: event.output.data.enabled,\n },\n };\n } else {\n return context._internalState;\n }\n },\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n Web3ChecksOptInResult: {\n entry: assign(({ context }) => ({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.WEB3_CHECKS_OPT_IN_RESULT,\n result: context._internalState.appConfig!.web3ChecksEnabled,\n },\n })),\n // Using after transition to force a snapshot of the state after the entry action\n // This ensures the intermediateValue is captured before moving to ParseTransaction\n after: {\n 0: {\n target: \"ParseTransaction\",\n },\n },\n },\n ParseTransaction: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.PARSE_TRANSACTION,\n },\n }),\n invoke: {\n id: \"parseTransaction\",\n src: \"parseTransaction\",\n input: ({ context }) => ({\n mapper: context.input.mapper,\n transaction: context.input.transaction,\n }),\n onDone: {\n target: \"BuildContexts\",\n actions: assign({\n _internalState: ({ event, context }) => ({\n ...context._internalState,\n subset: event.output.subset,\n transactionType: event.output.type,\n }),\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n BuildContexts: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXTS,\n },\n }),\n invoke: {\n id: \"buildContexts\",\n src: \"buildContexts\",\n input: ({ context }) => ({\n contextModule: context.input.contextModule,\n mapper: context.input.mapper,\n parser: context.input.parser,\n options: context.input.options,\n appConfig: context._internalState.appConfig!,\n derivationPath: context.input.derivationPath,\n subset: context._internalState.subset!,\n transaction: context.input.transaction,\n deviceModelId: internalApi.getDeviceModel().id,\n }),\n onDone: {\n target: \"ProvideContexts\",\n actions: [\n assign({\n _internalState: ({ event, context }) => ({\n ...context._internalState,\n contexts: event.output.clearSignContexts,\n clearSigningType: event.output.clearSigningType,\n }),\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContexts: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.PROVIDE_CONTEXTS,\n },\n }),\n exit: assign({\n // remove the first context of the first transaction details as it has been consumed\n _internalState: ({ context }) => {\n return {\n ...context._internalState,\n contexts: context._internalState.contexts.slice(1),\n };\n },\n }),\n invoke: {\n id: \"provideContexts\",\n src: \"provideContexts\",\n input: ({ context }) => ({\n contexts: context._internalState.contexts,\n derivationPath: context.input.derivationPath,\n serializedTransaction: context.input.transaction,\n }),\n onDone: {\n target: \"SignTransaction\",\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n SignTransaction: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: SignTransactionDAStep.SIGN_TRANSACTION,\n },\n }),\n invoke: {\n id: \"signTransaction\",\n src: \"signTransaction\",\n input: ({ context }) => ({\n derivationPath: context.input.derivationPath,\n serializedTransaction: context.input.transaction,\n chainId: context._internalState.subset!.chainId,\n transactionType: context._internalState.transactionType!,\n clearSigningType: context._internalState.clearSigningType!,\n }),\n onDone: {\n target: \"SignTransactionResultCheck\",\n actions: [\n assign({\n _internalState: ({ event, context }) => {\n if (isSuccessCommandResult(event.output)) {\n return {\n ...context._internalState,\n signature: event.output.data,\n };\n }\n return {\n ...context._internalState,\n error: event.output.error,\n };\n },\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n SignTransactionResultCheck: {\n always: [\n { guard: \"noInternalError\", target: \"Success\" },\n { target: \"Error\" },\n ],\n },\n Success: {\n type: \"final\",\n },\n Error: {\n type: \"final\",\n },\n },\n output: ({ context }) =>\n context._internalState.signature\n ? Right(context._internalState.signature)\n : Left(\n context._internalState.error ||\n new UnknownDAError(\"No error in final state\"),\n ),\n });\n }\n\n extractDependencies(internalApi: InternalApi): MachineDependencies {\n const getAppConfig = async () =>\n internalApi.sendCommand(new GetAppConfiguration());\n const web3CheckOptIn = async () =>\n internalApi.sendCommand(new Web3CheckOptInCommand());\n const parseTransaction = async (arg0: {\n input: ParseTransactionTaskArgs;\n }) =>\n Promise.resolve(\n new ParseTransactionTask({\n mapper: arg0.input.mapper,\n transaction: arg0.input.transaction,\n }).run(),\n );\n const buildContexts = async (arg0: { input: BuildFullContextsTaskArgs }) =>\n new BuildFullContextsTask(internalApi, arg0.input).run();\n\n const provideContexts = async (arg0: {\n input: ProvideContextsTaskArgs;\n }) => {\n return new ProvideContextsTask(internalApi, arg0.input).run();\n };\n\n const signTransaction = async (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n chainId: number;\n transactionType: TransactionType;\n clearSigningType: ClearSigningType;\n };\n }) =>\n new SendSignTransactionTask(internalApi, {\n ...arg0.input,\n }).run();\n\n return {\n getAppConfig,\n web3CheckOptIn,\n parseTransaction,\n buildContexts,\n provideContexts,\n signTransaction,\n };\n }\n}\n"],
|
|
5
|
-
"mappings": "AAAA,OAGE,iBAAAA,EAEA,0BAAAC,EACA,uBAAAC,EAEA,kBAAAC,EACA,2BAAAC,EACA,sBAAAC,MACK,kCACP,OAAS,QAAAC,EAAM,SAAAC,MAAa,YAC5B,OAAS,OAAAC,EAAK,UAAAC,EAAQ,eAAAC,EAAa,SAAAC,MAAa,SAGhD,OAME,yBAAAC,MACK,
|
|
6
|
-
"names": ["DeviceModelId", "isSuccessCommandResult", "OpenAppDeviceAction", "UnknownDAError", "UserInteractionRequired", "XStateDeviceAction", "Left", "Right", "and", "assign", "fromPromise", "setup", "SignTransactionDAStep", "GetAppConfiguration", "Web3CheckOptInCommand", "BuildFullContextsTask", "ParseTransactionTask", "ProvideContextsTask", "SendSignTransactionTask", "ApplicationChecker", "SignTransactionDeviceAction", "internalApi", "getAppConfig", "web3CheckOptIn", "parseTransaction", "buildContexts", "signTransaction", "provideContexts", "context", "_", "input", "error", "event", "arg0"]
|
|
4
|
+
"sourcesContent": ["import {\n type CommandResult,\n type DeviceActionStateMachine,\n DeviceModelId,\n type InternalApi,\n isSuccessCommandResult,\n OpenAppDeviceAction,\n type StateMachineTypes,\n UnknownDAError,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { and, assign, fromPromise, setup } from \"xstate\";\n\nimport { type GetConfigCommandResponse } from \"@api/app-binder/GetConfigCommandTypes\";\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAInternalState,\n type SignTransactionDAOutput,\n SignTransactionDAStep,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { ClearSigningType } from \"@api/model/ClearSigningType\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { type TransactionType } from \"@api/model/TransactionType\";\nimport { GetAppConfiguration } from \"@internal/app-binder/command/GetAppConfigurationCommand\";\nimport { type EthErrorCodes } from \"@internal/app-binder/command/utils/ethAppErrors\";\nimport {\n Web3CheckOptInCommand,\n type Web3CheckOptInCommandResponse,\n} from \"@internal/app-binder/command/Web3CheckOptInCommand\";\nimport {\n BuildFullContextsTask,\n type BuildFullContextsTaskArgs,\n type BuildFullContextsTaskResult,\n} from \"@internal/app-binder/task/BuildFullContextsTask\";\nimport {\n ParseTransactionTask,\n type ParseTransactionTaskArgs,\n type ParseTransactionTaskResult,\n} from \"@internal/app-binder/task/ParseTransactionTask\";\nimport {\n ProvideContextsTask,\n type ProvideContextsTaskArgs,\n type ProvideContextsTaskResult,\n} from \"@internal/app-binder/task/ProvideContextsTask\";\nimport { SendSignTransactionTask } from \"@internal/app-binder/task/SendSignTransactionTask\";\nimport { ApplicationChecker } from \"@internal/shared/utils/ApplicationChecker\";\n\nexport type MachineDependencies = {\n readonly getAppConfig: () => Promise<\n CommandResult<GetConfigCommandResponse, EthErrorCodes>\n >;\n readonly web3CheckOptIn: () => Promise<\n CommandResult<Web3CheckOptInCommandResponse, EthErrorCodes>\n >;\n readonly parseTransaction: (arg0: {\n input: ParseTransactionTaskArgs;\n }) => Promise<ParseTransactionTaskResult>;\n readonly buildContexts: (arg0: {\n input: BuildFullContextsTaskArgs;\n }) => Promise<BuildFullContextsTaskResult>;\n readonly provideContexts: (arg0: {\n input: ProvideContextsTaskArgs;\n }) => Promise<ProvideContextsTaskResult>;\n readonly signTransaction: (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n chainId: number;\n transactionType: TransactionType;\n clearSigningType: ClearSigningType;\n };\n }) => Promise<CommandResult<Signature, EthErrorCodes>>;\n};\n\nexport class SignTransactionDeviceAction extends XStateDeviceAction<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n > {\n type types = StateMachineTypes<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n >;\n\n const {\n getAppConfig,\n web3CheckOptIn,\n parseTransaction,\n buildContexts,\n signTransaction,\n provideContexts,\n } = this.extractDependencies(internalApi);\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n openAppStateMachine: new OpenAppDeviceAction({\n input: { appName: \"Ethereum\" },\n }).makeStateMachine(internalApi),\n getAppConfig: fromPromise(getAppConfig),\n web3CheckOptIn: fromPromise(web3CheckOptIn),\n parseTransaction: fromPromise(parseTransaction),\n buildContexts: fromPromise(buildContexts),\n provideContexts: fromPromise(provideContexts),\n signTransaction: fromPromise(signTransaction),\n },\n guards: {\n noInternalError: ({ context }) => context._internalState.error === null,\n isWeb3ChecksSupported: ({ context }) =>\n new ApplicationChecker(\n internalApi.getDeviceSessionState(),\n context._internalState.appConfig!,\n )\n .withMinVersionExclusive(\"1.15.0\")\n .excludeDeviceModel(DeviceModelId.NANO_S)\n .excludeDeviceModel(DeviceModelId.NANO_SP)\n .excludeDeviceModel(DeviceModelId.NANO_X)\n .check(),\n shouldOptIn: ({ context }) =>\n !context._internalState.appConfig!.web3ChecksEnabled &&\n !context._internalState.appConfig!.web3ChecksOptIn,\n skipOpenApp: ({ context }) => !!context.input.options.skipOpenApp,\n },\n actions: {\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: _.event[\"error\"], // NOTE: it should never happen, the error is not typed anymore here\n }),\n }),\n },\n }).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QGUCWUB2AVATgQw1jwGMAXVAewwBEwA3VYsAQTMowDoBJDVcvADbJSeUmADEAbQAMAXUSgADhVh92CkAA9EARgDsAZg4AOACzGAnAFYDNgGxXpF6ToA0IAJ67TOgEwcDHTsLCz9pQN9bAF8o9zRMXAIiNipaBiZWcipuXn4hETEpHXkkEGVVLIwNbQR9IzNLG3tHZzdPXV87aQ5I5ztfSON+zpi49Gx8QhJKtMYWFM4AeUUwDGZFRVmMhfEIKjAOVAw6CgBrA4oVtY3hUTAAWRIACyOwGRKlFTUqasQ9RxMVjMdgcdj0xnBvncXlqkTsHAsQxcnVMvmM4TsoxA8QmSWm7C280qHAAwk8wMRTstVutNvQ5pl2AAlOAAVwEpCkcg05W+VVKNR0gW6IOsoWMfgMdlMdmhHRBHActisFnMMqCmNi2PGiSmC0JjOyZIpVKutINCxZsHZnMkxR5X0qv1qwsVwRVOglcJlcoQEo4ns9pmkQL00mCFgMWJxuuSM3p22JAHEwKRaSSqAAzdC7faHY5nA4wNMbDMYbNQd4OirqAW6CVWDhWPR2fR2Yy+Fu+UwGX1C4zGHoGcPSDuGCx6HTRnWTOMEhNE9gcFMlxRliviMA4HAUHAcRQCUSZ3cAWw4xfTWfQVdKvKdddqDabLbbY-6Pb7IQ4I+sPdR1n+KMtRjWd8VSBdDU4FdL3LdArRtY1KS5D4ykdWtQBqAYO2-MFwyBHRTEjNoYT8Lpv3CKwrG7Zt0VMPRpwSUD9QghZl1TGCK3gjlENOIoULvdCtEQLD-HDMMHAlQjAj7VEdADENg1MYNhQMUwGNxPV43SRdsmg0srygLjSB4qRfH4tCfgfEScPE-CpOIxBVO6HQiLbVUQR8dTYzAmgWOJAB1MAACMDB42BllIHhcwwA4jhOc4OAAd2C0LyUpCKeBvT4a0sjDhKGfxmxDXwMT0SIDF7dpYUono9B7YxbAI4xHGMLymK0hlWMCkKwoyjBN23Xd90PUhjxwM9kp6tLTUijAstQnL+TyhA0X6Z9itK8rKphUwgW-MrfFCXpKJcejgJnPFmO0yCOG61KTXCxRZqM8RNFgAoDjwTMxBwAAKaQAEpxBAy6OsTJc7t6p6eCM+aBNyoSEAqgjFVIz0LE6CxWz0PtOz0Dg9HBMquh8LowTa0H52u1iAAU8BwWAwG8nY9hi-N4oORR6cZ5nKjhiylsRgxwQsJtCOlIIdFHaQWz7AwJ2-FyCMGEMMbOsZGMp8DqeJOmGaZ9r2AGnc9wPI9T33bmDa1ubuVvAXnWFywxax0mpfRWWqpVUWSqUgYw2F5xWvOzXNKpzriQAIVZVABAgMsxE0UhYGi2KCwSoKY7jhOwCT2B+cW50e09RUSshJwQ0nGSdEbKx-1bUI7IsCmw+1iOl2j2P46oRPk+NoazdGi3M67nO84Lvki8CQd+hljsK+bByEDq7oKocbtI3BOurBbuc2-B7IaZ3BgIDAMe+9ZtOOf3Y-UFP8-87t7LJ4fcwyqbbGezq-orFlKqCLIs4XwVFgjSFOr-XePkLS61vvfHuuc+5bhNsNc240b4UBPmfeB48n4LRfstN+hVP7CxlMAv+MIBxyRlAVSck5xSQKuu3bIINW79UvuzQsHBVChz3rbcyhcHx1xKhwVEwwQgV0nFYGSv8EQDCFD4GuehVQ7xDhpXh0ClwsN4f3U2I0xpnm4WonyE97zLSEd0URAxxHOEkX2aQAxFRgLKqqVWDYGFgx0pwLRPkjImRMYJGoQJnBNiFIdCSIJwgySGE2SwZVwgr1DO48OB8vEXVYb46afFqz4MRkE7oVhQlYyBBE7augDC+DkgUiUZgqnlLqkk-eniOCRwEEcCA3iFgADFBACCCiQXi7C4qcKCq0jA7S0m8O6QIXp-T-EIxqNKFs35VQSlVDKQmpg5aohESqAcnQQT1NUbzZJTSWltI6ZUKZMykJIIHno4eozxk8J8lcvplI5mCwWeYRsEkWzNXbJ2YwfY-D42kKieJHY2zNgab5HWHdHkXPYK8-pGSTTIWyaYxGk5IjPmsHXfQeEoT-1UqLfowpKIdlWUBDWRjGEpOaQiiZLyelvNOKipCdp+E5JqNiowzY8U+FskSkiw5TAmGlCEQioR-j6BiFqDAFBT7wFKIixpkEMUBMQAAWnIdqxsIQQiE3BGClx0QjmGzVaxHgahBC3DEBq+ZiBUQyXCE2YWSjJxgOFtC81NsNHZGpNcOkcKEbw0+Y5OuJg1ZDCUSqQFuNgHfmDN2AOYCnBTl9aw-1nAeKBvNH5ZkbIOQOvDQgA1AQxy2BbKdWwuNmwmDqo4cwjRykwuzWxVc650AludDXMBPRmoGAlP8cwTg5aRs6GGGu+g0RgJUTS45lrkzsX0rBQyRbjLTR7VZex-g0QuU6HXIdE5Sm1GDKLHQSsgkShDMLNtBbsiQ2mo9Wa27lrANdWYP2-QPKdikf-ORAQpZKLBUKds96Q2cCfQ9PqRk31Cxlvjaw7YKIQk9iRYB-hKUFJogU4BEGmGcD1jzC1gsw2Ox7EYYWql5aqS6MUuWdgjAhjrpQ7GSiCP0s7tnbByd4M1GDK6hwlEpRbyBcS-0-LURlTqiEMwnGmlHwwXfLBGBe7KufpigTVFGzlKVJ6cMX65YQnkljaVUo-DdgUzdVVZGHaCNHP4Fy2KP32OCDJBx1gzCIkIuiexzdM3qIfak55loN08X44gX+nYAzlOA-oKio4ZKExMFLFUQJ4mnWs6xM5YzbPIspJFhAXR0QBkOkKLGdUOybIA4YAIwDDCehVCCfDgWoHBYZecplXSWUovC1u+2AjlpgiYyIicl6St4SXvI7oX7RzWCDFhbLxJkCsmIEwWAGm8Fab+LYIwLk66tnCEOsFyXdPyKGO7QIGaF2kfbQAUUGjgIrhgbABl-EdiqtFfT-HxgOd0TsQMdjlVEIAA */\n id: \"SignTransactionDeviceAction\",\n initial: \"InitialState\",\n context: ({ input }) => {\n return {\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.OPEN_APP,\n },\n _internalState: {\n error: null,\n appConfig: null,\n subset: null,\n contexts: [],\n clearSigningType: null,\n transactionType: null,\n signature: null,\n },\n };\n },\n states: {\n InitialState: {\n always: [\n {\n target: \"GetAppConfig\",\n guard: \"skipOpenApp\",\n },\n \"OpenAppDeviceAction\",\n ],\n },\n OpenAppDeviceAction: {\n invoke: {\n id: \"openAppStateMachine\",\n input: {\n appName: \"Ethereum\",\n },\n src: \"openAppStateMachine\",\n onSnapshot: {\n actions: assign({\n intermediateValue: (_) => ({\n ..._.event.snapshot.context.intermediateValue,\n step: SignTransactionDAStep.OPEN_APP,\n }),\n }),\n },\n onDone: {\n actions: assign({\n _internalState: (_) => {\n return _.event.output.caseOf<SignTransactionDAInternalState>({\n Right: () => _.context._internalState,\n Left: (error) => ({\n ..._.context._internalState,\n error,\n }),\n });\n },\n }),\n target: \"CheckOpenAppDeviceActionResult\",\n },\n },\n },\n CheckOpenAppDeviceActionResult: {\n always: [\n {\n target: \"GetAppConfig\",\n guard: \"noInternalError\",\n },\n \"Error\",\n ],\n },\n GetAppConfig: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.GET_APP_CONFIG,\n },\n }),\n invoke: {\n id: \"getAppConfig\",\n src: \"getAppConfig\",\n onDone: {\n target: \"GetAppConfigResultCheck\",\n actions: [\n assign({\n _internalState: ({ event, context }) => {\n if (isSuccessCommandResult(event.output)) {\n return {\n ...context._internalState,\n appConfig: event.output.data,\n };\n } else {\n return {\n ...context._internalState,\n error: event.output.error,\n };\n }\n },\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n GetAppConfigResultCheck: {\n always: [\n {\n target: \"Web3ChecksOptIn\",\n guard: and([\n \"noInternalError\",\n \"isWeb3ChecksSupported\",\n \"shouldOptIn\",\n ]),\n },\n {\n target: \"ParseTransaction\",\n guard: \"noInternalError\",\n },\n {\n target: \"Error\",\n },\n ],\n },\n Web3ChecksOptIn: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.Web3ChecksOptIn,\n step: SignTransactionDAStep.WEB3_CHECKS_OPT_IN,\n },\n }),\n invoke: {\n id: \"web3CheckOptIn\",\n src: \"web3CheckOptIn\",\n onDone: {\n target: \"Web3ChecksOptInResult\",\n actions: [\n assign({\n _internalState: ({ event, context }) => {\n if (isSuccessCommandResult(event.output)) {\n return {\n ...context._internalState,\n appConfig: {\n ...context._internalState.appConfig!,\n web3ChecksEnabled: event.output.data.enabled,\n },\n };\n } else {\n return context._internalState;\n }\n },\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n Web3ChecksOptInResult: {\n entry: assign(({ context }) => ({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.WEB3_CHECKS_OPT_IN_RESULT,\n result: context._internalState.appConfig!.web3ChecksEnabled,\n },\n })),\n // Using after transition to force a snapshot of the state after the entry action\n // This ensures the intermediateValue is captured before moving to ParseTransaction\n after: {\n 0: {\n target: \"ParseTransaction\",\n },\n },\n },\n ParseTransaction: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.PARSE_TRANSACTION,\n },\n }),\n invoke: {\n id: \"parseTransaction\",\n src: \"parseTransaction\",\n input: ({ context }) => ({\n mapper: context.input.mapper,\n transaction: context.input.transaction,\n }),\n onDone: {\n target: \"BuildContexts\",\n actions: assign({\n _internalState: ({ event, context }) => ({\n ...context._internalState,\n subset: event.output.subset,\n transactionType: event.output.type,\n }),\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n BuildContexts: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BUILD_CONTEXTS,\n },\n }),\n invoke: {\n id: \"buildContexts\",\n src: \"buildContexts\",\n input: ({ context }) => ({\n contextModule: context.input.contextModule,\n mapper: context.input.mapper,\n parser: context.input.parser,\n options: context.input.options,\n appConfig: context._internalState.appConfig!,\n derivationPath: context.input.derivationPath,\n subset: context._internalState.subset!,\n transaction: context.input.transaction,\n deviceModelId: internalApi.getDeviceModel().id,\n }),\n onDone: {\n target: \"ProvideContexts\",\n actions: [\n assign({\n _internalState: ({ event, context }) => ({\n ...context._internalState,\n contexts: event.output.clearSignContexts,\n clearSigningType: event.output.clearSigningType,\n }),\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContexts: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.PROVIDE_CONTEXTS,\n },\n }),\n exit: assign({\n // remove the first context of the first transaction details as it has been consumed\n _internalState: ({ context }) => {\n return {\n ...context._internalState,\n contexts: context._internalState.contexts.slice(1),\n };\n },\n }),\n invoke: {\n id: \"provideContexts\",\n src: \"provideContexts\",\n input: ({ context }) => ({\n contexts: context._internalState.contexts,\n derivationPath: context.input.derivationPath,\n serializedTransaction: context.input.transaction,\n }),\n onDone: {\n target: \"SignTransaction\",\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n SignTransaction: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: SignTransactionDAStep.SIGN_TRANSACTION,\n },\n }),\n invoke: {\n id: \"signTransaction\",\n src: \"signTransaction\",\n input: ({ context }) => ({\n derivationPath: context.input.derivationPath,\n serializedTransaction: context.input.transaction,\n chainId: context._internalState.subset!.chainId,\n transactionType: context._internalState.transactionType!,\n clearSigningType: context._internalState.clearSigningType!,\n }),\n onDone: {\n target: \"SignTransactionResultCheck\",\n actions: [\n assign({\n _internalState: ({ event, context }) => {\n if (isSuccessCommandResult(event.output)) {\n return {\n ...context._internalState,\n signature: event.output.data,\n };\n }\n return {\n ...context._internalState,\n error: event.output.error,\n };\n },\n }),\n ],\n },\n onError: {\n target: \"SignTransactionResultCheck\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n SignTransactionResultCheck: {\n always: [\n { guard: \"noInternalError\", target: \"Success\" },\n { target: \"BlindSignTransactionFallback\" },\n ],\n },\n BlindSignTransactionFallback: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTransactionDAStep.BLIND_SIGN_TRANSACTION_FALLBACK,\n },\n }),\n invoke: {\n id: \"blindSignTransactionFallback\",\n src: \"signTransaction\",\n input: ({ context }) => ({\n derivationPath: context.input.derivationPath,\n serializedTransaction: context.input.transaction,\n chainId: context._internalState.subset!.chainId,\n transactionType: context._internalState.transactionType!,\n clearSigningType: ClearSigningType.BASIC,\n }),\n onDone: {\n target: \"BlindSignTransactionFallbackResultCheck\",\n actions: [\n assign({\n _internalState: ({ event, context }) => {\n if (isSuccessCommandResult(event.output)) {\n return {\n ...context._internalState,\n signature: event.output.data,\n };\n }\n return {\n ...context._internalState,\n error: event.output.error,\n };\n },\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n BlindSignTransactionFallbackResultCheck: {\n always: [\n { guard: \"noInternalError\", target: \"Success\" },\n { target: \"Error\" },\n ],\n },\n Success: {\n type: \"final\",\n },\n Error: {\n type: \"final\",\n },\n },\n output: ({ context }) =>\n context._internalState.signature\n ? Right(context._internalState.signature)\n : Left(\n context._internalState.error ||\n new UnknownDAError(\"No error in final state\"),\n ),\n });\n }\n\n extractDependencies(internalApi: InternalApi): MachineDependencies {\n const getAppConfig = async () =>\n internalApi.sendCommand(new GetAppConfiguration());\n const web3CheckOptIn = async () =>\n internalApi.sendCommand(new Web3CheckOptInCommand());\n const parseTransaction = async (arg0: {\n input: ParseTransactionTaskArgs;\n }) =>\n Promise.resolve(\n new ParseTransactionTask({\n mapper: arg0.input.mapper,\n transaction: arg0.input.transaction,\n }).run(),\n );\n const buildContexts = async (arg0: { input: BuildFullContextsTaskArgs }) =>\n new BuildFullContextsTask(internalApi, arg0.input).run();\n\n const provideContexts = async (arg0: {\n input: ProvideContextsTaskArgs;\n }) => {\n return new ProvideContextsTask(internalApi, arg0.input).run();\n };\n\n const signTransaction = async (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n chainId: number;\n transactionType: TransactionType;\n clearSigningType: ClearSigningType;\n };\n }) =>\n new SendSignTransactionTask(internalApi, {\n ...arg0.input,\n }).run();\n\n return {\n getAppConfig,\n web3CheckOptIn,\n parseTransaction,\n buildContexts,\n provideContexts,\n signTransaction,\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["DeviceModelId", "isSuccessCommandResult", "OpenAppDeviceAction", "UnknownDAError", "UserInteractionRequired", "XStateDeviceAction", "Left", "Right", "and", "assign", "fromPromise", "setup", "SignTransactionDAStep", "ClearSigningType", "GetAppConfiguration", "Web3CheckOptInCommand", "BuildFullContextsTask", "ParseTransactionTask", "ProvideContextsTask", "SendSignTransactionTask", "ApplicationChecker", "SignTransactionDeviceAction", "internalApi", "getAppConfig", "web3CheckOptIn", "parseTransaction", "buildContexts", "signTransaction", "provideContexts", "context", "_", "input", "error", "event", "arg0"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ClearSignContextType as D}from"@ledgerhq/context-module";import{CommandResultFactory as S,DeviceActionStatus as x,DeviceModelId as M,DeviceSessionStateType as P,DeviceStatus as B,hexaStringToBuffer as _,InvalidStatusWordError as A,UserInteractionRequired as N}from"@ledgerhq/device-management-kit";import{Transaction as H}from"ethers";import{Just as V}from"purify-ts";import{lastValueFrom as k}from"rxjs";import{SignTransactionDAStep as b}from"../../../../api/app-binder/SignTransactionDeviceActionTypes";import{ClearSigningType as T}from"../../../../api/model/ClearSigningType";import{TransactionType as w}from"../../../../api/model/TransactionType";import{makeDeviceActionInternalApiMock as q}from"../../../app-binder/device-action/__test-utils__/makeInternalApi";import{setupOpenAppDAMock as f}from"../../../app-binder/device-action/__test-utils__/setupOpenAppDAMock";import{executeUntilStep as p}from"../../../app-binder/device-action/__test-utils__/testDeviceActionUntilStep";import{SignTransactionDeviceAction as v}from"./SignTransactionDeviceAction";vi.mock("@ledgerhq/device-management-kit",async a=>({...await a(),OpenAppDeviceAction:vi.fn(()=>({makeStateMachine:vi.fn()}))}));describe("SignTransactionDeviceAction",()=>{let a;const o={getFieldContext:vi.fn(),getContexts:vi.fn(),getTypedDataFilters:vi.fn(),getWeb3Checks:vi.fn(),getSolanaContext:vi.fn()},i={mapTransactionToSubset:vi.fn()},c={extractValue:vi.fn()},E=vi.fn(),C=vi.fn(),m=vi.fn(),g=vi.fn(),y=vi.fn(),h=vi.fn();function l(){return{getAppConfig:E,web3CheckOptIn:C,parseTransaction:m,buildContexts:g,provideContexts:y,signTransaction:h}}const r=q(),s={domain:"domain-name.eth"},n=_(H.from({chainId:1n,nonce:0,data:"0x"}).unsignedSerialized),O={chainId:1,data:"0x",selector:"0x",to:"0x",value:0n};function I(e,t,R){return{blindSigningEnabled:!1,web3ChecksEnabled:t,web3ChecksOptIn:R,version:e}}function d(e,t,R){r.getDeviceSessionState.mockReturnValueOnce({sessionStateType:P.ReadyWithoutSecureChannel,deviceStatus:B.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:e},deviceModelId:M.FLEX,isSecureConnectionAllowed:!1}),r.getDeviceModel.mockReturnValueOnce({id:M.FLEX}),E.mockResolvedValue(S({data:I(e,t,R)}))}const u=(e,t)=>{if(e[t]?.status!==x.Pending)throw new Error(`Step ${t} is not pending: ${JSON.stringify(e[t])}`);return e[t]};describe("Happy path",()=>{describe("should sign a transaction",()=>{const e=[{context:{type:D.TRANSACTION_INFO,payload:"payload-1"},subcontextCallbacks:[]},{context:{type:D.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-2"},subcontextCallbacks:[]}];beforeEach(()=>{vi.resetAllMocks(),f(),d("1.15.0",!1,!1),m.mockResolvedValueOnce({subset:O,type:w.EIP1559}),g.mockResolvedValueOnce({clearSignContexts:e,clearSigningType:T.EIP7730}),y.mockResolvedValueOnce(V(void 0)),h.mockResolvedValueOnce(S({data:{v:28,r:"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788",s:"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513"}}));const t=new v({input:{derivationPath:"44'/60'/0'/0/0",transaction:n,options:s,contextModule:o,mapper:i,parser:c}});vi.spyOn(t,"extractDependencies").mockReturnValue(l()),a=t._execute(r).observable}),it("should open the app",async()=>{const{steps:t}=await p(0,a);expect(u(t,0).intermediateValue.step).toBe(b.OPEN_APP)}),it("should confirm open app",async()=>{const{steps:t}=await p(1,a);expect(u(t,1).intermediateValue.requiredUserInteraction).toBe(N.ConfirmOpenApp)}),it("should get app config",async()=>{const{steps:t}=await p(2,a);expect(u(t,2).intermediateValue.step).toBe(b.GET_APP_CONFIG)}),it("should prebuild context",async()=>{const{steps:t}=await p(3,a);expect(u(t,3).intermediateValue.step).toBe(b.PARSE_TRANSACTION),expect(m).toHaveBeenCalledTimes(1),expect(m).toHaveBeenNthCalledWith(1,expect.objectContaining({input:{mapper:i,transaction:n}}))}),it("should build context",async()=>{const{steps:t}=await p(4,a);expect(u(t,4).intermediateValue.step).toBe(b.BUILD_CONTEXTS),expect(g).toHaveBeenCalledTimes(1),expect(g).toHaveBeenNthCalledWith(1,expect.objectContaining({input:{contextModule:o,parser:c,mapper:i,options:s,subset:O,transaction:n,appConfig:I("1.15.0",!1,!1),derivationPath:"44'/60'/0'/0/0",deviceModelId:M.FLEX}}))}),it("should provide context",async()=>{const{steps:t}=await p(5,a);expect(u(t,5).intermediateValue.step).toBe(b.PROVIDE_CONTEXTS),expect(y).toHaveBeenCalledTimes(1),expect(y).toHaveBeenNthCalledWith(1,expect.objectContaining({input:{contexts:e,serializedTransaction:n,derivationPath:"44'/60'/0'/0/0"}}))}),it("should sign transaction",async()=>{const{steps:t}=await p(6,a);expect(u(t,6).intermediateValue.step).toBe(b.SIGN_TRANSACTION),expect(h).toHaveBeenCalledTimes(1),expect(h).toHaveBeenNthCalledWith(1,expect.objectContaining({input:{derivationPath:"44'/60'/0'/0/0",serializedTransaction:n,chainId:1,transactionType:w.EIP1559,clearSigningType:T.EIP7730}}))}),it("should return the signature",async()=>{const t=await k(a);expect(t).toEqual({status:x.Completed,output:{v:28,r:"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788",s:"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513"}})})}),describe("should skip open app",()=>{beforeEach(()=>{vi.resetAllMocks(),f(),d("1.15.0",!1,!1);const e=new v({input:{derivationPath:"44'/60'/0'/0/0",transaction:n,options:{...s,skipOpenApp:!0},contextModule:o,mapper:i,parser:c}});m.mockResolvedValueOnce({subset:O,type:w.EIP1559}),g.mockResolvedValueOnce({clearSignContexts:[],clearSignContextsOptional:[],clearSigningType:T.BASIC}),y.mockResolvedValueOnce(V(void 0)),h.mockResolvedValueOnce(S({data:{v:28,r:"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788",s:"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513"}})),vi.spyOn(e,"extractDependencies").mockReturnValue(l()),a=e._execute(r).observable}),it("should skip open app and get app config directly",async()=>{const{steps:e}=await p(0,a);expect(u(e,0).intermediateValue.step).toBe(b.GET_APP_CONFIG)})}),describe("should opt in to web3 checks",()=>{beforeEach(()=>{vi.resetAllMocks(),f(),d("1.16.0",!1,!1);const e=new v({input:{derivationPath:"44'/60'/0'/0/0",transaction:n,options:s,contextModule:o,mapper:i,parser:c}});vi.spyOn(e,"extractDependencies").mockReturnValue(l()),C.mockResolvedValueOnce(S({data:{enabled:!0}})),a=e._execute(r).observable}),it("should opt in to web3 checks if app config is supported and not already enabled",async()=>{const{steps:e}=await p(4,a);expect(u(e,3).intermediateValue.step).toBe(b.WEB3_CHECKS_OPT_IN),expect(C).toHaveBeenCalledTimes(1),expect(u(e,4).intermediateValue.step).toBe(b.WEB3_CHECKS_OPT_IN_RESULT),expect(u(e,4).intermediateValue.result).toBe(!0)})}),describe("should not opt in to web3 checks",()=>{beforeEach(()=>{vi.resetAllMocks(),f();const e=new v({input:{derivationPath:"44'/60'/0'/0/0",transaction:n,options:s,contextModule:o,mapper:i,parser:c}});vi.spyOn(e,"extractDependencies").mockReturnValue(l()),a=e._execute(r).observable}),it("should not opt in to web3 checks if app config is not supported",async()=>{d("1.15.0",!1,!1),await p(3,a),expect(C).not.toHaveBeenCalled()}),it("should not opt in to web3 checks if already enabled",async()=>{d("1.16.0",!0,!1),await p(3,a),expect(C).not.toHaveBeenCalled()}),it("should not opt in to web3 checks if already opted out",async()=>{d("1.16.0",!1,!0),await p(3,a),expect(C).not.toHaveBeenCalled()})})}),describe("Error cases",()=>{beforeEach(()=>{vi.resetAllMocks()}),it("should return an error if the open app throw an error",async()=>{f(new Error("Open app failed")),d("1.15.0",!1,!1);const e=new v({input:{derivationPath:"44'/60'/0'/0/0",transaction:n,options:s,contextModule:o,mapper:i,parser:c}});vi.spyOn(e,"extractDependencies").mockReturnValue(l()),a=e._execute(r).observable;const t=await k(a);expect(t).toEqual({status:x.Error,error:new Error("Open app failed")})}),it("should return an error if the get app config return an error",async()=>{f(),E.mockResolvedValueOnce(S({error:new A("Get app config failed")}));const e=new v({input:{derivationPath:"44'/60'/0'/0/0",transaction:n,options:s,contextModule:o,mapper:i,parser:c}});vi.spyOn(e,"extractDependencies").mockReturnValue(l()),a=e._execute(r).observable;const t=await k(a);expect(t).toEqual({status:x.Error,error:new A("Get app config failed")})}),it("should return an error if the get app config throw an error",async()=>{f(),E.mockRejectedValueOnce(new Error("Get app config failed"));const e=new v({input:{derivationPath:"44'/60'/0'/0/0",transaction:n,options:s,contextModule:o,mapper:i,parser:c}});vi.spyOn(e,"extractDependencies").mockReturnValue(l()),a=e._execute(r).observable;const t=await k(a);expect(t).toEqual({status:x.Error,error:new Error("Get app config failed")})}),it("should ignore the web3checks result if the command fails",async()=>{f(),d("1.16.0",!1,!1);const e=new v({input:{derivationPath:"44'/60'/0'/0/0",transaction:n,options:s,contextModule:o,mapper:i,parser:c}});vi.spyOn(e,"extractDependencies").mockReturnValue(l()),C.mockResolvedValueOnce(S({error:new A("web3 check opt in failed")})),m.mockResolvedValueOnce({subset:O,type:w.EIP1559}),g.mockResolvedValueOnce({clearSignContexts:[],clearSignContextsOptional:[],clearSigningType:T.BASIC}),h.mockResolvedValueOnce(S({data:{v:28,r:"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788",s:"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513"}})),a=e._execute(r).observable;const t=await k(a);expect(t).toEqual({status:x.Completed,output:{v:28,r:"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788",s:"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513"}})}),it("should return an error if the parse transaction throw an error",async()=>{f(),d("1.15.0",!1,!1);const e=new v({input:{derivationPath:"44'/60'/0'/0/0",transaction:n,options:s,contextModule:o,mapper:i,parser:c}});vi.spyOn(e,"extractDependencies").mockReturnValue(l()),m.mockRejectedValueOnce(new Error("Parse transaction failed")),a=e._execute(r).observable;const t=await k(a);expect(t).toEqual({status:x.Error,error:new Error("Parse transaction failed")})}),it("should blind sign if the build contexts fails",async()=>{}),it("should blind sign if the provide contexts fails",async()=>{}),it("should return an error if the sign transaction fails",async()=>{f(),d("1.15.0",!1,!1);const e=new v({input:{derivationPath:"44'/60'/0'/0/0",transaction:n,options:s,contextModule:o,mapper:i,parser:c}});vi.spyOn(e,"extractDependencies").mockReturnValue(l()),m.mockResolvedValueOnce({subset:O,type:w.EIP1559}),g.mockResolvedValueOnce({clearSignContexts:[],clearSignContextsOptional:[],clearSigningType:T.BASIC}),y.mockResolvedValueOnce(V(void 0)),h.mockRejectedValueOnce(new Error("Sign transaction failed")),a=e._execute(r).observable;const t=await k(a);expect(t).toEqual({status:x.Error,error:new Error("Sign transaction failed")})}),it("should return an error if the sign transaction return an error",async()=>{f(),d("1.15.0",!1,!1);const e=new v({input:{derivationPath:"44'/60'/0'/0/0",transaction:n,options:s,contextModule:o,mapper:i,parser:c}});vi.spyOn(e,"extractDependencies").mockReturnValue(l()),m.mockResolvedValueOnce({subset:O,type:w.EIP1559}),g.mockResolvedValueOnce({clearSignContexts:[],clearSignContextsOptional:[],clearSigningType:T.BASIC}),y.mockResolvedValueOnce(V(void 0)),h.mockResolvedValueOnce(S({error:new A("Sign transaction failed")})),a=e._execute(r).observable;const t=await k(a);expect(t).toEqual({status:x.Error,error:new A("Sign transaction failed")})})})});
|
|
1
|
+
import{ClearSignContextType as M}from"@ledgerhq/context-module";import{CommandResultFactory as u,DeviceActionStatus as g,DeviceModelId as I,DeviceSessionStateType as D,DeviceStatus as B,hexaStringToBuffer as _,InvalidStatusWordError as w,UserInteractionRequired as N}from"@ledgerhq/device-management-kit";import{Transaction as H}from"ethers";import{Just as V}from"purify-ts";import{lastValueFrom as k}from"rxjs";import{SignTransactionDAStep as y}from"../../../../api/app-binder/SignTransactionDeviceActionTypes";import{ClearSigningType as S}from"../../../../api/model/ClearSigningType";import{TransactionType as C}from"../../../../api/model/TransactionType";import{makeDeviceActionInternalApiMock as q}from"../../../app-binder/device-action/__test-utils__/makeInternalApi";import{setupOpenAppDAMock as f}from"../../../app-binder/device-action/__test-utils__/setupOpenAppDAMock";import{executeUntilStep as x}from"../../../app-binder/device-action/__test-utils__/testDeviceActionUntilStep";import{SignTransactionDeviceAction as v}from"./SignTransactionDeviceAction";vi.mock("@ledgerhq/device-management-kit",async a=>({...await a(),OpenAppDeviceAction:vi.fn(()=>({makeStateMachine:vi.fn()}))}));describe("SignTransactionDeviceAction",()=>{let a;const i={getFieldContext:vi.fn(),getContexts:vi.fn(),getTypedDataFilters:vi.fn(),getWeb3Checks:vi.fn(),getSolanaContext:vi.fn()},c={mapTransactionToSubset:vi.fn()},s={extractValue:vi.fn()},A=vi.fn(),E=vi.fn(),m=vi.fn(),h=vi.fn(),O=vi.fn(),o=vi.fn();function d(){return{getAppConfig:A,web3CheckOptIn:E,parseTransaction:m,buildContexts:h,provideContexts:O,signTransaction:o}}const r=q(),l={domain:"domain-name.eth"},n=_(H.from({chainId:1n,nonce:0,data:"0x"}).unsignedSerialized),T={chainId:1,data:"0x",selector:"0x",to:"0x",value:0n};function P(e,t,R){return{blindSigningEnabled:!1,web3ChecksEnabled:t,web3ChecksOptIn:R,version:e}}function p(e,t,R){r.getDeviceSessionState.mockReturnValueOnce({sessionStateType:D.ReadyWithoutSecureChannel,deviceStatus:B.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:e},deviceModelId:I.FLEX,isSecureConnectionAllowed:!1}),r.getDeviceModel.mockReturnValueOnce({id:I.FLEX}),A.mockResolvedValue(u({data:P(e,t,R)}))}const b=(e,t)=>{if(e[t]?.status!==g.Pending)throw new Error(`Step ${t} is not pending: ${JSON.stringify(e[t])}`);return e[t]};describe("Happy path",()=>{describe("should sign a transaction",()=>{const e=[{context:{type:M.TRANSACTION_INFO,payload:"payload-1"},subcontextCallbacks:[]},{context:{type:M.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-2"},subcontextCallbacks:[]}];beforeEach(()=>{vi.resetAllMocks(),f(),p("1.15.0",!1,!1),m.mockResolvedValueOnce({subset:T,type:C.EIP1559}),h.mockResolvedValueOnce({clearSignContexts:e,clearSigningType:S.EIP7730}),O.mockResolvedValueOnce(V(void 0)),o.mockResolvedValueOnce(u({data:{v:28,r:"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788",s:"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513"}}));const t=new v({input:{derivationPath:"44'/60'/0'/0/0",transaction:n,options:l,contextModule:i,mapper:c,parser:s}});vi.spyOn(t,"extractDependencies").mockReturnValue(d()),a=t._execute(r).observable}),it("should open the app",async()=>{const{steps:t}=await x(0,a);expect(b(t,0).intermediateValue.step).toBe(y.OPEN_APP)}),it("should confirm open app",async()=>{const{steps:t}=await x(1,a);expect(b(t,1).intermediateValue.requiredUserInteraction).toBe(N.ConfirmOpenApp)}),it("should get app config",async()=>{const{steps:t}=await x(2,a);expect(b(t,2).intermediateValue.step).toBe(y.GET_APP_CONFIG)}),it("should prebuild context",async()=>{const{steps:t}=await x(3,a);expect(b(t,3).intermediateValue.step).toBe(y.PARSE_TRANSACTION),expect(m).toHaveBeenCalledTimes(1),expect(m).toHaveBeenNthCalledWith(1,expect.objectContaining({input:{mapper:c,transaction:n}}))}),it("should build context",async()=>{const{steps:t}=await x(4,a);expect(b(t,4).intermediateValue.step).toBe(y.BUILD_CONTEXTS),expect(h).toHaveBeenCalledTimes(1),expect(h).toHaveBeenNthCalledWith(1,expect.objectContaining({input:{contextModule:i,parser:s,mapper:c,options:l,subset:T,transaction:n,appConfig:P("1.15.0",!1,!1),derivationPath:"44'/60'/0'/0/0",deviceModelId:I.FLEX}}))}),it("should provide context",async()=>{const{steps:t}=await x(5,a);expect(b(t,5).intermediateValue.step).toBe(y.PROVIDE_CONTEXTS),expect(O).toHaveBeenCalledTimes(1),expect(O).toHaveBeenNthCalledWith(1,expect.objectContaining({input:{contexts:e,serializedTransaction:n,derivationPath:"44'/60'/0'/0/0"}}))}),it("should sign transaction",async()=>{const{steps:t}=await x(6,a);expect(b(t,6).intermediateValue.step).toBe(y.SIGN_TRANSACTION),expect(o).toHaveBeenCalledTimes(1),expect(o).toHaveBeenNthCalledWith(1,expect.objectContaining({input:{derivationPath:"44'/60'/0'/0/0",serializedTransaction:n,chainId:1,transactionType:C.EIP1559,clearSigningType:S.EIP7730}}))}),it("should return the signature",async()=>{const t=await k(a);expect(t).toEqual({status:g.Completed,output:{v:28,r:"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788",s:"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513"}})})}),describe("should skip open app",()=>{beforeEach(()=>{vi.resetAllMocks(),f(),p("1.15.0",!1,!1);const e=new v({input:{derivationPath:"44'/60'/0'/0/0",transaction:n,options:{...l,skipOpenApp:!0},contextModule:i,mapper:c,parser:s}});m.mockResolvedValueOnce({subset:T,type:C.EIP1559}),h.mockResolvedValueOnce({clearSignContexts:[],clearSignContextsOptional:[],clearSigningType:S.BASIC}),O.mockResolvedValueOnce(V(void 0)),o.mockResolvedValueOnce(u({data:{v:28,r:"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788",s:"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513"}})),vi.spyOn(e,"extractDependencies").mockReturnValue(d()),a=e._execute(r).observable}),it("should skip open app and get app config directly",async()=>{const{steps:e}=await x(0,a);expect(b(e,0).intermediateValue.step).toBe(y.GET_APP_CONFIG)})}),describe("should opt in to web3 checks",()=>{beforeEach(()=>{vi.resetAllMocks(),f(),p("1.16.0",!1,!1);const e=new v({input:{derivationPath:"44'/60'/0'/0/0",transaction:n,options:l,contextModule:i,mapper:c,parser:s}});vi.spyOn(e,"extractDependencies").mockReturnValue(d()),E.mockResolvedValueOnce(u({data:{enabled:!0}})),a=e._execute(r).observable}),it("should opt in to web3 checks if app config is supported and not already enabled",async()=>{const{steps:e}=await x(4,a);expect(b(e,3).intermediateValue.step).toBe(y.WEB3_CHECKS_OPT_IN),expect(E).toHaveBeenCalledTimes(1),expect(b(e,4).intermediateValue.step).toBe(y.WEB3_CHECKS_OPT_IN_RESULT),expect(b(e,4).intermediateValue.result).toBe(!0)})}),describe("should not opt in to web3 checks",()=>{beforeEach(()=>{vi.resetAllMocks(),f();const e=new v({input:{derivationPath:"44'/60'/0'/0/0",transaction:n,options:l,contextModule:i,mapper:c,parser:s}});vi.spyOn(e,"extractDependencies").mockReturnValue(d()),a=e._execute(r).observable}),it("should not opt in to web3 checks if app config is not supported",async()=>{p("1.15.0",!1,!1),await x(3,a),expect(E).not.toHaveBeenCalled()}),it("should not opt in to web3 checks if already enabled",async()=>{p("1.16.0",!0,!1),await x(3,a),expect(E).not.toHaveBeenCalled()}),it("should not opt in to web3 checks if already opted out",async()=>{p("1.16.0",!1,!0),await x(3,a),expect(E).not.toHaveBeenCalled()})})}),describe("Error cases",()=>{beforeEach(()=>{vi.resetAllMocks()}),it("should return an error if the open app throw an error",async()=>{f(new Error("Open app failed")),p("1.15.0",!1,!1);const e=new v({input:{derivationPath:"44'/60'/0'/0/0",transaction:n,options:l,contextModule:i,mapper:c,parser:s}});vi.spyOn(e,"extractDependencies").mockReturnValue(d()),a=e._execute(r).observable;const t=await k(a);expect(t).toEqual({status:g.Error,error:new Error("Open app failed")})}),it("should return an error if the get app config return an error",async()=>{f(),A.mockResolvedValueOnce(u({error:new w("Get app config failed")}));const e=new v({input:{derivationPath:"44'/60'/0'/0/0",transaction:n,options:l,contextModule:i,mapper:c,parser:s}});vi.spyOn(e,"extractDependencies").mockReturnValue(d()),a=e._execute(r).observable;const t=await k(a);expect(t).toEqual({status:g.Error,error:new w("Get app config failed")})}),it("should return an error if the get app config throw an error",async()=>{f(),A.mockRejectedValueOnce(new Error("Get app config failed"));const e=new v({input:{derivationPath:"44'/60'/0'/0/0",transaction:n,options:l,contextModule:i,mapper:c,parser:s}});vi.spyOn(e,"extractDependencies").mockReturnValue(d()),a=e._execute(r).observable;const t=await k(a);expect(t).toEqual({status:g.Error,error:new Error("Get app config failed")})}),it("should ignore the web3checks result if the command fails",async()=>{f(),p("1.16.0",!1,!1);const e=new v({input:{derivationPath:"44'/60'/0'/0/0",transaction:n,options:l,contextModule:i,mapper:c,parser:s}});vi.spyOn(e,"extractDependencies").mockReturnValue(d()),E.mockResolvedValueOnce(u({error:new w("web3 check opt in failed")})),m.mockResolvedValueOnce({subset:T,type:C.EIP1559}),h.mockResolvedValueOnce({clearSignContexts:[],clearSignContextsOptional:[],clearSigningType:S.BASIC}),o.mockResolvedValueOnce(u({data:{v:28,r:"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788",s:"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513"}})),a=e._execute(r).observable;const t=await k(a);expect(t).toEqual({status:g.Completed,output:{v:28,r:"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788",s:"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513"}})}),it("should return an error if the parse transaction throw an error",async()=>{f(),p("1.15.0",!1,!1);const e=new v({input:{derivationPath:"44'/60'/0'/0/0",transaction:n,options:l,contextModule:i,mapper:c,parser:s}});vi.spyOn(e,"extractDependencies").mockReturnValue(d()),m.mockRejectedValueOnce(new Error("Parse transaction failed")),a=e._execute(r).observable;const t=await k(a);expect(t).toEqual({status:g.Error,error:new Error("Parse transaction failed")})}),it("should blind sign if the first sign transaction fails and the second sign transaction succeeds",async()=>{f(),p("1.15.0",!1,!1);const e=new v({input:{derivationPath:"44'/60'/0'/0/0",transaction:n,options:l,contextModule:i,mapper:c,parser:s}});vi.spyOn(e,"extractDependencies").mockReturnValue(d()),m.mockResolvedValueOnce({subset:T,type:C.EIP1559}),h.mockResolvedValueOnce({clearSignContexts:[],clearSignContextsOptional:[],clearSigningType:S.BASIC}),O.mockResolvedValueOnce(V(void 0)),o.mockResolvedValueOnce(u({error:new w("Sign transaction failed")})),o.mockResolvedValueOnce(u({data:{v:28,r:"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad789",s:"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513"}})),a=e._execute(r).observable;const t=await k(a);expect(t).toEqual({status:g.Completed,output:{v:28,r:"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad789",s:"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513"}})}),it("should blind sign if the first sign transaction throws an error and the second sign transaction succeeds",async()=>{f(),p("1.15.0",!1,!1);const e=new v({input:{derivationPath:"44'/60'/0'/0/0",transaction:n,options:l,contextModule:i,mapper:c,parser:s}});vi.spyOn(e,"extractDependencies").mockReturnValue(d()),m.mockResolvedValueOnce({subset:T,type:C.EIP1559}),h.mockResolvedValueOnce({clearSignContexts:[],clearSignContextsOptional:[],clearSigningType:S.EIP7730}),O.mockResolvedValueOnce(V(void 0)),o.mockRejectedValueOnce(new Error("Sign transaction failed")),o.mockResolvedValueOnce(u({data:{v:28,r:"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad789",s:"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513"}})),a=e._execute(r).observable;const t=await k(a);expect(t).toEqual({status:g.Completed,output:{v:28,r:"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad789",s:"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513"}}),expect(o).toHaveBeenCalledTimes(2),expect(o).toHaveBeenNthCalledWith(1,expect.objectContaining({input:{derivationPath:"44'/60'/0'/0/0",serializedTransaction:n,chainId:1,transactionType:C.EIP1559,clearSigningType:S.EIP7730}})),expect(o).toHaveBeenNthCalledWith(2,expect.objectContaining({input:{derivationPath:"44'/60'/0'/0/0",serializedTransaction:n,chainId:1,transactionType:C.EIP1559,clearSigningType:S.BASIC}}))}),it("should return an error if the sign transaction return two times an error",async()=>{f(),p("1.15.0",!1,!1);const e=new v({input:{derivationPath:"44'/60'/0'/0/0",transaction:n,options:l,contextModule:i,mapper:c,parser:s}});vi.spyOn(e,"extractDependencies").mockReturnValue(d()),m.mockResolvedValueOnce({subset:T,type:C.EIP1559}),h.mockResolvedValueOnce({clearSignContexts:[],clearSignContextsOptional:[],clearSigningType:S.BASIC}),O.mockResolvedValueOnce(V(void 0)),o.mockResolvedValueOnce(u({error:new w("Sign transaction failed")})),o.mockResolvedValueOnce(u({error:new w("Blind sign transaction failed")})),a=e._execute(r).observable;const t=await k(a);expect(t).toEqual({status:g.Error,error:new w("Blind sign transaction failed")})}),it("should return an error if the blind sign transaction fallback throws an error",async()=>{f(),p("1.15.0",!1,!1);const e=new v({input:{derivationPath:"44'/60'/0'/0/0",transaction:n,options:l,contextModule:i,mapper:c,parser:s}});vi.spyOn(e,"extractDependencies").mockReturnValue(d()),m.mockResolvedValueOnce({subset:T,type:C.EIP1559}),h.mockResolvedValueOnce({clearSignContexts:[],clearSignContextsOptional:[],clearSigningType:S.BASIC}),O.mockResolvedValueOnce(V(void 0)),o.mockResolvedValueOnce(u({error:new w("Sign transaction failed")})),o.mockRejectedValueOnce(new Error("Blind sign transaction fallback failed")),a=e._execute(r).observable;const t=await k(a);expect(t).toEqual({status:g.Error,error:new Error("Blind sign transaction fallback failed")})})})});
|
|
2
2
|
//# sourceMappingURL=SignTransactionDeviceAction.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.ts"],
|
|
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 DeviceActionState,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n hexaStringToBuffer,\n InvalidStatusWordError,\n TransportDeviceModel,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { Transaction } from \"ethers\";\nimport { Just } from \"purify-ts\";\nimport { lastValueFrom, Observable } from \"rxjs\";\n\nimport {\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n type SignTransactionDAState,\n SignTransactionDAStep,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { Signature } from \"@api/index\";\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 { executeUntilStep } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionUntilStep\";\nimport { ContextWithSubContexts } from \"@internal/app-binder/task/BuildFullContextsTask\";\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 let observable: Observable<\n DeviceActionState<\n Signature,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >\n >;\n const contextModuleMock: ContextModule = {\n getFieldContext: 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 parseTransactionMock = vi.fn();\n const buildContextsMock = vi.fn();\n const provideContextsMock = vi.fn();\n const signTransactionMock = vi.fn();\n function extractDependenciesMock() {\n return {\n getAppConfig: getAppConfigMock,\n web3CheckOptIn: web3CheckOptInMock,\n parseTransaction: parseTransactionMock,\n buildContexts: buildContextsMock,\n provideContexts: provideContextsMock,\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 apiMock.getDeviceModel.mockReturnValueOnce({\n id: DeviceModelId.FLEX,\n } as unknown as TransportDeviceModel);\n getAppConfigMock.mockResolvedValue(\n CommandResultFactory({\n data: createAppConfig(version, web3ChecksEnabled, web3ChecksOptIn),\n }),\n );\n }\n\n const getStep = (s: Array<SignTransactionDAState>, index: number) => {\n if (s[index]?.status !== DeviceActionStatus.Pending) {\n throw new Error(\n `Step ${index} is not pending: ${JSON.stringify(s[index])}`,\n );\n }\n return s[index];\n };\n\n describe(\"Happy path\", () => {\n describe(\"should sign a transaction\", () => {\n const contexts: ContextWithSubContexts[] = [\n {\n context: {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-1\",\n },\n subcontextCallbacks: [],\n },\n {\n context: {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"payload-2\",\n },\n subcontextCallbacks: [],\n },\n ];\n\n beforeEach(() => {\n vi.resetAllMocks();\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n // Mock the dependencies to return some sample data\n parseTransactionMock.mockResolvedValueOnce({\n subset: defaultSubset,\n type: TransactionType.EIP1559,\n });\n buildContextsMock.mockResolvedValueOnce({\n clearSignContexts: contexts,\n clearSigningType: ClearSigningType.EIP7730,\n });\n provideContextsMock.mockResolvedValueOnce(Just(void 0));\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\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 vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n observable = deviceAction._execute(apiMock).observable;\n });\n\n it(\"should open the app\", async () => {\n const { steps } = await executeUntilStep(0, observable);\n expect(getStep(steps, 0).intermediateValue.step).toBe(\n SignTransactionDAStep.OPEN_APP,\n );\n });\n\n it(\"should confirm open app\", async () => {\n const { steps } = await executeUntilStep(1, observable);\n expect(\n getStep(steps, 1).intermediateValue.requiredUserInteraction,\n ).toBe(UserInteractionRequired.ConfirmOpenApp);\n });\n\n it(\"should get app config\", async () => {\n const { steps } = await executeUntilStep(2, observable);\n expect(getStep(steps, 2).intermediateValue.step).toBe(\n SignTransactionDAStep.GET_APP_CONFIG,\n );\n });\n\n it(\"should prebuild context\", async () => {\n const { steps } = await executeUntilStep(3, observable);\n expect(getStep(steps, 3).intermediateValue.step).toBe(\n SignTransactionDAStep.PARSE_TRANSACTION,\n );\n expect(parseTransactionMock).toHaveBeenCalledTimes(1);\n expect(parseTransactionMock).toHaveBeenNthCalledWith(\n 1,\n expect.objectContaining({\n input: {\n mapper: mapperMock,\n transaction: defaultTransaction,\n },\n }),\n );\n });\n\n it(\"should build context\", async () => {\n const { steps } = await executeUntilStep(4, observable);\n expect(getStep(steps, 4).intermediateValue.step).toBe(\n SignTransactionDAStep.BUILD_CONTEXTS,\n );\n expect(buildContextsMock).toHaveBeenCalledTimes(1);\n expect(buildContextsMock).toHaveBeenNthCalledWith(\n 1,\n expect.objectContaining({\n input: {\n contextModule: contextModuleMock,\n parser: parserMock,\n mapper: mapperMock,\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 deviceModelId: DeviceModelId.FLEX,\n },\n }),\n );\n });\n\n it(\"should provide context\", async () => {\n const { steps } = await executeUntilStep(5, observable);\n expect(getStep(steps, 5).intermediateValue.step).toBe(\n SignTransactionDAStep.PROVIDE_CONTEXTS,\n );\n expect(provideContextsMock).toHaveBeenCalledTimes(1);\n expect(provideContextsMock).toHaveBeenNthCalledWith(\n 1,\n expect.objectContaining({\n input: {\n contexts: contexts,\n serializedTransaction: defaultTransaction,\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n });\n\n it(\"should sign transaction\", async () => {\n const { steps } = await executeUntilStep(6, observable);\n expect(getStep(steps, 6).intermediateValue.step).toBe(\n SignTransactionDAStep.SIGN_TRANSACTION,\n );\n expect(signTransactionMock).toHaveBeenCalledTimes(1);\n expect(signTransactionMock).toHaveBeenNthCalledWith(\n 1,\n expect.objectContaining({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n serializedTransaction: defaultTransaction,\n chainId: 1,\n transactionType: TransactionType.EIP1559,\n clearSigningType: ClearSigningType.EIP7730,\n },\n }),\n );\n });\n\n it(\"should return the signature\", async () => {\n const result = await lastValueFrom(observable);\n expect(result).toEqual({\n status: DeviceActionStatus.Completed,\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n });\n });\n });\n\n describe(\"should skip open app\", () => {\n beforeEach(() => {\n vi.resetAllMocks();\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, skipOpenApp: true },\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n },\n });\n parseTransactionMock.mockResolvedValueOnce({\n subset: defaultSubset,\n type: TransactionType.EIP1559,\n });\n buildContextsMock.mockResolvedValueOnce({\n clearSignContexts: [],\n clearSignContextsOptional: [],\n clearSigningType: ClearSigningType.BASIC,\n });\n provideContextsMock.mockResolvedValueOnce(Just(void 0));\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n observable = deviceAction._execute(apiMock).observable;\n });\n\n it(\"should skip open app and get app config directly\", async () => {\n const { steps } = await executeUntilStep(0, observable);\n\n expect(getStep(steps, 0).intermediateValue.step).toBe(\n SignTransactionDAStep.GET_APP_CONFIG,\n );\n });\n });\n\n describe(\"should opt in to web3 checks\", () => {\n beforeEach(() => {\n vi.resetAllMocks();\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 vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n web3CheckOptInMock.mockResolvedValueOnce(\n CommandResultFactory({ data: { enabled: true } }),\n );\n\n observable = deviceAction._execute(apiMock).observable;\n });\n\n it(\"should opt in to web3 checks if app config is supported and not already enabled\", async () => {\n const { steps } = await executeUntilStep(4, observable);\n\n expect(getStep(steps, 3).intermediateValue.step).toBe(\n SignTransactionDAStep.WEB3_CHECKS_OPT_IN,\n );\n expect(web3CheckOptInMock).toHaveBeenCalledTimes(1);\n\n expect(getStep(steps, 4).intermediateValue.step).toBe(\n SignTransactionDAStep.WEB3_CHECKS_OPT_IN_RESULT,\n );\n // @ts-expect-error - result is not typed\n expect(getStep(steps, 4).intermediateValue.result).toBe(true);\n });\n });\n\n describe(\"should not opt in to web3 checks\", () => {\n beforeEach(() => {\n vi.resetAllMocks();\n setupOpenAppDAMock();\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 observable = deviceAction._execute(apiMock).observable;\n });\n\n it(\"should not opt in to web3 checks if app config is not supported\", async () => {\n setupAppConfig(\"1.15.0\", false, false);\n await executeUntilStep(3, observable);\n expect(web3CheckOptInMock).not.toHaveBeenCalled();\n });\n\n it(\"should not opt in to web3 checks if already enabled\", async () => {\n setupAppConfig(\"1.16.0\", true, false);\n await executeUntilStep(3, observable);\n expect(web3CheckOptInMock).not.toHaveBeenCalled();\n });\n\n it(\"should not opt in to web3 checks if already opted out\", async () => {\n setupAppConfig(\"1.16.0\", false, true);\n await executeUntilStep(3, observable);\n expect(web3CheckOptInMock).not.toHaveBeenCalled();\n });\n });\n });\n\n describe(\"Error cases\", () => {\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n it(\"should return an error if the open app throw an error\", async () => {\n // GIVEN\n setupOpenAppDAMock(new Error(\"Open app failed\"));\n setupAppConfig(\"1.15.0\", false, false);\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 vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n observable = deviceAction._execute(apiMock).observable;\n\n // WHEN\n const result = await lastValueFrom(observable);\n\n // THEN\n expect(result).toEqual({\n status: DeviceActionStatus.Error,\n error: new Error(\"Open app failed\"),\n });\n });\n\n it(\"should return an error if the get app config return an error\", async () => {\n // GIVEN\n setupOpenAppDAMock();\n getAppConfigMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"Get app config failed\"),\n }),\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 vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n observable = deviceAction._execute(apiMock).observable;\n\n // WHEN\n const result = await lastValueFrom(observable);\n\n // THEN\n expect(result).toEqual({\n status: DeviceActionStatus.Error,\n error: new InvalidStatusWordError(\"Get app config failed\"),\n });\n });\n\n it(\"should return an error if the get app config throw an error\", async () => {\n // GIVEN\n setupOpenAppDAMock();\n getAppConfigMock.mockRejectedValueOnce(\n new Error(\"Get app config failed\"),\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 vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n observable = deviceAction._execute(apiMock).observable;\n\n // WHEN\n const result = await lastValueFrom(observable);\n\n // THEN\n expect(result).toEqual({\n status: DeviceActionStatus.Error,\n error: new Error(\"Get app config failed\"),\n });\n });\n\n it(\"should ignore the web3checks result if the command fails\", async () => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.16.0\", false, false);\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 vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n web3CheckOptInMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"web3 check opt in failed\"),\n }),\n );\n parseTransactionMock.mockResolvedValueOnce({\n subset: defaultSubset,\n type: TransactionType.EIP1559,\n });\n buildContextsMock.mockResolvedValueOnce({\n clearSignContexts: [],\n clearSignContextsOptional: [],\n clearSigningType: ClearSigningType.BASIC,\n });\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n observable = deviceAction._execute(apiMock).observable;\n\n // WHEN\n const result = await lastValueFrom(observable);\n\n // THEN\n expect(result).toEqual({\n status: DeviceActionStatus.Completed,\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n });\n });\n\n it(\"should return an error if the parse transaction throw an error\", async () => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\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 vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n parseTransactionMock.mockRejectedValueOnce(\n new Error(\"Parse transaction failed\"),\n );\n observable = deviceAction._execute(apiMock).observable;\n\n // WHEN\n const result = await lastValueFrom(observable);\n\n // THEN\n expect(result).toEqual({\n status: DeviceActionStatus.Error,\n error: new Error(\"Parse transaction failed\"),\n });\n });\n\n it(\"should blind sign if the build contexts fails\", async () => {\n // TODO: implement this test\n });\n\n it(\"should blind sign if the provide contexts fails\", async () => {\n // TODO: implement this test\n });\n\n it(\"should return an error if the sign transaction fails\", async () => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\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 vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n parseTransactionMock.mockResolvedValueOnce({\n subset: defaultSubset,\n type: TransactionType.EIP1559,\n });\n buildContextsMock.mockResolvedValueOnce({\n clearSignContexts: [],\n clearSignContextsOptional: [],\n clearSigningType: ClearSigningType.BASIC,\n });\n provideContextsMock.mockResolvedValueOnce(Just(void 0));\n signTransactionMock.mockRejectedValueOnce(\n new Error(\"Sign transaction failed\"),\n );\n observable = deviceAction._execute(apiMock).observable;\n\n // WHEN\n const result = await lastValueFrom(observable);\n\n // THEN\n expect(result).toEqual({\n status: DeviceActionStatus.Error,\n error: new Error(\"Sign transaction failed\"),\n });\n });\n\n it(\"should return an error if the sign transaction return an error\", async () => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\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 vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n parseTransactionMock.mockResolvedValueOnce({\n subset: defaultSubset,\n type: TransactionType.EIP1559,\n });\n buildContextsMock.mockResolvedValueOnce({\n clearSignContexts: [],\n clearSignContextsOptional: [],\n clearSigningType: ClearSigningType.BASIC,\n });\n provideContextsMock.mockResolvedValueOnce(Just(void 0));\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"Sign transaction failed\"),\n }),\n );\n observable = deviceAction._execute(apiMock).observable;\n\n // WHEN\n const result = await lastValueFrom(observable);\n\n // THEN\n expect(result).toEqual({\n status: DeviceActionStatus.Error,\n error: new InvalidStatusWordError(\"Sign transaction failed\"),\n });\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
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 DeviceActionState,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n hexaStringToBuffer,\n InvalidStatusWordError,\n TransportDeviceModel,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { Transaction } from \"ethers\";\nimport { Just } from \"purify-ts\";\nimport { lastValueFrom, Observable } from \"rxjs\";\n\nimport {\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n type SignTransactionDAState,\n SignTransactionDAStep,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { Signature } from \"@api/index\";\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 { executeUntilStep } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionUntilStep\";\nimport { ContextWithSubContexts } from \"@internal/app-binder/task/BuildFullContextsTask\";\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 let observable: Observable<\n DeviceActionState<\n Signature,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >\n >;\n const contextModuleMock: ContextModule = {\n getFieldContext: 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 parseTransactionMock = vi.fn();\n const buildContextsMock = vi.fn();\n const provideContextsMock = vi.fn();\n const signTransactionMock = vi.fn();\n function extractDependenciesMock() {\n return {\n getAppConfig: getAppConfigMock,\n web3CheckOptIn: web3CheckOptInMock,\n parseTransaction: parseTransactionMock,\n buildContexts: buildContextsMock,\n provideContexts: provideContextsMock,\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 apiMock.getDeviceModel.mockReturnValueOnce({\n id: DeviceModelId.FLEX,\n } as unknown as TransportDeviceModel);\n getAppConfigMock.mockResolvedValue(\n CommandResultFactory({\n data: createAppConfig(version, web3ChecksEnabled, web3ChecksOptIn),\n }),\n );\n }\n\n const getStep = (s: Array<SignTransactionDAState>, index: number) => {\n if (s[index]?.status !== DeviceActionStatus.Pending) {\n throw new Error(\n `Step ${index} is not pending: ${JSON.stringify(s[index])}`,\n );\n }\n return s[index];\n };\n\n describe(\"Happy path\", () => {\n describe(\"should sign a transaction\", () => {\n const contexts: ContextWithSubContexts[] = [\n {\n context: {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-1\",\n },\n subcontextCallbacks: [],\n },\n {\n context: {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"payload-2\",\n },\n subcontextCallbacks: [],\n },\n ];\n\n beforeEach(() => {\n vi.resetAllMocks();\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n // Mock the dependencies to return some sample data\n parseTransactionMock.mockResolvedValueOnce({\n subset: defaultSubset,\n type: TransactionType.EIP1559,\n });\n buildContextsMock.mockResolvedValueOnce({\n clearSignContexts: contexts,\n clearSigningType: ClearSigningType.EIP7730,\n });\n provideContextsMock.mockResolvedValueOnce(Just(void 0));\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\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 vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n observable = deviceAction._execute(apiMock).observable;\n });\n\n it(\"should open the app\", async () => {\n const { steps } = await executeUntilStep(0, observable);\n expect(getStep(steps, 0).intermediateValue.step).toBe(\n SignTransactionDAStep.OPEN_APP,\n );\n });\n\n it(\"should confirm open app\", async () => {\n const { steps } = await executeUntilStep(1, observable);\n expect(\n getStep(steps, 1).intermediateValue.requiredUserInteraction,\n ).toBe(UserInteractionRequired.ConfirmOpenApp);\n });\n\n it(\"should get app config\", async () => {\n const { steps } = await executeUntilStep(2, observable);\n expect(getStep(steps, 2).intermediateValue.step).toBe(\n SignTransactionDAStep.GET_APP_CONFIG,\n );\n });\n\n it(\"should prebuild context\", async () => {\n const { steps } = await executeUntilStep(3, observable);\n expect(getStep(steps, 3).intermediateValue.step).toBe(\n SignTransactionDAStep.PARSE_TRANSACTION,\n );\n expect(parseTransactionMock).toHaveBeenCalledTimes(1);\n expect(parseTransactionMock).toHaveBeenNthCalledWith(\n 1,\n expect.objectContaining({\n input: {\n mapper: mapperMock,\n transaction: defaultTransaction,\n },\n }),\n );\n });\n\n it(\"should build context\", async () => {\n const { steps } = await executeUntilStep(4, observable);\n expect(getStep(steps, 4).intermediateValue.step).toBe(\n SignTransactionDAStep.BUILD_CONTEXTS,\n );\n expect(buildContextsMock).toHaveBeenCalledTimes(1);\n expect(buildContextsMock).toHaveBeenNthCalledWith(\n 1,\n expect.objectContaining({\n input: {\n contextModule: contextModuleMock,\n parser: parserMock,\n mapper: mapperMock,\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 deviceModelId: DeviceModelId.FLEX,\n },\n }),\n );\n });\n\n it(\"should provide context\", async () => {\n const { steps } = await executeUntilStep(5, observable);\n expect(getStep(steps, 5).intermediateValue.step).toBe(\n SignTransactionDAStep.PROVIDE_CONTEXTS,\n );\n expect(provideContextsMock).toHaveBeenCalledTimes(1);\n expect(provideContextsMock).toHaveBeenNthCalledWith(\n 1,\n expect.objectContaining({\n input: {\n contexts: contexts,\n serializedTransaction: defaultTransaction,\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n });\n\n it(\"should sign transaction\", async () => {\n const { steps } = await executeUntilStep(6, observable);\n expect(getStep(steps, 6).intermediateValue.step).toBe(\n SignTransactionDAStep.SIGN_TRANSACTION,\n );\n expect(signTransactionMock).toHaveBeenCalledTimes(1);\n expect(signTransactionMock).toHaveBeenNthCalledWith(\n 1,\n expect.objectContaining({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n serializedTransaction: defaultTransaction,\n chainId: 1,\n transactionType: TransactionType.EIP1559,\n clearSigningType: ClearSigningType.EIP7730,\n },\n }),\n );\n });\n\n it(\"should return the signature\", async () => {\n const result = await lastValueFrom(observable);\n expect(result).toEqual({\n status: DeviceActionStatus.Completed,\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n });\n });\n });\n\n describe(\"should skip open app\", () => {\n beforeEach(() => {\n vi.resetAllMocks();\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, skipOpenApp: true },\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n },\n });\n parseTransactionMock.mockResolvedValueOnce({\n subset: defaultSubset,\n type: TransactionType.EIP1559,\n });\n buildContextsMock.mockResolvedValueOnce({\n clearSignContexts: [],\n clearSignContextsOptional: [],\n clearSigningType: ClearSigningType.BASIC,\n });\n provideContextsMock.mockResolvedValueOnce(Just(void 0));\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n observable = deviceAction._execute(apiMock).observable;\n });\n\n it(\"should skip open app and get app config directly\", async () => {\n const { steps } = await executeUntilStep(0, observable);\n\n expect(getStep(steps, 0).intermediateValue.step).toBe(\n SignTransactionDAStep.GET_APP_CONFIG,\n );\n });\n });\n\n describe(\"should opt in to web3 checks\", () => {\n beforeEach(() => {\n vi.resetAllMocks();\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 vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n web3CheckOptInMock.mockResolvedValueOnce(\n CommandResultFactory({ data: { enabled: true } }),\n );\n\n observable = deviceAction._execute(apiMock).observable;\n });\n\n it(\"should opt in to web3 checks if app config is supported and not already enabled\", async () => {\n const { steps } = await executeUntilStep(4, observable);\n\n expect(getStep(steps, 3).intermediateValue.step).toBe(\n SignTransactionDAStep.WEB3_CHECKS_OPT_IN,\n );\n expect(web3CheckOptInMock).toHaveBeenCalledTimes(1);\n\n expect(getStep(steps, 4).intermediateValue.step).toBe(\n SignTransactionDAStep.WEB3_CHECKS_OPT_IN_RESULT,\n );\n // @ts-expect-error - result is not typed\n expect(getStep(steps, 4).intermediateValue.result).toBe(true);\n });\n });\n\n describe(\"should not opt in to web3 checks\", () => {\n beforeEach(() => {\n vi.resetAllMocks();\n setupOpenAppDAMock();\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 observable = deviceAction._execute(apiMock).observable;\n });\n\n it(\"should not opt in to web3 checks if app config is not supported\", async () => {\n setupAppConfig(\"1.15.0\", false, false);\n await executeUntilStep(3, observable);\n expect(web3CheckOptInMock).not.toHaveBeenCalled();\n });\n\n it(\"should not opt in to web3 checks if already enabled\", async () => {\n setupAppConfig(\"1.16.0\", true, false);\n await executeUntilStep(3, observable);\n expect(web3CheckOptInMock).not.toHaveBeenCalled();\n });\n\n it(\"should not opt in to web3 checks if already opted out\", async () => {\n setupAppConfig(\"1.16.0\", false, true);\n await executeUntilStep(3, observable);\n expect(web3CheckOptInMock).not.toHaveBeenCalled();\n });\n });\n });\n\n describe(\"Error cases\", () => {\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n it(\"should return an error if the open app throw an error\", async () => {\n // GIVEN\n setupOpenAppDAMock(new Error(\"Open app failed\"));\n setupAppConfig(\"1.15.0\", false, false);\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 vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n observable = deviceAction._execute(apiMock).observable;\n\n // WHEN\n const result = await lastValueFrom(observable);\n\n // THEN\n expect(result).toEqual({\n status: DeviceActionStatus.Error,\n error: new Error(\"Open app failed\"),\n });\n });\n\n it(\"should return an error if the get app config return an error\", async () => {\n // GIVEN\n setupOpenAppDAMock();\n getAppConfigMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"Get app config failed\"),\n }),\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 vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n observable = deviceAction._execute(apiMock).observable;\n\n // WHEN\n const result = await lastValueFrom(observable);\n\n // THEN\n expect(result).toEqual({\n status: DeviceActionStatus.Error,\n error: new InvalidStatusWordError(\"Get app config failed\"),\n });\n });\n\n it(\"should return an error if the get app config throw an error\", async () => {\n // GIVEN\n setupOpenAppDAMock();\n getAppConfigMock.mockRejectedValueOnce(\n new Error(\"Get app config failed\"),\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 vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n observable = deviceAction._execute(apiMock).observable;\n\n // WHEN\n const result = await lastValueFrom(observable);\n\n // THEN\n expect(result).toEqual({\n status: DeviceActionStatus.Error,\n error: new Error(\"Get app config failed\"),\n });\n });\n\n it(\"should ignore the web3checks result if the command fails\", async () => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.16.0\", false, false);\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 vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n web3CheckOptInMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"web3 check opt in failed\"),\n }),\n );\n parseTransactionMock.mockResolvedValueOnce({\n subset: defaultSubset,\n type: TransactionType.EIP1559,\n });\n buildContextsMock.mockResolvedValueOnce({\n clearSignContexts: [],\n clearSignContextsOptional: [],\n clearSigningType: ClearSigningType.BASIC,\n });\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n observable = deviceAction._execute(apiMock).observable;\n\n // WHEN\n const result = await lastValueFrom(observable);\n\n // THEN\n expect(result).toEqual({\n status: DeviceActionStatus.Completed,\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n });\n });\n\n it(\"should return an error if the parse transaction throw an error\", async () => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\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 vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n parseTransactionMock.mockRejectedValueOnce(\n new Error(\"Parse transaction failed\"),\n );\n observable = deviceAction._execute(apiMock).observable;\n\n // WHEN\n const result = await lastValueFrom(observable);\n\n // THEN\n expect(result).toEqual({\n status: DeviceActionStatus.Error,\n error: new Error(\"Parse transaction failed\"),\n });\n });\n\n it(\"should blind sign if the first sign transaction fails and the second sign transaction succeeds\", async () => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\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 vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n parseTransactionMock.mockResolvedValueOnce({\n subset: defaultSubset,\n type: TransactionType.EIP1559,\n });\n buildContextsMock.mockResolvedValueOnce({\n clearSignContexts: [],\n clearSignContextsOptional: [],\n clearSigningType: ClearSigningType.BASIC,\n });\n provideContextsMock.mockResolvedValueOnce(Just(void 0));\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"Sign transaction failed\"),\n }),\n );\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad789\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n observable = deviceAction._execute(apiMock).observable;\n\n // WHEN\n const result = await lastValueFrom(observable);\n\n // THEN\n expect(result).toEqual({\n status: DeviceActionStatus.Completed,\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad789\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n });\n });\n\n it(\"should blind sign if the first sign transaction throws an error and the second sign transaction succeeds\", async () => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\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 vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n parseTransactionMock.mockResolvedValueOnce({\n subset: defaultSubset,\n type: TransactionType.EIP1559,\n });\n buildContextsMock.mockResolvedValueOnce({\n clearSignContexts: [],\n clearSignContextsOptional: [],\n clearSigningType: ClearSigningType.EIP7730,\n });\n provideContextsMock.mockResolvedValueOnce(Just(void 0));\n signTransactionMock.mockRejectedValueOnce(\n new Error(\"Sign transaction failed\"),\n );\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad789\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n observable = deviceAction._execute(apiMock).observable;\n\n // WHEN\n const result = await lastValueFrom(observable);\n\n // THEN\n expect(result).toEqual({\n status: DeviceActionStatus.Completed,\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad789\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n });\n expect(signTransactionMock).toHaveBeenCalledTimes(2);\n expect(signTransactionMock).toHaveBeenNthCalledWith(\n 1,\n expect.objectContaining({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n serializedTransaction: defaultTransaction,\n chainId: 1,\n transactionType: TransactionType.EIP1559,\n clearSigningType: ClearSigningType.EIP7730,\n },\n }),\n );\n expect(signTransactionMock).toHaveBeenNthCalledWith(\n 2,\n expect.objectContaining({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n serializedTransaction: defaultTransaction,\n chainId: 1,\n transactionType: TransactionType.EIP1559,\n clearSigningType: ClearSigningType.BASIC, // fallback to basic\n },\n }),\n );\n });\n\n it(\"should return an error if the sign transaction return two times an error\", async () => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\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 vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n parseTransactionMock.mockResolvedValueOnce({\n subset: defaultSubset,\n type: TransactionType.EIP1559,\n });\n buildContextsMock.mockResolvedValueOnce({\n clearSignContexts: [],\n clearSignContextsOptional: [],\n clearSigningType: ClearSigningType.BASIC,\n });\n provideContextsMock.mockResolvedValueOnce(Just(void 0));\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"Sign transaction failed\"),\n }),\n );\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"Blind sign transaction failed\"),\n }),\n );\n observable = deviceAction._execute(apiMock).observable;\n\n // WHEN\n const result = await lastValueFrom(observable);\n\n // THEN\n expect(result).toEqual({\n status: DeviceActionStatus.Error,\n error: new InvalidStatusWordError(\"Blind sign transaction failed\"),\n });\n });\n\n it(\"should return an error if the blind sign transaction fallback throws an error\", async () => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\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 vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n parseTransactionMock.mockResolvedValueOnce({\n subset: defaultSubset,\n type: TransactionType.EIP1559,\n });\n buildContextsMock.mockResolvedValueOnce({\n clearSignContexts: [],\n clearSignContextsOptional: [],\n clearSigningType: ClearSigningType.BASIC,\n });\n provideContextsMock.mockResolvedValueOnce(Just(void 0));\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"Sign transaction failed\"),\n }),\n );\n signTransactionMock.mockRejectedValueOnce(\n new Error(\"Blind sign transaction fallback failed\"),\n );\n observable = deviceAction._execute(apiMock).observable;\n\n // WHEN\n const result = await lastValueFrom(observable);\n\n // THEN\n expect(result).toEqual({\n status: DeviceActionStatus.Error,\n error: new Error(\"Blind sign transaction fallback failed\"),\n });\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["ClearSignContextType", "CommandResultFactory", "DeviceActionStatus", "DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "hexaStringToBuffer", "InvalidStatusWordError", "UserInteractionRequired", "Transaction", "Just", "lastValueFrom", "SignTransactionDAStep", "ClearSigningType", "TransactionType", "makeDeviceActionInternalApiMock", "setupOpenAppDAMock", "executeUntilStep", "SignTransactionDeviceAction", "importOriginal", "observable", "contextModuleMock", "mapperMock", "parserMock", "getAppConfigMock", "web3CheckOptInMock", "parseTransactionMock", "buildContextsMock", "provideContextsMock", "signTransactionMock", "extractDependenciesMock", "apiMock", "defaultOptions", "defaultTransaction", "defaultSubset", "createAppConfig", "version", "web3ChecksEnabled", "web3ChecksOptIn", "setupAppConfig", "getStep", "s", "index", "contexts", "deviceAction", "steps", "result"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ClearSignContextType as a}from"@ledgerhq/context-module";import{ByteArrayBuilder as c,CommandResultFactory as h,InvalidStatusWordError as k,isSuccessCommandResult as d,LoadCertificateCommand as p}from"@ledgerhq/device-management-kit";import{DerivationPathUtils as T}from"@ledgerhq/signer-utils";import{Left as m,Right as y}from"purify-ts";import{ProvideEnumCommand as f}from"../../app-binder/command/ProvideEnumCommand";import{NetworkConfigurationType as u,ProvideNetworkConfigurationCommand as C}from"../../app-binder/command/ProvideNetworkConfigurationCommand";import{ProvideNFTInformationCommand as I}from"../../app-binder/command/ProvideNFTInformationCommand";import{ProvideProxyInfoCommand as
|
|
1
|
+
import{ClearSignContextType as a}from"@ledgerhq/context-module";import{ByteArrayBuilder as c,CommandResultFactory as h,InvalidStatusWordError as k,isSuccessCommandResult as d,LoadCertificateCommand as p}from"@ledgerhq/device-management-kit";import{DerivationPathUtils as T}from"@ledgerhq/signer-utils";import{Left as m,Right as y}from"purify-ts";import{ProvideEnumCommand as f}from"../../app-binder/command/ProvideEnumCommand";import{NetworkConfigurationType as u,ProvideNetworkConfigurationCommand as C}from"../../app-binder/command/ProvideNetworkConfigurationCommand";import{ProvideNFTInformationCommand as I}from"../../app-binder/command/ProvideNFTInformationCommand";import{ProvideProxyInfoCommand as F}from"../../app-binder/command/ProvideProxyInfoCommand";import{ProvideTokenInformationCommand as l}from"../../app-binder/command/ProvideTokenInformationCommand";import{ProvideTransactionFieldDescriptionCommand as _}from"../../app-binder/command/ProvideTransactionFieldDescriptionCommand";import{ProvideTransactionInformationCommand as P}from"../../app-binder/command/ProvideTransactionInformationCommand";import{ProvideTrustedNameCommand as w}from"../../app-binder/command/ProvideTrustedNameCommand";import{ProvideWeb3CheckCommand as E}from"../../app-binder/command/ProvideWeb3CheckCommand";import{SetExternalPluginCommand as v}from"../../app-binder/command/SetExternalPluginCommand";import{SetPluginCommand as N}from"../../app-binder/command/SetPluginCommand";import{StoreTransactionCommand as A}from"../../app-binder/command/StoreTransactionCommand";import{SendCommandInChunksTask as x}from"./SendCommandInChunksTask";import{SendPayloadInChunksTask as R}from"./SendPayloadInChunksTask";class J{constructor(i,n,s=(r,o)=>new R(r,o),t=(r,o)=>new x(r,o)){this._api=i;this._args=n;this._sendPayloadInChunksTaskFactory=s;this._sendCommandInChunksTaskFactory=t}async run(){let i=!1;for(const{context:n,subcontextCallbacks:s}of this._args.contexts){for(const r of s){const o=await r();if(o.type===a.ERROR)continue;const e=await this.provideContext(o);if(!d(e))return m(e)}if(n.type===a.PROXY_DELEGATE_CALL)continue;if(!i&&this._args.serializedTransaction!==void 0&&n.type===a.TRANSACTION_INFO){i=!0;const r=T.splitPath(this._args.derivationPath),o=new c;o.add8BitUIntToData(r.length),r.forEach(e=>{o.add32BitUIntToData(e)}),o.addBufferToData(this._args.serializedTransaction),await this._sendCommandInChunksTaskFactory(this._api,{data:o.build(),commandFactory:e=>new A({serializedTransaction:e.chunkedData,isFirstChunk:e.isFirstChunk})}).run()}const t=await this.provideContext(n);if(!d(t))return m(t)}return y(void 0)}async provideContext({type:i,payload:n,certificate:s}){switch(s&&await this._api.sendCommand(new p({keyUsage:s.keyUsageNumber,certificate:s.payload})),i){case a.PLUGIN:return await this._api.sendCommand(new N({payload:n}));case a.EXTERNAL_PLUGIN:return await this._api.sendCommand(new v({payload:n}));case a.NFT:return await this._api.sendCommand(new I({payload:n}));case a.TOKEN:return await this._api.sendCommand(new l({payload:n}));case a.TRANSACTION_INFO:return await this._sendPayloadInChunksTaskFactory(this._api,{payload:n,commandFactory:r=>new P({data:r.chunkedData,isFirstChunk:r.isFirstChunk})}).run();case a.TRUSTED_NAME:return this._sendPayloadInChunksTaskFactory(this._api,{payload:n,commandFactory:t=>new w({data:t.chunkedData,isFirstChunk:t.isFirstChunk})}).run();case a.ENUM:return this._sendPayloadInChunksTaskFactory(this._api,{payload:n,commandFactory:t=>new f({data:t.chunkedData,isFirstChunk:t.isFirstChunk})}).run();case a.TRANSACTION_FIELD_DESCRIPTION:return this._sendPayloadInChunksTaskFactory(this._api,{payload:n,commandFactory:t=>new _({data:t.chunkedData,isFirstChunk:t.isFirstChunk})}).run();case a.WEB3_CHECK:return this._sendPayloadInChunksTaskFactory(this._api,{payload:n,commandFactory:t=>new E({payload:t.chunkedData,isFirstChunk:t.isFirstChunk})}).run();case a.PROXY_DELEGATE_CALL:return this._sendPayloadInChunksTaskFactory(this._api,{payload:n,commandFactory:t=>new F({data:t.chunkedData,isFirstChunk:t.isFirstChunk})}).run();case a.DYNAMIC_NETWORK:return this._sendPayloadInChunksTaskFactory(this._api,{payload:n,commandFactory:t=>new C({data:t.chunkedData,isFirstChunk:t.isFirstChunk,configurationType:u.CONFIGURATION})}).run();case a.DYNAMIC_NETWORK_ICON:return this._sendPayloadInChunksTaskFactory(this._api,{payload:n,commandFactory:t=>new C({data:t.chunkedData,isFirstChunk:t.isFirstChunk,configurationType:u.ICON}),withPayloadLength:!1}).run();default:{const t=i;return h({error:new k(`The context type [${t}] is not covered`)})}}}}export{J as ProvideContextsTask};
|
|
2
2
|
//# sourceMappingURL=ProvideContextsTask.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/task/ProvideContextsTask.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type ClearSignContextSuccess,\n ClearSignContextType,\n} from \"@ledgerhq/context-module\";\nimport {\n ByteArrayBuilder,\n type CommandErrorResult,\n type CommandResult,\n CommandResultFactory,\n type InternalApi,\n InvalidStatusWordError,\n isSuccessCommandResult,\n LoadCertificateCommand,\n} from \"@ledgerhq/device-management-kit\";\nimport { DerivationPathUtils } from \"@ledgerhq/signer-utils\";\nimport { type Either, Left, Right } from \"purify-ts\";\n\nimport { ProvideEnumCommand } from \"@internal/app-binder/command/ProvideEnumCommand\";\nimport {\n NetworkConfigurationType,\n ProvideNetworkConfigurationCommand,\n} from \"@internal/app-binder/command/ProvideNetworkConfigurationCommand\";\nimport { ProvideNFTInformationCommand } from \"@internal/app-binder/command/ProvideNFTInformationCommand\";\nimport { ProvideProxyInfoCommand } from \"@internal/app-binder/command/ProvideProxyInfoCommand\";\nimport { ProvideTokenInformationCommand } from \"@internal/app-binder/command/ProvideTokenInformationCommand\";\nimport { ProvideTransactionFieldDescriptionCommand } from \"@internal/app-binder/command/ProvideTransactionFieldDescriptionCommand\";\nimport { ProvideTransactionInformationCommand } from \"@internal/app-binder/command/ProvideTransactionInformationCommand\";\nimport { ProvideTrustedNameCommand } from \"@internal/app-binder/command/ProvideTrustedNameCommand\";\nimport { ProvideWeb3CheckCommand } from \"@internal/app-binder/command/ProvideWeb3CheckCommand\";\nimport { SetExternalPluginCommand } from \"@internal/app-binder/command/SetExternalPluginCommand\";\nimport { SetPluginCommand } from \"@internal/app-binder/command/SetPluginCommand\";\nimport { StoreTransactionCommand } from \"@internal/app-binder/command/StoreTransactionCommand\";\nimport { type EthErrorCodes } from \"@internal/app-binder/command/utils/ethAppErrors\";\n\nimport { type ContextWithSubContexts } from \"./BuildFullContextsTask\";\nimport {\n SendCommandInChunksTask,\n type SendCommandInChunksTaskArgs,\n} from \"./SendCommandInChunksTask\";\nimport {\n SendPayloadInChunksTask,\n type SendPayloadInChunksTaskArgs,\n} from \"./SendPayloadInChunksTask\";\n\nexport type ProvideContextsTaskArgs = {\n /**\n * The list of clear sign context with subcontexts callback to provide.\n */\n contexts: ContextWithSubContexts[];\n /**\n * The derivation path to provide.\n */\n derivationPath: string;\n /**\n * The serialized transaction to provide.\n */\n serializedTransaction: Uint8Array;\n};\n\nexport type ProvideContextsTaskResult = Either<\n CommandErrorResult<EthErrorCodes>,\n void\n>;\n\n/**\n * This task is responsible for providing the transaction context to the device.\n * It will send the subcontexts callbacks in order and finish with the context.\n */\nexport class ProvideContextsTask {\n constructor(\n private _api: InternalApi,\n private _args: ProvideContextsTaskArgs,\n private _sendPayloadInChunksTaskFactory = (\n api: InternalApi,\n args: SendPayloadInChunksTaskArgs<unknown>,\n ) => new SendPayloadInChunksTask(api, args),\n private _sendCommandInChunksTaskFactory = (\n api: InternalApi,\n args: SendCommandInChunksTaskArgs<unknown>,\n ) => new SendCommandInChunksTask(api, args),\n ) {}\n\n async run(): Promise<ProvideContextsTaskResult> {\n let transactionInfoProvided = false;\n\n for (const { context, subcontextCallbacks } of this._args.contexts) {\n for (const callback of subcontextCallbacks) {\n const subcontext = await callback();\n\n if (subcontext.type === ClearSignContextType.ERROR) {\n // silently ignore error subcontexts\n continue;\n }\n\n const res = await this.provideContext(subcontext);\n if (!isSuccessCommandResult(res)) {\n return Left(res);\n }\n }\n\n if (context.type === ClearSignContextType.PROXY_DELEGATE_CALL) {\n // In this specific case, the context is not valid as the challenge is not valid on the first call\n // the real data is provided in the subcontext callback\n continue;\n }\n\n if (\n !transactionInfoProvided &&\n this._args.serializedTransaction.length > 0 &&\n context.type === ClearSignContextType.TRANSACTION_INFO\n ) {\n // Send the serialized transaction for the first TRANSACTION_INFO.\n // All other TRANSACTION_INFO contexts will be ignored as it will be for nested calldata.\n transactionInfoProvided = true;\n\n const paths = DerivationPathUtils.splitPath(this._args.derivationPath);\n const builder = new ByteArrayBuilder();\n builder.add8BitUIntToData(paths.length);\n paths.forEach((path) => {\n builder.add32BitUIntToData(path);\n });\n builder.addBufferToData(this._args.serializedTransaction);\n await this._sendCommandInChunksTaskFactory(this._api, {\n data: builder.build(),\n commandFactory: (args) =>\n new StoreTransactionCommand({\n serializedTransaction: args.chunkedData,\n isFirstChunk: args.isFirstChunk,\n }),\n }).run();\n }\n\n const res = await this.provideContext(context);\n if (!isSuccessCommandResult(res)) {\n return Left(res);\n }\n }\n\n return Right(void 0);\n }\n\n /**\n * This method will send the context to the device.\n *\n * @param context The clear sign context to provide.\n * @returns A promise that resolves when the command is sent.\n */\n async provideContext({\n type,\n payload,\n certificate,\n }: ClearSignContextSuccess): Promise<CommandResult<unknown, EthErrorCodes>> {\n // if a certificate is provided, we load it before sending the command\n if (certificate) {\n await this._api.sendCommand(\n new LoadCertificateCommand({\n keyUsage: certificate.keyUsageNumber,\n certificate: certificate.payload,\n }),\n );\n }\n\n switch (type) {\n case ClearSignContextType.PLUGIN: {\n return await this._api.sendCommand(new SetPluginCommand({ payload }));\n }\n case ClearSignContextType.EXTERNAL_PLUGIN: {\n return await this._api.sendCommand(\n new SetExternalPluginCommand({ payload }),\n );\n }\n case ClearSignContextType.NFT: {\n return await this._api.sendCommand(\n new ProvideNFTInformationCommand({ payload }),\n );\n }\n case ClearSignContextType.TOKEN: {\n return await this._api.sendCommand(\n new ProvideTokenInformationCommand({ payload }),\n );\n }\n case ClearSignContextType.TRANSACTION_INFO: {\n const transactionInfoResult =\n await this._sendPayloadInChunksTaskFactory(this._api, {\n payload,\n commandFactory: (args) =>\n new ProvideTransactionInformationCommand({\n data: args.chunkedData,\n isFirstChunk: args.isFirstChunk,\n }),\n }).run();\n\n return transactionInfoResult;\n }\n case ClearSignContextType.TRUSTED_NAME: {\n return this._sendPayloadInChunksTaskFactory(this._api, {\n payload,\n commandFactory: (args) =>\n new ProvideTrustedNameCommand({\n data: args.chunkedData,\n isFirstChunk: args.isFirstChunk,\n }),\n }).run();\n }\n case ClearSignContextType.ENUM:\n return this._sendPayloadInChunksTaskFactory(this._api, {\n payload,\n commandFactory: (args) =>\n new ProvideEnumCommand({\n data: args.chunkedData,\n isFirstChunk: args.isFirstChunk,\n }),\n }).run();\n case ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION:\n return this._sendPayloadInChunksTaskFactory(this._api, {\n payload,\n commandFactory: (args) =>\n new ProvideTransactionFieldDescriptionCommand({\n data: args.chunkedData,\n isFirstChunk: args.isFirstChunk,\n }),\n }).run();\n case ClearSignContextType.WEB3_CHECK:\n return this._sendPayloadInChunksTaskFactory(this._api, {\n payload,\n commandFactory: (args) =>\n new ProvideWeb3CheckCommand({\n payload: args.chunkedData,\n isFirstChunk: args.isFirstChunk,\n }),\n }).run();\n case ClearSignContextType.PROXY_DELEGATE_CALL:\n return this._sendPayloadInChunksTaskFactory(this._api, {\n payload,\n commandFactory: (args) =>\n new ProvideProxyInfoCommand({\n data: args.chunkedData,\n isFirstChunk: args.isFirstChunk,\n }),\n }).run();\n case ClearSignContextType.DYNAMIC_NETWORK:\n // Dynamic network configuration uses the existing ProvideNetworkConfiguration command\n // but is provided as part of the context flow\n return this._sendPayloadInChunksTaskFactory(this._api, {\n payload,\n commandFactory: (args) =>\n new ProvideNetworkConfigurationCommand({\n data: args.chunkedData,\n isFirstChunk: args.isFirstChunk,\n configurationType: NetworkConfigurationType.CONFIGURATION,\n }),\n }).run();\n case ClearSignContextType.DYNAMIC_NETWORK_ICON: {\n return this._sendPayloadInChunksTaskFactory(this._api, {\n payload,\n commandFactory: (args) =>\n new ProvideNetworkConfigurationCommand({\n data: args.chunkedData,\n isFirstChunk: args.isFirstChunk,\n configurationType: NetworkConfigurationType.ICON,\n }),\n withPayloadLength: false,\n }).run();\n }\n default: {\n const uncoveredType: never = type;\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n `The context type [${uncoveredType}] is not covered`,\n ),\n });\n }\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "AAAA,OAEE,wBAAAA,MACK,2BACP,OACE,oBAAAC,EAGA,wBAAAC,EAEA,0BAAAC,EACA,0BAAAC,EACA,0BAAAC,MACK,kCACP,OAAS,uBAAAC,MAA2B,yBACpC,OAAsB,QAAAC,EAAM,SAAAC,MAAa,YAEzC,OAAS,sBAAAC,MAA0B,kDACnC,OACE,4BAAAC,EACA,sCAAAC,MACK,kEACP,OAAS,gCAAAC,MAAoC,4DAC7C,OAAS,2BAAAC,MAA+B,uDACxC,OAAS,kCAAAC,MAAsC,8DAC/C,OAAS,6CAAAC,MAAiD,yEAC1D,OAAS,wCAAAC,MAA4C,oEACrD,OAAS,6BAAAC,MAAiC,yDAC1C,OAAS,2BAAAC,MAA+B,uDACxC,OAAS,4BAAAC,MAAgC,wDACzC,OAAS,oBAAAC,MAAwB,gDACjC,OAAS,2BAAAC,MAA+B,uDAIxC,OACE,2BAAAC,MAEK,4BACP,OACE,2BAAAC,MAEK,
|
|
4
|
+
"sourcesContent": ["import {\n type ClearSignContextSuccess,\n ClearSignContextType,\n} from \"@ledgerhq/context-module\";\nimport {\n ByteArrayBuilder,\n type CommandErrorResult,\n type CommandResult,\n CommandResultFactory,\n type InternalApi,\n InvalidStatusWordError,\n isSuccessCommandResult,\n LoadCertificateCommand,\n} from \"@ledgerhq/device-management-kit\";\nimport { DerivationPathUtils } from \"@ledgerhq/signer-utils\";\nimport { type Either, Left, Right } from \"purify-ts\";\n\nimport { ProvideEnumCommand } from \"@internal/app-binder/command/ProvideEnumCommand\";\nimport {\n NetworkConfigurationType,\n ProvideNetworkConfigurationCommand,\n} from \"@internal/app-binder/command/ProvideNetworkConfigurationCommand\";\nimport { ProvideNFTInformationCommand } from \"@internal/app-binder/command/ProvideNFTInformationCommand\";\nimport { ProvideProxyInfoCommand } from \"@internal/app-binder/command/ProvideProxyInfoCommand\";\nimport { ProvideTokenInformationCommand } from \"@internal/app-binder/command/ProvideTokenInformationCommand\";\nimport { ProvideTransactionFieldDescriptionCommand } from \"@internal/app-binder/command/ProvideTransactionFieldDescriptionCommand\";\nimport { ProvideTransactionInformationCommand } from \"@internal/app-binder/command/ProvideTransactionInformationCommand\";\nimport { ProvideTrustedNameCommand } from \"@internal/app-binder/command/ProvideTrustedNameCommand\";\nimport { ProvideWeb3CheckCommand } from \"@internal/app-binder/command/ProvideWeb3CheckCommand\";\nimport { SetExternalPluginCommand } from \"@internal/app-binder/command/SetExternalPluginCommand\";\nimport { SetPluginCommand } from \"@internal/app-binder/command/SetPluginCommand\";\nimport { StoreTransactionCommand } from \"@internal/app-binder/command/StoreTransactionCommand\";\nimport { type EthErrorCodes } from \"@internal/app-binder/command/utils/ethAppErrors\";\n\nimport { type ContextWithSubContexts } from \"./BuildFullContextsTask\";\nimport {\n SendCommandInChunksTask,\n type SendCommandInChunksTaskArgs,\n} from \"./SendCommandInChunksTask\";\nimport {\n SendPayloadInChunksTask,\n type SendPayloadInChunksTaskArgs,\n} from \"./SendPayloadInChunksTask\";\n\nexport type ProvideContextsTaskArgs = {\n /**\n * The list of clear sign context with subcontexts callback to provide.\n */\n contexts: ContextWithSubContexts[];\n /**\n * The derivation path to provide.\n */\n derivationPath: string;\n /**\n * The serialized transaction to provide.\n * This parameter is optional in the case there is no transaction at all, for instance\n * if there is only a standalone calldata embedded in a message.\n */\n serializedTransaction?: Uint8Array;\n};\n\nexport type ProvideContextsTaskResult = Either<\n CommandErrorResult<EthErrorCodes>,\n void\n>;\n\n/**\n * This task is responsible for providing the transaction context to the device.\n * It will send the subcontexts callbacks in order and finish with the context.\n */\nexport class ProvideContextsTask {\n constructor(\n private _api: InternalApi,\n private _args: ProvideContextsTaskArgs,\n private _sendPayloadInChunksTaskFactory = (\n api: InternalApi,\n args: SendPayloadInChunksTaskArgs<unknown>,\n ) => new SendPayloadInChunksTask(api, args),\n private _sendCommandInChunksTaskFactory = (\n api: InternalApi,\n args: SendCommandInChunksTaskArgs<unknown>,\n ) => new SendCommandInChunksTask(api, args),\n ) {}\n\n async run(): Promise<ProvideContextsTaskResult> {\n let transactionInfoProvided = false;\n\n for (const { context, subcontextCallbacks } of this._args.contexts) {\n for (const callback of subcontextCallbacks) {\n const subcontext = await callback();\n\n if (subcontext.type === ClearSignContextType.ERROR) {\n // silently ignore error subcontexts\n continue;\n }\n\n const res = await this.provideContext(subcontext);\n if (!isSuccessCommandResult(res)) {\n return Left(res);\n }\n }\n\n if (context.type === ClearSignContextType.PROXY_DELEGATE_CALL) {\n // In this specific case, the context is not valid as the challenge is not valid on the first call\n // the real data is provided in the subcontext callback\n continue;\n }\n\n if (\n !transactionInfoProvided &&\n this._args.serializedTransaction !== undefined &&\n context.type === ClearSignContextType.TRANSACTION_INFO\n ) {\n // Send the serialized transaction for the first TRANSACTION_INFO.\n // All other TRANSACTION_INFO contexts will be ignored as it will be for nested calldata.\n transactionInfoProvided = true;\n\n const paths = DerivationPathUtils.splitPath(this._args.derivationPath);\n const builder = new ByteArrayBuilder();\n builder.add8BitUIntToData(paths.length);\n paths.forEach((path) => {\n builder.add32BitUIntToData(path);\n });\n builder.addBufferToData(this._args.serializedTransaction);\n await this._sendCommandInChunksTaskFactory(this._api, {\n data: builder.build(),\n commandFactory: (args) =>\n new StoreTransactionCommand({\n serializedTransaction: args.chunkedData,\n isFirstChunk: args.isFirstChunk,\n }),\n }).run();\n }\n\n const res = await this.provideContext(context);\n if (!isSuccessCommandResult(res)) {\n return Left(res);\n }\n }\n\n return Right(void 0);\n }\n\n /**\n * This method will send the context to the device.\n *\n * @param context The clear sign context to provide.\n * @returns A promise that resolves when the command is sent.\n */\n async provideContext({\n type,\n payload,\n certificate,\n }: ClearSignContextSuccess): Promise<CommandResult<unknown, EthErrorCodes>> {\n // if a certificate is provided, we load it before sending the command\n if (certificate) {\n await this._api.sendCommand(\n new LoadCertificateCommand({\n keyUsage: certificate.keyUsageNumber,\n certificate: certificate.payload,\n }),\n );\n }\n\n switch (type) {\n case ClearSignContextType.PLUGIN: {\n return await this._api.sendCommand(new SetPluginCommand({ payload }));\n }\n case ClearSignContextType.EXTERNAL_PLUGIN: {\n return await this._api.sendCommand(\n new SetExternalPluginCommand({ payload }),\n );\n }\n case ClearSignContextType.NFT: {\n return await this._api.sendCommand(\n new ProvideNFTInformationCommand({ payload }),\n );\n }\n case ClearSignContextType.TOKEN: {\n return await this._api.sendCommand(\n new ProvideTokenInformationCommand({ payload }),\n );\n }\n case ClearSignContextType.TRANSACTION_INFO: {\n const transactionInfoResult =\n await this._sendPayloadInChunksTaskFactory(this._api, {\n payload,\n commandFactory: (args) =>\n new ProvideTransactionInformationCommand({\n data: args.chunkedData,\n isFirstChunk: args.isFirstChunk,\n }),\n }).run();\n\n return transactionInfoResult;\n }\n case ClearSignContextType.TRUSTED_NAME: {\n return this._sendPayloadInChunksTaskFactory(this._api, {\n payload,\n commandFactory: (args) =>\n new ProvideTrustedNameCommand({\n data: args.chunkedData,\n isFirstChunk: args.isFirstChunk,\n }),\n }).run();\n }\n case ClearSignContextType.ENUM:\n return this._sendPayloadInChunksTaskFactory(this._api, {\n payload,\n commandFactory: (args) =>\n new ProvideEnumCommand({\n data: args.chunkedData,\n isFirstChunk: args.isFirstChunk,\n }),\n }).run();\n case ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION:\n return this._sendPayloadInChunksTaskFactory(this._api, {\n payload,\n commandFactory: (args) =>\n new ProvideTransactionFieldDescriptionCommand({\n data: args.chunkedData,\n isFirstChunk: args.isFirstChunk,\n }),\n }).run();\n case ClearSignContextType.WEB3_CHECK:\n return this._sendPayloadInChunksTaskFactory(this._api, {\n payload,\n commandFactory: (args) =>\n new ProvideWeb3CheckCommand({\n payload: args.chunkedData,\n isFirstChunk: args.isFirstChunk,\n }),\n }).run();\n case ClearSignContextType.PROXY_DELEGATE_CALL:\n return this._sendPayloadInChunksTaskFactory(this._api, {\n payload,\n commandFactory: (args) =>\n new ProvideProxyInfoCommand({\n data: args.chunkedData,\n isFirstChunk: args.isFirstChunk,\n }),\n }).run();\n case ClearSignContextType.DYNAMIC_NETWORK:\n // Dynamic network configuration uses the existing ProvideNetworkConfiguration command\n // but is provided as part of the context flow\n return this._sendPayloadInChunksTaskFactory(this._api, {\n payload,\n commandFactory: (args) =>\n new ProvideNetworkConfigurationCommand({\n data: args.chunkedData,\n isFirstChunk: args.isFirstChunk,\n configurationType: NetworkConfigurationType.CONFIGURATION,\n }),\n }).run();\n case ClearSignContextType.DYNAMIC_NETWORK_ICON: {\n return this._sendPayloadInChunksTaskFactory(this._api, {\n payload,\n commandFactory: (args) =>\n new ProvideNetworkConfigurationCommand({\n data: args.chunkedData,\n isFirstChunk: args.isFirstChunk,\n configurationType: NetworkConfigurationType.ICON,\n }),\n withPayloadLength: false,\n }).run();\n }\n default: {\n const uncoveredType: never = type;\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n `The context type [${uncoveredType}] is not covered`,\n ),\n });\n }\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["ClearSignContextType", "ByteArrayBuilder", "CommandResultFactory", "InvalidStatusWordError", "isSuccessCommandResult", "LoadCertificateCommand", "DerivationPathUtils", "Left", "Right", "ProvideEnumCommand", "NetworkConfigurationType", "ProvideNetworkConfigurationCommand", "ProvideNFTInformationCommand", "ProvideProxyInfoCommand", "ProvideTokenInformationCommand", "ProvideTransactionFieldDescriptionCommand", "ProvideTransactionInformationCommand", "ProvideTrustedNameCommand", "ProvideWeb3CheckCommand", "SetExternalPluginCommand", "SetPluginCommand", "StoreTransactionCommand", "SendCommandInChunksTask", "SendPayloadInChunksTask", "ProvideContextsTask", "_api", "_args", "_sendPayloadInChunksTaskFactory", "api", "args", "_sendCommandInChunksTaskFactory", "transactionInfoProvided", "context", "subcontextCallbacks", "callback", "subcontext", "res", "paths", "builder", "path", "type", "payload", "certificate", "uncoveredType"]
|
|
7
7
|
}
|