@ledgerhq/device-signer-kit-ethereum 1.8.0 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +59 -1
- package/lib/cjs/api/SignerEth.js +1 -1
- package/lib/cjs/api/SignerEth.js.map +1 -1
- package/lib/cjs/api/SignerEthBuilder.test.js +1 -1
- package/lib/cjs/api/SignerEthBuilder.test.js.map +2 -2
- package/lib/cjs/api/app-binder/VerifySafeAddressDeviceActionTypes.js +2 -0
- package/lib/cjs/api/app-binder/VerifySafeAddressDeviceActionTypes.js.map +7 -0
- package/lib/cjs/api/model/SafeAddressOptions.js +2 -0
- package/lib/cjs/api/model/SafeAddressOptions.js.map +7 -0
- package/lib/cjs/internal/DefaultSignerEth.js +1 -1
- package/lib/cjs/internal/DefaultSignerEth.js.map +3 -3
- package/lib/cjs/internal/app-binder/EthAppBinder.js +1 -1
- package/lib/cjs/internal/app-binder/EthAppBinder.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/ProvideSafeAccountCommand.js +2 -0
- package/lib/cjs/internal/app-binder/command/ProvideSafeAccountCommand.js.map +7 -0
- package/lib/cjs/internal/app-binder/command/ProvideSafeAccountCommand.test.js +2 -0
- package/lib/cjs/internal/app-binder/command/ProvideSafeAccountCommand.test.js.map +7 -0
- 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/VerifySafeAddress/VerifySafeAddress.js +2 -0
- package/lib/cjs/internal/app-binder/device-action/VerifySafeAddress/VerifySafeAddress.js.map +7 -0
- package/lib/cjs/internal/app-binder/device-action/VerifySafeAddress/VerifySafeAddress.test.js +2 -0
- package/lib/cjs/internal/app-binder/device-action/VerifySafeAddress/VerifySafeAddress.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/BuildBaseContexts.js +1 -1
- package/lib/cjs/internal/app-binder/task/BuildBaseContexts.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/BuildBaseContexts.test.js +1 -1
- package/lib/cjs/internal/app-binder/task/BuildBaseContexts.test.js.map +2 -2
- package/lib/cjs/internal/app-binder/task/BuildSafeAddressContextTask.js +2 -0
- package/lib/cjs/internal/app-binder/task/BuildSafeAddressContextTask.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/BuildSafeAddressContextTask.test.js +2 -0
- package/lib/cjs/internal/app-binder/task/BuildSafeAddressContextTask.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/BuildSubcontextsTask.js +1 -1
- package/lib/cjs/internal/app-binder/task/BuildSubcontextsTask.js.map +2 -2
- package/lib/cjs/internal/app-binder/task/ProvideContextTask.js +2 -0
- package/lib/cjs/internal/app-binder/task/ProvideContextTask.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/ProvideContextTask.test.js +2 -0
- package/lib/cjs/internal/app-binder/task/ProvideContextTask.test.js.map +7 -0
- 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/ProvideTransactionContextsTask.js +2 -0
- package/lib/cjs/internal/app-binder/task/ProvideTransactionContextsTask.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/ProvideTransactionContextsTask.test.js +2 -0
- package/lib/cjs/internal/app-binder/task/ProvideTransactionContextsTask.test.js.map +7 -0
- package/lib/cjs/internal/di.js +1 -1
- package/lib/cjs/internal/di.js.map +3 -3
- package/lib/cjs/internal/safe/di/safeModule.js +2 -0
- package/lib/cjs/internal/safe/di/safeModule.js.map +7 -0
- package/lib/cjs/internal/safe/di/safeModule.test.js +2 -0
- package/lib/cjs/internal/safe/di/safeModule.test.js.map +7 -0
- package/lib/cjs/internal/safe/di/safeTypes.js +2 -0
- package/lib/cjs/internal/safe/di/safeTypes.js.map +7 -0
- package/lib/cjs/internal/safe/use-case/VerifySafeAddressUseCase.js +2 -0
- package/lib/cjs/internal/safe/use-case/VerifySafeAddressUseCase.js.map +7 -0
- package/lib/cjs/internal/safe/use-case/VerifySafeAddressUseCase.test.js +2 -0
- package/lib/cjs/internal/safe/use-case/VerifySafeAddressUseCase.test.js.map +7 -0
- package/lib/cjs/package.json +2 -2
- package/lib/esm/api/SignerEthBuilder.test.js +1 -1
- package/lib/esm/api/SignerEthBuilder.test.js.map +2 -2
- package/lib/esm/api/app-binder/VerifySafeAddressDeviceActionTypes.js +2 -0
- package/lib/esm/api/app-binder/VerifySafeAddressDeviceActionTypes.js.map +7 -0
- package/lib/esm/api/model/SafeAddressOptions.js +1 -0
- package/lib/esm/api/model/SafeAddressOptions.js.map +7 -0
- package/lib/esm/internal/DefaultSignerEth.js +1 -1
- package/lib/esm/internal/DefaultSignerEth.js.map +3 -3
- package/lib/esm/internal/app-binder/EthAppBinder.js +1 -1
- package/lib/esm/internal/app-binder/EthAppBinder.js.map +3 -3
- package/lib/esm/internal/app-binder/command/ProvideSafeAccountCommand.js +2 -0
- package/lib/esm/internal/app-binder/command/ProvideSafeAccountCommand.js.map +7 -0
- package/lib/esm/internal/app-binder/command/ProvideSafeAccountCommand.test.js +2 -0
- package/lib/esm/internal/app-binder/command/ProvideSafeAccountCommand.test.js.map +7 -0
- 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/VerifySafeAddress/VerifySafeAddress.js +2 -0
- package/lib/esm/internal/app-binder/device-action/VerifySafeAddress/VerifySafeAddress.js.map +7 -0
- package/lib/esm/internal/app-binder/device-action/VerifySafeAddress/VerifySafeAddress.test.js +2 -0
- package/lib/esm/internal/app-binder/device-action/VerifySafeAddress/VerifySafeAddress.test.js.map +7 -0
- package/lib/esm/internal/app-binder/task/BuildBaseContexts.js +1 -1
- package/lib/esm/internal/app-binder/task/BuildBaseContexts.js.map +3 -3
- package/lib/esm/internal/app-binder/task/BuildBaseContexts.test.js +1 -1
- package/lib/esm/internal/app-binder/task/BuildBaseContexts.test.js.map +3 -3
- package/lib/esm/internal/app-binder/task/BuildSafeAddressContextTask.js +2 -0
- package/lib/esm/internal/app-binder/task/BuildSafeAddressContextTask.js.map +7 -0
- package/lib/esm/internal/app-binder/task/BuildSafeAddressContextTask.test.js +2 -0
- package/lib/esm/internal/app-binder/task/BuildSafeAddressContextTask.test.js.map +7 -0
- package/lib/esm/internal/app-binder/task/BuildSubcontextsTask.js +1 -1
- package/lib/esm/internal/app-binder/task/BuildSubcontextsTask.js.map +2 -2
- package/lib/esm/internal/app-binder/task/ProvideContextTask.js +2 -0
- package/lib/esm/internal/app-binder/task/ProvideContextTask.js.map +7 -0
- package/lib/esm/internal/app-binder/task/ProvideContextTask.test.js +2 -0
- package/lib/esm/internal/app-binder/task/ProvideContextTask.test.js.map +7 -0
- 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/ProvideTransactionContextsTask.js +2 -0
- package/lib/esm/internal/app-binder/task/ProvideTransactionContextsTask.js.map +7 -0
- package/lib/esm/internal/app-binder/task/ProvideTransactionContextsTask.test.js +2 -0
- package/lib/esm/internal/app-binder/task/ProvideTransactionContextsTask.test.js.map +7 -0
- package/lib/esm/internal/di.js +1 -1
- package/lib/esm/internal/di.js.map +3 -3
- package/lib/esm/internal/safe/di/safeModule.js +2 -0
- package/lib/esm/internal/safe/di/safeModule.js.map +7 -0
- package/lib/esm/internal/safe/di/safeModule.test.js +2 -0
- package/lib/esm/internal/safe/di/safeModule.test.js.map +7 -0
- package/lib/esm/internal/safe/di/safeTypes.js +2 -0
- package/lib/esm/internal/safe/di/safeTypes.js.map +7 -0
- package/lib/esm/internal/safe/use-case/VerifySafeAddressUseCase.js +2 -0
- package/lib/esm/internal/safe/use-case/VerifySafeAddressUseCase.js.map +7 -0
- package/lib/esm/internal/safe/use-case/VerifySafeAddressUseCase.test.js +2 -0
- package/lib/esm/internal/safe/use-case/VerifySafeAddressUseCase.test.js.map +7 -0
- package/lib/esm/package.json +2 -2
- package/lib/types/api/SignerEth.d.ts +3 -0
- package/lib/types/api/SignerEth.d.ts.map +1 -1
- package/lib/types/api/app-binder/VerifySafeAddressDeviceActionTypes.d.ts +30 -0
- package/lib/types/api/app-binder/VerifySafeAddressDeviceActionTypes.d.ts.map +1 -0
- package/lib/types/api/model/SafeAddressOptions.d.ts +5 -0
- package/lib/types/api/model/SafeAddressOptions.d.ts.map +1 -0
- package/lib/types/internal/DefaultSignerEth.d.ts +3 -0
- package/lib/types/internal/DefaultSignerEth.d.ts.map +1 -1
- package/lib/types/internal/app-binder/EthAppBinder.d.ts +6 -0
- package/lib/types/internal/app-binder/EthAppBinder.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/ProvideSafeAccountCommand.d.ts +34 -0
- package/lib/types/internal/app-binder/command/ProvideSafeAccountCommand.d.ts.map +1 -0
- package/lib/types/internal/app-binder/command/ProvideSafeAccountCommand.test.d.ts +2 -0
- package/lib/types/internal/app-binder/command/ProvideSafeAccountCommand.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.d.ts +3 -3
- package/lib/types/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.d.ts.map +1 -1
- package/lib/types/internal/app-binder/device-action/VerifySafeAddress/VerifySafeAddress.d.ts +20 -0
- package/lib/types/internal/app-binder/device-action/VerifySafeAddress/VerifySafeAddress.d.ts.map +1 -0
- package/lib/types/internal/app-binder/device-action/VerifySafeAddress/VerifySafeAddress.test.d.ts +2 -0
- package/lib/types/internal/app-binder/device-action/VerifySafeAddress/VerifySafeAddress.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/BuildBaseContexts.d.ts +3 -1
- package/lib/types/internal/app-binder/task/BuildBaseContexts.d.ts.map +1 -1
- package/lib/types/internal/app-binder/task/BuildSafeAddressContextTask.d.ts +19 -0
- package/lib/types/internal/app-binder/task/BuildSafeAddressContextTask.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/BuildSafeAddressContextTask.test.d.ts +2 -0
- package/lib/types/internal/app-binder/task/BuildSafeAddressContextTask.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/BuildSubcontextsTask.d.ts.map +1 -1
- package/lib/types/internal/app-binder/task/ProvideContextTask.d.ts +22 -0
- package/lib/types/internal/app-binder/task/ProvideContextTask.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/ProvideContextTask.test.d.ts +2 -0
- package/lib/types/internal/app-binder/task/ProvideContextTask.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/ProvideEIP712ContextTask.d.ts +2 -2
- package/lib/types/internal/app-binder/task/ProvideEIP712ContextTask.d.ts.map +1 -1
- package/lib/types/internal/app-binder/task/ProvideTransactionContextsTask.d.ts +36 -0
- package/lib/types/internal/app-binder/task/ProvideTransactionContextsTask.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/ProvideTransactionContextsTask.test.d.ts +2 -0
- package/lib/types/internal/app-binder/task/ProvideTransactionContextsTask.test.d.ts.map +1 -0
- package/lib/types/internal/di.d.ts.map +1 -1
- package/lib/types/internal/safe/di/safeModule.d.ts +3 -0
- package/lib/types/internal/safe/di/safeModule.d.ts.map +1 -0
- package/lib/types/internal/safe/di/safeModule.test.d.ts +2 -0
- package/lib/types/internal/safe/di/safeModule.test.d.ts.map +1 -0
- package/lib/types/internal/safe/di/safeTypes.d.ts +4 -0
- package/lib/types/internal/safe/di/safeTypes.d.ts.map +1 -0
- package/lib/types/internal/safe/use-case/VerifySafeAddressUseCase.d.ts +9 -0
- package/lib/types/internal/safe/use-case/VerifySafeAddressUseCase.d.ts.map +1 -0
- package/lib/types/internal/safe/use-case/VerifySafeAddressUseCase.test.d.ts +2 -0
- package/lib/types/internal/safe/use-case/VerifySafeAddressUseCase.test.d.ts.map +1 -0
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +6 -6
- package/lib/cjs/internal/app-binder/task/ProvideContextsTask.js +0 -2
- package/lib/cjs/internal/app-binder/task/ProvideContextsTask.js.map +0 -7
- package/lib/cjs/internal/app-binder/task/ProvideContextsTask.test.js +0 -2
- package/lib/cjs/internal/app-binder/task/ProvideContextsTask.test.js.map +0 -7
- package/lib/esm/internal/app-binder/task/ProvideContextsTask.js +0 -2
- package/lib/esm/internal/app-binder/task/ProvideContextsTask.js.map +0 -7
- package/lib/esm/internal/app-binder/task/ProvideContextsTask.test.js +0 -2
- package/lib/esm/internal/app-binder/task/ProvideContextsTask.test.js.map +0 -7
- package/lib/types/internal/app-binder/task/ProvideContextsTask.d.ts +0 -44
- package/lib/types/internal/app-binder/task/ProvideContextsTask.d.ts.map +0 -1
- package/lib/types/internal/app-binder/task/ProvideContextsTask.test.d.ts +0 -2
- package/lib/types/internal/app-binder/task/ProvideContextsTask.test.d.ts.map +0 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/task/BuildSafeAddressContextTask.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n type ClearSignContextSuccess,\n ClearSignContextType,\n type ContextModule,\n} from \"@ledgerhq/context-module\";\nimport {\n type DeviceModelId,\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type SafeAddressOptions } from \"@api/model/SafeAddressOptions\";\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\n\nexport type BuildSafeAddressContextTaskArgs = {\n readonly contextModule: ContextModule;\n readonly safeContractAddress: string;\n readonly options: SafeAddressOptions;\n readonly deviceModelId: DeviceModelId;\n};\n\nexport type BuildSafeAddressContextTaskResult = {\n readonly clearSignContexts: ClearSignContextSuccess[];\n};\n\nexport class BuildSafeAddressContextTask {\n constructor(\n private readonly _api: InternalApi,\n private readonly _args: BuildSafeAddressContextTaskArgs,\n ) {}\n\n async run(): Promise<BuildSafeAddressContextTaskResult> {\n const challengeResponse = await this._api.sendCommand(\n new GetChallengeCommand(),\n );\n\n if (!isSuccessCommandResult(challengeResponse)) {\n throw new Error(\"Failed to get challenge\");\n }\n\n const challenge = challengeResponse.data.challenge;\n\n const contexts = await this._args.contextModule.getContexts(\n {\n safeContractAddress: this._args.safeContractAddress,\n chainId: this._args.options.chainId,\n deviceModelId: this._args.deviceModelId,\n challenge,\n },\n [ClearSignContextType.SAFE, ClearSignContextType.SIGNER],\n );\n\n contexts.forEach((context) => {\n if (context.type === ClearSignContextType.ERROR) {\n throw new Error(context.error.message);\n }\n });\n\n // should contain one SAFE and one SIGNER context\n if (\n contexts.length !== 2 ||\n contexts.find((context) => context.type === ClearSignContextType.SAFE) ===\n undefined ||\n contexts.find(\n (context) => context.type === ClearSignContextType.SIGNER,\n ) === undefined\n ) {\n throw new Error(\"Invalid safe address contexts\");\n }\n\n return {\n clearSignContexts: contexts as ClearSignContextSuccess[],\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iCAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAIO,oCACPC,EAIO,2CAGPC,EAAoC,4DAa7B,MAAMJ,CAA4B,CACvC,YACmBK,EACAC,EACjB,CAFiB,UAAAD,EACA,WAAAC,CAChB,CAEH,MAAM,KAAkD,CACtD,MAAMC,EAAoB,MAAM,KAAK,KAAK,YACxC,IAAI,qBACN,EAEA,GAAI,IAAC,0BAAuBA,CAAiB,EAC3C,MAAM,IAAI,MAAM,yBAAyB,EAG3C,MAAMC,EAAYD,EAAkB,KAAK,UAEnCE,EAAW,MAAM,KAAK,MAAM,cAAc,YAC9C,CACE,oBAAqB,KAAK,MAAM,oBAChC,QAAS,KAAK,MAAM,QAAQ,QAC5B,cAAe,KAAK,MAAM,cAC1B,UAAAD,CACF,EACA,CAAC,uBAAqB,KAAM,uBAAqB,MAAM,CACzD,EASA,GAPAC,EAAS,QAASC,GAAY,CAC5B,GAAIA,EAAQ,OAAS,uBAAqB,MACxC,MAAM,IAAI,MAAMA,EAAQ,MAAM,OAAO,CAEzC,CAAC,EAICD,EAAS,SAAW,GACpBA,EAAS,KAAMC,GAAYA,EAAQ,OAAS,uBAAqB,IAAI,IACnE,QACFD,EAAS,KACNC,GAAYA,EAAQ,OAAS,uBAAqB,MACrD,IAAM,OAEN,MAAM,IAAI,MAAM,+BAA+B,EAGjD,MAAO,CACL,kBAAmBD,CACrB,CACF,CACF",
|
|
6
|
+
"names": ["BuildSafeAddressContextTask_exports", "__export", "BuildSafeAddressContextTask", "__toCommonJS", "import_context_module", "import_device_management_kit", "import_GetChallengeCommand", "_api", "_args", "challengeResponse", "challenge", "contexts", "context"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var a=require("@ledgerhq/context-module"),n=require("@ledgerhq/device-management-kit"),S=require("../../app-binder/device-action/__test-utils__/makeInternalApi"),l=require("./BuildSafeAddressContextTask");describe("BuildSafeAddressContextTask",()=>{const o=(0,S.makeDeviceActionInternalApiMock)(),e={getContexts:vi.fn(),getFieldContext:vi.fn(),getTypedDataFilters:vi.fn(),getWeb3Checks:vi.fn(),getSolanaContext:vi.fn()},p="0x12345678",d="0x1234567890123456789012345678901234567890",r=1,i=(0,n.CommandResultFactory)({data:{challenge:p}}),h=(0,n.CommandResultFactory)({data:void 0,error:{}}),C={type:a.ClearSignContextType.SAFE,payload:"safe_payload"},x={type:a.ClearSignContextType.SIGNER,payload:"signer_payload"};beforeEach(()=>{vi.resetAllMocks()}),describe("run",()=>{it("should successfully build safe address contexts with valid SAFE and SIGNER contexts",async()=>{const t={contextModule:e,safeContractAddress:d,options:{chainId:r},deviceModelId:n.DeviceModelId.FLEX};o.sendCommand.mockResolvedValue(i),e.getContexts=vi.fn().mockResolvedValue([C,x]);const c=await new l.BuildSafeAddressContextTask(o,t).run();expect(c).toEqual({clearSignContexts:[C,x]}),expect(o.sendCommand).toHaveBeenCalledTimes(1),expect(e.getContexts).toHaveBeenCalledWith({safeContractAddress:d,chainId:r,deviceModelId:n.DeviceModelId.FLEX,challenge:p},[a.ClearSignContextType.SAFE,a.ClearSignContextType.SIGNER])}),it("should include certificates when provided in contexts",async()=>{const t={type:a.ClearSignContextType.SAFE,payload:"safe_payload",certificate:{keyUsageNumber:1,payload:new Uint8Array([1,2,3])}},s={type:a.ClearSignContextType.SIGNER,payload:"signer_payload",certificate:{keyUsageNumber:2,payload:new Uint8Array([4,5,6])}},c={contextModule:e,safeContractAddress:d,options:{chainId:r},deviceModelId:n.DeviceModelId.FLEX};o.sendCommand.mockResolvedValue(i),e.getContexts=vi.fn().mockResolvedValue([t,s]);const g=await new l.BuildSafeAddressContextTask(o,c).run();expect(g).toEqual({clearSignContexts:[t,s]})})}),describe("error handling",()=>{it("should throw error when GetChallengeCommand fails",async()=>{const t={contextModule:e,safeContractAddress:d,options:{chainId:r},deviceModelId:n.DeviceModelId.FLEX};o.sendCommand.mockResolvedValue(h);const s=new l.BuildSafeAddressContextTask(o,t);await expect(s.run()).rejects.toThrow("Failed to get challenge")}),it("should throw error when context contains ERROR type",async()=>{const t={type:a.ClearSignContextType.ERROR,error:new Error("Context error")},s={contextModule:e,safeContractAddress:d,options:{chainId:r},deviceModelId:n.DeviceModelId.FLEX};o.sendCommand.mockResolvedValue(i),e.getContexts=vi.fn().mockResolvedValue([t,x]);const c=new l.BuildSafeAddressContextTask(o,s);await expect(c.run()).rejects.toThrow("Context error")}),it("should throw error when only one context is returned",async()=>{const t={contextModule:e,safeContractAddress:d,options:{chainId:r},deviceModelId:n.DeviceModelId.FLEX};o.sendCommand.mockResolvedValue(i),e.getContexts=vi.fn().mockResolvedValue([C]);const s=new l.BuildSafeAddressContextTask(o,t);await expect(s.run()).rejects.toThrow("Invalid safe address contexts")}),it("should throw error when no contexts are returned",async()=>{const t={contextModule:e,safeContractAddress:d,options:{chainId:r},deviceModelId:n.DeviceModelId.FLEX};o.sendCommand.mockResolvedValue(i),e.getContexts=vi.fn().mockResolvedValue([]);const s=new l.BuildSafeAddressContextTask(o,t);await expect(s.run()).rejects.toThrow("Invalid safe address contexts")}),it("should throw error when more than two contexts are returned",async()=>{const t={type:a.ClearSignContextType.TOKEN,payload:"extra_payload"},s={contextModule:e,safeContractAddress:d,options:{chainId:r},deviceModelId:n.DeviceModelId.FLEX};o.sendCommand.mockResolvedValue(i),e.getContexts=vi.fn().mockResolvedValue([C,x,t]);const c=new l.BuildSafeAddressContextTask(o,s);await expect(c.run()).rejects.toThrow("Invalid safe address contexts")}),it("should throw error when SAFE context is missing",async()=>{const t={contextModule:e,safeContractAddress:d,options:{chainId:r},deviceModelId:n.DeviceModelId.FLEX};o.sendCommand.mockResolvedValue(i),e.getContexts=vi.fn().mockResolvedValue([x,x]);const s=new l.BuildSafeAddressContextTask(o,t);await expect(s.run()).rejects.toThrow("Invalid safe address contexts")}),it("should throw error when SIGNER context is missing",async()=>{const t={contextModule:e,safeContractAddress:d,options:{chainId:r},deviceModelId:n.DeviceModelId.FLEX};o.sendCommand.mockResolvedValue(i),e.getContexts=vi.fn().mockResolvedValue([C,C]);const s=new l.BuildSafeAddressContextTask(o,t);await expect(s.run()).rejects.toThrow("Invalid safe address contexts")}),it("should throw error when contexts are of wrong types",async()=>{const t={type:a.ClearSignContextType.TOKEN,payload:"token_payload"},s={type:a.ClearSignContextType.NFT,payload:"nft_payload"},c={contextModule:e,safeContractAddress:d,options:{chainId:r},deviceModelId:n.DeviceModelId.FLEX};o.sendCommand.mockResolvedValue(i),e.getContexts=vi.fn().mockResolvedValue([t,s]);const u=new l.BuildSafeAddressContextTask(o,c);await expect(u.run()).rejects.toThrow("Invalid safe address contexts")}),it("should throw error with multiple ERROR contexts",async()=>{const t={type:a.ClearSignContextType.ERROR,error:new Error("First error")},s={type:a.ClearSignContextType.ERROR,error:new Error("Second error")},c={contextModule:e,safeContractAddress:d,options:{chainId:r},deviceModelId:n.DeviceModelId.FLEX};o.sendCommand.mockResolvedValue(i),e.getContexts=vi.fn().mockResolvedValue([t,s]);const u=new l.BuildSafeAddressContextTask(o,c);await expect(u.run()).rejects.toThrow("First error")})}),describe("device model variants",()=>{it.each([[n.DeviceModelId.NANO_S,"Nano S"],[n.DeviceModelId.NANO_SP,"Nano S Plus"],[n.DeviceModelId.NANO_X,"Nano X"],[n.DeviceModelId.FLEX,"Flex"],[n.DeviceModelId.STAX,"Stax"]])("should successfully build contexts for %s device",async(t,s)=>{const c={contextModule:e,safeContractAddress:d,options:{chainId:r},deviceModelId:t};o.sendCommand.mockResolvedValue(i),e.getContexts=vi.fn().mockResolvedValue([C,x]);const g=await new l.BuildSafeAddressContextTask(o,c).run();expect(g).toEqual({clearSignContexts:[C,x]}),expect(e.getContexts).toHaveBeenCalledWith(expect.objectContaining({deviceModelId:t}),[a.ClearSignContextType.SAFE,a.ClearSignContextType.SIGNER])})}),describe("challenge handling",()=>{it("should pass the correct challenge to contextModule",async()=>{const t="0xabcdef12",s={contextModule:e,safeContractAddress:d,options:{chainId:r},deviceModelId:n.DeviceModelId.FLEX};o.sendCommand.mockResolvedValue((0,n.CommandResultFactory)({data:{challenge:t}})),e.getContexts=vi.fn().mockResolvedValue([C,x]),await new l.BuildSafeAddressContextTask(o,s).run(),expect(e.getContexts).toHaveBeenCalledWith(expect.objectContaining({challenge:t}),[a.ClearSignContextType.SAFE,a.ClearSignContextType.SIGNER])})})});
|
|
2
|
+
//# sourceMappingURL=BuildSafeAddressContextTask.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/task/BuildSafeAddressContextTask.test.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n type ClearSignContext,\n type ClearSignContextSuccess,\n ClearSignContextType,\n type ContextModule,\n} from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n DeviceModelId,\n type UnknownDeviceExchangeError,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\n\nimport {\n BuildSafeAddressContextTask,\n type BuildSafeAddressContextTaskArgs,\n} from \"./BuildSafeAddressContextTask\";\n\ndescribe(\"BuildSafeAddressContextTask\", () => {\n const apiMock = makeDeviceActionInternalApiMock();\n const contextModuleMock: ContextModule = {\n getContexts: vi.fn(),\n getFieldContext: vi.fn(),\n getTypedDataFilters: vi.fn(),\n getWeb3Checks: vi.fn(),\n getSolanaContext: vi.fn(),\n };\n\n const TEST_CHALLENGE = \"0x12345678\";\n const TEST_SAFE_ADDRESS = \"0x1234567890123456789012345678901234567890\";\n const TEST_CHAIN_ID = 1;\n\n const successChallengeResult = CommandResultFactory({\n data: { challenge: TEST_CHALLENGE },\n });\n\n const errorResult = CommandResultFactory({\n data: undefined,\n error: {} as UnknownDeviceExchangeError,\n });\n\n const validSafeContext: ClearSignContextSuccess<ClearSignContextType.SAFE> = {\n type: ClearSignContextType.SAFE,\n payload: \"safe_payload\",\n };\n\n const validSignerContext: ClearSignContextSuccess<ClearSignContextType.SIGNER> =\n {\n type: ClearSignContextType.SIGNER,\n payload: \"signer_payload\",\n };\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n describe(\"run\", () => {\n it(\"should successfully build safe address contexts with valid SAFE and SIGNER contexts\", async () => {\n // GIVEN\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([validSafeContext, validSignerContext]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n const result = await task.run();\n\n // THEN\n expect(result).toEqual({\n clearSignContexts: [validSafeContext, validSignerContext],\n });\n expect(apiMock.sendCommand).toHaveBeenCalledTimes(1);\n expect(contextModuleMock.getContexts).toHaveBeenCalledWith(\n {\n safeContractAddress: TEST_SAFE_ADDRESS,\n chainId: TEST_CHAIN_ID,\n deviceModelId: DeviceModelId.FLEX,\n challenge: TEST_CHALLENGE,\n },\n [ClearSignContextType.SAFE, ClearSignContextType.SIGNER],\n );\n });\n\n it(\"should include certificates when provided in contexts\", async () => {\n // GIVEN\n const safeContextWithCert: ClearSignContextSuccess<ClearSignContextType.SAFE> =\n {\n type: ClearSignContextType.SAFE,\n payload: \"safe_payload\",\n certificate: {\n keyUsageNumber: 1,\n payload: new Uint8Array([1, 2, 3]),\n },\n };\n const signerContextWithCert: ClearSignContextSuccess<ClearSignContextType.SIGNER> =\n {\n type: ClearSignContextType.SIGNER,\n payload: \"signer_payload\",\n certificate: {\n keyUsageNumber: 2,\n payload: new Uint8Array([4, 5, 6]),\n },\n };\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([safeContextWithCert, signerContextWithCert]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n const result = await task.run();\n\n // THEN\n expect(result).toEqual({\n clearSignContexts: [safeContextWithCert, signerContextWithCert],\n });\n });\n });\n\n describe(\"error handling\", () => {\n it(\"should throw error when GetChallengeCommand fails\", async () => {\n // GIVEN\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(errorResult);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n\n // THEN\n await expect(task.run()).rejects.toThrow(\"Failed to get challenge\");\n });\n\n it(\"should throw error when context contains ERROR type\", async () => {\n // GIVEN\n const errorContext: ClearSignContext = {\n type: ClearSignContextType.ERROR,\n error: new Error(\"Context error\"),\n };\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([errorContext, validSignerContext]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n\n // THEN\n await expect(task.run()).rejects.toThrow(\"Context error\");\n });\n\n it(\"should throw error when only one context is returned\", async () => {\n // GIVEN\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([validSafeContext]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n\n // THEN\n await expect(task.run()).rejects.toThrow(\"Invalid safe address contexts\");\n });\n\n it(\"should throw error when no contexts are returned\", async () => {\n // GIVEN\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi.fn().mockResolvedValue([]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n\n // THEN\n await expect(task.run()).rejects.toThrow(\"Invalid safe address contexts\");\n });\n\n it(\"should throw error when more than two contexts are returned\", async () => {\n // GIVEN\n const extraContext: ClearSignContextSuccess<ClearSignContextType.TOKEN> =\n {\n type: ClearSignContextType.TOKEN,\n payload: \"extra_payload\",\n };\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([\n validSafeContext,\n validSignerContext,\n extraContext,\n ]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n\n // THEN\n await expect(task.run()).rejects.toThrow(\"Invalid safe address contexts\");\n });\n\n it(\"should throw error when SAFE context is missing\", async () => {\n // GIVEN\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([validSignerContext, validSignerContext]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n\n // THEN\n await expect(task.run()).rejects.toThrow(\"Invalid safe address contexts\");\n });\n\n it(\"should throw error when SIGNER context is missing\", async () => {\n // GIVEN\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([validSafeContext, validSafeContext]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n\n // THEN\n await expect(task.run()).rejects.toThrow(\"Invalid safe address contexts\");\n });\n\n it(\"should throw error when contexts are of wrong types\", async () => {\n // GIVEN\n const wrongContext1: ClearSignContextSuccess<ClearSignContextType.TOKEN> =\n {\n type: ClearSignContextType.TOKEN,\n payload: \"token_payload\",\n };\n const wrongContext2: ClearSignContextSuccess<ClearSignContextType.NFT> = {\n type: ClearSignContextType.NFT,\n payload: \"nft_payload\",\n };\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([wrongContext1, wrongContext2]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n\n // THEN\n await expect(task.run()).rejects.toThrow(\"Invalid safe address contexts\");\n });\n\n it(\"should throw error with multiple ERROR contexts\", async () => {\n // GIVEN\n const errorContext1: ClearSignContext = {\n type: ClearSignContextType.ERROR,\n error: new Error(\"First error\"),\n };\n const errorContext2: ClearSignContext = {\n type: ClearSignContextType.ERROR,\n error: new Error(\"Second error\"),\n };\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([errorContext1, errorContext2]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n\n // THEN\n await expect(task.run()).rejects.toThrow(\"First error\");\n });\n });\n\n describe(\"device model variants\", () => {\n it.each([\n [DeviceModelId.NANO_S, \"Nano S\"],\n [DeviceModelId.NANO_SP, \"Nano S Plus\"],\n [DeviceModelId.NANO_X, \"Nano X\"],\n [DeviceModelId.FLEX, \"Flex\"],\n [DeviceModelId.STAX, \"Stax\"],\n ])(\n \"should successfully build contexts for %s device\",\n async (deviceModelId, _deviceName) => {\n // GIVEN\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([validSafeContext, validSignerContext]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n const result = await task.run();\n\n // THEN\n expect(result).toEqual({\n clearSignContexts: [validSafeContext, validSignerContext],\n });\n expect(contextModuleMock.getContexts).toHaveBeenCalledWith(\n expect.objectContaining({\n deviceModelId,\n }),\n [ClearSignContextType.SAFE, ClearSignContextType.SIGNER],\n );\n },\n );\n });\n\n describe(\"challenge handling\", () => {\n it(\"should pass the correct challenge to contextModule\", async () => {\n // GIVEN\n const customChallenge = \"0xabcdef12\";\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({\n data: { challenge: customChallenge },\n }),\n );\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([validSafeContext, validSignerContext]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n await task.run();\n\n // THEN\n expect(contextModuleMock.getContexts).toHaveBeenCalledWith(\n expect.objectContaining({\n challenge: customChallenge,\n }),\n [ClearSignContextType.SAFE, ClearSignContextType.SIGNER],\n );\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_context_module", "import_device_management_kit", "import_makeInternalApi", "import_BuildSafeAddressContextTask", "apiMock", "contextModuleMock", "TEST_CHALLENGE", "TEST_SAFE_ADDRESS", "TEST_CHAIN_ID", "successChallengeResult", "errorResult", "validSafeContext", "validSignerContext", "args", "result", "safeContextWithCert", "signerContextWithCert", "task", "errorContext", "extraContext", "wrongContext1", "wrongContext2", "errorContext1", "errorContext2", "deviceModelId", "_deviceName", "customChallenge"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var d=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var b=Object.prototype.hasOwnProperty;var p=(r,e)=>{for(var n in e)d(r,n,{get:e[n],enumerable:!0})},h=(r,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of g(e))!b.call(r,a)&&a!==n&&d(r,a,{get:()=>e[a],enumerable:!(s=C(e,a))||s.enumerable});return r};var S=r=>h(d({},"__esModule",{value:!0}),r);var y={};p(y,{BuildSubcontextsTask:()=>T});module.exports=S(y);var t=require("@ledgerhq/context-module"),c=require("@ledgerhq/device-management-kit"),x=require("../../app-binder/command/GetChallengeCommand");class T{constructor(e,n){this.api=e;this.args=n}run(){const e=this.args.context,n=e.type;switch(n){case t.ClearSignContextType.TRANSACTION_INFO:case t.ClearSignContextType.WEB3_CHECK:case t.ClearSignContextType.PLUGIN:case t.ClearSignContextType.EXTERNAL_PLUGIN:case t.ClearSignContextType.DYNAMIC_NETWORK:case t.ClearSignContextType.DYNAMIC_NETWORK_ICON:case t.ClearSignContextType.ENUM:case t.ClearSignContextType.TRUSTED_NAME:case t.ClearSignContextType.TOKEN:case t.ClearSignContextType.NFT:return{subcontextCallbacks:[]};case t.ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION:return{subcontextCallbacks:e.reference?this._getSubcontextsFromReference(e.reference):[]};case t.ClearSignContextType.PROXY_INFO:return{subcontextCallbacks:this._getSubcontextFromProxy(e)};default:{const s=n;throw new Error(`Uncovered type: ${s}`)}}}_getSubcontextsFromReference(e){const n=e.type;switch(n){case t.ClearSignContextReferenceType.TOKEN:case t.ClearSignContextReferenceType.NFT:return this._getSubcontextsFromTokenOrNftReference(e);case t.ClearSignContextReferenceType.ENUM:return this._getSubcontextsFromEnumReference(e);case t.ClearSignContextReferenceType.TRUSTED_NAME:return this._getSubcontextsFromTrustedNameReference(e);case t.ClearSignContextReferenceType.CALLDATA:return[];default:{const s=n;throw new Error(`Uncovered reference type: ${s}`)}}}_getSubcontextsFromTokenOrNftReference(e){if(e.value!==void 0){const s={chainId:this.args.subset.chainId,address:e.value},a=e.type===t.ClearSignContextReferenceType.TOKEN?t.ClearSignContextType.TOKEN:t.ClearSignContextType.NFT;return[()=>this.args.contextModule.getFieldContext(s,a)]}const n=[];if(e.valuePath!==void 0){const s=this.args.transactionParser.extractValue(this.args.subset,e.valuePath).orDefault([]);for(const a of s){const o=(0,c.bufferToHexaString)(a.slice(Math.max(0,a.length-20))),l=e.type===t.ClearSignContextReferenceType.TOKEN?t.ClearSignContextType.TOKEN:t.ClearSignContextType.NFT;n.push(()=>this.args.contextModule.getFieldContext({chainId:this.args.subset.chainId,address:o},l))}}return n}_getSubcontextsFromEnumReference(e){const n=[];if(!e.valuePath)return n;const s=this.args.transactionParser.extractValue(this.args.subset,e.valuePath).orDefault([]);for(const a of s){const o=a[a.length-1];if(o===void 0)continue;const i=this.args.contextOptional.filter(u=>u.type===t.ClearSignContextType.ENUM).find(u=>u.value===o&&u.id===e.id);i&&n.push(()=>Promise.resolve(i))}return n}_getSubcontextsFromTrustedNameReference(e){const n=[];if(!e.valuePath)return n;const s=this.args.transactionParser.extractValue(this.args.subset,e.valuePath).orDefault([]);for(const a of s)n.push(async()=>{const o=(0,c.bufferToHexaString)(a.slice(Math.max(0,a.length-20))),l=await this.api.sendCommand(new x.GetChallengeCommand);return(0,c.isSuccessCommandResult)(l)?await this.args.contextModule.getFieldContext({chainId:this.args.subset.chainId,address:o,challenge:l.data.challenge,types:e.types,sources:e.sources,deviceModelId:this.args.deviceModelId},t.ClearSignContextType.TRUSTED_NAME):{type:t.ClearSignContextType.ERROR,error:new Error("Failed to get challenge")}});return n}_getSubcontextFromProxy(e){return[async()=>{const n=await this.api.sendCommand(new x.GetChallengeCommand);return(0,c.isSuccessCommandResult)(n)?this.args.subset.to===void 0?{type:t.ClearSignContextType.ERROR,error:new Error("Failed to get proxy address")}:await this.args.contextModule.getFieldContext({chainId:this.args.subset.chainId,proxyAddress:this.args.subset.to,calldata:this.args.subset.data,deviceModelId:this.args.deviceModelId,challenge:n.data.challenge},t.ClearSignContextType.PROXY_INFO):{type:t.ClearSignContextType.ERROR,error:new Error("Failed to get challenge")}}]}}0&&(module.exports={BuildSubcontextsTask});
|
|
1
|
+
"use strict";var d=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var b=Object.prototype.hasOwnProperty;var p=(r,e)=>{for(var n in e)d(r,n,{get:e[n],enumerable:!0})},h=(r,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of g(e))!b.call(r,a)&&a!==n&&d(r,a,{get:()=>e[a],enumerable:!(s=C(e,a))||s.enumerable});return r};var S=r=>h(d({},"__esModule",{value:!0}),r);var y={};p(y,{BuildSubcontextsTask:()=>T});module.exports=S(y);var t=require("@ledgerhq/context-module"),c=require("@ledgerhq/device-management-kit"),x=require("../../app-binder/command/GetChallengeCommand");class T{constructor(e,n){this.api=e;this.args=n}run(){const e=this.args.context,n=e.type;switch(n){case t.ClearSignContextType.TRANSACTION_INFO:case t.ClearSignContextType.WEB3_CHECK:case t.ClearSignContextType.PLUGIN:case t.ClearSignContextType.EXTERNAL_PLUGIN:case t.ClearSignContextType.DYNAMIC_NETWORK:case t.ClearSignContextType.DYNAMIC_NETWORK_ICON:case t.ClearSignContextType.ENUM:case t.ClearSignContextType.TRUSTED_NAME:case t.ClearSignContextType.TOKEN:case t.ClearSignContextType.NFT:case t.ClearSignContextType.SAFE:case t.ClearSignContextType.SIGNER:return{subcontextCallbacks:[]};case t.ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION:return{subcontextCallbacks:e.reference?this._getSubcontextsFromReference(e.reference):[]};case t.ClearSignContextType.PROXY_INFO:return{subcontextCallbacks:this._getSubcontextFromProxy(e)};default:{const s=n;throw new Error(`Uncovered type: ${s}`)}}}_getSubcontextsFromReference(e){const n=e.type;switch(n){case t.ClearSignContextReferenceType.TOKEN:case t.ClearSignContextReferenceType.NFT:return this._getSubcontextsFromTokenOrNftReference(e);case t.ClearSignContextReferenceType.ENUM:return this._getSubcontextsFromEnumReference(e);case t.ClearSignContextReferenceType.TRUSTED_NAME:return this._getSubcontextsFromTrustedNameReference(e);case t.ClearSignContextReferenceType.CALLDATA:return[];default:{const s=n;throw new Error(`Uncovered reference type: ${s}`)}}}_getSubcontextsFromTokenOrNftReference(e){if(e.value!==void 0){const s={chainId:this.args.subset.chainId,address:e.value},a=e.type===t.ClearSignContextReferenceType.TOKEN?t.ClearSignContextType.TOKEN:t.ClearSignContextType.NFT;return[()=>this.args.contextModule.getFieldContext(s,a)]}const n=[];if(e.valuePath!==void 0){const s=this.args.transactionParser.extractValue(this.args.subset,e.valuePath).orDefault([]);for(const a of s){const o=(0,c.bufferToHexaString)(a.slice(Math.max(0,a.length-20))),l=e.type===t.ClearSignContextReferenceType.TOKEN?t.ClearSignContextType.TOKEN:t.ClearSignContextType.NFT;n.push(()=>this.args.contextModule.getFieldContext({chainId:this.args.subset.chainId,address:o},l))}}return n}_getSubcontextsFromEnumReference(e){const n=[];if(!e.valuePath)return n;const s=this.args.transactionParser.extractValue(this.args.subset,e.valuePath).orDefault([]);for(const a of s){const o=a[a.length-1];if(o===void 0)continue;const i=this.args.contextOptional.filter(u=>u.type===t.ClearSignContextType.ENUM).find(u=>u.value===o&&u.id===e.id);i&&n.push(()=>Promise.resolve(i))}return n}_getSubcontextsFromTrustedNameReference(e){const n=[];if(!e.valuePath)return n;const s=this.args.transactionParser.extractValue(this.args.subset,e.valuePath).orDefault([]);for(const a of s)n.push(async()=>{const o=(0,c.bufferToHexaString)(a.slice(Math.max(0,a.length-20))),l=await this.api.sendCommand(new x.GetChallengeCommand);return(0,c.isSuccessCommandResult)(l)?await this.args.contextModule.getFieldContext({chainId:this.args.subset.chainId,address:o,challenge:l.data.challenge,types:e.types,sources:e.sources,deviceModelId:this.args.deviceModelId},t.ClearSignContextType.TRUSTED_NAME):{type:t.ClearSignContextType.ERROR,error:new Error("Failed to get challenge")}});return n}_getSubcontextFromProxy(e){return[async()=>{const n=await this.api.sendCommand(new x.GetChallengeCommand);return(0,c.isSuccessCommandResult)(n)?this.args.subset.to===void 0?{type:t.ClearSignContextType.ERROR,error:new Error("Failed to get proxy address")}:await this.args.contextModule.getFieldContext({chainId:this.args.subset.chainId,proxyAddress:this.args.subset.to,calldata:this.args.subset.data,deviceModelId:this.args.deviceModelId,challenge:n.data.challenge},t.ClearSignContextType.PROXY_INFO):{type:t.ClearSignContextType.ERROR,error:new Error("Failed to get challenge")}}]}}0&&(module.exports={BuildSubcontextsTask});
|
|
2
2
|
//# sourceMappingURL=BuildSubcontextsTask.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/task/BuildSubcontextsTask.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type ClearSignContext,\n type ClearSignContextReference,\n ClearSignContextReferenceType,\n type ClearSignContextSuccess,\n ClearSignContextType,\n type ContextModule,\n type TransactionSubset,\n} from \"@ledgerhq/context-module\";\nimport {\n bufferToHexaString,\n type DeviceModelId,\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\nimport { type TransactionParserService } from \"@internal/transaction/service/parser/TransactionParserService\";\n\nexport type BuildSubcontextsTaskArgs = {\n readonly context: ClearSignContextSuccess;\n readonly contextOptional: ClearSignContextSuccess[];\n readonly transactionParser: TransactionParserService;\n readonly subset: TransactionSubset;\n readonly deviceModelId: DeviceModelId;\n readonly contextModule: ContextModule;\n};\n\ntype SubcontextCallback = () => Promise<ClearSignContext>;\n\nexport type BuildSubcontextsTaskResult = {\n subcontextCallbacks: SubcontextCallback[];\n};\n\nexport class BuildSubcontextsTask {\n constructor(\n private readonly api: InternalApi,\n private readonly args: BuildSubcontextsTaskArgs,\n ) {}\n\n run(): BuildSubcontextsTaskResult {\n const context = this.args.context;\n const type = context.type;\n\n switch (type) {\n case ClearSignContextType.TRANSACTION_INFO:\n case ClearSignContextType.WEB3_CHECK:\n case ClearSignContextType.PLUGIN:\n case ClearSignContextType.EXTERNAL_PLUGIN:\n case ClearSignContextType.DYNAMIC_NETWORK:\n case ClearSignContextType.DYNAMIC_NETWORK_ICON:\n case ClearSignContextType.ENUM:\n case ClearSignContextType.TRUSTED_NAME:\n case ClearSignContextType.TOKEN:\n case ClearSignContextType.NFT:\n return {\n subcontextCallbacks: [],\n };\n case ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION:\n return {\n subcontextCallbacks: context.reference\n ? this._getSubcontextsFromReference(context.reference)\n : [],\n };\n case ClearSignContextType.PROXY_INFO:\n return {\n subcontextCallbacks: this._getSubcontextFromProxy(context),\n };\n default: {\n const uncoveredType: never = type;\n throw new Error(`Uncovered type: ${uncoveredType}`);\n }\n }\n }\n\n private _getSubcontextsFromReference(\n reference: ClearSignContextReference,\n ): SubcontextCallback[] {\n const referenceType = reference.type;\n\n switch (referenceType) {\n case ClearSignContextReferenceType.TOKEN:\n case ClearSignContextReferenceType.NFT:\n return this._getSubcontextsFromTokenOrNftReference(reference);\n case ClearSignContextReferenceType.ENUM:\n return this._getSubcontextsFromEnumReference(reference);\n case ClearSignContextReferenceType.TRUSTED_NAME:\n return this._getSubcontextsFromTrustedNameReference(reference);\n case ClearSignContextReferenceType.CALLDATA:\n // calldata reference is handled by the BuildFullContextsTask and ParseNestedTransactionTask\n return [];\n default: {\n const uncoveredReferenceType: never = referenceType;\n throw new Error(`Uncovered reference type: ${uncoveredReferenceType}`);\n }\n }\n }\n\n private _getSubcontextsFromTokenOrNftReference(\n reference: ClearSignContextReference<\n ClearSignContextReferenceType.TOKEN | ClearSignContextReferenceType.NFT\n >,\n ): SubcontextCallback[] {\n // if the reference is a string, it means it is a direct address\n // and we don't need to extract the value from the transaction\n // as it is already provided in the reference\n if (reference.value !== undefined) {\n const transactionFieldContext = {\n chainId: this.args.subset.chainId,\n address: reference.value,\n };\n\n const expectedType =\n reference.type === ClearSignContextReferenceType.TOKEN\n ? ClearSignContextType.TOKEN\n : ClearSignContextType.NFT;\n\n return [\n () =>\n this.args.contextModule.getFieldContext(\n transactionFieldContext,\n expectedType,\n ),\n ];\n }\n\n const subcontextCallbacks: SubcontextCallback[] = [];\n\n // if the reference is a path, it means we need to extract the value\n // from the transaction and provide it to the device\n if (reference.valuePath !== undefined) {\n const referenceValues = this.args.transactionParser\n .extractValue(this.args.subset, reference.valuePath)\n .orDefault([]);\n\n for (const value of referenceValues) {\n const address = bufferToHexaString(\n value.slice(Math.max(0, value.length - 20)),\n );\n\n const expectedType =\n reference.type === ClearSignContextReferenceType.TOKEN\n ? ClearSignContextType.TOKEN\n : ClearSignContextType.NFT;\n\n subcontextCallbacks.push(() =>\n this.args.contextModule.getFieldContext(\n {\n chainId: this.args.subset.chainId,\n address,\n },\n expectedType,\n ),\n );\n }\n }\n\n return subcontextCallbacks;\n }\n\n private _getSubcontextsFromEnumReference(\n reference: ClearSignContextReference<ClearSignContextReferenceType.ENUM>,\n ): SubcontextCallback[] {\n const subcontextCallbacks: SubcontextCallback[] = [];\n\n if (!reference.valuePath) {\n return subcontextCallbacks;\n }\n\n const referenceValues = this.args.transactionParser\n .extractValue(this.args.subset, reference.valuePath)\n .orDefault([]);\n\n for (const value of referenceValues) {\n const enumValue = value[value.length - 1];\n if (enumValue === undefined) {\n continue;\n }\n\n const enumsContext = this.args.contextOptional.filter(\n (c) => c.type === ClearSignContextType.ENUM,\n );\n\n const subcontext = enumsContext.find(\n (enumContext) =>\n enumContext.value === enumValue && enumContext.id === reference.id,\n );\n\n if (subcontext) {\n subcontextCallbacks.push(() => Promise.resolve(subcontext));\n }\n }\n return subcontextCallbacks;\n }\n\n private _getSubcontextsFromTrustedNameReference(\n reference: ClearSignContextReference<ClearSignContextReferenceType.TRUSTED_NAME>,\n ): SubcontextCallback[] {\n const subcontextCallbacks: SubcontextCallback[] = [];\n\n if (!reference.valuePath) {\n return subcontextCallbacks;\n }\n\n const referenceValues = this.args.transactionParser\n .extractValue(this.args.subset, reference.valuePath)\n .orDefault([]);\n\n for (const value of referenceValues) {\n {\n subcontextCallbacks.push(async () => {\n const address = bufferToHexaString(\n value.slice(Math.max(0, value.length - 20)),\n );\n\n const getChallengeResult = await this.api.sendCommand(\n new GetChallengeCommand(),\n );\n if (!isSuccessCommandResult(getChallengeResult)) {\n return {\n type: ClearSignContextType.ERROR,\n error: new Error(\"Failed to get challenge\"),\n };\n }\n\n const subcontext = await this.args.contextModule.getFieldContext(\n {\n chainId: this.args.subset.chainId,\n address,\n challenge: getChallengeResult.data.challenge,\n types: reference.types,\n sources: reference.sources,\n deviceModelId: this.args.deviceModelId,\n },\n ClearSignContextType.TRUSTED_NAME,\n );\n\n return subcontext;\n });\n }\n }\n\n return subcontextCallbacks;\n }\n\n private _getSubcontextFromProxy(\n _context: ClearSignContextSuccess<ClearSignContextType.PROXY_INFO>,\n ): SubcontextCallback[] {\n return [\n async () => {\n const getChallengeResult = await this.api.sendCommand(\n new GetChallengeCommand(),\n );\n if (!isSuccessCommandResult(getChallengeResult)) {\n return {\n type: ClearSignContextType.ERROR,\n error: new Error(\"Failed to get challenge\"),\n };\n }\n\n if (this.args.subset.to === undefined) {\n return {\n type: ClearSignContextType.ERROR,\n error: new Error(\"Failed to get proxy address\"),\n };\n }\n\n const subcontext = await this.args.contextModule.getFieldContext(\n {\n chainId: this.args.subset.chainId,\n proxyAddress: this.args.subset.to,\n calldata: this.args.subset.data,\n deviceModelId: this.args.deviceModelId,\n challenge: getChallengeResult.data.challenge,\n },\n ClearSignContextType.PROXY_INFO,\n );\n\n return subcontext;\n },\n ];\n }\n}\n"],
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,0BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAQO,oCACPC,EAKO,2CAEPC,EAAoC,4DAkB7B,MAAMJ,CAAqB,CAChC,YACmBK,EACAC,EACjB,CAFiB,SAAAD,EACA,UAAAC,CAChB,CAEH,KAAkC,CAChC,MAAMC,EAAU,KAAK,KAAK,QACpBC,EAAOD,EAAQ,KAErB,OAAQC,EAAM,CACZ,KAAK,uBAAqB,iBAC1B,KAAK,uBAAqB,WAC1B,KAAK,uBAAqB,OAC1B,KAAK,uBAAqB,gBAC1B,KAAK,uBAAqB,gBAC1B,KAAK,uBAAqB,qBAC1B,KAAK,uBAAqB,KAC1B,KAAK,uBAAqB,aAC1B,KAAK,uBAAqB,MAC1B,KAAK,uBAAqB,
|
|
4
|
+
"sourcesContent": ["import {\n type ClearSignContext,\n type ClearSignContextReference,\n ClearSignContextReferenceType,\n type ClearSignContextSuccess,\n ClearSignContextType,\n type ContextModule,\n type TransactionSubset,\n} from \"@ledgerhq/context-module\";\nimport {\n bufferToHexaString,\n type DeviceModelId,\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\nimport { type TransactionParserService } from \"@internal/transaction/service/parser/TransactionParserService\";\n\nexport type BuildSubcontextsTaskArgs = {\n readonly context: ClearSignContextSuccess;\n readonly contextOptional: ClearSignContextSuccess[];\n readonly transactionParser: TransactionParserService;\n readonly subset: TransactionSubset;\n readonly deviceModelId: DeviceModelId;\n readonly contextModule: ContextModule;\n};\n\ntype SubcontextCallback = () => Promise<ClearSignContext>;\n\nexport type BuildSubcontextsTaskResult = {\n subcontextCallbacks: SubcontextCallback[];\n};\n\nexport class BuildSubcontextsTask {\n constructor(\n private readonly api: InternalApi,\n private readonly args: BuildSubcontextsTaskArgs,\n ) {}\n\n run(): BuildSubcontextsTaskResult {\n const context = this.args.context;\n const type = context.type;\n\n switch (type) {\n case ClearSignContextType.TRANSACTION_INFO:\n case ClearSignContextType.WEB3_CHECK:\n case ClearSignContextType.PLUGIN:\n case ClearSignContextType.EXTERNAL_PLUGIN:\n case ClearSignContextType.DYNAMIC_NETWORK:\n case ClearSignContextType.DYNAMIC_NETWORK_ICON:\n case ClearSignContextType.ENUM:\n case ClearSignContextType.TRUSTED_NAME:\n case ClearSignContextType.TOKEN:\n case ClearSignContextType.NFT:\n case ClearSignContextType.SAFE:\n case ClearSignContextType.SIGNER:\n return {\n subcontextCallbacks: [],\n };\n case ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION:\n return {\n subcontextCallbacks: context.reference\n ? this._getSubcontextsFromReference(context.reference)\n : [],\n };\n case ClearSignContextType.PROXY_INFO:\n return {\n subcontextCallbacks: this._getSubcontextFromProxy(context),\n };\n default: {\n const uncoveredType: never = type;\n throw new Error(`Uncovered type: ${uncoveredType}`);\n }\n }\n }\n\n private _getSubcontextsFromReference(\n reference: ClearSignContextReference,\n ): SubcontextCallback[] {\n const referenceType = reference.type;\n\n switch (referenceType) {\n case ClearSignContextReferenceType.TOKEN:\n case ClearSignContextReferenceType.NFT:\n return this._getSubcontextsFromTokenOrNftReference(reference);\n case ClearSignContextReferenceType.ENUM:\n return this._getSubcontextsFromEnumReference(reference);\n case ClearSignContextReferenceType.TRUSTED_NAME:\n return this._getSubcontextsFromTrustedNameReference(reference);\n case ClearSignContextReferenceType.CALLDATA:\n // calldata reference is handled by the BuildFullContextsTask and ParseNestedTransactionTask\n return [];\n default: {\n const uncoveredReferenceType: never = referenceType;\n throw new Error(`Uncovered reference type: ${uncoveredReferenceType}`);\n }\n }\n }\n\n private _getSubcontextsFromTokenOrNftReference(\n reference: ClearSignContextReference<\n ClearSignContextReferenceType.TOKEN | ClearSignContextReferenceType.NFT\n >,\n ): SubcontextCallback[] {\n // if the reference is a string, it means it is a direct address\n // and we don't need to extract the value from the transaction\n // as it is already provided in the reference\n if (reference.value !== undefined) {\n const transactionFieldContext = {\n chainId: this.args.subset.chainId,\n address: reference.value,\n };\n\n const expectedType =\n reference.type === ClearSignContextReferenceType.TOKEN\n ? ClearSignContextType.TOKEN\n : ClearSignContextType.NFT;\n\n return [\n () =>\n this.args.contextModule.getFieldContext(\n transactionFieldContext,\n expectedType,\n ),\n ];\n }\n\n const subcontextCallbacks: SubcontextCallback[] = [];\n\n // if the reference is a path, it means we need to extract the value\n // from the transaction and provide it to the device\n if (reference.valuePath !== undefined) {\n const referenceValues = this.args.transactionParser\n .extractValue(this.args.subset, reference.valuePath)\n .orDefault([]);\n\n for (const value of referenceValues) {\n const address = bufferToHexaString(\n value.slice(Math.max(0, value.length - 20)),\n );\n\n const expectedType =\n reference.type === ClearSignContextReferenceType.TOKEN\n ? ClearSignContextType.TOKEN\n : ClearSignContextType.NFT;\n\n subcontextCallbacks.push(() =>\n this.args.contextModule.getFieldContext(\n {\n chainId: this.args.subset.chainId,\n address,\n },\n expectedType,\n ),\n );\n }\n }\n\n return subcontextCallbacks;\n }\n\n private _getSubcontextsFromEnumReference(\n reference: ClearSignContextReference<ClearSignContextReferenceType.ENUM>,\n ): SubcontextCallback[] {\n const subcontextCallbacks: SubcontextCallback[] = [];\n\n if (!reference.valuePath) {\n return subcontextCallbacks;\n }\n\n const referenceValues = this.args.transactionParser\n .extractValue(this.args.subset, reference.valuePath)\n .orDefault([]);\n\n for (const value of referenceValues) {\n const enumValue = value[value.length - 1];\n if (enumValue === undefined) {\n continue;\n }\n\n const enumsContext = this.args.contextOptional.filter(\n (c) => c.type === ClearSignContextType.ENUM,\n );\n\n const subcontext = enumsContext.find(\n (enumContext) =>\n enumContext.value === enumValue && enumContext.id === reference.id,\n );\n\n if (subcontext) {\n subcontextCallbacks.push(() => Promise.resolve(subcontext));\n }\n }\n return subcontextCallbacks;\n }\n\n private _getSubcontextsFromTrustedNameReference(\n reference: ClearSignContextReference<ClearSignContextReferenceType.TRUSTED_NAME>,\n ): SubcontextCallback[] {\n const subcontextCallbacks: SubcontextCallback[] = [];\n\n if (!reference.valuePath) {\n return subcontextCallbacks;\n }\n\n const referenceValues = this.args.transactionParser\n .extractValue(this.args.subset, reference.valuePath)\n .orDefault([]);\n\n for (const value of referenceValues) {\n {\n subcontextCallbacks.push(async () => {\n const address = bufferToHexaString(\n value.slice(Math.max(0, value.length - 20)),\n );\n\n const getChallengeResult = await this.api.sendCommand(\n new GetChallengeCommand(),\n );\n if (!isSuccessCommandResult(getChallengeResult)) {\n return {\n type: ClearSignContextType.ERROR,\n error: new Error(\"Failed to get challenge\"),\n };\n }\n\n const subcontext = await this.args.contextModule.getFieldContext(\n {\n chainId: this.args.subset.chainId,\n address,\n challenge: getChallengeResult.data.challenge,\n types: reference.types,\n sources: reference.sources,\n deviceModelId: this.args.deviceModelId,\n },\n ClearSignContextType.TRUSTED_NAME,\n );\n\n return subcontext;\n });\n }\n }\n\n return subcontextCallbacks;\n }\n\n private _getSubcontextFromProxy(\n _context: ClearSignContextSuccess<ClearSignContextType.PROXY_INFO>,\n ): SubcontextCallback[] {\n return [\n async () => {\n const getChallengeResult = await this.api.sendCommand(\n new GetChallengeCommand(),\n );\n if (!isSuccessCommandResult(getChallengeResult)) {\n return {\n type: ClearSignContextType.ERROR,\n error: new Error(\"Failed to get challenge\"),\n };\n }\n\n if (this.args.subset.to === undefined) {\n return {\n type: ClearSignContextType.ERROR,\n error: new Error(\"Failed to get proxy address\"),\n };\n }\n\n const subcontext = await this.args.contextModule.getFieldContext(\n {\n chainId: this.args.subset.chainId,\n proxyAddress: this.args.subset.to,\n calldata: this.args.subset.data,\n deviceModelId: this.args.deviceModelId,\n challenge: getChallengeResult.data.challenge,\n },\n ClearSignContextType.PROXY_INFO,\n );\n\n return subcontext;\n },\n ];\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["BuildSubcontextsTask_exports", "__export", "BuildSubcontextsTask", "__toCommonJS", "import_context_module", "import_device_management_kit", "import_GetChallengeCommand", "api", "args", "context", "type", "uncoveredType", "reference", "referenceType", "uncoveredReferenceType", "transactionFieldContext", "expectedType", "subcontextCallbacks", "referenceValues", "value", "address", "enumValue", "subcontext", "c", "enumContext", "getChallengeResult", "_context"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var u=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var w=Object.prototype.hasOwnProperty;var N=(e,o)=>{for(var n in o)u(e,n,{get:o[n],enumerable:!0})},E=(e,o,n,r)=>{if(o&&typeof o=="object"||typeof o=="function")for(let a of f(o))!w.call(e,a)&&a!==n&&u(e,a,{get:()=>o[a],enumerable:!(r=l(o,a))||r.enumerable});return e};var v=e=>E(u({},"__esModule",{value:!0}),e);var R={};N(R,{ProvideContextTask:()=>S});module.exports=v(R);var t=require("@ledgerhq/context-module"),d=require("@ledgerhq/device-management-kit"),c=require("../../app-binder/command/ProvideEnumCommand"),i=require("../../app-binder/command/ProvideNetworkConfigurationCommand"),C=require("../../app-binder/command/ProvideNFTInformationCommand"),h=require("../../app-binder/command/ProvideProxyInfoCommand"),s=require("../../app-binder/command/ProvideSafeAccountCommand"),k=require("../../app-binder/command/ProvideTokenInformationCommand"),p=require("../../app-binder/command/ProvideTransactionFieldDescriptionCommand"),y=require("../../app-binder/command/ProvideTransactionInformationCommand"),F=require("../../app-binder/command/ProvideTrustedNameCommand"),T=require("../../app-binder/command/ProvideWeb3CheckCommand"),I=require("../../app-binder/command/SetExternalPluginCommand"),P=require("../../app-binder/command/SetPluginCommand"),_=require("./SendPayloadInChunksTask");class S{constructor(o,n,r=(a,m)=>new _.SendPayloadInChunksTask(a,m)){this._api=o;this._args=n;this._sendPayloadInChunksTaskFactory=r}async run(){const{type:o,payload:n,certificate:r}=this._args.context;switch(r&&await this._api.sendCommand(new d.LoadCertificateCommand({keyUsage:r.keyUsageNumber,certificate:r.payload})),o){case t.ClearSignContextType.PLUGIN:return await this._api.sendCommand(new P.SetPluginCommand({payload:n}));case t.ClearSignContextType.EXTERNAL_PLUGIN:return await this._api.sendCommand(new I.SetExternalPluginCommand({payload:n}));case t.ClearSignContextType.NFT:return await this._api.sendCommand(new C.ProvideNFTInformationCommand({payload:n}));case t.ClearSignContextType.TOKEN:return await this._api.sendCommand(new k.ProvideTokenInformationCommand({payload:n}));case t.ClearSignContextType.TRANSACTION_INFO:return await this._sendPayloadInChunksTaskFactory(this._api,{payload:n,commandFactory:m=>new y.ProvideTransactionInformationCommand({data:m.chunkedData,isFirstChunk:m.isFirstChunk})}).run();case t.ClearSignContextType.TRUSTED_NAME:return this._sendPayloadInChunksTaskFactory(this._api,{payload:n,commandFactory:a=>new F.ProvideTrustedNameCommand({data:a.chunkedData,isFirstChunk:a.isFirstChunk})}).run();case t.ClearSignContextType.ENUM:return this._sendPayloadInChunksTaskFactory(this._api,{payload:n,commandFactory:a=>new c.ProvideEnumCommand({data:a.chunkedData,isFirstChunk:a.isFirstChunk})}).run();case t.ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION:return this._sendPayloadInChunksTaskFactory(this._api,{payload:n,commandFactory:a=>new p.ProvideTransactionFieldDescriptionCommand({data:a.chunkedData,isFirstChunk:a.isFirstChunk})}).run();case t.ClearSignContextType.WEB3_CHECK:return this._sendPayloadInChunksTaskFactory(this._api,{payload:n,commandFactory:a=>new T.ProvideWeb3CheckCommand({payload:a.chunkedData,isFirstChunk:a.isFirstChunk})}).run();case t.ClearSignContextType.PROXY_INFO:return this._sendPayloadInChunksTaskFactory(this._api,{payload:n,commandFactory:a=>new h.ProvideProxyInfoCommand({data:a.chunkedData,isFirstChunk:a.isFirstChunk})}).run();case t.ClearSignContextType.DYNAMIC_NETWORK:return this._sendPayloadInChunksTaskFactory(this._api,{payload:n,commandFactory:a=>new i.ProvideNetworkConfigurationCommand({data:a.chunkedData,isFirstChunk:a.isFirstChunk,configurationType:i.NetworkConfigurationType.CONFIGURATION})}).run();case t.ClearSignContextType.DYNAMIC_NETWORK_ICON:return this._sendPayloadInChunksTaskFactory(this._api,{payload:n,commandFactory:a=>new i.ProvideNetworkConfigurationCommand({data:a.chunkedData,isFirstChunk:a.isFirstChunk,configurationType:i.NetworkConfigurationType.ICON}),withPayloadLength:!1}).run();case t.ClearSignContextType.SAFE:return this._sendPayloadInChunksTaskFactory(this._api,{payload:n,commandFactory:a=>new s.ProvideSafeAccountCommand({data:a.chunkedData,isFirstChunk:a.isFirstChunk,type:s.ProvideSafeAccountCommandType.SAFE_DESCRIPTOR})}).run();case t.ClearSignContextType.SIGNER:return this._sendPayloadInChunksTaskFactory(this._api,{payload:n,commandFactory:a=>new s.ProvideSafeAccountCommand({data:a.chunkedData,isFirstChunk:a.isFirstChunk,type:s.ProvideSafeAccountCommandType.SIGNER_DESCRIPTOR})}).run();default:{const a=o;return(0,d.CommandResultFactory)({error:new d.InvalidStatusWordError(`The context type [${a}] is not covered`)})}}}}0&&(module.exports={ProvideContextTask});
|
|
2
|
+
//# sourceMappingURL=ProvideContextTask.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/task/ProvideContextTask.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n type ClearSignContextSuccess,\n ClearSignContextType,\n} from \"@ledgerhq/context-module\";\nimport {\n type CommandResult,\n CommandResultFactory,\n type InternalApi,\n InvalidStatusWordError,\n LoadCertificateCommand,\n} from \"@ledgerhq/device-management-kit\";\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 {\n ProvideSafeAccountCommand,\n ProvideSafeAccountCommandType,\n} from \"@internal/app-binder/command/ProvideSafeAccountCommand\";\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 { type EthErrorCodes } from \"@internal/app-binder/command/utils/ethAppErrors\";\n\nimport {\n SendPayloadInChunksTask,\n type SendPayloadInChunksTaskArgs,\n} from \"./SendPayloadInChunksTask\";\n\nexport type ProvideContextTaskArgs = {\n /**\n * The clear sign context to provide.\n */\n context: ClearSignContextSuccess;\n};\n\nexport type ProvideContextTaskResult = CommandResult<unknown, EthErrorCodes>;\n\n/**\n * This task is responsible for providing a single context to the device.\n */\nexport class ProvideContextTask {\n constructor(\n private _api: InternalApi,\n private _args: ProvideContextTaskArgs,\n private _sendPayloadInChunksTaskFactory = (\n api: InternalApi,\n args: SendPayloadInChunksTaskArgs<unknown>,\n ) => new SendPayloadInChunksTask(api, args),\n ) {}\n\n async run(): Promise<ProvideContextTaskResult> {\n const { type, payload, certificate } = this._args.context;\n\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_INFO:\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 case ClearSignContextType.SAFE:\n return this._sendPayloadInChunksTaskFactory(this._api, {\n payload,\n commandFactory: (args) =>\n new ProvideSafeAccountCommand({\n data: args.chunkedData,\n isFirstChunk: args.isFirstChunk,\n type: ProvideSafeAccountCommandType.SAFE_DESCRIPTOR,\n }),\n }).run();\n case ClearSignContextType.SIGNER:\n return this._sendPayloadInChunksTaskFactory(this._api, {\n payload,\n commandFactory: (args) =>\n new ProvideSafeAccountCommand({\n data: args.chunkedData,\n isFirstChunk: args.isFirstChunk,\n type: ProvideSafeAccountCommandType.SIGNER_DESCRIPTOR,\n }),\n }).run();\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
|
+
"names": ["ProvideContextTask_exports", "__export", "ProvideContextTask", "__toCommonJS", "import_context_module", "import_device_management_kit", "import_ProvideEnumCommand", "import_ProvideNetworkConfigurationCommand", "import_ProvideNFTInformationCommand", "import_ProvideProxyInfoCommand", "import_ProvideSafeAccountCommand", "import_ProvideTokenInformationCommand", "import_ProvideTransactionFieldDescriptionCommand", "import_ProvideTransactionInformationCommand", "import_ProvideTrustedNameCommand", "import_ProvideWeb3CheckCommand", "import_SetExternalPluginCommand", "import_SetPluginCommand", "import_SendPayloadInChunksTask", "_api", "_args", "_sendPayloadInChunksTaskFactory", "api", "args", "type", "payload", "certificate", "uncoveredType"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var a=require("@ledgerhq/context-module"),m=require("@ledgerhq/device-management-kit"),h=require("../../app-binder/command/ProvideEnumCommand"),y=require("../../app-binder/command/ProvideNetworkConfigurationCommand"),f=require("../../app-binder/command/ProvideNFTInformationCommand"),v=require("../../app-binder/command/ProvideProxyInfoCommand"),u=require("../../app-binder/command/ProvideSafeAccountCommand"),x=require("../../app-binder/command/ProvideTokenInformationCommand"),g=require("../../app-binder/command/ProvideTransactionFieldDescriptionCommand"),T=require("../../app-binder/command/ProvideTransactionInformationCommand"),w=require("../../app-binder/command/ProvideTrustedNameCommand"),E=require("../../app-binder/command/ProvideWeb3CheckCommand"),A=require("../../app-binder/command/SetExternalPluginCommand"),I=require("../../app-binder/command/SetPluginCommand"),P=require("../../app-binder/device-action/__test-utils__/makeInternalApi"),d=require("./ProvideContextTask"),N=require("./SendPayloadInChunksTask");describe("ProvideContextTask",()=>{const e=(0,P.makeDeviceActionInternalApiMock)(),n=(0,m.CommandResultFactory)({data:void 0}),k=(0,m.CommandResultFactory)({data:void 0,error:{}});beforeEach(()=>{vi.resetAllMocks()}),describe("run",()=>{const r=vi.fn(),s=vi.fn();beforeEach(()=>{vi.clearAllMocks(),s.mockImplementation((t,c)=>({run:()=>r(t,c)}))}),describe("contexts with sendCommand",()=>{it.each([[a.ClearSignContextType.PLUGIN,I.SetPluginCommand],[a.ClearSignContextType.EXTERNAL_PLUGIN,A.SetExternalPluginCommand],[a.ClearSignContextType.NFT,f.ProvideNFTInformationCommand],[a.ClearSignContextType.TOKEN,x.ProvideTokenInformationCommand]])("should provide context by calling sendCommand for a %s context",async(t,c)=>{const o={context:{type:t,payload:"payload"}};e.sendCommand.mockResolvedValue(n);const i=await new d.ProvideContextTask(e,o,s).run();expect(i).toEqual(n),expect(e.sendCommand).toHaveBeenCalledTimes(1),expect(e.sendCommand).toHaveBeenCalledWith(expect.any(c))})}),describe("contexts with sendPayloadInChunksTask",()=>{it.each([[a.ClearSignContextType.TRANSACTION_INFO,T.ProvideTransactionInformationCommand],[a.ClearSignContextType.TRUSTED_NAME,w.ProvideTrustedNameCommand],[a.ClearSignContextType.ENUM,h.ProvideEnumCommand],[a.ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,g.ProvideTransactionFieldDescriptionCommand],[a.ClearSignContextType.WEB3_CHECK,E.ProvideWeb3CheckCommand],[a.ClearSignContextType.PROXY_INFO,v.ProvideProxyInfoCommand]])("should provide context by calling sendPayloadInChunksTask for a %s context",async(t,c)=>{const o={context:{type:t,payload:"payload"}};r.mockResolvedValue(n);const i=await new d.ProvideContextTask(e,o,s).run();expect(i).toEqual(n),expect(r).toHaveBeenCalledTimes(1),expect(r).toHaveBeenCalledWith(e,{payload:"payload",commandFactory:expect.any(Function)});const l=s.mock.calls[0][1].commandFactory,F={chunkedData:new Uint8Array([1,2,3]),isFirstChunk:!0},R=l(F);expect(R).toBeInstanceOf(c)}),it("should provide context for DYNAMIC_NETWORK with correct configuration type",async()=>{const t={context:{type:a.ClearSignContextType.DYNAMIC_NETWORK,payload:"payload"}};r.mockResolvedValue(n);const o=await new d.ProvideContextTask(e,t,s).run();expect(o).toEqual(n),expect(r).toHaveBeenCalledTimes(1);const i=s.mock.calls[0][1].commandFactory,p={chunkedData:new Uint8Array([1,2,3]),isFirstChunk:!0},l=i(p);expect(l).toBeInstanceOf(y.ProvideNetworkConfigurationCommand),expect(l.args.configurationType).toBe(y.NetworkConfigurationType.CONFIGURATION)}),it("should provide context for DYNAMIC_NETWORK_ICON with correct configuration type and withPayloadLength",async()=>{const t={context:{type:a.ClearSignContextType.DYNAMIC_NETWORK_ICON,payload:"payload"}};r.mockResolvedValue(n);const o=await new d.ProvideContextTask(e,t,s).run();expect(o).toEqual(n),expect(r).toHaveBeenCalledTimes(1),expect(r).toHaveBeenCalledWith(e,{payload:"payload",commandFactory:expect.any(Function),withPayloadLength:!1});const i=s.mock.calls[0][1].commandFactory,p={chunkedData:new Uint8Array([1,2,3]),isFirstChunk:!0},l=i(p);expect(l).toBeInstanceOf(y.ProvideNetworkConfigurationCommand),expect(l.args.configurationType).toBe(y.NetworkConfigurationType.ICON)}),it("should provide context for SAFE with correct type",async()=>{const t={context:{type:a.ClearSignContextType.SAFE,payload:"payload"}};r.mockResolvedValue(n);const o=await new d.ProvideContextTask(e,t,s).run();expect(o).toEqual(n),expect(r).toHaveBeenCalledTimes(1);const i=s.mock.calls[0][1].commandFactory,p={chunkedData:new Uint8Array([1,2,3]),isFirstChunk:!0},l=i(p);expect(l).toBeInstanceOf(u.ProvideSafeAccountCommand),expect(l.args.type).toBe(u.ProvideSafeAccountCommandType.SAFE_DESCRIPTOR)}),it("should provide context for SIGNER with correct type",async()=>{const t={context:{type:a.ClearSignContextType.SIGNER,payload:"payload"}};r.mockResolvedValue(n);const o=await new d.ProvideContextTask(e,t,s).run();expect(o).toEqual(n),expect(r).toHaveBeenCalledTimes(1);const i=s.mock.calls[0][1].commandFactory,p={chunkedData:new Uint8Array([1,2,3]),isFirstChunk:!0},l=i(p);expect(l).toBeInstanceOf(u.ProvideSafeAccountCommand),expect(l.args.type).toBe(u.ProvideSafeAccountCommandType.SIGNER_DESCRIPTOR)})}),describe("with certificate",()=>{it("should load certificate before providing context when certificate is present",async()=>{const t={context:{type:a.ClearSignContextType.TOKEN,payload:"payload",certificate:{keyUsageNumber:1,payload:new Uint8Array([1,2,3])}}};e.sendCommand.mockResolvedValue(n);const o=await new d.ProvideContextTask(e,t,s).run();expect(o).toEqual(n),expect(e.sendCommand).toHaveBeenCalledTimes(2),expect(e.sendCommand).toHaveBeenNthCalledWith(1,expect.any(m.LoadCertificateCommand)),expect(e.sendCommand).toHaveBeenNthCalledWith(2,expect.any(x.ProvideTokenInformationCommand))}),it("should load certificate with sendPayloadInChunksTask context",async()=>{const t={context:{type:a.ClearSignContextType.TRANSACTION_INFO,payload:"payload",certificate:{keyUsageNumber:2,payload:new Uint8Array([4,5,6])}}};e.sendCommand.mockResolvedValue(n),r.mockResolvedValue(n);const o=await new d.ProvideContextTask(e,t,s).run();expect(o).toEqual(n),expect(e.sendCommand).toHaveBeenCalledTimes(1),expect(e.sendCommand).toHaveBeenCalledWith(expect.any(m.LoadCertificateCommand)),expect(r).toHaveBeenCalledTimes(1)}),it("should not load certificate when not present",async()=>{const t={context:{type:a.ClearSignContextType.TOKEN,payload:"payload"}};e.sendCommand.mockResolvedValue(n);const o=await new d.ProvideContextTask(e,t,s).run();expect(o).toEqual(n),expect(e.sendCommand).toHaveBeenCalledTimes(1),expect(e.sendCommand).toHaveBeenCalledWith(expect.any(x.ProvideTokenInformationCommand))})}),describe("error handling",()=>{it("should return error when sendCommand fails",async()=>{const t={context:{type:a.ClearSignContextType.NFT,payload:"payload"}};e.sendCommand.mockResolvedValue(k);const o=await new d.ProvideContextTask(e,t,s).run();expect(o).toEqual(k)}),it("should return error when sendPayloadInChunksTask fails",async()=>{const t={context:{type:a.ClearSignContextType.TRUSTED_NAME,payload:"payload"}};r.mockResolvedValue(k);const o=await new d.ProvideContextTask(e,t,s).run();expect(o).toEqual(k)}),it("should return error for unsupported context type",async()=>{const t={context:{type:"unsupported",payload:"payload"}},o=await new d.ProvideContextTask(e,t,s).run();expect(o).toEqual((0,m.CommandResultFactory)({error:new m.InvalidStatusWordError("The context type [unsupported] is not covered")}))})}),describe("factory",()=>{it("should have a default sendPayloadInChunksTaskFactory",()=>{const t={context:{type:a.ClearSignContextType.TOKEN,payload:"payload"}},c=new d.ProvideContextTask(e,t);expect(c._sendPayloadInChunksTaskFactory).toBeDefined();const o=c._sendPayloadInChunksTaskFactory(e,{payload:"payload",commandFactory:()=>new T.ProvideTransactionInformationCommand({data:new Uint8Array,isFirstChunk:!0})});expect(o).toBeInstanceOf(N.SendPayloadInChunksTask)})})})});
|
|
2
|
+
//# sourceMappingURL=ProvideContextTask.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/task/ProvideContextTask.test.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n type ClearSignContextSuccess,\n ClearSignContextType,\n} from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n type InternalApi,\n InvalidStatusWordError,\n LoadCertificateCommand,\n type UnknownDeviceExchangeError,\n} from \"@ledgerhq/device-management-kit\";\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 {\n ProvideSafeAccountCommand,\n ProvideSafeAccountCommandType,\n} from \"@internal/app-binder/command/ProvideSafeAccountCommand\";\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 { type EthErrorCodes } from \"@internal/app-binder/command/utils/ethAppErrors\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\n\nimport {\n ProvideContextTask,\n type ProvideContextTaskArgs,\n} from \"./ProvideContextTask\";\nimport {\n SendPayloadInChunksTask,\n type SendPayloadInChunksTaskArgs,\n} from \"./SendPayloadInChunksTask\";\n\ndescribe(\"ProvideContextTask\", () => {\n const api = makeDeviceActionInternalApiMock();\n const successResult = CommandResultFactory<void, EthErrorCodes>({\n data: undefined,\n });\n const errorResult = CommandResultFactory<void, EthErrorCodes>({\n data: undefined,\n error: {} as UnknownDeviceExchangeError,\n });\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n describe(\"run\", () => {\n const sendPayloadInChunksRunMock = vi.fn();\n const sendPayloadInChunksTaskMockFactory = vi.fn();\n\n beforeEach(() => {\n vi.clearAllMocks();\n sendPayloadInChunksTaskMockFactory.mockImplementation(\n (a: InternalApi, args: SendPayloadInChunksTaskArgs<unknown>) =>\n ({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n run: () => sendPayloadInChunksRunMock(a, args),\n }) as unknown as SendPayloadInChunksTask<unknown>,\n );\n });\n\n describe(\"contexts with sendCommand\", () => {\n it.each([\n [ClearSignContextType.PLUGIN, SetPluginCommand],\n [ClearSignContextType.EXTERNAL_PLUGIN, SetExternalPluginCommand],\n [ClearSignContextType.NFT, ProvideNFTInformationCommand],\n [ClearSignContextType.TOKEN, ProvideTokenInformationCommand],\n ] as const)(\n \"should provide context by calling sendCommand for a %s context\",\n async (contextType, commandClass) => {\n // GIVEN\n const args: ProvideContextTaskArgs = {\n context: {\n type: contextType,\n payload: \"payload\",\n },\n };\n api.sendCommand.mockResolvedValue(successResult);\n\n // WHEN\n const task = new ProvideContextTask(\n api,\n args,\n sendPayloadInChunksTaskMockFactory,\n );\n const result = await task.run();\n\n // THEN\n expect(result).toEqual(successResult);\n expect(api.sendCommand).toHaveBeenCalledTimes(1);\n expect(api.sendCommand).toHaveBeenCalledWith(\n expect.any(commandClass),\n );\n },\n );\n });\n\n describe(\"contexts with sendPayloadInChunksTask\", () => {\n it.each([\n [\n ClearSignContextType.TRANSACTION_INFO,\n ProvideTransactionInformationCommand,\n ],\n [ClearSignContextType.TRUSTED_NAME, ProvideTrustedNameCommand],\n [ClearSignContextType.ENUM, ProvideEnumCommand],\n [\n ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n ProvideTransactionFieldDescriptionCommand,\n ],\n [ClearSignContextType.WEB3_CHECK, ProvideWeb3CheckCommand],\n [ClearSignContextType.PROXY_INFO, ProvideProxyInfoCommand],\n ] as const)(\n \"should provide context by calling sendPayloadInChunksTask for a %s context\",\n async (contextType, commandClass) => {\n // GIVEN\n const args: ProvideContextTaskArgs = {\n context: {\n type: contextType,\n payload: \"payload\",\n } as ClearSignContextSuccess<typeof contextType>,\n };\n sendPayloadInChunksRunMock.mockResolvedValue(successResult);\n\n // WHEN\n const task = new ProvideContextTask(\n api,\n args,\n sendPayloadInChunksTaskMockFactory,\n );\n const result = await task.run();\n\n // THEN\n expect(result).toEqual(successResult);\n expect(sendPayloadInChunksRunMock).toHaveBeenCalledTimes(1);\n expect(sendPayloadInChunksRunMock).toHaveBeenCalledWith(api, {\n payload: \"payload\",\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n commandFactory: expect.any(Function),\n });\n\n // Test that the commandFactory returns the correct command class\n const factoryCall = sendPayloadInChunksTaskMockFactory.mock.calls[0]!;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n const commandFactory = factoryCall[1].commandFactory;\n const mockArgs = {\n chunkedData: new Uint8Array([1, 2, 3]),\n isFirstChunk: true,\n };\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call\n const command = commandFactory(mockArgs);\n expect(command).toBeInstanceOf(commandClass);\n },\n );\n\n it(\"should provide context for DYNAMIC_NETWORK with correct configuration type\", async () => {\n // GIVEN\n const args: ProvideContextTaskArgs = {\n context: {\n type: ClearSignContextType.DYNAMIC_NETWORK,\n payload: \"payload\",\n },\n };\n sendPayloadInChunksRunMock.mockResolvedValue(successResult);\n\n // WHEN\n const task = new ProvideContextTask(\n api,\n args,\n sendPayloadInChunksTaskMockFactory,\n );\n const result = await task.run();\n\n // THEN\n expect(result).toEqual(successResult);\n expect(sendPayloadInChunksRunMock).toHaveBeenCalledTimes(1);\n\n // Test that the commandFactory returns ProvideNetworkConfigurationCommand with CONFIGURATION type\n const factoryCall = sendPayloadInChunksTaskMockFactory.mock.calls[0]!;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n const commandFactory = factoryCall[1].commandFactory;\n const mockArgs = {\n chunkedData: new Uint8Array([1, 2, 3]),\n isFirstChunk: true,\n };\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call\n const command = commandFactory(mockArgs);\n expect(command).toBeInstanceOf(ProvideNetworkConfigurationCommand);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n expect(command.args.configurationType).toBe(\n NetworkConfigurationType.CONFIGURATION,\n );\n });\n\n it(\"should provide context for DYNAMIC_NETWORK_ICON with correct configuration type and withPayloadLength\", async () => {\n // GIVEN\n const args: ProvideContextTaskArgs = {\n context: {\n type: ClearSignContextType.DYNAMIC_NETWORK_ICON,\n payload: \"payload\",\n },\n };\n sendPayloadInChunksRunMock.mockResolvedValue(successResult);\n\n // WHEN\n const task = new ProvideContextTask(\n api,\n args,\n sendPayloadInChunksTaskMockFactory,\n );\n const result = await task.run();\n\n // THEN\n expect(result).toEqual(successResult);\n expect(sendPayloadInChunksRunMock).toHaveBeenCalledTimes(1);\n expect(sendPayloadInChunksRunMock).toHaveBeenCalledWith(api, {\n payload: \"payload\",\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n commandFactory: expect.any(Function),\n withPayloadLength: false,\n });\n\n // Test that the commandFactory returns ProvideNetworkConfigurationCommand with ICON type\n const factoryCall = sendPayloadInChunksTaskMockFactory.mock.calls[0]!;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n const commandFactory = factoryCall[1].commandFactory;\n const mockArgs = {\n chunkedData: new Uint8Array([1, 2, 3]),\n isFirstChunk: true,\n };\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call\n const command = commandFactory(mockArgs);\n expect(command).toBeInstanceOf(ProvideNetworkConfigurationCommand);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n expect(command.args.configurationType).toBe(\n NetworkConfigurationType.ICON,\n );\n });\n\n it(\"should provide context for SAFE with correct type\", async () => {\n // GIVEN\n const args: ProvideContextTaskArgs = {\n context: {\n type: ClearSignContextType.SAFE,\n payload: \"payload\",\n },\n };\n sendPayloadInChunksRunMock.mockResolvedValue(successResult);\n\n // WHEN\n const task = new ProvideContextTask(\n api,\n args,\n sendPayloadInChunksTaskMockFactory,\n );\n const result = await task.run();\n\n // THEN\n expect(result).toEqual(successResult);\n expect(sendPayloadInChunksRunMock).toHaveBeenCalledTimes(1);\n\n // Test that the commandFactory returns ProvideSafeAccountCommand with SAFE_DESCRIPTOR type\n const factoryCall = sendPayloadInChunksTaskMockFactory.mock.calls[0]!;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n const commandFactory = factoryCall[1].commandFactory;\n const mockArgs = {\n chunkedData: new Uint8Array([1, 2, 3]),\n isFirstChunk: true,\n };\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call\n const command = commandFactory(mockArgs);\n expect(command).toBeInstanceOf(ProvideSafeAccountCommand);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n expect(command.args.type).toBe(\n ProvideSafeAccountCommandType.SAFE_DESCRIPTOR,\n );\n });\n\n it(\"should provide context for SIGNER with correct type\", async () => {\n // GIVEN\n const args: ProvideContextTaskArgs = {\n context: {\n type: ClearSignContextType.SIGNER,\n payload: \"payload\",\n },\n };\n sendPayloadInChunksRunMock.mockResolvedValue(successResult);\n\n // WHEN\n const task = new ProvideContextTask(\n api,\n args,\n sendPayloadInChunksTaskMockFactory,\n );\n const result = await task.run();\n\n // THEN\n expect(result).toEqual(successResult);\n expect(sendPayloadInChunksRunMock).toHaveBeenCalledTimes(1);\n\n // Test that the commandFactory returns ProvideSafeAccountCommand with SIGNER_DESCRIPTOR type\n const factoryCall = sendPayloadInChunksTaskMockFactory.mock.calls[0]!;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n const commandFactory = factoryCall[1].commandFactory;\n const mockArgs = {\n chunkedData: new Uint8Array([1, 2, 3]),\n isFirstChunk: true,\n };\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call\n const command = commandFactory(mockArgs);\n expect(command).toBeInstanceOf(ProvideSafeAccountCommand);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n expect(command.args.type).toBe(\n ProvideSafeAccountCommandType.SIGNER_DESCRIPTOR,\n );\n });\n });\n\n describe(\"with certificate\", () => {\n it(\"should load certificate before providing context when certificate is present\", async () => {\n // GIVEN\n const args: ProvideContextTaskArgs = {\n context: {\n type: ClearSignContextType.TOKEN,\n payload: \"payload\",\n certificate: {\n keyUsageNumber: 1,\n payload: new Uint8Array([1, 2, 3]),\n },\n },\n };\n api.sendCommand.mockResolvedValue(successResult);\n\n // WHEN\n const task = new ProvideContextTask(\n api,\n args,\n sendPayloadInChunksTaskMockFactory,\n );\n const result = await task.run();\n\n // THEN\n expect(result).toEqual(successResult);\n expect(api.sendCommand).toHaveBeenCalledTimes(2);\n expect(api.sendCommand).toHaveBeenNthCalledWith(\n 1,\n expect.any(LoadCertificateCommand),\n );\n expect(api.sendCommand).toHaveBeenNthCalledWith(\n 2,\n expect.any(ProvideTokenInformationCommand),\n );\n });\n\n it(\"should load certificate with sendPayloadInChunksTask context\", async () => {\n // GIVEN\n const args: ProvideContextTaskArgs = {\n context: {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload\",\n certificate: {\n keyUsageNumber: 2,\n payload: new Uint8Array([4, 5, 6]),\n },\n },\n };\n api.sendCommand.mockResolvedValue(successResult);\n sendPayloadInChunksRunMock.mockResolvedValue(successResult);\n\n // WHEN\n const task = new ProvideContextTask(\n api,\n args,\n sendPayloadInChunksTaskMockFactory,\n );\n const result = await task.run();\n\n // THEN\n expect(result).toEqual(successResult);\n expect(api.sendCommand).toHaveBeenCalledTimes(1);\n expect(api.sendCommand).toHaveBeenCalledWith(\n expect.any(LoadCertificateCommand),\n );\n expect(sendPayloadInChunksRunMock).toHaveBeenCalledTimes(1);\n });\n\n it(\"should not load certificate when not present\", async () => {\n // GIVEN\n const args: ProvideContextTaskArgs = {\n context: {\n type: ClearSignContextType.TOKEN,\n payload: \"payload\",\n },\n };\n api.sendCommand.mockResolvedValue(successResult);\n\n // WHEN\n const task = new ProvideContextTask(\n api,\n args,\n sendPayloadInChunksTaskMockFactory,\n );\n const result = await task.run();\n\n // THEN\n expect(result).toEqual(successResult);\n expect(api.sendCommand).toHaveBeenCalledTimes(1);\n expect(api.sendCommand).toHaveBeenCalledWith(\n expect.any(ProvideTokenInformationCommand),\n );\n });\n });\n\n describe(\"error handling\", () => {\n it(\"should return error when sendCommand fails\", async () => {\n // GIVEN\n const args: ProvideContextTaskArgs = {\n context: {\n type: ClearSignContextType.NFT,\n payload: \"payload\",\n },\n };\n api.sendCommand.mockResolvedValue(errorResult);\n\n // WHEN\n const task = new ProvideContextTask(\n api,\n args,\n sendPayloadInChunksTaskMockFactory,\n );\n const result = await task.run();\n\n // THEN\n expect(result).toEqual(errorResult);\n });\n\n it(\"should return error when sendPayloadInChunksTask fails\", async () => {\n // GIVEN\n const args: ProvideContextTaskArgs = {\n context: {\n type: ClearSignContextType.TRUSTED_NAME,\n payload: \"payload\",\n },\n };\n sendPayloadInChunksRunMock.mockResolvedValue(errorResult);\n\n // WHEN\n const task = new ProvideContextTask(\n api,\n args,\n sendPayloadInChunksTaskMockFactory,\n );\n const result = await task.run();\n\n // THEN\n expect(result).toEqual(errorResult);\n });\n\n it(\"should return error for unsupported context type\", async () => {\n // GIVEN\n const args: ProvideContextTaskArgs = {\n context: {\n type: \"unsupported\" as unknown as ClearSignContextType.TOKEN,\n payload: \"payload\",\n },\n };\n\n // WHEN\n const task = new ProvideContextTask(\n api,\n args,\n sendPayloadInChunksTaskMockFactory,\n );\n const result = await task.run();\n\n // THEN\n expect(result).toEqual(\n CommandResultFactory({\n error: new InvalidStatusWordError(\n `The context type [unsupported] is not covered`,\n ),\n }),\n );\n });\n });\n\n describe(\"factory\", () => {\n it(\"should have a default sendPayloadInChunksTaskFactory\", () => {\n // GIVEN\n const args: ProvideContextTaskArgs = {\n context: {\n type: ClearSignContextType.TOKEN,\n payload: \"payload\",\n },\n };\n\n // WHEN\n const task = new ProvideContextTask(api, args);\n\n // THEN\n expect(task[\"_sendPayloadInChunksTaskFactory\"]).toBeDefined();\n const sendPayloadInChunksTask = task[\"_sendPayloadInChunksTaskFactory\"](\n api,\n {\n payload: \"payload\",\n commandFactory: () =>\n new ProvideTransactionInformationCommand({\n data: new Uint8Array(),\n isFirstChunk: true,\n }),\n },\n );\n expect(sendPayloadInChunksTask).toBeInstanceOf(SendPayloadInChunksTask);\n });\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_context_module", "import_device_management_kit", "import_ProvideEnumCommand", "import_ProvideNetworkConfigurationCommand", "import_ProvideNFTInformationCommand", "import_ProvideProxyInfoCommand", "import_ProvideSafeAccountCommand", "import_ProvideTokenInformationCommand", "import_ProvideTransactionFieldDescriptionCommand", "import_ProvideTransactionInformationCommand", "import_ProvideTrustedNameCommand", "import_ProvideWeb3CheckCommand", "import_SetExternalPluginCommand", "import_SetPluginCommand", "import_makeInternalApi", "import_ProvideContextTask", "import_SendPayloadInChunksTask", "api", "successResult", "errorResult", "sendPayloadInChunksRunMock", "sendPayloadInChunksTaskMockFactory", "a", "args", "contextType", "commandClass", "result", "commandFactory", "mockArgs", "command", "task", "sendPayloadInChunksTask"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var T=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var _=Object.prototype.hasOwnProperty;var V=(p,e)=>{for(var t in e)T(p,t,{get:e[t],enumerable:!0})},O=(p,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of M(e))!_.call(p,a)&&a!==t&&T(p,a,{get:()=>e[a],enumerable:!(n=b(e,a))||n.enumerable});return p};var J=p=>O(T({},"__esModule",{value:!0}),p);var W={};V(W,{ProvideEIP712ContextTask:()=>U});module.exports=J(W);var u=require("@ledgerhq/context-module"),l=require("@ledgerhq/context-module"),o=require("@ledgerhq/device-management-kit"),d=require("purify-ts"),k=require("../../app-binder/command/GetChallengeCommand"),E=require("../../app-binder/command/ProvideProxyInfoCommand"),P=require("../../app-binder/command/ProvideTokenInformationCommand"),F=require("../../app-binder/command/ProvideTrustedNameCommand"),N=require("../../app-binder/command/ProvideWeb3CheckCommand"),s=require("../../app-binder/command/SendEIP712FilteringCommand"),h=require("../../app-binder/command/SendEIP712StructDefinitionCommand"),f=require("../../app-binder/command/SendEIP712StructImplemCommand"),D=require("../../app-binder/task/ProvideContextsTask"),x=require("../../app-binder/task/SendEIP712StructImplemTask"),R=require("../../typed-data/model/Types"),g=require("../../typed-data/model/Types"),I=require("./SendPayloadInChunksTask");const S=5;class U{constructor(e,t,n,a=i=>new D.ProvideContextsTask(this.api,i)){this.api=e;this.contextModule=t;this.args=n;this.provideContextFactory=a;for(const i of this.args.domain)if(i.path==="chainId"&&i.value instanceof R.TypedDataValueField){const r=BigInt((0,o.bufferToHexaString)(i.value.data));r<=Number.MAX_SAFE_INTEGER&&(this.chainId=(0,d.Just)(Number(r)));break}}chainId=d.Nothing;calldataMetadatas={};async run(){this.args.web3Check&&await this.provideContext(this.args.web3Check),await this.args.clearSignContext.ifJust(async a=>{a.proxy!==void 0&&await this.provideContext(a.proxy)});const e=(0,o.CommandResultFactory)({data:void 0}),t=Object.entries(this.args.types).sort(([a],[i])=>a.localeCompare(i));for(const[a,i]of t){const r=await this.api.sendCommand(new h.SendEIP712StructDefinitionCommand({command:h.StructDefinitionCommand.Name,name:a}));if(!(0,o.isSuccessCommandResult)(r))return r;for(const[c,m]of Object.entries(i)){const y=await this.api.sendCommand(new h.SendEIP712StructDefinitionCommand({command:h.StructDefinitionCommand.Field,name:c,type:m}));if(!(0,o.isSuccessCommandResult)(y))return y}}if(this.args.clearSignContext.isJust()){const a=await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.Activation}));if(!(0,o.isSuccessCommandResult)(a))return a}for(const a of this.args.domain){const r=await this.getImplementationTask(a).run();if(!(0,o.isSuccessCommandResult)(r))return r}if(this.args.clearSignContext.isJust()){const a=this.args.clearSignContext.extract(),i=await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.MessageInfo,displayName:a.messageInfo.displayName,filtersCount:a.messageInfo.filtersCount,signature:a.messageInfo.signature}));if(!(0,o.isSuccessCommandResult)(i))return i}const n={indexes:{},nextIndex:0};for(const a of this.args.message){const i=await this.provideTokenInformation(a,n);if(i.isJust())return i.extract();const r=await this.provideTrustedName(a);if(r.isJust())return r.extract();const c=await this.filterValue(a,n);if(c.isJust()&&!(0,o.isSuccessCommandResult)(c.extract()))return c.extract();const y=await this.getImplementationTask(a).run();if(!(0,o.isSuccessCommandResult)(y))return y;if(await this.tryProvideTransactionContext(),this.args.clearSignContext.isJust()&&a.value instanceof g.TypedDataValueArray&&a.value.length===0){const A=Object.entries(this.args.clearSignContext.extract().filters).filter(([C])=>C.startsWith(`${a.path}.[]`)).map(([,C])=>C);for(const C of A){const w=await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.DiscardedPath,path:C.path}));if(!(0,o.isSuccessCommandResult)(w))return w;const v=await this.provideFiltering(C,n,!0);if(!(0,o.isSuccessCommandResult)(v))return v}}}return e}async provideContext({type:e,payload:t,certificate:n}){switch(n&&await this.api.sendCommand(new o.LoadCertificateCommand({keyUsage:n.keyUsageNumber,certificate:n.payload})),e){case l.ClearSignContextType.WEB3_CHECK:await new I.SendPayloadInChunksTask(this.api,{payload:t,commandFactory:a=>new N.ProvideWeb3CheckCommand({payload:a.chunkedData,isFirstChunk:a.isFirstChunk})}).run();break;case l.ClearSignContextType.PROXY_INFO:await new I.SendPayloadInChunksTask(this.api,{payload:t,commandFactory:a=>new E.ProvideProxyInfoCommand({data:a.chunkedData,isFirstChunk:a.isFirstChunk})}).run();break;case l.ClearSignContextType.TOKEN:case l.ClearSignContextType.NFT:case l.ClearSignContextType.TRUSTED_NAME:case l.ClearSignContextType.PLUGIN:case l.ClearSignContextType.EXTERNAL_PLUGIN:case l.ClearSignContextType.ENUM:case l.ClearSignContextType.TRANSACTION_INFO:case l.ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION:case l.ClearSignContextType.DYNAMIC_NETWORK:case l.ClearSignContextType.DYNAMIC_NETWORK_ICON:throw new Error(`Context type ${e} not supported in EIP712 messages`);default:{const a=e;throw new Error(`Unhandled context type ${a}`)}}}getImplementationTask(e){return e.value instanceof g.TypedDataValueRoot?new x.SendEIP712StructImplemTask(this.api,{type:f.StructImplemType.ROOT,value:e.value.root}):e.value instanceof g.TypedDataValueArray?new x.SendEIP712StructImplemTask(this.api,{type:f.StructImplemType.ARRAY,value:e.value.length}):new x.SendEIP712StructImplemTask(this.api,{type:f.StructImplemType.FIELD,value:e.value.data})}async provideTokenInformation(e,t){if(this.args.clearSignContext.isJust()){const n=this.args.clearSignContext.extract().filters[e.path];if(n!==void 0&&(n.type==="amount"||n.type==="token")&&t.indexes[n.tokenIndex]===void 0){const a=n.tokenIndex,r=this.args.clearSignContext.extract().tokens[a];if(r===void 0)return d.Nothing;const c=await this.api.sendCommand(new P.ProvideTokenInformationCommand({payload:r}));if(!(0,o.isSuccessCommandResult)(c))return d.Maybe.of(c);let{tokenIndex:m}=c.data;t.nextIndex=(m+1)%S,Number(a)===u.VERIFYING_CONTRACT_TOKEN_INDEX&&(m=u.VERIFYING_CONTRACT_TOKEN_INDEX),t.indexes[Number(a)]=m}}return d.Nothing}async provideTrustedName(e){if(this.args.clearSignContext.isJust()&&this.chainId.isJust()){const t=this.args.clearSignContext.extract(),n=t.filters[e.path],a=t.trustedNamesAddresses[e.path];if(n!==void 0&&n.type==="trusted-name"&&a!==void 0){const i=await this.api.sendCommand(new k.GetChallengeCommand);if(!(0,o.isSuccessCommandResult)(i))return(0,d.Just)(i);const r=await this.contextModule.getFieldContext({chainId:this.chainId.extract(),address:a,challenge:i.data.challenge,types:n.types,sources:n.sources,deviceModelId:this.args.deviceModelId},l.ClearSignContextType.TRUSTED_NAME);if(r.type===l.ClearSignContextType.TRUSTED_NAME){r.certificate&&await this.api.sendCommand(new o.LoadCertificateCommand({keyUsage:r.certificate.keyUsageNumber,certificate:r.certificate.payload}));const c=await new I.SendPayloadInChunksTask(this.api,{payload:r.payload,commandFactory:m=>new F.ProvideTrustedNameCommand({data:m.chunkedData,isFirstChunk:m.isFirstChunk})}).run();if(!(0,o.isSuccessCommandResult)(c))return(0,d.Just)(c)}}}return d.Nothing}async filterValue(e,t){if(this.args.clearSignContext.isJust()){const n=this.args.clearSignContext.extract().filters[e.path];if(n===void 0)return d.Nothing;const a=await this.provideFiltering(n,t,!1);return d.Maybe.of(a)}return d.Nothing}async provideFiltering(e,t,n){switch(e.type){case"trusted-name":return await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.TrustedName,discarded:n,displayName:e.displayName,typesAndSourcesPayload:e.typesAndSourcesPayload,signature:e.signature}));case"datetime":return await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.Datetime,discarded:n,displayName:e.displayName,signature:e.signature}));case"raw":return await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.Raw,discarded:n,displayName:e.displayName,signature:e.signature}));case"token":return this.sanitizeDeviceIndex(e.tokenIndex,t),await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.Token,discarded:n,tokenIndex:t.indexes[e.tokenIndex],signature:e.signature}));case"amount":return this.sanitizeDeviceIndex(e.tokenIndex,t),await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.Amount,discarded:n,displayName:e.displayName,tokenIndex:t.indexes[e.tokenIndex],signature:e.signature}));case"calldata-value":return await this.provideCalldataInfos(e.calldataIndex),await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.CalldataValue,discarded:n,calldataIndex:e.calldataIndex,signature:e.signature}));case"calldata-callee":return await this.provideCalldataInfos(e.calldataIndex),await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.CalldataCallee,discarded:n,calldataIndex:e.calldataIndex,signature:e.signature}));case"calldata-spender":return await this.provideCalldataInfos(e.calldataIndex),await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.CalldataSpender,discarded:n,calldataIndex:e.calldataIndex,signature:e.signature}));case"calldata-chain-id":return await this.provideCalldataInfos(e.calldataIndex),await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.CalldataChainId,discarded:n,calldataIndex:e.calldataIndex,signature:e.signature}));case"calldata-selector":return await this.provideCalldataInfos(e.calldataIndex),await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.CalldataSelector,discarded:n,calldataIndex:e.calldataIndex,signature:e.signature}));case"calldata-amount":return await this.provideCalldataInfos(e.calldataIndex),await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.CalldataAmount,discarded:n,calldataIndex:e.calldataIndex,signature:e.signature}));default:{const a=e;throw new Error(`ProvideEIP712ContextTask/provideFiltering - Unhandled filter ${a}`)}}}async provideCalldataInfos(e){if(this.args.clearSignContext.isJust()){if(this.calldataMetadatas[e]!==void 0)return this.calldataMetadatas[e].remainingFilters--,d.Nothing;const t=this.args.clearSignContext.extract().calldatas[e];if(t===void 0)return d.Nothing;const a=[t.filter.valueFlag,t.filter.calleeFlag===u.TypedDataCalldataParamPresence.Present,t.filter.chainIdFlag,t.filter.selectorFlag,t.filter.amountFlag,t.filter.spenderFlag===u.TypedDataCalldataParamPresence.Present].filter(i=>i).length;return this.calldataMetadatas[e]={remainingFilters:a-1,contexts:this.args.calldatasContexts[e]},d.Maybe.of(await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.CalldataInfo,discarded:!1,calldataIndex:e,valueFlag:t.filter.valueFlag,calleeFlag:this.mapCalldataPresence(t.filter.calleeFlag),chainIdFlag:t.filter.chainIdFlag,selectorFlag:t.filter.selectorFlag,amountFlag:t.filter.amountFlag,spenderFlag:this.mapCalldataPresence(t.filter.spenderFlag),signature:t.filter.signature})))}return d.Nothing}async tryProvideTransactionContext(){for(const e in this.calldataMetadatas){const t=this.calldataMetadatas[e];t.remainingFilters===0&&(t.contexts!==void 0&&await this.provideContextFactory({contexts:t.contexts,derivationPath:this.args.derivationPath}).run(),delete this.calldataMetadatas[e])}}mapCalldataPresence(e){switch(e){case u.TypedDataCalldataParamPresence.None:return s.CalldataParamPresence.None;case u.TypedDataCalldataParamPresence.Present:return s.CalldataParamPresence.Present;case u.TypedDataCalldataParamPresence.VerifyingContract:return s.CalldataParamPresence.VerifyingContract;default:{const t=e;throw new Error(`Unhandled presence ${t}`)}}}sanitizeDeviceIndex(e,t){t.indexes[e]===void 0&&(t.indexes[e]=t.nextIndex,t.nextIndex=(t.nextIndex+1)%S)}}0&&(module.exports={ProvideEIP712ContextTask});
|
|
1
|
+
"use strict";var T=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var _=Object.prototype.hasOwnProperty;var V=(p,e)=>{for(var t in e)T(p,t,{get:e[t],enumerable:!0})},O=(p,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of M(e))!_.call(p,a)&&a!==t&&T(p,a,{get:()=>e[a],enumerable:!(n=b(e,a))||n.enumerable});return p};var J=p=>O(T({},"__esModule",{value:!0}),p);var W={};V(W,{ProvideEIP712ContextTask:()=>U});module.exports=J(W);var u=require("@ledgerhq/context-module"),l=require("@ledgerhq/context-module"),o=require("@ledgerhq/device-management-kit"),d=require("purify-ts"),E=require("../../app-binder/command/GetChallengeCommand"),k=require("../../app-binder/command/ProvideProxyInfoCommand"),F=require("../../app-binder/command/ProvideTokenInformationCommand"),P=require("../../app-binder/command/ProvideTrustedNameCommand"),N=require("../../app-binder/command/ProvideWeb3CheckCommand"),s=require("../../app-binder/command/SendEIP712FilteringCommand"),h=require("../../app-binder/command/SendEIP712StructDefinitionCommand"),f=require("../../app-binder/command/SendEIP712StructImplemCommand"),x=require("../../app-binder/task/SendEIP712StructImplemTask"),D=require("../../typed-data/model/Types"),g=require("../../typed-data/model/Types"),R=require("./ProvideTransactionContextsTask"),I=require("./SendPayloadInChunksTask");const S=5;class U{constructor(e,t,n,a=i=>new R.ProvideTransactionContextsTask(this.api,i)){this.api=e;this.contextModule=t;this.args=n;this.provideContextFactory=a;for(const i of this.args.domain)if(i.path==="chainId"&&i.value instanceof D.TypedDataValueField){const r=BigInt((0,o.bufferToHexaString)(i.value.data));r<=Number.MAX_SAFE_INTEGER&&(this.chainId=(0,d.Just)(Number(r)));break}}chainId=d.Nothing;calldataMetadatas={};async run(){this.args.web3Check&&await this.provideContext(this.args.web3Check),await this.args.clearSignContext.ifJust(async a=>{a.proxy!==void 0&&await this.provideContext(a.proxy)});const e=(0,o.CommandResultFactory)({data:void 0}),t=Object.entries(this.args.types).sort(([a],[i])=>a.localeCompare(i));for(const[a,i]of t){const r=await this.api.sendCommand(new h.SendEIP712StructDefinitionCommand({command:h.StructDefinitionCommand.Name,name:a}));if(!(0,o.isSuccessCommandResult)(r))return r;for(const[c,m]of Object.entries(i)){const y=await this.api.sendCommand(new h.SendEIP712StructDefinitionCommand({command:h.StructDefinitionCommand.Field,name:c,type:m}));if(!(0,o.isSuccessCommandResult)(y))return y}}if(this.args.clearSignContext.isJust()){const a=await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.Activation}));if(!(0,o.isSuccessCommandResult)(a))return a}for(const a of this.args.domain){const r=await this.getImplementationTask(a).run();if(!(0,o.isSuccessCommandResult)(r))return r}if(this.args.clearSignContext.isJust()){const a=this.args.clearSignContext.extract(),i=await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.MessageInfo,displayName:a.messageInfo.displayName,filtersCount:a.messageInfo.filtersCount,signature:a.messageInfo.signature}));if(!(0,o.isSuccessCommandResult)(i))return i}const n={indexes:{},nextIndex:0};for(const a of this.args.message){const i=await this.provideTokenInformation(a,n);if(i.isJust())return i.extract();const r=await this.provideTrustedName(a);if(r.isJust())return r.extract();const c=await this.filterValue(a,n);if(c.isJust()&&!(0,o.isSuccessCommandResult)(c.extract()))return c.extract();const y=await this.getImplementationTask(a).run();if(!(0,o.isSuccessCommandResult)(y))return y;if(await this.tryProvideTransactionContext(),this.args.clearSignContext.isJust()&&a.value instanceof g.TypedDataValueArray&&a.value.length===0){const A=Object.entries(this.args.clearSignContext.extract().filters).filter(([C])=>C.startsWith(`${a.path}.[]`)).map(([,C])=>C);for(const C of A){const w=await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.DiscardedPath,path:C.path}));if(!(0,o.isSuccessCommandResult)(w))return w;const v=await this.provideFiltering(C,n,!0);if(!(0,o.isSuccessCommandResult)(v))return v}}}return e}async provideContext({type:e,payload:t,certificate:n}){switch(n&&await this.api.sendCommand(new o.LoadCertificateCommand({keyUsage:n.keyUsageNumber,certificate:n.payload})),e){case l.ClearSignContextType.WEB3_CHECK:await new I.SendPayloadInChunksTask(this.api,{payload:t,commandFactory:a=>new N.ProvideWeb3CheckCommand({payload:a.chunkedData,isFirstChunk:a.isFirstChunk})}).run();break;case l.ClearSignContextType.PROXY_INFO:await new I.SendPayloadInChunksTask(this.api,{payload:t,commandFactory:a=>new k.ProvideProxyInfoCommand({data:a.chunkedData,isFirstChunk:a.isFirstChunk})}).run();break;case l.ClearSignContextType.TOKEN:case l.ClearSignContextType.NFT:case l.ClearSignContextType.TRUSTED_NAME:case l.ClearSignContextType.PLUGIN:case l.ClearSignContextType.EXTERNAL_PLUGIN:case l.ClearSignContextType.ENUM:case l.ClearSignContextType.TRANSACTION_INFO:case l.ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION:case l.ClearSignContextType.DYNAMIC_NETWORK:case l.ClearSignContextType.DYNAMIC_NETWORK_ICON:case l.ClearSignContextType.SAFE:case l.ClearSignContextType.SIGNER:throw new Error(`Context type ${e} not supported in EIP712 messages`);default:{const a=e;throw new Error(`Unhandled context type ${a}`)}}}getImplementationTask(e){return e.value instanceof g.TypedDataValueRoot?new x.SendEIP712StructImplemTask(this.api,{type:f.StructImplemType.ROOT,value:e.value.root}):e.value instanceof g.TypedDataValueArray?new x.SendEIP712StructImplemTask(this.api,{type:f.StructImplemType.ARRAY,value:e.value.length}):new x.SendEIP712StructImplemTask(this.api,{type:f.StructImplemType.FIELD,value:e.value.data})}async provideTokenInformation(e,t){if(this.args.clearSignContext.isJust()){const n=this.args.clearSignContext.extract().filters[e.path];if(n!==void 0&&(n.type==="amount"||n.type==="token")&&t.indexes[n.tokenIndex]===void 0){const a=n.tokenIndex,r=this.args.clearSignContext.extract().tokens[a];if(r===void 0)return d.Nothing;const c=await this.api.sendCommand(new F.ProvideTokenInformationCommand({payload:r}));if(!(0,o.isSuccessCommandResult)(c))return d.Maybe.of(c);let{tokenIndex:m}=c.data;t.nextIndex=(m+1)%S,Number(a)===u.VERIFYING_CONTRACT_TOKEN_INDEX&&(m=u.VERIFYING_CONTRACT_TOKEN_INDEX),t.indexes[Number(a)]=m}}return d.Nothing}async provideTrustedName(e){if(this.args.clearSignContext.isJust()&&this.chainId.isJust()){const t=this.args.clearSignContext.extract(),n=t.filters[e.path],a=t.trustedNamesAddresses[e.path];if(n!==void 0&&n.type==="trusted-name"&&a!==void 0){const i=await this.api.sendCommand(new E.GetChallengeCommand);if(!(0,o.isSuccessCommandResult)(i))return(0,d.Just)(i);const r=await this.contextModule.getFieldContext({chainId:this.chainId.extract(),address:a,challenge:i.data.challenge,types:n.types,sources:n.sources,deviceModelId:this.args.deviceModelId},l.ClearSignContextType.TRUSTED_NAME);if(r.type===l.ClearSignContextType.TRUSTED_NAME){r.certificate&&await this.api.sendCommand(new o.LoadCertificateCommand({keyUsage:r.certificate.keyUsageNumber,certificate:r.certificate.payload}));const c=await new I.SendPayloadInChunksTask(this.api,{payload:r.payload,commandFactory:m=>new P.ProvideTrustedNameCommand({data:m.chunkedData,isFirstChunk:m.isFirstChunk})}).run();if(!(0,o.isSuccessCommandResult)(c))return(0,d.Just)(c)}}}return d.Nothing}async filterValue(e,t){if(this.args.clearSignContext.isJust()){const n=this.args.clearSignContext.extract().filters[e.path];if(n===void 0)return d.Nothing;const a=await this.provideFiltering(n,t,!1);return d.Maybe.of(a)}return d.Nothing}async provideFiltering(e,t,n){switch(e.type){case"trusted-name":return await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.TrustedName,discarded:n,displayName:e.displayName,typesAndSourcesPayload:e.typesAndSourcesPayload,signature:e.signature}));case"datetime":return await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.Datetime,discarded:n,displayName:e.displayName,signature:e.signature}));case"raw":return await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.Raw,discarded:n,displayName:e.displayName,signature:e.signature}));case"token":return this.sanitizeDeviceIndex(e.tokenIndex,t),await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.Token,discarded:n,tokenIndex:t.indexes[e.tokenIndex],signature:e.signature}));case"amount":return this.sanitizeDeviceIndex(e.tokenIndex,t),await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.Amount,discarded:n,displayName:e.displayName,tokenIndex:t.indexes[e.tokenIndex],signature:e.signature}));case"calldata-value":return await this.provideCalldataInfos(e.calldataIndex),await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.CalldataValue,discarded:n,calldataIndex:e.calldataIndex,signature:e.signature}));case"calldata-callee":return await this.provideCalldataInfos(e.calldataIndex),await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.CalldataCallee,discarded:n,calldataIndex:e.calldataIndex,signature:e.signature}));case"calldata-spender":return await this.provideCalldataInfos(e.calldataIndex),await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.CalldataSpender,discarded:n,calldataIndex:e.calldataIndex,signature:e.signature}));case"calldata-chain-id":return await this.provideCalldataInfos(e.calldataIndex),await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.CalldataChainId,discarded:n,calldataIndex:e.calldataIndex,signature:e.signature}));case"calldata-selector":return await this.provideCalldataInfos(e.calldataIndex),await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.CalldataSelector,discarded:n,calldataIndex:e.calldataIndex,signature:e.signature}));case"calldata-amount":return await this.provideCalldataInfos(e.calldataIndex),await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.CalldataAmount,discarded:n,calldataIndex:e.calldataIndex,signature:e.signature}));default:{const a=e;throw new Error(`ProvideEIP712ContextTask/provideFiltering - Unhandled filter ${a}`)}}}async provideCalldataInfos(e){if(this.args.clearSignContext.isJust()){if(this.calldataMetadatas[e]!==void 0)return this.calldataMetadatas[e].remainingFilters--,d.Nothing;const t=this.args.clearSignContext.extract().calldatas[e];if(t===void 0)return d.Nothing;const a=[t.filter.valueFlag,t.filter.calleeFlag===u.TypedDataCalldataParamPresence.Present,t.filter.chainIdFlag,t.filter.selectorFlag,t.filter.amountFlag,t.filter.spenderFlag===u.TypedDataCalldataParamPresence.Present].filter(i=>i).length;return this.calldataMetadatas[e]={remainingFilters:a-1,contexts:this.args.calldatasContexts[e]},d.Maybe.of(await this.api.sendCommand(new s.SendEIP712FilteringCommand({type:s.Eip712FilterType.CalldataInfo,discarded:!1,calldataIndex:e,valueFlag:t.filter.valueFlag,calleeFlag:this.mapCalldataPresence(t.filter.calleeFlag),chainIdFlag:t.filter.chainIdFlag,selectorFlag:t.filter.selectorFlag,amountFlag:t.filter.amountFlag,spenderFlag:this.mapCalldataPresence(t.filter.spenderFlag),signature:t.filter.signature})))}return d.Nothing}async tryProvideTransactionContext(){for(const e in this.calldataMetadatas){const t=this.calldataMetadatas[e];t.remainingFilters===0&&(t.contexts!==void 0&&await this.provideContextFactory({contexts:t.contexts,derivationPath:this.args.derivationPath}).run(),delete this.calldataMetadatas[e])}}mapCalldataPresence(e){switch(e){case u.TypedDataCalldataParamPresence.None:return s.CalldataParamPresence.None;case u.TypedDataCalldataParamPresence.Present:return s.CalldataParamPresence.Present;case u.TypedDataCalldataParamPresence.VerifyingContract:return s.CalldataParamPresence.VerifyingContract;default:{const t=e;throw new Error(`Unhandled presence ${t}`)}}}sanitizeDeviceIndex(e,t){t.indexes[e]===void 0&&(t.indexes[e]=t.nextIndex,t.nextIndex=(t.nextIndex+1)%S)}}0&&(module.exports={ProvideEIP712ContextTask});
|
|
2
2
|
//# sourceMappingURL=ProvideEIP712ContextTask.js.map
|