@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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/task/ProvideEIP712ContextTask.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type ContextModule,\n type TypedDataCalldataIndex,\n TypedDataCalldataParamPresence,\n type TypedDataClearSignContextSuccess,\n type TypedDataFilter,\n type TypedDataTokenIndex,\n VERIFYING_CONTRACT_TOKEN_INDEX,\n} from \"@ledgerhq/context-module\";\nimport {\n type ClearSignContextSuccess,\n ClearSignContextType,\n} from \"@ledgerhq/context-module\";\nimport type {\n CommandResult,\n DeviceModelId,\n InternalApi,\n} from \"@ledgerhq/device-management-kit\";\nimport {\n bufferToHexaString,\n CommandResultFactory,\n isSuccessCommandResult,\n LoadCertificateCommand,\n} from \"@ledgerhq/device-management-kit\";\nimport { Just, Maybe, Nothing } from \"purify-ts\";\n\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\nimport { ProvideProxyInfoCommand } from \"@internal/app-binder/command/ProvideProxyInfoCommand\";\nimport { ProvideTokenInformationCommand } from \"@internal/app-binder/command/ProvideTokenInformationCommand\";\nimport { ProvideTrustedNameCommand } from \"@internal/app-binder/command/ProvideTrustedNameCommand\";\nimport { ProvideWeb3CheckCommand } from \"@internal/app-binder/command/ProvideWeb3CheckCommand\";\nimport {\n CalldataParamPresence,\n Eip712FilterType,\n SendEIP712FilteringCommand,\n} from \"@internal/app-binder/command/SendEIP712FilteringCommand\";\nimport {\n SendEIP712StructDefinitionCommand,\n StructDefinitionCommand,\n} from \"@internal/app-binder/command/SendEIP712StructDefinitionCommand\";\nimport { StructImplemType } from \"@internal/app-binder/command/SendEIP712StructImplemCommand\";\nimport { type EthErrorCodes } from \"@internal/app-binder/command/utils/ethAppErrors\";\nimport { type ContextWithSubContexts } from \"@internal/app-binder/task/BuildFullContextsTask\";\nimport {\n ProvideContextsTask,\n type ProvideContextsTaskArgs,\n} from \"@internal/app-binder/task/ProvideContextsTask\";\nimport { SendEIP712StructImplemTask } from \"@internal/app-binder/task/SendEIP712StructImplemTask\";\nimport { TypedDataValueField } from \"@internal/typed-data/model/Types\";\nimport {\n type FieldName,\n type FieldType,\n type StructName,\n type TypedDataValue,\n TypedDataValueArray,\n TypedDataValueRoot,\n} from \"@internal/typed-data/model/Types\";\n\nimport { SendPayloadInChunksTask } from \"./SendPayloadInChunksTask\";\n\ntype AllSuccessTypes = void | { tokenIndex: number };\n\nexport type ProvideEIP712ContextTaskReturnType = Promise<\n CommandResult<AllSuccessTypes, EthErrorCodes>\n>;\n\nexport type ProvideEIP712ContextTaskArgs = {\n deviceModelId: DeviceModelId;\n derivationPath: string;\n types: Record<StructName, Record<FieldName, FieldType>>;\n domain: Array<TypedDataValue>;\n message: Array<TypedDataValue>;\n clearSignContext: Maybe<TypedDataClearSignContextSuccess>;\n calldatasContexts: Record<TypedDataCalldataIndex, ContextWithSubContexts[]>;\n web3Check: ClearSignContextSuccess<ClearSignContextType.WEB3_CHECK> | null;\n};\n\nconst DEVICE_ASSETS_MAX = 5;\n\ntype DeviceAssetIndexes = {\n indexes: Record<TypedDataTokenIndex, number>;\n nextIndex: number;\n};\n\ntype CalldataFiltersMetadata = {\n remainingFilters: number;\n contexts?: ContextWithSubContexts[];\n};\n\nexport class ProvideEIP712ContextTask {\n private chainId: Maybe<number> = Nothing;\n private calldataMetadatas: Record<\n TypedDataCalldataIndex,\n CalldataFiltersMetadata\n > = {};\n\n constructor(\n private api: InternalApi,\n private contextModule: ContextModule,\n private args: ProvideEIP712ContextTaskArgs,\n private readonly provideContextFactory = (args: ProvideContextsTaskArgs) =>\n new ProvideContextsTask(this.api, args),\n ) {\n for (const domainValue of this.args.domain) {\n if (\n domainValue.path === \"chainId\" &&\n domainValue.value instanceof TypedDataValueField\n ) {\n const val = BigInt(bufferToHexaString(domainValue.value.data));\n if (val <= Number.MAX_SAFE_INTEGER) {\n this.chainId = Just(Number(val));\n }\n break;\n }\n }\n }\n\n async run(): ProvideEIP712ContextTaskReturnType {\n // Send message simulation first\n if (this.args.web3Check) {\n await this.provideContext(this.args.web3Check);\n }\n\n // Send proxy descriptor first if required\n await this.args.clearSignContext.ifJust(async (clearSignContext) => {\n if (clearSignContext.proxy !== undefined) {\n await this.provideContext(clearSignContext.proxy);\n }\n });\n\n const result: CommandResult<AllSuccessTypes, EthErrorCodes> =\n CommandResultFactory<AllSuccessTypes, EthErrorCodes>({ data: undefined });\n\n // Provide the structure definitions.\n // Should be sent before struct implementations, as described here:\n // https://github.com/LedgerHQ/app-ethereum/blob/develop/doc/ethapp.adoc#eip712-send-struct-definition\n // Note that those types are used to compute the schema hash, in the device and in ClearSignContexts, as described here:\n // https://github.com/LedgerHQ/app-ethereum/blob/develop/doc/ethapp.adoc#eip712-filtering\n // Therefore it should be normalized on both sides: sorted per keys\n const types = Object.entries(this.args.types).sort(([aKey], [bKey]) =>\n aKey.localeCompare(bKey),\n );\n for (const [structName, fields] of types) {\n const structNameResult = await this.api.sendCommand(\n new SendEIP712StructDefinitionCommand({\n command: StructDefinitionCommand.Name,\n name: structName,\n }),\n );\n if (!isSuccessCommandResult(structNameResult)) {\n return structNameResult;\n }\n\n for (const [fieldName, fieldType] of Object.entries(fields)) {\n const fieldResult = await this.api.sendCommand(\n new SendEIP712StructDefinitionCommand({\n command: StructDefinitionCommand.Field,\n name: fieldName,\n type: fieldType,\n }),\n );\n if (!isSuccessCommandResult(fieldResult)) {\n return fieldResult;\n }\n }\n }\n\n // possibly activate the filtering, before sending domain and message implementations, as described here:\n // https://github.com/LedgerHQ/app-ethereum/blob/develop/doc/ethapp.adoc#activation\n if (this.args.clearSignContext.isJust()) {\n const activationResult = await this.api.sendCommand(\n new SendEIP712FilteringCommand({ type: Eip712FilterType.Activation }),\n );\n if (!isSuccessCommandResult(activationResult)) {\n return activationResult;\n }\n }\n\n // send domain implementation values.\n for (const value of this.args.domain) {\n const domainImplTask = this.getImplementationTask(value);\n const domainImplResult = await domainImplTask.run();\n if (!isSuccessCommandResult(domainImplResult)) {\n return domainImplResult;\n }\n }\n\n // possibly send MessageInformation filter (between Domain and Message)\n // should be sent between Domain and Message implementations, as described here:\n // https://github.com/LedgerHQ/app-ethereum/blob/develop/doc/ethapp.adoc#message-info\n if (this.args.clearSignContext.isJust()) {\n const clearSignContext = this.args.clearSignContext.extract();\n const messageInfoFilterResult = await this.api.sendCommand(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.MessageInfo,\n displayName: clearSignContext.messageInfo.displayName,\n filtersCount: clearSignContext.messageInfo.filtersCount,\n signature: clearSignContext.messageInfo.signature,\n }),\n );\n if (!isSuccessCommandResult(messageInfoFilterResult)) {\n return messageInfoFilterResult;\n }\n }\n\n // send message implementation values\n const deviceIndexes: DeviceAssetIndexes = { indexes: {}, nextIndex: 0 };\n for (const value of this.args.message) {\n // 5.1 Provide token descriptors, if any\n // Keep a map of all device indexes for those provided tokens.\n const maybeTokenError = await this.provideTokenInformation(\n value,\n deviceIndexes,\n );\n if (maybeTokenError.isJust()) {\n return maybeTokenError.extract();\n }\n\n // Provide trusted name descriptors, if any\n const maybeNameError = await this.provideTrustedName(value);\n if (maybeNameError.isJust()) {\n return maybeNameError.extract();\n }\n\n // if there's a filter, send it\n // https://github.com/LedgerHQ/app-ethereum/blob/develop/doc/ethapp.adoc#amount-join-token\n const maybeFilterResult = await this.filterValue(value, deviceIndexes);\n if (\n maybeFilterResult.isJust() &&\n !isSuccessCommandResult(maybeFilterResult.extract())\n ) {\n return maybeFilterResult.extract();\n }\n\n // provide message value implementation\n const messageImplTask = this.getImplementationTask(value);\n const messageImplResult = await messageImplTask.run();\n if (!isSuccessCommandResult(messageImplResult)) {\n return messageImplResult;\n }\n\n // if a transaction was embedded in that value, provide the related clear sign context\n await this.tryProvideTransactionContext();\n\n // if the value is an empty array, discard sub-filters since\n // there will be no according sub-values in the message\n if (\n this.args.clearSignContext.isJust() &&\n value.value instanceof TypedDataValueArray &&\n value.value.length === 0\n ) {\n const filters = Object.entries(\n this.args.clearSignContext.extract().filters,\n );\n const discardedFilters = filters\n .filter(([path]) => path.startsWith(`${value.path}.[]`))\n .map(([, filter]) => filter);\n for (const filter of discardedFilters) {\n const discardedPathResult = await this.api.sendCommand(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.DiscardedPath,\n path: filter.path,\n }),\n );\n if (!isSuccessCommandResult(discardedPathResult)) {\n return discardedPathResult;\n }\n\n const provideFilteringResult = await this.provideFiltering(\n filter,\n deviceIndexes,\n true,\n );\n if (!isSuccessCommandResult(provideFilteringResult)) {\n return provideFilteringResult;\n }\n }\n }\n }\n\n return result;\n }\n\n async provideContext({\n type,\n payload,\n certificate,\n }: ClearSignContextSuccess) {\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.WEB3_CHECK:\n await new SendPayloadInChunksTask(this.api, {\n payload,\n commandFactory: (args) =>\n new ProvideWeb3CheckCommand({\n payload: args.chunkedData,\n isFirstChunk: args.isFirstChunk,\n }),\n }).run();\n break;\n case ClearSignContextType.PROXY_INFO:\n await new SendPayloadInChunksTask(this.api, {\n payload,\n commandFactory: (args) =>\n new ProvideProxyInfoCommand({\n data: args.chunkedData,\n isFirstChunk: args.isFirstChunk,\n }),\n }).run();\n break;\n case ClearSignContextType.TOKEN:\n case ClearSignContextType.NFT:\n case ClearSignContextType.TRUSTED_NAME:\n case ClearSignContextType.PLUGIN:\n case ClearSignContextType.EXTERNAL_PLUGIN:\n case ClearSignContextType.ENUM:\n case ClearSignContextType.TRANSACTION_INFO:\n case ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION:\n case ClearSignContextType.DYNAMIC_NETWORK:\n case ClearSignContextType.DYNAMIC_NETWORK_ICON:\n throw new Error(\n `Context type ${type} not supported in EIP712 messages`,\n );\n default: {\n const uncoveredType: never = type;\n throw new Error(`Unhandled context type ${uncoveredType}`);\n }\n }\n }\n\n getImplementationTask(value: TypedDataValue): SendEIP712StructImplemTask {\n if (value.value instanceof TypedDataValueRoot) {\n return new SendEIP712StructImplemTask(this.api, {\n type: StructImplemType.ROOT,\n value: value.value.root,\n });\n } else if (value.value instanceof TypedDataValueArray) {\n return new SendEIP712StructImplemTask(this.api, {\n type: StructImplemType.ARRAY,\n value: value.value.length,\n });\n } else {\n return new SendEIP712StructImplemTask(this.api, {\n type: StructImplemType.FIELD,\n value: value.value.data,\n });\n }\n }\n\n async provideTokenInformation(\n value: TypedDataValue,\n deviceIndexes: DeviceAssetIndexes,\n ): Promise<Maybe<CommandResult<AllSuccessTypes, EthErrorCodes>>> {\n if (this.args.clearSignContext.isJust()) {\n const filter = this.args.clearSignContext.extract().filters[value.path];\n // tokens descriptors only needed when a tokenIndex is available in filter.\n // it should be sent to the device only 1 time so deviceIndexes has to be checked.\n if (\n filter !== undefined &&\n (filter.type === \"amount\" || filter.type === \"token\") &&\n deviceIndexes.indexes[filter.tokenIndex] === undefined\n ) {\n const descriptorIndex = filter.tokenIndex;\n const tokens = this.args.clearSignContext.extract().tokens;\n const token = tokens[descriptorIndex];\n if (token === undefined) {\n return Nothing;\n }\n\n const provideTokenInfoResult = await this.api.sendCommand(\n new ProvideTokenInformationCommand({ payload: token }),\n );\n if (!isSuccessCommandResult(provideTokenInfoResult)) {\n return Maybe.of(provideTokenInfoResult);\n }\n let { tokenIndex: deviceIndex } = provideTokenInfoResult.data;\n deviceIndexes.nextIndex = (deviceIndex + 1) % DEVICE_ASSETS_MAX;\n\n // the token corresponding to the Verifying Contract of message domain has a special index value, as described here:\n // https://github.com/LedgerHQ/app-ethereum/blob/develop/doc/ethapp.adoc#amount-join-value\n if (Number(descriptorIndex) === VERIFYING_CONTRACT_TOKEN_INDEX) {\n deviceIndex = VERIFYING_CONTRACT_TOKEN_INDEX;\n }\n\n deviceIndexes.indexes[Number(descriptorIndex)] = deviceIndex;\n }\n }\n return Nothing;\n }\n\n private async provideTrustedName(\n value: TypedDataValue,\n ): Promise<Maybe<CommandResult<AllSuccessTypes, EthErrorCodes>>> {\n if (this.args.clearSignContext.isJust() && this.chainId.isJust()) {\n const context = this.args.clearSignContext.extract();\n const filter = context.filters[value.path];\n const address = context.trustedNamesAddresses[value.path];\n if (\n filter !== undefined &&\n filter.type === \"trusted-name\" &&\n address !== undefined\n ) {\n const getChallengeResult = await this.api.sendCommand(\n new GetChallengeCommand(),\n );\n if (!isSuccessCommandResult(getChallengeResult)) {\n return Just(getChallengeResult);\n }\n\n const context = await this.contextModule.getFieldContext(\n {\n chainId: this.chainId.extract(),\n address,\n challenge: getChallengeResult.data.challenge,\n types: filter.types,\n sources: filter.sources,\n deviceModelId: this.args.deviceModelId,\n },\n ClearSignContextType.TRUSTED_NAME,\n );\n if (context.type === ClearSignContextType.TRUSTED_NAME) {\n if (context.certificate) {\n await this.api.sendCommand(\n new LoadCertificateCommand({\n keyUsage: context.certificate.keyUsageNumber,\n certificate: context.certificate.payload,\n }),\n );\n }\n const provideNameResult = await new SendPayloadInChunksTask(\n this.api,\n {\n payload: context.payload,\n commandFactory: (args) =>\n new ProvideTrustedNameCommand({\n data: args.chunkedData,\n isFirstChunk: args.isFirstChunk,\n }),\n },\n ).run();\n if (!isSuccessCommandResult(provideNameResult)) {\n return Just(provideNameResult);\n }\n }\n }\n }\n return Nothing;\n }\n\n async filterValue(\n value: TypedDataValue,\n deviceIndexes: DeviceAssetIndexes,\n ): Promise<Maybe<CommandResult<AllSuccessTypes, EthErrorCodes>>> {\n if (this.args.clearSignContext.isJust()) {\n const filter = this.args.clearSignContext.extract().filters[value.path];\n if (filter === undefined) {\n return Nothing;\n }\n // provide the filter\n const filteringResult = await this.provideFiltering(\n filter,\n deviceIndexes,\n false,\n );\n return Maybe.of(filteringResult);\n }\n return Nothing;\n }\n\n async provideFiltering(\n filter: TypedDataFilter,\n deviceIndexes: DeviceAssetIndexes,\n discarded: boolean,\n ): Promise<CommandResult<AllSuccessTypes, EthErrorCodes>> {\n switch (filter.type) {\n case \"trusted-name\":\n return await this.api.sendCommand(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.TrustedName,\n discarded,\n displayName: filter.displayName,\n typesAndSourcesPayload: filter.typesAndSourcesPayload,\n signature: filter.signature,\n }),\n );\n case \"datetime\":\n return await this.api.sendCommand(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Datetime,\n discarded,\n displayName: filter.displayName,\n signature: filter.signature,\n }),\n );\n case \"raw\":\n return await this.api.sendCommand(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Raw,\n discarded,\n displayName: filter.displayName,\n signature: filter.signature,\n }),\n );\n case \"token\":\n this.sanitizeDeviceIndex(filter.tokenIndex, deviceIndexes);\n return await this.api.sendCommand(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Token,\n discarded,\n tokenIndex: deviceIndexes.indexes[filter.tokenIndex]!,\n signature: filter.signature,\n }),\n );\n case \"amount\":\n this.sanitizeDeviceIndex(filter.tokenIndex, deviceIndexes);\n return await this.api.sendCommand(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Amount,\n discarded,\n displayName: filter.displayName,\n tokenIndex: deviceIndexes.indexes[filter.tokenIndex]!,\n signature: filter.signature,\n }),\n );\n case \"calldata-value\":\n await this.provideCalldataInfos(filter.calldataIndex);\n return await this.api.sendCommand(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataValue,\n discarded,\n calldataIndex: filter.calldataIndex,\n signature: filter.signature,\n }),\n );\n case \"calldata-callee\":\n await this.provideCalldataInfos(filter.calldataIndex);\n return await this.api.sendCommand(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataCallee,\n discarded,\n calldataIndex: filter.calldataIndex,\n signature: filter.signature,\n }),\n );\n case \"calldata-spender\":\n await this.provideCalldataInfos(filter.calldataIndex);\n return await this.api.sendCommand(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataSpender,\n discarded,\n calldataIndex: filter.calldataIndex,\n signature: filter.signature,\n }),\n );\n case \"calldata-chain-id\":\n await this.provideCalldataInfos(filter.calldataIndex);\n return await this.api.sendCommand(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataChainId,\n discarded,\n calldataIndex: filter.calldataIndex,\n signature: filter.signature,\n }),\n );\n case \"calldata-selector\":\n await this.provideCalldataInfos(filter.calldataIndex);\n return await this.api.sendCommand(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataSelector,\n discarded,\n calldataIndex: filter.calldataIndex,\n signature: filter.signature,\n }),\n );\n case \"calldata-amount\":\n await this.provideCalldataInfos(filter.calldataIndex);\n return await this.api.sendCommand(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataAmount,\n discarded,\n calldataIndex: filter.calldataIndex,\n signature: filter.signature,\n }),\n );\n default: {\n const unhandledType: never = filter;\n throw new Error(\n `ProvideEIP712ContextTask/provideFiltering - Unhandled filter ${unhandledType}`,\n );\n }\n }\n }\n\n private async provideCalldataInfos(\n calldataIndex: number,\n ): Promise<Maybe<CommandResult<AllSuccessTypes, EthErrorCodes>>> {\n if (this.args.clearSignContext.isJust()) {\n // ensure the calldata info was not already provided to the device\n if (this.calldataMetadatas[calldataIndex] !== undefined) {\n // If already provided, update the remaining filters count\n this.calldataMetadatas[calldataIndex]!.remainingFilters--;\n return Nothing;\n }\n\n // get the calldata infos\n const calldataInfos =\n this.args.clearSignContext.extract().calldatas[calldataIndex];\n if (calldataInfos === undefined) {\n return Nothing;\n }\n\n // Initialize the expected filters count\n const filtersPresence = [\n calldataInfos.filter.valueFlag,\n calldataInfos.filter.calleeFlag ===\n TypedDataCalldataParamPresence.Present,\n calldataInfos.filter.chainIdFlag,\n calldataInfos.filter.selectorFlag,\n calldataInfos.filter.amountFlag,\n calldataInfos.filter.spenderFlag ===\n TypedDataCalldataParamPresence.Present,\n ];\n const filtersCount = filtersPresence.filter((f) => f).length;\n this.calldataMetadatas[calldataIndex] = {\n remainingFilters: filtersCount - 1, // Minus 1 since a filter is already being sent\n contexts: this.args.calldatasContexts[calldataIndex],\n };\n\n // provide the transaction infos filter\n return Maybe.of(\n await this.api.sendCommand(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataInfo,\n discarded: false,\n calldataIndex: calldataIndex,\n valueFlag: calldataInfos.filter.valueFlag,\n calleeFlag: this.mapCalldataPresence(\n calldataInfos.filter.calleeFlag,\n ),\n chainIdFlag: calldataInfos.filter.chainIdFlag,\n selectorFlag: calldataInfos.filter.selectorFlag,\n amountFlag: calldataInfos.filter.amountFlag,\n spenderFlag: this.mapCalldataPresence(\n calldataInfos.filter.spenderFlag,\n ),\n signature: calldataInfos.filter.signature,\n }),\n ),\n );\n }\n return Nothing;\n }\n\n private async tryProvideTransactionContext() {\n for (const calldataIndex in this.calldataMetadatas) {\n const metadata = this.calldataMetadatas[calldataIndex]!;\n if (metadata.remainingFilters === 0) {\n // All the filters and implementations were sent for that TX,\n // the related clear sign contexts should now be provided\n if (metadata.contexts !== undefined) {\n await this.provideContextFactory({\n contexts: metadata.contexts,\n derivationPath: this.args.derivationPath,\n }).run();\n }\n delete this.calldataMetadatas[calldataIndex];\n }\n }\n }\n\n private mapCalldataPresence(\n presence: TypedDataCalldataParamPresence,\n ): CalldataParamPresence {\n switch (presence) {\n case TypedDataCalldataParamPresence.None:\n return CalldataParamPresence.None;\n case TypedDataCalldataParamPresence.Present:\n return CalldataParamPresence.Present;\n case TypedDataCalldataParamPresence.VerifyingContract:\n return CalldataParamPresence.VerifyingContract;\n default: {\n const unhandledPresence: never = presence;\n throw new Error(`Unhandled presence ${unhandledPresence}`);\n }\n }\n }\n\n private sanitizeDeviceIndex(\n descriptorIndex: number,\n deviceIndexes: DeviceAssetIndexes,\n ) {\n // If a token is missing, the device will replace it with a placeholder and use the next available index\n if (deviceIndexes.indexes[descriptorIndex] === undefined) {\n deviceIndexes.indexes[descriptorIndex] = deviceIndexes.nextIndex;\n deviceIndexes.nextIndex =\n (deviceIndexes.nextIndex + 1) % DEVICE_ASSETS_MAX;\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,8BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAQO,oCACPA,EAGO,oCAMPC,EAKO,2CACPC,EAAqC,qBAErCC,EAAoC,4DACpCC,EAAwC,gEACxCC,EAA+C,uEAC/CC,EAA0C,kEAC1CC,EAAwC,gEACxCC,EAIO,mEACPC,EAGO,0EACPC,EAAiC,sEAGjCC,
|
|
6
|
-
"names": ["ProvideEIP712ContextTask_exports", "__export", "ProvideEIP712ContextTask", "__toCommonJS", "import_context_module", "import_device_management_kit", "import_purify_ts", "import_GetChallengeCommand", "import_ProvideProxyInfoCommand", "import_ProvideTokenInformationCommand", "import_ProvideTrustedNameCommand", "import_ProvideWeb3CheckCommand", "import_SendEIP712FilteringCommand", "import_SendEIP712StructDefinitionCommand", "import_SendEIP712StructImplemCommand", "
|
|
4
|
+
"sourcesContent": ["import {\n type ContextModule,\n type TypedDataCalldataIndex,\n TypedDataCalldataParamPresence,\n type TypedDataClearSignContextSuccess,\n type TypedDataFilter,\n type TypedDataTokenIndex,\n VERIFYING_CONTRACT_TOKEN_INDEX,\n} from \"@ledgerhq/context-module\";\nimport {\n type ClearSignContextSuccess,\n ClearSignContextType,\n} from \"@ledgerhq/context-module\";\nimport type {\n CommandResult,\n DeviceModelId,\n InternalApi,\n} from \"@ledgerhq/device-management-kit\";\nimport {\n bufferToHexaString,\n CommandResultFactory,\n isSuccessCommandResult,\n LoadCertificateCommand,\n} from \"@ledgerhq/device-management-kit\";\nimport { Just, Maybe, Nothing } from \"purify-ts\";\n\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\nimport { ProvideProxyInfoCommand } from \"@internal/app-binder/command/ProvideProxyInfoCommand\";\nimport { ProvideTokenInformationCommand } from \"@internal/app-binder/command/ProvideTokenInformationCommand\";\nimport { ProvideTrustedNameCommand } from \"@internal/app-binder/command/ProvideTrustedNameCommand\";\nimport { ProvideWeb3CheckCommand } from \"@internal/app-binder/command/ProvideWeb3CheckCommand\";\nimport {\n CalldataParamPresence,\n Eip712FilterType,\n SendEIP712FilteringCommand,\n} from \"@internal/app-binder/command/SendEIP712FilteringCommand\";\nimport {\n SendEIP712StructDefinitionCommand,\n StructDefinitionCommand,\n} from \"@internal/app-binder/command/SendEIP712StructDefinitionCommand\";\nimport { StructImplemType } from \"@internal/app-binder/command/SendEIP712StructImplemCommand\";\nimport { type EthErrorCodes } from \"@internal/app-binder/command/utils/ethAppErrors\";\nimport { type ContextWithSubContexts } from \"@internal/app-binder/task/BuildFullContextsTask\";\nimport { SendEIP712StructImplemTask } from \"@internal/app-binder/task/SendEIP712StructImplemTask\";\nimport { TypedDataValueField } from \"@internal/typed-data/model/Types\";\nimport {\n type FieldName,\n type FieldType,\n type StructName,\n type TypedDataValue,\n TypedDataValueArray,\n TypedDataValueRoot,\n} from \"@internal/typed-data/model/Types\";\n\nimport {\n ProvideTransactionContextsTask,\n type ProvideTransactionContextsTaskArgs,\n} from \"./ProvideTransactionContextsTask\";\nimport { SendPayloadInChunksTask } from \"./SendPayloadInChunksTask\";\n\ntype AllSuccessTypes = void | { tokenIndex: number };\n\nexport type ProvideEIP712ContextTaskReturnType = Promise<\n CommandResult<AllSuccessTypes, EthErrorCodes>\n>;\n\nexport type ProvideEIP712ContextTaskArgs = {\n deviceModelId: DeviceModelId;\n derivationPath: string;\n types: Record<StructName, Record<FieldName, FieldType>>;\n domain: Array<TypedDataValue>;\n message: Array<TypedDataValue>;\n clearSignContext: Maybe<TypedDataClearSignContextSuccess>;\n calldatasContexts: Record<TypedDataCalldataIndex, ContextWithSubContexts[]>;\n web3Check: ClearSignContextSuccess<ClearSignContextType.WEB3_CHECK> | null;\n};\n\nconst DEVICE_ASSETS_MAX = 5;\n\ntype DeviceAssetIndexes = {\n indexes: Record<TypedDataTokenIndex, number>;\n nextIndex: number;\n};\n\ntype CalldataFiltersMetadata = {\n remainingFilters: number;\n contexts?: ContextWithSubContexts[];\n};\n\nexport class ProvideEIP712ContextTask {\n private chainId: Maybe<number> = Nothing;\n private calldataMetadatas: Record<\n TypedDataCalldataIndex,\n CalldataFiltersMetadata\n > = {};\n\n constructor(\n private api: InternalApi,\n private contextModule: ContextModule,\n private args: ProvideEIP712ContextTaskArgs,\n private readonly provideContextFactory = (\n args: ProvideTransactionContextsTaskArgs,\n ) => new ProvideTransactionContextsTask(this.api, args),\n ) {\n for (const domainValue of this.args.domain) {\n if (\n domainValue.path === \"chainId\" &&\n domainValue.value instanceof TypedDataValueField\n ) {\n const val = BigInt(bufferToHexaString(domainValue.value.data));\n if (val <= Number.MAX_SAFE_INTEGER) {\n this.chainId = Just(Number(val));\n }\n break;\n }\n }\n }\n\n async run(): ProvideEIP712ContextTaskReturnType {\n // Send message simulation first\n if (this.args.web3Check) {\n await this.provideContext(this.args.web3Check);\n }\n\n // Send proxy descriptor first if required\n await this.args.clearSignContext.ifJust(async (clearSignContext) => {\n if (clearSignContext.proxy !== undefined) {\n await this.provideContext(clearSignContext.proxy);\n }\n });\n\n const result: CommandResult<AllSuccessTypes, EthErrorCodes> =\n CommandResultFactory<AllSuccessTypes, EthErrorCodes>({ data: undefined });\n\n // Provide the structure definitions.\n // Should be sent before struct implementations, as described here:\n // https://github.com/LedgerHQ/app-ethereum/blob/develop/doc/ethapp.adoc#eip712-send-struct-definition\n // Note that those types are used to compute the schema hash, in the device and in ClearSignContexts, as described here:\n // https://github.com/LedgerHQ/app-ethereum/blob/develop/doc/ethapp.adoc#eip712-filtering\n // Therefore it should be normalized on both sides: sorted per keys\n const types = Object.entries(this.args.types).sort(([aKey], [bKey]) =>\n aKey.localeCompare(bKey),\n );\n for (const [structName, fields] of types) {\n const structNameResult = await this.api.sendCommand(\n new SendEIP712StructDefinitionCommand({\n command: StructDefinitionCommand.Name,\n name: structName,\n }),\n );\n if (!isSuccessCommandResult(structNameResult)) {\n return structNameResult;\n }\n\n for (const [fieldName, fieldType] of Object.entries(fields)) {\n const fieldResult = await this.api.sendCommand(\n new SendEIP712StructDefinitionCommand({\n command: StructDefinitionCommand.Field,\n name: fieldName,\n type: fieldType,\n }),\n );\n if (!isSuccessCommandResult(fieldResult)) {\n return fieldResult;\n }\n }\n }\n\n // possibly activate the filtering, before sending domain and message implementations, as described here:\n // https://github.com/LedgerHQ/app-ethereum/blob/develop/doc/ethapp.adoc#activation\n if (this.args.clearSignContext.isJust()) {\n const activationResult = await this.api.sendCommand(\n new SendEIP712FilteringCommand({ type: Eip712FilterType.Activation }),\n );\n if (!isSuccessCommandResult(activationResult)) {\n return activationResult;\n }\n }\n\n // send domain implementation values.\n for (const value of this.args.domain) {\n const domainImplTask = this.getImplementationTask(value);\n const domainImplResult = await domainImplTask.run();\n if (!isSuccessCommandResult(domainImplResult)) {\n return domainImplResult;\n }\n }\n\n // possibly send MessageInformation filter (between Domain and Message)\n // should be sent between Domain and Message implementations, as described here:\n // https://github.com/LedgerHQ/app-ethereum/blob/develop/doc/ethapp.adoc#message-info\n if (this.args.clearSignContext.isJust()) {\n const clearSignContext = this.args.clearSignContext.extract();\n const messageInfoFilterResult = await this.api.sendCommand(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.MessageInfo,\n displayName: clearSignContext.messageInfo.displayName,\n filtersCount: clearSignContext.messageInfo.filtersCount,\n signature: clearSignContext.messageInfo.signature,\n }),\n );\n if (!isSuccessCommandResult(messageInfoFilterResult)) {\n return messageInfoFilterResult;\n }\n }\n\n // send message implementation values\n const deviceIndexes: DeviceAssetIndexes = { indexes: {}, nextIndex: 0 };\n for (const value of this.args.message) {\n // 5.1 Provide token descriptors, if any\n // Keep a map of all device indexes for those provided tokens.\n const maybeTokenError = await this.provideTokenInformation(\n value,\n deviceIndexes,\n );\n if (maybeTokenError.isJust()) {\n return maybeTokenError.extract();\n }\n\n // Provide trusted name descriptors, if any\n const maybeNameError = await this.provideTrustedName(value);\n if (maybeNameError.isJust()) {\n return maybeNameError.extract();\n }\n\n // if there's a filter, send it\n // https://github.com/LedgerHQ/app-ethereum/blob/develop/doc/ethapp.adoc#amount-join-token\n const maybeFilterResult = await this.filterValue(value, deviceIndexes);\n if (\n maybeFilterResult.isJust() &&\n !isSuccessCommandResult(maybeFilterResult.extract())\n ) {\n return maybeFilterResult.extract();\n }\n\n // provide message value implementation\n const messageImplTask = this.getImplementationTask(value);\n const messageImplResult = await messageImplTask.run();\n if (!isSuccessCommandResult(messageImplResult)) {\n return messageImplResult;\n }\n\n // if a transaction was embedded in that value, provide the related clear sign context\n await this.tryProvideTransactionContext();\n\n // if the value is an empty array, discard sub-filters since\n // there will be no according sub-values in the message\n if (\n this.args.clearSignContext.isJust() &&\n value.value instanceof TypedDataValueArray &&\n value.value.length === 0\n ) {\n const filters = Object.entries(\n this.args.clearSignContext.extract().filters,\n );\n const discardedFilters = filters\n .filter(([path]) => path.startsWith(`${value.path}.[]`))\n .map(([, filter]) => filter);\n for (const filter of discardedFilters) {\n const discardedPathResult = await this.api.sendCommand(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.DiscardedPath,\n path: filter.path,\n }),\n );\n if (!isSuccessCommandResult(discardedPathResult)) {\n return discardedPathResult;\n }\n\n const provideFilteringResult = await this.provideFiltering(\n filter,\n deviceIndexes,\n true,\n );\n if (!isSuccessCommandResult(provideFilteringResult)) {\n return provideFilteringResult;\n }\n }\n }\n }\n\n return result;\n }\n\n async provideContext({\n type,\n payload,\n certificate,\n }: ClearSignContextSuccess) {\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.WEB3_CHECK:\n await new SendPayloadInChunksTask(this.api, {\n payload,\n commandFactory: (args) =>\n new ProvideWeb3CheckCommand({\n payload: args.chunkedData,\n isFirstChunk: args.isFirstChunk,\n }),\n }).run();\n break;\n case ClearSignContextType.PROXY_INFO:\n await new SendPayloadInChunksTask(this.api, {\n payload,\n commandFactory: (args) =>\n new ProvideProxyInfoCommand({\n data: args.chunkedData,\n isFirstChunk: args.isFirstChunk,\n }),\n }).run();\n break;\n case ClearSignContextType.TOKEN:\n case ClearSignContextType.NFT:\n case ClearSignContextType.TRUSTED_NAME:\n case ClearSignContextType.PLUGIN:\n case ClearSignContextType.EXTERNAL_PLUGIN:\n case ClearSignContextType.ENUM:\n case ClearSignContextType.TRANSACTION_INFO:\n case ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION:\n case ClearSignContextType.DYNAMIC_NETWORK:\n case ClearSignContextType.DYNAMIC_NETWORK_ICON:\n case ClearSignContextType.SAFE:\n case ClearSignContextType.SIGNER:\n throw new Error(\n `Context type ${type} not supported in EIP712 messages`,\n );\n default: {\n const uncoveredType: never = type;\n throw new Error(`Unhandled context type ${uncoveredType}`);\n }\n }\n }\n\n getImplementationTask(value: TypedDataValue): SendEIP712StructImplemTask {\n if (value.value instanceof TypedDataValueRoot) {\n return new SendEIP712StructImplemTask(this.api, {\n type: StructImplemType.ROOT,\n value: value.value.root,\n });\n } else if (value.value instanceof TypedDataValueArray) {\n return new SendEIP712StructImplemTask(this.api, {\n type: StructImplemType.ARRAY,\n value: value.value.length,\n });\n } else {\n return new SendEIP712StructImplemTask(this.api, {\n type: StructImplemType.FIELD,\n value: value.value.data,\n });\n }\n }\n\n async provideTokenInformation(\n value: TypedDataValue,\n deviceIndexes: DeviceAssetIndexes,\n ): Promise<Maybe<CommandResult<AllSuccessTypes, EthErrorCodes>>> {\n if (this.args.clearSignContext.isJust()) {\n const filter = this.args.clearSignContext.extract().filters[value.path];\n // tokens descriptors only needed when a tokenIndex is available in filter.\n // it should be sent to the device only 1 time so deviceIndexes has to be checked.\n if (\n filter !== undefined &&\n (filter.type === \"amount\" || filter.type === \"token\") &&\n deviceIndexes.indexes[filter.tokenIndex] === undefined\n ) {\n const descriptorIndex = filter.tokenIndex;\n const tokens = this.args.clearSignContext.extract().tokens;\n const token = tokens[descriptorIndex];\n if (token === undefined) {\n return Nothing;\n }\n\n const provideTokenInfoResult = await this.api.sendCommand(\n new ProvideTokenInformationCommand({ payload: token }),\n );\n if (!isSuccessCommandResult(provideTokenInfoResult)) {\n return Maybe.of(provideTokenInfoResult);\n }\n let { tokenIndex: deviceIndex } = provideTokenInfoResult.data;\n deviceIndexes.nextIndex = (deviceIndex + 1) % DEVICE_ASSETS_MAX;\n\n // the token corresponding to the Verifying Contract of message domain has a special index value, as described here:\n // https://github.com/LedgerHQ/app-ethereum/blob/develop/doc/ethapp.adoc#amount-join-value\n if (Number(descriptorIndex) === VERIFYING_CONTRACT_TOKEN_INDEX) {\n deviceIndex = VERIFYING_CONTRACT_TOKEN_INDEX;\n }\n\n deviceIndexes.indexes[Number(descriptorIndex)] = deviceIndex;\n }\n }\n return Nothing;\n }\n\n private async provideTrustedName(\n value: TypedDataValue,\n ): Promise<Maybe<CommandResult<AllSuccessTypes, EthErrorCodes>>> {\n if (this.args.clearSignContext.isJust() && this.chainId.isJust()) {\n const context = this.args.clearSignContext.extract();\n const filter = context.filters[value.path];\n const address = context.trustedNamesAddresses[value.path];\n if (\n filter !== undefined &&\n filter.type === \"trusted-name\" &&\n address !== undefined\n ) {\n const getChallengeResult = await this.api.sendCommand(\n new GetChallengeCommand(),\n );\n if (!isSuccessCommandResult(getChallengeResult)) {\n return Just(getChallengeResult);\n }\n\n const context = await this.contextModule.getFieldContext(\n {\n chainId: this.chainId.extract(),\n address,\n challenge: getChallengeResult.data.challenge,\n types: filter.types,\n sources: filter.sources,\n deviceModelId: this.args.deviceModelId,\n },\n ClearSignContextType.TRUSTED_NAME,\n );\n if (context.type === ClearSignContextType.TRUSTED_NAME) {\n if (context.certificate) {\n await this.api.sendCommand(\n new LoadCertificateCommand({\n keyUsage: context.certificate.keyUsageNumber,\n certificate: context.certificate.payload,\n }),\n );\n }\n const provideNameResult = await new SendPayloadInChunksTask(\n this.api,\n {\n payload: context.payload,\n commandFactory: (args) =>\n new ProvideTrustedNameCommand({\n data: args.chunkedData,\n isFirstChunk: args.isFirstChunk,\n }),\n },\n ).run();\n if (!isSuccessCommandResult(provideNameResult)) {\n return Just(provideNameResult);\n }\n }\n }\n }\n return Nothing;\n }\n\n async filterValue(\n value: TypedDataValue,\n deviceIndexes: DeviceAssetIndexes,\n ): Promise<Maybe<CommandResult<AllSuccessTypes, EthErrorCodes>>> {\n if (this.args.clearSignContext.isJust()) {\n const filter = this.args.clearSignContext.extract().filters[value.path];\n if (filter === undefined) {\n return Nothing;\n }\n // provide the filter\n const filteringResult = await this.provideFiltering(\n filter,\n deviceIndexes,\n false,\n );\n return Maybe.of(filteringResult);\n }\n return Nothing;\n }\n\n async provideFiltering(\n filter: TypedDataFilter,\n deviceIndexes: DeviceAssetIndexes,\n discarded: boolean,\n ): Promise<CommandResult<AllSuccessTypes, EthErrorCodes>> {\n switch (filter.type) {\n case \"trusted-name\":\n return await this.api.sendCommand(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.TrustedName,\n discarded,\n displayName: filter.displayName,\n typesAndSourcesPayload: filter.typesAndSourcesPayload,\n signature: filter.signature,\n }),\n );\n case \"datetime\":\n return await this.api.sendCommand(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Datetime,\n discarded,\n displayName: filter.displayName,\n signature: filter.signature,\n }),\n );\n case \"raw\":\n return await this.api.sendCommand(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Raw,\n discarded,\n displayName: filter.displayName,\n signature: filter.signature,\n }),\n );\n case \"token\":\n this.sanitizeDeviceIndex(filter.tokenIndex, deviceIndexes);\n return await this.api.sendCommand(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Token,\n discarded,\n tokenIndex: deviceIndexes.indexes[filter.tokenIndex]!,\n signature: filter.signature,\n }),\n );\n case \"amount\":\n this.sanitizeDeviceIndex(filter.tokenIndex, deviceIndexes);\n return await this.api.sendCommand(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Amount,\n discarded,\n displayName: filter.displayName,\n tokenIndex: deviceIndexes.indexes[filter.tokenIndex]!,\n signature: filter.signature,\n }),\n );\n case \"calldata-value\":\n await this.provideCalldataInfos(filter.calldataIndex);\n return await this.api.sendCommand(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataValue,\n discarded,\n calldataIndex: filter.calldataIndex,\n signature: filter.signature,\n }),\n );\n case \"calldata-callee\":\n await this.provideCalldataInfos(filter.calldataIndex);\n return await this.api.sendCommand(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataCallee,\n discarded,\n calldataIndex: filter.calldataIndex,\n signature: filter.signature,\n }),\n );\n case \"calldata-spender\":\n await this.provideCalldataInfos(filter.calldataIndex);\n return await this.api.sendCommand(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataSpender,\n discarded,\n calldataIndex: filter.calldataIndex,\n signature: filter.signature,\n }),\n );\n case \"calldata-chain-id\":\n await this.provideCalldataInfos(filter.calldataIndex);\n return await this.api.sendCommand(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataChainId,\n discarded,\n calldataIndex: filter.calldataIndex,\n signature: filter.signature,\n }),\n );\n case \"calldata-selector\":\n await this.provideCalldataInfos(filter.calldataIndex);\n return await this.api.sendCommand(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataSelector,\n discarded,\n calldataIndex: filter.calldataIndex,\n signature: filter.signature,\n }),\n );\n case \"calldata-amount\":\n await this.provideCalldataInfos(filter.calldataIndex);\n return await this.api.sendCommand(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataAmount,\n discarded,\n calldataIndex: filter.calldataIndex,\n signature: filter.signature,\n }),\n );\n default: {\n const unhandledType: never = filter;\n throw new Error(\n `ProvideEIP712ContextTask/provideFiltering - Unhandled filter ${unhandledType}`,\n );\n }\n }\n }\n\n private async provideCalldataInfos(\n calldataIndex: number,\n ): Promise<Maybe<CommandResult<AllSuccessTypes, EthErrorCodes>>> {\n if (this.args.clearSignContext.isJust()) {\n // ensure the calldata info was not already provided to the device\n if (this.calldataMetadatas[calldataIndex] !== undefined) {\n // If already provided, update the remaining filters count\n this.calldataMetadatas[calldataIndex]!.remainingFilters--;\n return Nothing;\n }\n\n // get the calldata infos\n const calldataInfos =\n this.args.clearSignContext.extract().calldatas[calldataIndex];\n if (calldataInfos === undefined) {\n return Nothing;\n }\n\n // Initialize the expected filters count\n const filtersPresence = [\n calldataInfos.filter.valueFlag,\n calldataInfos.filter.calleeFlag ===\n TypedDataCalldataParamPresence.Present,\n calldataInfos.filter.chainIdFlag,\n calldataInfos.filter.selectorFlag,\n calldataInfos.filter.amountFlag,\n calldataInfos.filter.spenderFlag ===\n TypedDataCalldataParamPresence.Present,\n ];\n const filtersCount = filtersPresence.filter((f) => f).length;\n this.calldataMetadatas[calldataIndex] = {\n remainingFilters: filtersCount - 1, // Minus 1 since a filter is already being sent\n contexts: this.args.calldatasContexts[calldataIndex],\n };\n\n // provide the transaction infos filter\n return Maybe.of(\n await this.api.sendCommand(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataInfo,\n discarded: false,\n calldataIndex: calldataIndex,\n valueFlag: calldataInfos.filter.valueFlag,\n calleeFlag: this.mapCalldataPresence(\n calldataInfos.filter.calleeFlag,\n ),\n chainIdFlag: calldataInfos.filter.chainIdFlag,\n selectorFlag: calldataInfos.filter.selectorFlag,\n amountFlag: calldataInfos.filter.amountFlag,\n spenderFlag: this.mapCalldataPresence(\n calldataInfos.filter.spenderFlag,\n ),\n signature: calldataInfos.filter.signature,\n }),\n ),\n );\n }\n return Nothing;\n }\n\n private async tryProvideTransactionContext() {\n for (const calldataIndex in this.calldataMetadatas) {\n const metadata = this.calldataMetadatas[calldataIndex]!;\n if (metadata.remainingFilters === 0) {\n // All the filters and implementations were sent for that TX,\n // the related clear sign contexts should now be provided\n if (metadata.contexts !== undefined) {\n await this.provideContextFactory({\n contexts: metadata.contexts,\n derivationPath: this.args.derivationPath,\n }).run();\n }\n delete this.calldataMetadatas[calldataIndex];\n }\n }\n }\n\n private mapCalldataPresence(\n presence: TypedDataCalldataParamPresence,\n ): CalldataParamPresence {\n switch (presence) {\n case TypedDataCalldataParamPresence.None:\n return CalldataParamPresence.None;\n case TypedDataCalldataParamPresence.Present:\n return CalldataParamPresence.Present;\n case TypedDataCalldataParamPresence.VerifyingContract:\n return CalldataParamPresence.VerifyingContract;\n default: {\n const unhandledPresence: never = presence;\n throw new Error(`Unhandled presence ${unhandledPresence}`);\n }\n }\n }\n\n private sanitizeDeviceIndex(\n descriptorIndex: number,\n deviceIndexes: DeviceAssetIndexes,\n ) {\n // If a token is missing, the device will replace it with a placeholder and use the next available index\n if (deviceIndexes.indexes[descriptorIndex] === undefined) {\n deviceIndexes.indexes[descriptorIndex] = deviceIndexes.nextIndex;\n deviceIndexes.nextIndex =\n (deviceIndexes.nextIndex + 1) % DEVICE_ASSETS_MAX;\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["ProvideEIP712ContextTask_exports", "__export", "ProvideEIP712ContextTask", "__toCommonJS", "import_context_module", "import_device_management_kit", "import_purify_ts", "import_GetChallengeCommand", "import_ProvideProxyInfoCommand", "import_ProvideTokenInformationCommand", "import_ProvideTrustedNameCommand", "import_ProvideWeb3CheckCommand", "import_SendEIP712FilteringCommand", "import_SendEIP712StructDefinitionCommand", "import_SendEIP712StructImplemCommand", "import_SendEIP712StructImplemTask", "import_Types", "import_ProvideTransactionContextsTask", "import_SendPayloadInChunksTask", "DEVICE_ASSETS_MAX", "api", "contextModule", "args", "provideContextFactory", "domainValue", "val", "clearSignContext", "result", "types", "aKey", "bKey", "structName", "fields", "structNameResult", "fieldName", "fieldType", "fieldResult", "activationResult", "value", "domainImplResult", "messageInfoFilterResult", "deviceIndexes", "maybeTokenError", "maybeNameError", "maybeFilterResult", "messageImplResult", "discardedFilters", "path", "filter", "discardedPathResult", "provideFilteringResult", "type", "payload", "certificate", "uncoveredType", "descriptorIndex", "token", "provideTokenInfoResult", "deviceIndex", "context", "address", "getChallengeResult", "provideNameResult", "filteringResult", "discarded", "unhandledType", "calldataIndex", "calldataInfos", "filtersCount", "f", "metadata", "presence", "unhandledPresence"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var m=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var f=(a,t)=>{for(var r in t)m(a,r,{get:t[r],enumerable:!0})},y=(a,t,r,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of l(t))!x.call(a,o)&&o!==r&&m(a,o,{get:()=>t[o],enumerable:!(i=k(t,o))||i.enumerable});return a};var v=a=>y(m({},"__esModule",{value:!0}),a);var I={};f(I,{ProvideTransactionContextsTask:()=>_});module.exports=v(I);var d=require("@ledgerhq/context-module"),c=require("@ledgerhq/device-management-kit"),C=require("@ledgerhq/signer-utils"),p=require("purify-ts"),u=require("../../app-binder/command/StoreTransactionCommand"),h=require("./ProvideContextTask"),T=require("./SendCommandInChunksTask");class _{constructor(t,r,i=(e,n)=>new h.ProvideContextTask(e,n),o=(e,n)=>new T.SendCommandInChunksTask(e,n)){this._api=t;this._args=r;this._provideContextTaskFactory=i;this._sendCommandInChunksTaskFactory=o}async run(){let t=!1;for(const{context:r,subcontextCallbacks:i}of this._args.contexts){for(const e of i){const n=await e();n.type!==d.ClearSignContextType.ERROR&&await this._provideContextTaskFactory(this._api,{context:n}).run()}if(r.type===d.ClearSignContextType.PROXY_INFO)continue;if(!t&&this._args.serializedTransaction!==void 0&&r.type===d.ClearSignContextType.TRANSACTION_INFO){t=!0;const e=C.DerivationPathUtils.splitPath(this._args.derivationPath),n=new c.ByteArrayBuilder;n.add8BitUIntToData(e.length),e.forEach(s=>{n.add32BitUIntToData(s)}),n.addBufferToData(this._args.serializedTransaction),await this._sendCommandInChunksTaskFactory(this._api,{data:n.build(),commandFactory:s=>new u.StoreTransactionCommand({serializedTransaction:s.chunkedData,isFirstChunk:s.isFirstChunk})}).run()}const o=await this._provideContextTaskFactory(this._api,{context:r}).run();if(!(0,c.isSuccessCommandResult)(o))return(0,p.Left)(o)}return(0,p.Right)(void 0)}}0&&(module.exports={ProvideTransactionContextsTask});
|
|
2
|
+
//# sourceMappingURL=ProvideTransactionContextsTask.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/task/ProvideTransactionContextsTask.ts"],
|
|
4
|
+
"sourcesContent": ["import { ClearSignContextType } from \"@ledgerhq/context-module\";\nimport {\n ByteArrayBuilder,\n type CommandErrorResult,\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\nimport { DerivationPathUtils } from \"@ledgerhq/signer-utils\";\nimport { type Either, Left, Right } from \"purify-ts\";\n\nimport { StoreTransactionCommand } from \"@internal/app-binder/command/StoreTransactionCommand\";\nimport { type EthErrorCodes } from \"@internal/app-binder/command/utils/ethAppErrors\";\n\nimport { type ContextWithSubContexts } from \"./BuildFullContextsTask\";\nimport {\n ProvideContextTask,\n type ProvideContextTaskArgs,\n} from \"./ProvideContextTask\";\nimport {\n SendCommandInChunksTask,\n type SendCommandInChunksTaskArgs,\n} from \"./SendCommandInChunksTask\";\n\nexport type ProvideTransactionContextsTaskArgs = {\n /**\n * The list of clear sign context with subcontexts callback to provide.\n */\n contexts: ContextWithSubContexts[];\n /**\n * The derivation path to provide.\n */\n derivationPath: string;\n /**\n * The serialized transaction to provide.\n * This parameter is optional in the case there is no transaction at all, for instance\n * if there is only a standalone calldata embedded in a message.\n */\n serializedTransaction?: Uint8Array;\n};\n\nexport type ProvideTransactionContextsTaskResult = Either<\n CommandErrorResult<EthErrorCodes>,\n void\n>;\n\n/**\n * This task is responsible for providing the transaction context to the device.\n * It will send the subcontexts callbacks in order and finish with the context.\n */\nexport class ProvideTransactionContextsTask {\n constructor(\n private _api: InternalApi,\n private _args: ProvideTransactionContextsTaskArgs,\n private _provideContextTaskFactory = (\n api: InternalApi,\n args: ProvideContextTaskArgs,\n ) => new ProvideContextTask(api, args),\n private _sendCommandInChunksTaskFactory = (\n api: InternalApi,\n args: SendCommandInChunksTaskArgs<unknown>,\n ) => new SendCommandInChunksTask(api, args),\n ) {}\n\n async run(): Promise<ProvideTransactionContextsTaskResult> {\n let transactionInfoProvided = false;\n\n for (const { context, subcontextCallbacks } of this._args.contexts) {\n for (const callback of subcontextCallbacks) {\n const subcontext = await callback();\n\n if (subcontext.type === ClearSignContextType.ERROR) {\n // silently ignore error subcontexts\n continue;\n }\n\n // Don't fail immediately on subcontext errors because the main context may still be successful\n await this._provideContextTaskFactory(this._api, {\n context: subcontext,\n }).run();\n }\n\n if (context.type === ClearSignContextType.PROXY_INFO) {\n // In this specific case, the context is not valid as the challenge is not valid on the first call\n // the real data is provided in the subcontext callback\n continue;\n }\n\n if (\n !transactionInfoProvided &&\n this._args.serializedTransaction !== undefined &&\n context.type === ClearSignContextType.TRANSACTION_INFO\n ) {\n // Send the serialized transaction for the first TRANSACTION_INFO.\n // All other TRANSACTION_INFO contexts will be ignored as it will be for nested calldata.\n transactionInfoProvided = true;\n\n const paths = DerivationPathUtils.splitPath(this._args.derivationPath);\n const builder = new ByteArrayBuilder();\n builder.add8BitUIntToData(paths.length);\n paths.forEach((path) => {\n builder.add32BitUIntToData(path);\n });\n builder.addBufferToData(this._args.serializedTransaction);\n await this._sendCommandInChunksTaskFactory(this._api, {\n data: builder.build(),\n commandFactory: (args) =>\n new StoreTransactionCommand({\n serializedTransaction: args.chunkedData,\n isFirstChunk: args.isFirstChunk,\n }),\n }).run();\n }\n\n const res = await this._provideContextTaskFactory(this._api, {\n context,\n }).run();\n if (!isSuccessCommandResult(res)) {\n return Left(res);\n }\n }\n\n return Right(void 0);\n }\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oCAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAqC,oCACrCC,EAKO,2CACPC,EAAoC,kCACpCC,EAAyC,qBAEzCC,EAAwC,gEAIxCC,EAGO,gCACPC,EAGO,qCA4BA,MAAMR,CAA+B,CAC1C,YACUS,EACAC,EACAC,EAA6B,CACnCC,EACAC,IACG,IAAI,qBAAmBD,EAAKC,CAAI,EAC7BC,EAAkC,CACxCF,EACAC,IACG,IAAI,0BAAwBD,EAAKC,CAAI,EAC1C,CAVQ,UAAAJ,EACA,WAAAC,EACA,gCAAAC,EAIA,qCAAAG,CAIP,CAEH,MAAM,KAAqD,CACzD,IAAIC,EAA0B,GAE9B,SAAW,CAAE,QAAAC,EAAS,oBAAAC,CAAoB,IAAK,KAAK,MAAM,SAAU,CAClE,UAAWC,KAAYD,EAAqB,CAC1C,MAAME,EAAa,MAAMD,EAAS,EAE9BC,EAAW,OAAS,uBAAqB,OAM7C,MAAM,KAAK,2BAA2B,KAAK,KAAM,CAC/C,QAASA,CACX,CAAC,EAAE,IAAI,CACT,CAEA,GAAIH,EAAQ,OAAS,uBAAqB,WAGxC,SAGF,GACE,CAACD,GACD,KAAK,MAAM,wBAA0B,QACrCC,EAAQ,OAAS,uBAAqB,iBACtC,CAGAD,EAA0B,GAE1B,MAAMK,EAAQ,sBAAoB,UAAU,KAAK,MAAM,cAAc,EAC/DC,EAAU,IAAI,mBACpBA,EAAQ,kBAAkBD,EAAM,MAAM,EACtCA,EAAM,QAASE,GAAS,CACtBD,EAAQ,mBAAmBC,CAAI,CACjC,CAAC,EACDD,EAAQ,gBAAgB,KAAK,MAAM,qBAAqB,EACxD,MAAM,KAAK,gCAAgC,KAAK,KAAM,CACpD,KAAMA,EAAQ,MAAM,EACpB,eAAiBR,GACf,IAAI,0BAAwB,CAC1B,sBAAuBA,EAAK,YAC5B,aAAcA,EAAK,YACrB,CAAC,CACL,CAAC,EAAE,IAAI,CACT,CAEA,MAAMU,EAAM,MAAM,KAAK,2BAA2B,KAAK,KAAM,CAC3D,QAAAP,CACF,CAAC,EAAE,IAAI,EACP,GAAI,IAAC,0BAAuBO,CAAG,EAC7B,SAAO,QAAKA,CAAG,CAEnB,CAEA,SAAO,SAAM,MAAM,CACrB,CACF",
|
|
6
|
+
"names": ["ProvideTransactionContextsTask_exports", "__export", "ProvideTransactionContextsTask", "__toCommonJS", "import_context_module", "import_device_management_kit", "import_signer_utils", "import_purify_ts", "import_StoreTransactionCommand", "import_ProvideContextTask", "import_SendCommandInChunksTask", "_api", "_args", "_provideContextTaskFactory", "api", "args", "_sendCommandInChunksTaskFactory", "transactionInfoProvided", "context", "subcontextCallbacks", "callback", "subcontext", "paths", "builder", "path", "res"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var e=require("@ledgerhq/context-module"),y=require("@ledgerhq/device-management-kit"),d=require("purify-ts"),u=require("../../app-binder/command/StoreTransactionCommand"),T=require("../../app-binder/device-action/__test-utils__/makeInternalApi"),r=require("./ProvideTransactionContextsTask");describe("ProvideTransactionContextsTask",()=>{const o=(0,T.makeDeviceActionInternalApiMock)(),i=(0,y.CommandResultFactory)({data:void 0}),p=(0,y.CommandResultFactory)({data:void 0,error:{}});beforeEach(()=>{vi.resetAllMocks()}),describe("run",()=>{const t=vi.fn(),x=vi.fn(),l=vi.fn(),s=vi.fn();beforeEach(()=>{vi.clearAllMocks(),l.mockImplementation((a,c)=>({run:()=>t(a,c)})),s.mockImplementation((a,c)=>({run:()=>x(a,c)}))}),describe("with no subcontexts",()=>{it("should provide the transaction context for a TRANSACTION_INFO context",async()=>{const a={contexts:[{context:{type:e.ClearSignContextType.TRANSACTION_INFO,payload:"0x00"},subcontextCallbacks:[]}],serializedTransaction:new Uint8Array,derivationPath:"44'/60'/0'/0/0"};x.mockResolvedValue(i),t.mockResolvedValue(i);const n=await new r.ProvideTransactionContextsTask(o,a,l,s).run();expect(n).toEqual((0,d.Right)(void 0)),expect(x).toHaveBeenCalledTimes(1),expect(s).toHaveBeenCalledWith(o,{data:new Uint8Array([5,128,0,0,44,128,0,0,60,128,0,0,0,0,0,0,0,0,0,0,0]),commandFactory:expect.any(Function)});const k=s.mock.calls[0][1].commandFactory,v={chunkedData:new Uint8Array([1,2,3,4]),isFirstChunk:!0},C=k(v);expect(C).toBeInstanceOf(u.StoreTransactionCommand),expect(t).toHaveBeenCalledTimes(1),expect(t).toHaveBeenCalledWith(o,{context:{type:e.ClearSignContextType.TRANSACTION_INFO,payload:"0x00"}})}),it("should provide context without serialized transaction when not provided",async()=>{const a={contexts:[{context:{type:e.ClearSignContextType.TOKEN,payload:"payload"},subcontextCallbacks:[]}],derivationPath:"44'/60'/0'/0/0"};t.mockResolvedValue(i);const n=await new r.ProvideTransactionContextsTask(o,a,l,s).run();expect(n).toEqual((0,d.Right)(void 0)),expect(x).not.toHaveBeenCalled(),expect(t).toHaveBeenCalledTimes(1)}),it("should skip PROXY_INFO context and only provide subcontexts",async()=>{const a={contexts:[{context:{type:e.ClearSignContextType.PROXY_INFO,payload:"payload"},subcontextCallbacks:[()=>Promise.resolve({type:e.ClearSignContextType.PROXY_INFO,payload:"subcontext payload"})]}],serializedTransaction:new Uint8Array,derivationPath:"44'/60'/0'/0/0"};t.mockResolvedValue(i);const n=await new r.ProvideTransactionContextsTask(o,a,l,s).run();expect(n).toEqual((0,d.Right)(void 0)),expect(t).toHaveBeenCalledTimes(1),expect(t).toHaveBeenCalledWith(o,{context:{type:e.ClearSignContextType.PROXY_INFO,payload:"subcontext payload"}})}),it("should skip ERROR subcontexts silently",async()=>{const a={contexts:[{context:{type:e.ClearSignContextType.TOKEN,payload:"payload"},subcontextCallbacks:[()=>Promise.resolve({type:e.ClearSignContextType.ERROR,error:new Error("error")})]}],serializedTransaction:new Uint8Array,derivationPath:"44'/60'/0'/0/0"};t.mockResolvedValue(i);const n=await new r.ProvideTransactionContextsTask(o,a,l,s).run();expect(n).toEqual((0,d.Right)(void 0)),expect(t).toHaveBeenCalledTimes(1),expect(t).toHaveBeenCalledWith(o,{context:{type:e.ClearSignContextType.TOKEN,payload:"payload"}})}),it("should only store transaction once for first TRANSACTION_INFO context",async()=>{const a={contexts:[{context:{type:e.ClearSignContextType.TRANSACTION_INFO,payload:"payload1"},subcontextCallbacks:[]},{context:{type:e.ClearSignContextType.TRANSACTION_INFO,payload:"payload2"},subcontextCallbacks:[]}],serializedTransaction:new Uint8Array([1,2,3]),derivationPath:"44'/60'/0'/0/0"};x.mockResolvedValue(i),t.mockResolvedValue(i);const n=await new r.ProvideTransactionContextsTask(o,a,l,s).run();expect(n).toEqual((0,d.Right)(void 0)),expect(x).toHaveBeenCalledTimes(1),expect(t).toHaveBeenCalledTimes(2)})}),describe("with subcontexts",()=>{it("should provide subcontexts before the main context",async()=>{const a={contexts:[{context:{type:e.ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,payload:"main payload"},subcontextCallbacks:[()=>Promise.resolve({type:e.ClearSignContextType.TOKEN,payload:"subcontext payload"})]}],serializedTransaction:new Uint8Array,derivationPath:"44'/60'/0'/0/0"};t.mockResolvedValue(i);const n=await new r.ProvideTransactionContextsTask(o,a,l,s).run();expect(n).toEqual((0,d.Right)(void 0)),expect(t).toHaveBeenCalledTimes(2),expect(t).toHaveBeenNthCalledWith(1,o,{context:{type:e.ClearSignContextType.TOKEN,payload:"subcontext payload"}}),expect(t).toHaveBeenNthCalledWith(2,o,{context:{type:e.ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,payload:"main payload"}})}),it("should provide multiple subcontexts in order",async()=>{const a={contexts:[{context:{type:e.ClearSignContextType.TRUSTED_NAME,payload:"main payload"},subcontextCallbacks:[()=>Promise.resolve({type:e.ClearSignContextType.NFT,payload:"subcontext1"}),()=>Promise.resolve({type:e.ClearSignContextType.TOKEN,payload:"subcontext2"})]}],serializedTransaction:new Uint8Array,derivationPath:"44'/60'/0'/0/0"};t.mockResolvedValue(i);const n=await new r.ProvideTransactionContextsTask(o,a,l,s).run();expect(n).toEqual((0,d.Right)(void 0)),expect(t).toHaveBeenCalledTimes(3),expect(t).toHaveBeenNthCalledWith(1,o,{context:{type:e.ClearSignContextType.NFT,payload:"subcontext1"}}),expect(t).toHaveBeenNthCalledWith(2,o,{context:{type:e.ClearSignContextType.TOKEN,payload:"subcontext2"}}),expect(t).toHaveBeenNthCalledWith(3,o,{context:{type:e.ClearSignContextType.TRUSTED_NAME,payload:"main payload"}})}),it("should continue providing main context even if subcontext fails",async()=>{const a={contexts:[{context:{type:e.ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,payload:"main payload"},subcontextCallbacks:[()=>Promise.resolve({type:e.ClearSignContextType.TOKEN,payload:"subcontext payload"})]}],serializedTransaction:new Uint8Array,derivationPath:"44'/60'/0'/0/0"};t.mockResolvedValueOnce(p).mockResolvedValueOnce(i);const n=await new r.ProvideTransactionContextsTask(o,a,l,s).run();expect(n).toEqual((0,d.Right)(void 0)),expect(t).toHaveBeenCalledTimes(2)})}),describe("with multiple contexts",()=>{it("should provide all contexts in order",async()=>{const a={contexts:[{context:{type:e.ClearSignContextType.TOKEN,payload:"payload1"},subcontextCallbacks:[]},{context:{type:e.ClearSignContextType.NFT,payload:"payload2"},subcontextCallbacks:[]},{context:{type:e.ClearSignContextType.TRUSTED_NAME,payload:"payload3"},subcontextCallbacks:[]}],serializedTransaction:new Uint8Array,derivationPath:"44'/60'/0'/0/0"};t.mockResolvedValue(i);const n=await new r.ProvideTransactionContextsTask(o,a,l,s).run();expect(n).toEqual((0,d.Right)(void 0)),expect(t).toHaveBeenCalledTimes(3),expect(t).toHaveBeenNthCalledWith(1,o,{context:{type:e.ClearSignContextType.TOKEN,payload:"payload1"}}),expect(t).toHaveBeenNthCalledWith(2,o,{context:{type:e.ClearSignContextType.NFT,payload:"payload2"}}),expect(t).toHaveBeenNthCalledWith(3,o,{context:{type:e.ClearSignContextType.TRUSTED_NAME,payload:"payload3"}})})}),describe("error handling",()=>{it("should return error if main context fails",async()=>{const a={contexts:[{context:{type:e.ClearSignContextType.TOKEN,payload:"payload"},subcontextCallbacks:[]}],serializedTransaction:new Uint8Array,derivationPath:"44'/60'/0'/0/0"};t.mockResolvedValue(p);const n=await new r.ProvideTransactionContextsTask(o,a,l,s).run();expect(n).toEqual((0,d.Left)(p))}),it("should stop providing contexts after first main context failure",async()=>{const a={contexts:[{context:{type:e.ClearSignContextType.TOKEN,payload:"payload1"},subcontextCallbacks:[]},{context:{type:e.ClearSignContextType.NFT,payload:"payload2"},subcontextCallbacks:[]}],serializedTransaction:new Uint8Array,derivationPath:"44'/60'/0'/0/0"};t.mockResolvedValue(p);const n=await new r.ProvideTransactionContextsTask(o,a,l,s).run();expect(n).toEqual((0,d.Left)(p)),expect(t).toHaveBeenCalledTimes(1)})}),describe("derivation path handling",()=>{it("should correctly parse and include derivation path in StoreTransaction",async()=>{const a={contexts:[{context:{type:e.ClearSignContextType.TRANSACTION_INFO,payload:"payload"},subcontextCallbacks:[]}],serializedTransaction:new Uint8Array([170,187,204]),derivationPath:"44'/60'/0'/0/0"};x.mockResolvedValue(i),t.mockResolvedValue(i),await new r.ProvideTransactionContextsTask(o,a,l,s).run(),expect(s).toHaveBeenCalledWith(o,expect.objectContaining({data:new Uint8Array([5,128,0,0,44,128,0,0,60,128,0,0,0,0,0,0,0,0,0,0,0,170,187,204])}))})}),describe("factory types",()=>{it("should have default factories",()=>{const a=new r.ProvideTransactionContextsTask(o,{contexts:[{context:{type:e.ClearSignContextType.TOKEN,payload:"payload"},subcontextCallbacks:[]}],serializedTransaction:new Uint8Array,derivationPath:"44'/60'/0'/0/0"});expect(a._provideContextTaskFactory).toBeDefined(),expect(a._sendCommandInChunksTaskFactory).toBeDefined()})})})});
|
|
2
|
+
//# sourceMappingURL=ProvideTransactionContextsTask.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/task/ProvideTransactionContextsTask.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { ClearSignContextType } from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n type InternalApi,\n type UnknownDeviceExchangeError,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { StoreTransactionCommand } from \"@internal/app-binder/command/StoreTransactionCommand\";\nimport { type EthErrorCodes } from \"@internal/app-binder/command/utils/ethAppErrors\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\n\nimport {\n type ProvideContextTask,\n type ProvideContextTaskArgs,\n} from \"./ProvideContextTask\";\nimport {\n ProvideTransactionContextsTask,\n type ProvideTransactionContextsTaskArgs,\n} from \"./ProvideTransactionContextsTask\";\nimport {\n type SendCommandInChunksTask,\n type SendCommandInChunksTaskArgs,\n} from \"./SendCommandInChunksTask\";\n\ndescribe(\"ProvideTransactionContextsTask\", () => {\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 provideContextTaskRunMock = vi.fn();\n const sendCommandInChunksTaskRunMock = vi.fn();\n const provideContextTaskMockFactory = vi.fn();\n const sendCommandInChunksTaskMockFactory = vi.fn();\n\n beforeEach(() => {\n vi.clearAllMocks();\n provideContextTaskMockFactory.mockImplementation(\n (a: InternalApi, args: ProvideContextTaskArgs) =>\n ({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n run: () => provideContextTaskRunMock(a, args),\n }) as unknown as ProvideContextTask,\n );\n sendCommandInChunksTaskMockFactory.mockImplementation(\n (a: InternalApi, args: SendCommandInChunksTaskArgs<unknown>) =>\n ({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n run: () => sendCommandInChunksTaskRunMock(a, args),\n }) as unknown as SendCommandInChunksTask<unknown>,\n );\n });\n\n describe(\"with no subcontexts\", () => {\n it(\"should provide the transaction context for a TRANSACTION_INFO context\", async () => {\n // GIVEN\n const args: ProvideTransactionContextsTaskArgs = {\n contexts: [\n {\n context: {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"0x00\",\n },\n subcontextCallbacks: [],\n },\n ],\n serializedTransaction: new Uint8Array(),\n derivationPath: \"44'/60'/0'/0/0\",\n };\n sendCommandInChunksTaskRunMock.mockResolvedValue(successResult);\n provideContextTaskRunMock.mockResolvedValue(successResult);\n\n // WHEN\n const task = new ProvideTransactionContextsTask(\n api,\n args,\n provideContextTaskMockFactory,\n sendCommandInChunksTaskMockFactory,\n );\n const result = await task.run();\n\n // THEN\n expect(result).toEqual(Right(void 0));\n\n // StoreTransactionCommand should be called\n expect(sendCommandInChunksTaskRunMock).toHaveBeenCalledTimes(1);\n expect(sendCommandInChunksTaskMockFactory).toHaveBeenCalledWith(api, {\n data: new Uint8Array([\n 0x05, 0x80, 0x00, 0x00, 0x2c, 0x80, 0x00, 0x00, 0x3c, 0x80, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n ]),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n commandFactory: expect.any(Function),\n });\n // Test that the commandFactory returns a StoreTransactionCommand\n const factoryCall = sendCommandInChunksTaskMockFactory.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, 4]),\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(StoreTransactionCommand);\n\n // ProvideContextTask should be called for the context\n expect(provideContextTaskRunMock).toHaveBeenCalledTimes(1);\n expect(provideContextTaskRunMock).toHaveBeenCalledWith(api, {\n context: {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"0x00\",\n },\n });\n });\n\n it(\"should provide context without serialized transaction when not provided\", async () => {\n // GIVEN\n const args: ProvideTransactionContextsTaskArgs = {\n contexts: [\n {\n context: {\n type: ClearSignContextType.TOKEN,\n payload: \"payload\",\n },\n subcontextCallbacks: [],\n },\n ],\n derivationPath: \"44'/60'/0'/0/0\",\n };\n provideContextTaskRunMock.mockResolvedValue(successResult);\n\n // WHEN\n const task = new ProvideTransactionContextsTask(\n api,\n args,\n provideContextTaskMockFactory,\n sendCommandInChunksTaskMockFactory,\n );\n const result = await task.run();\n\n // THEN\n expect(result).toEqual(Right(void 0));\n expect(sendCommandInChunksTaskRunMock).not.toHaveBeenCalled();\n expect(provideContextTaskRunMock).toHaveBeenCalledTimes(1);\n });\n\n it(\"should skip PROXY_INFO context and only provide subcontexts\", async () => {\n // GIVEN\n const args: ProvideTransactionContextsTaskArgs = {\n contexts: [\n {\n context: {\n type: ClearSignContextType.PROXY_INFO,\n payload: \"payload\",\n },\n subcontextCallbacks: [\n () =>\n Promise.resolve({\n type: ClearSignContextType.PROXY_INFO,\n payload: \"subcontext payload\",\n }),\n ],\n },\n ],\n serializedTransaction: new Uint8Array(),\n derivationPath: \"44'/60'/0'/0/0\",\n };\n provideContextTaskRunMock.mockResolvedValue(successResult);\n\n // WHEN\n const task = new ProvideTransactionContextsTask(\n api,\n args,\n provideContextTaskMockFactory,\n sendCommandInChunksTaskMockFactory,\n );\n const result = await task.run();\n\n // THEN\n expect(result).toEqual(Right(void 0));\n expect(provideContextTaskRunMock).toHaveBeenCalledTimes(1);\n expect(provideContextTaskRunMock).toHaveBeenCalledWith(api, {\n context: {\n type: ClearSignContextType.PROXY_INFO,\n payload: \"subcontext payload\",\n },\n });\n });\n\n it(\"should skip ERROR subcontexts silently\", async () => {\n // GIVEN\n const args: ProvideTransactionContextsTaskArgs = {\n contexts: [\n {\n context: {\n type: ClearSignContextType.TOKEN,\n payload: \"payload\",\n },\n subcontextCallbacks: [\n () =>\n Promise.resolve({\n type: ClearSignContextType.ERROR,\n error: new Error(\"error\"),\n }),\n ],\n },\n ],\n serializedTransaction: new Uint8Array(),\n derivationPath: \"44'/60'/0'/0/0\",\n };\n provideContextTaskRunMock.mockResolvedValue(successResult);\n\n // WHEN\n const task = new ProvideTransactionContextsTask(\n api,\n args,\n provideContextTaskMockFactory,\n sendCommandInChunksTaskMockFactory,\n );\n const result = await task.run();\n\n // THEN\n expect(result).toEqual(Right(void 0));\n // Only the main context should be provided, not the error subcontext\n expect(provideContextTaskRunMock).toHaveBeenCalledTimes(1);\n expect(provideContextTaskRunMock).toHaveBeenCalledWith(api, {\n context: {\n type: ClearSignContextType.TOKEN,\n payload: \"payload\",\n },\n });\n });\n\n it(\"should only store transaction once for first TRANSACTION_INFO context\", async () => {\n // GIVEN\n const args: ProvideTransactionContextsTaskArgs = {\n contexts: [\n {\n context: {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload1\",\n },\n subcontextCallbacks: [],\n },\n {\n context: {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload2\",\n },\n subcontextCallbacks: [],\n },\n ],\n serializedTransaction: new Uint8Array([1, 2, 3]),\n derivationPath: \"44'/60'/0'/0/0\",\n };\n sendCommandInChunksTaskRunMock.mockResolvedValue(successResult);\n provideContextTaskRunMock.mockResolvedValue(successResult);\n\n // WHEN\n const task = new ProvideTransactionContextsTask(\n api,\n args,\n provideContextTaskMockFactory,\n sendCommandInChunksTaskMockFactory,\n );\n const result = await task.run();\n\n // THEN\n expect(result).toEqual(Right(void 0));\n // StoreTransactionCommand should only be called once\n expect(sendCommandInChunksTaskRunMock).toHaveBeenCalledTimes(1);\n // But both contexts should be provided\n expect(provideContextTaskRunMock).toHaveBeenCalledTimes(2);\n });\n });\n\n describe(\"with subcontexts\", () => {\n it(\"should provide subcontexts before the main context\", async () => {\n // GIVEN\n const args: ProvideTransactionContextsTaskArgs = {\n contexts: [\n {\n context: {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"main payload\",\n },\n subcontextCallbacks: [\n () =>\n Promise.resolve({\n type: ClearSignContextType.TOKEN,\n payload: \"subcontext payload\",\n }),\n ],\n },\n ],\n serializedTransaction: new Uint8Array(),\n derivationPath: \"44'/60'/0'/0/0\",\n };\n provideContextTaskRunMock.mockResolvedValue(successResult);\n\n // WHEN\n const task = new ProvideTransactionContextsTask(\n api,\n args,\n provideContextTaskMockFactory,\n sendCommandInChunksTaskMockFactory,\n );\n const result = await task.run();\n\n // THEN\n expect(result).toEqual(Right(void 0));\n expect(provideContextTaskRunMock).toHaveBeenCalledTimes(2);\n // Subcontext should be provided first\n expect(provideContextTaskRunMock).toHaveBeenNthCalledWith(1, api, {\n context: {\n type: ClearSignContextType.TOKEN,\n payload: \"subcontext payload\",\n },\n });\n // Then main context\n expect(provideContextTaskRunMock).toHaveBeenNthCalledWith(2, api, {\n context: {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"main payload\",\n },\n });\n });\n\n it(\"should provide multiple subcontexts in order\", async () => {\n // GIVEN\n const args: ProvideTransactionContextsTaskArgs = {\n contexts: [\n {\n context: {\n type: ClearSignContextType.TRUSTED_NAME,\n payload: \"main payload\",\n },\n subcontextCallbacks: [\n () =>\n Promise.resolve({\n type: ClearSignContextType.NFT,\n payload: \"subcontext1\",\n }),\n () =>\n Promise.resolve({\n type: ClearSignContextType.TOKEN,\n payload: \"subcontext2\",\n }),\n ],\n },\n ],\n serializedTransaction: new Uint8Array(),\n derivationPath: \"44'/60'/0'/0/0\",\n };\n provideContextTaskRunMock.mockResolvedValue(successResult);\n\n // WHEN\n const task = new ProvideTransactionContextsTask(\n api,\n args,\n provideContextTaskMockFactory,\n sendCommandInChunksTaskMockFactory,\n );\n const result = await task.run();\n\n // THEN\n expect(result).toEqual(Right(void 0));\n expect(provideContextTaskRunMock).toHaveBeenCalledTimes(3);\n expect(provideContextTaskRunMock).toHaveBeenNthCalledWith(1, api, {\n context: {\n type: ClearSignContextType.NFT,\n payload: \"subcontext1\",\n },\n });\n expect(provideContextTaskRunMock).toHaveBeenNthCalledWith(2, api, {\n context: {\n type: ClearSignContextType.TOKEN,\n payload: \"subcontext2\",\n },\n });\n expect(provideContextTaskRunMock).toHaveBeenNthCalledWith(3, api, {\n context: {\n type: ClearSignContextType.TRUSTED_NAME,\n payload: \"main payload\",\n },\n });\n });\n\n it(\"should continue providing main context even if subcontext fails\", async () => {\n // GIVEN\n const args: ProvideTransactionContextsTaskArgs = {\n contexts: [\n {\n context: {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"main payload\",\n },\n subcontextCallbacks: [\n () =>\n Promise.resolve({\n type: ClearSignContextType.TOKEN,\n payload: \"subcontext payload\",\n }),\n ],\n },\n ],\n serializedTransaction: new Uint8Array(),\n derivationPath: \"44'/60'/0'/0/0\",\n };\n provideContextTaskRunMock\n .mockResolvedValueOnce(errorResult) // subcontext fails\n .mockResolvedValueOnce(successResult); // main context succeeds\n\n // WHEN\n const task = new ProvideTransactionContextsTask(\n api,\n args,\n provideContextTaskMockFactory,\n sendCommandInChunksTaskMockFactory,\n );\n const result = await task.run();\n\n // THEN\n expect(result).toEqual(Right(void 0));\n expect(provideContextTaskRunMock).toHaveBeenCalledTimes(2);\n });\n });\n\n describe(\"with multiple contexts\", () => {\n it(\"should provide all contexts in order\", async () => {\n // GIVEN\n const args: ProvideTransactionContextsTaskArgs = {\n contexts: [\n {\n context: {\n type: ClearSignContextType.TOKEN,\n payload: \"payload1\",\n },\n subcontextCallbacks: [],\n },\n {\n context: {\n type: ClearSignContextType.NFT,\n payload: \"payload2\",\n },\n subcontextCallbacks: [],\n },\n {\n context: {\n type: ClearSignContextType.TRUSTED_NAME,\n payload: \"payload3\",\n },\n subcontextCallbacks: [],\n },\n ],\n serializedTransaction: new Uint8Array(),\n derivationPath: \"44'/60'/0'/0/0\",\n };\n provideContextTaskRunMock.mockResolvedValue(successResult);\n\n // WHEN\n const task = new ProvideTransactionContextsTask(\n api,\n args,\n provideContextTaskMockFactory,\n sendCommandInChunksTaskMockFactory,\n );\n const result = await task.run();\n\n // THEN\n expect(result).toEqual(Right(void 0));\n expect(provideContextTaskRunMock).toHaveBeenCalledTimes(3);\n expect(provideContextTaskRunMock).toHaveBeenNthCalledWith(1, api, {\n context: {\n type: ClearSignContextType.TOKEN,\n payload: \"payload1\",\n },\n });\n expect(provideContextTaskRunMock).toHaveBeenNthCalledWith(2, api, {\n context: {\n type: ClearSignContextType.NFT,\n payload: \"payload2\",\n },\n });\n expect(provideContextTaskRunMock).toHaveBeenNthCalledWith(3, api, {\n context: {\n type: ClearSignContextType.TRUSTED_NAME,\n payload: \"payload3\",\n },\n });\n });\n });\n\n describe(\"error handling\", () => {\n it(\"should return error if main context fails\", async () => {\n // GIVEN\n const args: ProvideTransactionContextsTaskArgs = {\n contexts: [\n {\n context: {\n type: ClearSignContextType.TOKEN,\n payload: \"payload\",\n },\n subcontextCallbacks: [],\n },\n ],\n serializedTransaction: new Uint8Array(),\n derivationPath: \"44'/60'/0'/0/0\",\n };\n provideContextTaskRunMock.mockResolvedValue(errorResult);\n\n // WHEN\n const task = new ProvideTransactionContextsTask(\n api,\n args,\n provideContextTaskMockFactory,\n sendCommandInChunksTaskMockFactory,\n );\n const result = await task.run();\n\n // THEN\n expect(result).toEqual(Left(errorResult));\n });\n\n it(\"should stop providing contexts after first main context failure\", async () => {\n // GIVEN\n const args: ProvideTransactionContextsTaskArgs = {\n contexts: [\n {\n context: {\n type: ClearSignContextType.TOKEN,\n payload: \"payload1\",\n },\n subcontextCallbacks: [],\n },\n {\n context: {\n type: ClearSignContextType.NFT,\n payload: \"payload2\",\n },\n subcontextCallbacks: [],\n },\n ],\n serializedTransaction: new Uint8Array(),\n derivationPath: \"44'/60'/0'/0/0\",\n };\n provideContextTaskRunMock.mockResolvedValue(errorResult);\n\n // WHEN\n const task = new ProvideTransactionContextsTask(\n api,\n args,\n provideContextTaskMockFactory,\n sendCommandInChunksTaskMockFactory,\n );\n const result = await task.run();\n\n // THEN\n expect(result).toEqual(Left(errorResult));\n // Should only try to provide the first context\n expect(provideContextTaskRunMock).toHaveBeenCalledTimes(1);\n });\n });\n\n describe(\"derivation path handling\", () => {\n it(\"should correctly parse and include derivation path in StoreTransaction\", async () => {\n // GIVEN\n const args: ProvideTransactionContextsTaskArgs = {\n contexts: [\n {\n context: {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload\",\n },\n subcontextCallbacks: [],\n },\n ],\n serializedTransaction: new Uint8Array([0xaa, 0xbb, 0xcc]),\n derivationPath: \"44'/60'/0'/0/0\",\n };\n sendCommandInChunksTaskRunMock.mockResolvedValue(successResult);\n provideContextTaskRunMock.mockResolvedValue(successResult);\n\n // WHEN\n const task = new ProvideTransactionContextsTask(\n api,\n args,\n provideContextTaskMockFactory,\n sendCommandInChunksTaskMockFactory,\n );\n await task.run();\n\n // THEN\n expect(sendCommandInChunksTaskMockFactory).toHaveBeenCalledWith(\n api,\n expect.objectContaining({\n data: new Uint8Array([\n 0x05, // path length\n 0x80,\n 0x00,\n 0x00,\n 0x2c, // 44'\n 0x80,\n 0x00,\n 0x00,\n 0x3c, // 60'\n 0x80,\n 0x00,\n 0x00,\n 0x00, // 0'\n 0x00,\n 0x00,\n 0x00,\n 0x00, // 0\n 0x00,\n 0x00,\n 0x00,\n 0x00, // 0\n 0xaa,\n 0xbb,\n 0xcc, // transaction\n ]),\n }),\n );\n });\n });\n\n describe(\"factory types\", () => {\n it(\"should have default factories\", () => {\n // GIVEN\n const task = new ProvideTransactionContextsTask(api, {\n contexts: [\n {\n context: {\n type: ClearSignContextType.TOKEN,\n payload: \"payload\",\n },\n subcontextCallbacks: [],\n },\n ],\n serializedTransaction: new Uint8Array(),\n derivationPath: \"44'/60'/0'/0/0\",\n });\n\n // THEN\n expect(task[\"_provideContextTaskFactory\"]).toBeDefined();\n expect(task[\"_sendCommandInChunksTaskFactory\"]).toBeDefined();\n });\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_context_module", "import_device_management_kit", "import_purify_ts", "import_StoreTransactionCommand", "import_makeInternalApi", "import_ProvideTransactionContextsTask", "api", "successResult", "errorResult", "provideContextTaskRunMock", "sendCommandInChunksTaskRunMock", "provideContextTaskMockFactory", "sendCommandInChunksTaskMockFactory", "args", "result", "commandFactory", "mockArgs", "command", "task"]
|
|
7
|
+
}
|
package/lib/cjs/internal/di.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var i=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var C=Object.prototype.hasOwnProperty;var x=(e,o)=>{for(var n in o)i(e,n,{get:o[n],enumerable:!0})},D=(e,o,n,t)=>{if(o&&typeof o=="object"||typeof o=="function")for(let r of f(o))!C.call(e,r)&&r!==n&&i(e,r,{get:()=>o[r],enumerable:!(t=y(o,r))||t.enumerable});return e};var F=e=>D(i({},"__esModule",{value:!0}),e);var g={};x(g,{makeContainer:()=>v});module.exports=F(g);var m=require("inversify"),d=require("./address/di/addressModule"),s=require("./app-binder/di/appBinderModule"),p=require("./eip7702/di/eip7702Module"),a=require("./externalTypes"),c=require("./message/di/messageModule"),l=require("./safe/di/safeModule"),M=require("./transaction/di/transactionModule"),u=require("./typed-data/di/typedDataModule");const v=({dmk:e,sessionId:o,contextModule:n})=>{const t=new m.Container;return t.bind(a.externalTypes.Dmk).toConstantValue(e),t.bind(a.externalTypes.ContextModule).toConstantValue(n),t.bind(a.externalTypes.SessionId).toConstantValue(o),t.loadSync((0,d.addressModuleFactory)(),(0,s.appBindingModuleFactory)(),(0,p.eip7702ModuleFactory)(),(0,c.messageModuleFactory)(),(0,M.transactionModuleFactory)(),(0,u.typedDataModuleFactory)(),(0,l.safeModuleFactory)()),t};0&&(module.exports={makeContainer});
|
|
2
2
|
//# sourceMappingURL=di.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/internal/di.ts"],
|
|
4
|
-
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n type DeviceManagementKit,\n type DeviceSessionId,\n} from \"@ledgerhq/device-management-kit\";\nimport { Container } from \"inversify\";\n\nimport { addressModuleFactory } from \"@internal/address/di/addressModule\";\nimport { appBindingModuleFactory } from \"@internal/app-binder/di/appBinderModule\";\nimport { eip7702ModuleFactory } from \"@internal/eip7702/di/eip7702Module\";\nimport { externalTypes } from \"@internal/externalTypes\";\nimport { messageModuleFactory } from \"@internal/message/di/messageModule\";\nimport { transactionModuleFactory } from \"@internal/transaction/di/transactionModule\";\nimport { typedDataModuleFactory } from \"@internal/typed-data/di/typedDataModule\";\n\nexport type MakeContainerProps = {\n dmk: DeviceManagementKit;\n sessionId: DeviceSessionId;\n contextModule: ContextModule;\n};\n\nexport const makeContainer = ({\n dmk,\n sessionId,\n contextModule,\n}: MakeContainerProps) => {\n const container = new Container();\n\n container.bind<DeviceManagementKit>(externalTypes.Dmk).toConstantValue(dmk);\n container\n .bind<ContextModule>(externalTypes.ContextModule)\n .toConstantValue(contextModule);\n container\n .bind<DeviceSessionId>(externalTypes.SessionId)\n .toConstantValue(sessionId);\n\n container.loadSync(\n addressModuleFactory(),\n appBindingModuleFactory(),\n eip7702ModuleFactory(),\n messageModuleFactory(),\n transactionModuleFactory(),\n typedDataModuleFactory(),\n );\n\n return container;\n};\n"],
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mBAAAE,IAAA,eAAAC,EAAAH,GAKA,IAAAI,EAA0B,qBAE1BC,EAAqC,8CACrCC,EAAwC,mDACxCC,EAAqC,8CACrCC,EAA8B,mCAC9BC,EAAqC,8CACrCC,EAAyC,sDACzCC,EAAuC,mDAQhC,
|
|
6
|
-
"names": ["di_exports", "__export", "makeContainer", "__toCommonJS", "import_inversify", "import_addressModule", "import_appBinderModule", "import_eip7702Module", "import_externalTypes", "import_messageModule", "import_transactionModule", "import_typedDataModule", "dmk", "sessionId", "contextModule", "container"]
|
|
4
|
+
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n type DeviceManagementKit,\n type DeviceSessionId,\n} from \"@ledgerhq/device-management-kit\";\nimport { Container } from \"inversify\";\n\nimport { addressModuleFactory } from \"@internal/address/di/addressModule\";\nimport { appBindingModuleFactory } from \"@internal/app-binder/di/appBinderModule\";\nimport { eip7702ModuleFactory } from \"@internal/eip7702/di/eip7702Module\";\nimport { externalTypes } from \"@internal/externalTypes\";\nimport { messageModuleFactory } from \"@internal/message/di/messageModule\";\nimport { safeModuleFactory } from \"@internal/safe/di/safeModule\";\nimport { transactionModuleFactory } from \"@internal/transaction/di/transactionModule\";\nimport { typedDataModuleFactory } from \"@internal/typed-data/di/typedDataModule\";\n\nexport type MakeContainerProps = {\n dmk: DeviceManagementKit;\n sessionId: DeviceSessionId;\n contextModule: ContextModule;\n};\n\nexport const makeContainer = ({\n dmk,\n sessionId,\n contextModule,\n}: MakeContainerProps) => {\n const container = new Container();\n\n container.bind<DeviceManagementKit>(externalTypes.Dmk).toConstantValue(dmk);\n container\n .bind<ContextModule>(externalTypes.ContextModule)\n .toConstantValue(contextModule);\n container\n .bind<DeviceSessionId>(externalTypes.SessionId)\n .toConstantValue(sessionId);\n\n container.loadSync(\n addressModuleFactory(),\n appBindingModuleFactory(),\n eip7702ModuleFactory(),\n messageModuleFactory(),\n transactionModuleFactory(),\n typedDataModuleFactory(),\n safeModuleFactory(),\n );\n\n return container;\n};\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mBAAAE,IAAA,eAAAC,EAAAH,GAKA,IAAAI,EAA0B,qBAE1BC,EAAqC,8CACrCC,EAAwC,mDACxCC,EAAqC,8CACrCC,EAA8B,mCAC9BC,EAAqC,8CACrCC,EAAkC,wCAClCC,EAAyC,sDACzCC,EAAuC,mDAQhC,MAAMV,EAAgB,CAAC,CAC5B,IAAAW,EACA,UAAAC,EACA,cAAAC,CACF,IAA0B,CACxB,MAAMC,EAAY,IAAI,YAEtB,OAAAA,EAAU,KAA0B,gBAAc,GAAG,EAAE,gBAAgBH,CAAG,EAC1EG,EACG,KAAoB,gBAAc,aAAa,EAC/C,gBAAgBD,CAAa,EAChCC,EACG,KAAsB,gBAAc,SAAS,EAC7C,gBAAgBF,CAAS,EAE5BE,EAAU,YACR,wBAAqB,KACrB,2BAAwB,KACxB,wBAAqB,KACrB,wBAAqB,KACrB,4BAAyB,KACzB,0BAAuB,KACvB,qBAAkB,CACpB,EAEOA,CACT",
|
|
6
|
+
"names": ["di_exports", "__export", "makeContainer", "__toCommonJS", "import_inversify", "import_addressModule", "import_appBinderModule", "import_eip7702Module", "import_externalTypes", "import_messageModule", "import_safeModule", "import_transactionModule", "import_typedDataModule", "dmk", "sessionId", "contextModule", "container"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var f=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var n=Object.prototype.hasOwnProperty;var y=(e,o)=>{for(var s in o)f(e,s,{get:o[s],enumerable:!0})},C=(e,o,s,a)=>{if(o&&typeof o=="object"||typeof o=="function")for(let r of p(o))!n.call(e,r)&&r!==s&&f(e,r,{get:()=>o[r],enumerable:!(a=m(o,r))||a.enumerable});return e};var c=e=>C(f({},"__esModule",{value:!0}),e);var u={};y(u,{safeModuleFactory:()=>l});module.exports=c(u);var t=require("inversify"),d=require("../../safe/use-case/VerifySafeAddressUseCase"),i=require("./safeTypes");const l=()=>new t.ContainerModule(({bind:e})=>{e(i.safeTypes.VerifySafeAddressUseCase).to(d.VerifySafeAddressUseCase)});0&&(module.exports={safeModuleFactory});
|
|
2
|
+
//# sourceMappingURL=safeModule.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/safe/di/safeModule.ts"],
|
|
4
|
+
"sourcesContent": ["import { ContainerModule } from \"inversify\";\n\nimport { VerifySafeAddressUseCase } from \"@internal/safe/use-case/VerifySafeAddressUseCase\";\n\nimport { safeTypes } from \"./safeTypes\";\n\nexport const safeModuleFactory = () =>\n new ContainerModule(({ bind }) => {\n bind(safeTypes.VerifySafeAddressUseCase).to(VerifySafeAddressUseCase);\n });\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,uBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAgC,qBAEhCC,EAAyC,4DAEzCC,EAA0B,uBAEnB,MAAMJ,EAAoB,IAC/B,IAAI,kBAAgB,CAAC,CAAE,KAAAK,CAAK,IAAM,CAChCA,EAAK,YAAU,wBAAwB,EAAE,GAAG,0BAAwB,CACtE,CAAC",
|
|
6
|
+
"names": ["safeModule_exports", "__export", "safeModuleFactory", "__toCommonJS", "import_inversify", "import_VerifySafeAddressUseCase", "import_safeTypes", "bind"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var t=require("inversify"),r=require("./safeModule");describe("safeModuleFactory",()=>{describe("Default",()=>{let o,e;beforeEach(()=>{e=(0,r.safeModuleFactory)(),o=new t.Container,o.loadSync(e)}),it("should return the safe module",()=>{expect(e).toBeDefined()})})});
|
|
2
|
+
//# sourceMappingURL=safeModule.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/safe/di/safeModule.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { Container } from \"inversify\";\n\nimport { safeModuleFactory } from \"./safeModule\";\n\ndescribe(\"safeModuleFactory\", () => {\n describe(\"Default\", () => {\n let container: Container;\n let mod: ReturnType<typeof safeModuleFactory>;\n beforeEach(() => {\n mod = safeModuleFactory();\n container = new Container();\n container.loadSync(mod);\n });\n\n it(\"should return the safe module\", () => {\n expect(mod).toBeDefined();\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "aAAA,IAAAA,EAA0B,qBAE1BC,EAAkC,wBAElC,SAAS,oBAAqB,IAAM,CAClC,SAAS,UAAW,IAAM,CACxB,IAAIC,EACAC,EACJ,WAAW,IAAM,CACfA,KAAM,qBAAkB,EACxBD,EAAY,IAAI,YAChBA,EAAU,SAASC,CAAG,CACxB,CAAC,EAED,GAAG,gCAAiC,IAAM,CACxC,OAAOA,CAAG,EAAE,YAAY,CAC1B,CAAC,CACH,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["import_inversify", "import_safeModule", "container", "mod"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var a=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var i=(s,e)=>{for(var r in e)a(s,r,{get:e[r],enumerable:!0})},p=(s,e,r,d)=>{if(e&&typeof e=="object"||typeof e=="function")for(let f of y(e))!S.call(s,f)&&f!==r&&a(s,f,{get:()=>e[f],enumerable:!(d=o(e,f))||d.enumerable});return s};var t=s=>p(a({},"__esModule",{value:!0}),s);var C={};i(C,{safeTypes:()=>A});module.exports=t(C);const A={VerifySafeAddressUseCase:Symbol.for("VerifySafeAddressUseCase")};0&&(module.exports={safeTypes});
|
|
2
|
+
//# sourceMappingURL=safeTypes.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/safe/di/safeTypes.ts"],
|
|
4
|
+
"sourcesContent": ["export const safeTypes = {\n VerifySafeAddressUseCase: Symbol.for(\"VerifySafeAddressUseCase\"),\n};\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,eAAAE,IAAA,eAAAC,EAAAH,GAAO,MAAME,EAAY,CACvB,yBAA0B,OAAO,IAAI,0BAA0B,CACjE",
|
|
6
|
+
"names": ["safeTypes_exports", "__export", "safeTypes", "__toCommonJS"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var o=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var u=(r,p)=>{for(var i in p)o(r,i,{get:p[i],enumerable:!0})},y=(r,p,i,e)=>{if(p&&typeof p=="object"||typeof p=="function")for(let t of c(p))!h.call(r,t)&&t!==i&&o(r,t,{get:()=>p[t],enumerable:!(e=B(p,t))||e.enumerable});return r};var E=r=>y(o({},"__esModule",{value:!0}),r),f=(r,p,i,e)=>{for(var t=e>1?void 0:e?B(p,i):p,m=r.length-1,A;m>=0;m--)(A=r[m])&&(t=(e?A(p,i,t):A(t))||t);return e&&t&&o(p,i,t),t},s=(r,p)=>(i,e)=>p(i,e,r);var T={};u(T,{VerifySafeAddressUseCase:()=>n});module.exports=E(T);var d=require("inversify"),a=require("../../app-binder/di/appBinderTypes");let n=class{_appBinder;constructor(p){this._appBinder=p}execute(p,i){return this._appBinder.verifySafeAddress({safeContractAddress:p,options:i})}};n=f([(0,d.injectable)(),s(0,(0,d.inject)(a.appBinderTypes.AppBinding))],n);0&&(module.exports={VerifySafeAddressUseCase});
|
|
2
|
+
//# sourceMappingURL=VerifySafeAddressUseCase.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/safe/use-case/VerifySafeAddressUseCase.ts"],
|
|
4
|
+
"sourcesContent": ["import { inject, injectable } from \"inversify\";\n\nimport { VerifySafeAddressDAReturnType } from \"@api/app-binder/VerifySafeAddressDeviceActionTypes\";\nimport { SafeAddressOptions } from \"@api/model/SafeAddressOptions\";\nimport { appBinderTypes } from \"@internal/app-binder/di/appBinderTypes\";\nimport { EthAppBinder } from \"@internal/app-binder/EthAppBinder\";\n\n@injectable()\nexport class VerifySafeAddressUseCase {\n private _appBinder: EthAppBinder;\n\n constructor(@inject(appBinderTypes.AppBinding) appBinder: EthAppBinder) {\n this._appBinder = appBinder;\n }\n\n execute(\n safeContractAddress: string,\n options?: SafeAddressOptions,\n ): VerifySafeAddressDAReturnType {\n return this._appBinder.verifySafeAddress({ safeContractAddress, options });\n }\n}\n"],
|
|
5
|
+
"mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,8BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAmC,qBAInCC,EAA+B,kDAIxB,IAAMC,EAAN,KAA+B,CAC5B,WAER,YAA+CC,EAAyB,CACtE,KAAK,WAAaA,CACpB,CAEA,QACEC,EACAC,EAC+B,CAC/B,OAAO,KAAK,WAAW,kBAAkB,CAAE,oBAAAD,EAAqB,QAAAC,CAAQ,CAAC,CAC3E,CACF,EAbaH,EAANI,EAAA,IADN,cAAW,EAIGC,EAAA,eAAO,iBAAe,UAAU,IAHlCL",
|
|
6
|
+
"names": ["VerifySafeAddressUseCase_exports", "__export", "VerifySafeAddressUseCase", "__toCommonJS", "import_inversify", "import_appBinderTypes", "VerifySafeAddressUseCase", "appBinder", "safeContractAddress", "options", "__decorateClass", "__decorateParam"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var d=require("./VerifySafeAddressUseCase");describe("VerifySafeAddressUseCase",()=>{it("should call verifySafeAddress on appBinder with the correct arguments",()=>{const e="0x1234567890123456789012345678901234567890",s={chainId:1},n={verifySafeAddress:vi.fn()};new d.VerifySafeAddressUseCase(n).execute(e,s),expect(n.verifySafeAddress).toHaveBeenCalledWith({safeContractAddress:e,options:s})}),it("should call verifySafeAddress on appBinder without options when not provided",()=>{const e="0x1234567890123456789012345678901234567890",s={verifySafeAddress:vi.fn()};new d.VerifySafeAddressUseCase(s).execute(e),expect(s.verifySafeAddress).toHaveBeenCalledWith({safeContractAddress:e,options:void 0})})});
|
|
2
|
+
//# sourceMappingURL=VerifySafeAddressUseCase.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/safe/use-case/VerifySafeAddressUseCase.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { type EthAppBinder } from \"@internal/app-binder/EthAppBinder\";\n\nimport { VerifySafeAddressUseCase } from \"./VerifySafeAddressUseCase\";\n\ndescribe(\"VerifySafeAddressUseCase\", () => {\n it(\"should call verifySafeAddress on appBinder with the correct arguments\", () => {\n // Given\n const safeContractAddress = \"0x1234567890123456789012345678901234567890\";\n const options = {\n chainId: 1,\n };\n const appBinder: EthAppBinder = {\n verifySafeAddress: vi.fn(),\n } as unknown as EthAppBinder;\n const useCase = new VerifySafeAddressUseCase(appBinder);\n\n // When\n useCase.execute(safeContractAddress, options);\n\n // Then\n expect(appBinder.verifySafeAddress).toHaveBeenCalledWith({\n safeContractAddress,\n options,\n });\n });\n\n it(\"should call verifySafeAddress on appBinder without options when not provided\", () => {\n // Given\n const safeContractAddress = \"0x1234567890123456789012345678901234567890\";\n const appBinder: EthAppBinder = {\n verifySafeAddress: vi.fn(),\n } as unknown as EthAppBinder;\n const useCase = new VerifySafeAddressUseCase(appBinder);\n\n // When\n useCase.execute(safeContractAddress);\n\n // Then\n expect(appBinder.verifySafeAddress).toHaveBeenCalledWith({\n safeContractAddress,\n options: undefined,\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "aAEA,IAAAA,EAAyC,sCAEzC,SAAS,2BAA4B,IAAM,CACzC,GAAG,wEAAyE,IAAM,CAEhF,MAAMC,EAAsB,6CACtBC,EAAU,CACd,QAAS,CACX,EACMC,EAA0B,CAC9B,kBAAmB,GAAG,GAAG,CAC3B,EACgB,IAAI,2BAAyBA,CAAS,EAG9C,QAAQF,EAAqBC,CAAO,EAG5C,OAAOC,EAAU,iBAAiB,EAAE,qBAAqB,CACvD,oBAAAF,EACA,QAAAC,CACF,CAAC,CACH,CAAC,EAED,GAAG,+EAAgF,IAAM,CAEvF,MAAMD,EAAsB,6CACtBE,EAA0B,CAC9B,kBAAmB,GAAG,GAAG,CAC3B,EACgB,IAAI,2BAAyBA,CAAS,EAG9C,QAAQF,CAAmB,EAGnC,OAAOE,EAAU,iBAAiB,EAAE,qBAAqB,CACvD,oBAAAF,EACA,QAAS,MACX,CAAC,CACH,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["import_VerifySafeAddressUseCase", "safeContractAddress", "options", "appBinder"]
|
|
7
|
+
}
|
package/lib/cjs/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ledgerhq/device-signer-kit-ethereum",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.9.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"exports": {
|
|
@@ -57,6 +57,6 @@
|
|
|
57
57
|
},
|
|
58
58
|
"peerDependencies": {
|
|
59
59
|
"@ledgerhq/context-module": "workspace:*",
|
|
60
|
-
"@ledgerhq/device-management-kit": "
|
|
60
|
+
"@ledgerhq/device-management-kit": "workspace:*"
|
|
61
61
|
}
|
|
62
62
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{SignerEthBuilder as
|
|
1
|
+
import{SignerEthBuilder as o}from"./SignerEthBuilder";import{DefaultSignerEth as s}from"../internal/DefaultSignerEth";import{externalTypes as c}from"../internal/externalTypes";describe("SignerEthBuilder",()=>{const i={dmk:{},sessionId:"",originToken:"test"};test("should be an instance of SignerEth",()=>{const e=new o(i);e.build(),expect(e).toBeInstanceOf(o)}),test("should instanciate with default context module",()=>{const t=new o(i).build(),n=t._container.get(c.ContextModule);expect(t).toBeInstanceOf(s),expect(n).toBeDefined()}),test("should instanciate with custom context module",()=>{const e=new o(i),t={},n=e.withContextModule(t).build();expect(n).toBeInstanceOf(s),expect(n._container.get(c.ContextModule)).toBe(t)})});
|
|
2
2
|
//# sourceMappingURL=SignerEthBuilder.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/api/SignerEthBuilder.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport { type DeviceManagementKit } from \"@ledgerhq/device-management-kit\";\n\nimport { SignerEthBuilder } from \"@api/SignerEthBuilder\";\nimport { DefaultSignerEth } from \"@internal/DefaultSignerEth\";\nimport { externalTypes } from \"@internal/externalTypes\";\n\ndescribe(\"SignerEthBuilder\", () => {\n const dmk: DeviceManagementKit = {} as DeviceManagementKit;\n const defaultConstructorArgs = { dmk, sessionId: \"\", originToken: \"test\" };\n\n test(\"should be an instance of SignerEth\", () => {\n // GIVEN\n const builder = new SignerEthBuilder(defaultConstructorArgs);\n\n // WHEN\n builder.build();\n\n // THEN\n expect(builder).toBeInstanceOf(SignerEthBuilder);\n });\n\n test(\"should instanciate with default context module\", () => {\n // GIVEN\n const builder = new SignerEthBuilder(defaultConstructorArgs);\n\n // WHEN\n const signer = builder.build();\n const contextModule = signer[\"_container\"].get<ContextModule>(\n externalTypes.ContextModule,\n );\n\n // THEN\n expect(signer).toBeInstanceOf(DefaultSignerEth);\n expect(contextModule).toBeDefined();\n
|
|
5
|
-
"mappings": "AAGA,OAAS,oBAAAA,MAAwB,wBACjC,OAAS,oBAAAC,MAAwB,6BACjC,OAAS,iBAAAC,MAAqB,0BAE9B,SAAS,mBAAoB,IAAM,CAEjC,MAAMC,EAAyB,CAAE,IADA,CAAC,EACI,UAAW,GAAI,YAAa,MAAO,EAEzE,KAAK,qCAAsC,IAAM,CAE/C,MAAMC,EAAU,IAAIJ,EAAiBG,CAAsB,EAG3DC,EAAQ,MAAM,EAGd,OAAOA,CAAO,EAAE,eAAeJ,CAAgB,CACjD,CAAC,EAED,KAAK,iDAAkD,IAAM,CAK3D,MAAMK,EAHU,IAAIL,EAAiBG,CAAsB,EAGpC,MAAM,EACvBG,EAAgBD,EAAO,WAAc,IACzCH,EAAc,aAChB,EAGA,OAAOG,CAAM,EAAE,eAAeJ,CAAgB,EAC9C,OAAOK,CAAa,EAAE,YAAY,
|
|
4
|
+
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport { type DeviceManagementKit } from \"@ledgerhq/device-management-kit\";\n\nimport { SignerEthBuilder } from \"@api/SignerEthBuilder\";\nimport { DefaultSignerEth } from \"@internal/DefaultSignerEth\";\nimport { externalTypes } from \"@internal/externalTypes\";\n\ndescribe(\"SignerEthBuilder\", () => {\n const dmk: DeviceManagementKit = {} as DeviceManagementKit;\n const defaultConstructorArgs = { dmk, sessionId: \"\", originToken: \"test\" };\n\n test(\"should be an instance of SignerEth\", () => {\n // GIVEN\n const builder = new SignerEthBuilder(defaultConstructorArgs);\n\n // WHEN\n builder.build();\n\n // THEN\n expect(builder).toBeInstanceOf(SignerEthBuilder);\n });\n\n test(\"should instanciate with default context module\", () => {\n // GIVEN\n const builder = new SignerEthBuilder(defaultConstructorArgs);\n\n // WHEN\n const signer = builder.build();\n const contextModule = signer[\"_container\"].get<ContextModule>(\n externalTypes.ContextModule,\n );\n\n // THEN\n expect(signer).toBeInstanceOf(DefaultSignerEth);\n expect(contextModule).toBeDefined();\n });\n\n test(\"should instanciate with custom context module\", () => {\n // GIVEN\n const builder = new SignerEthBuilder(defaultConstructorArgs);\n const contextModule = {} as ContextModule;\n\n // WHEN\n const signer = builder.withContextModule(contextModule).build();\n\n // THEN\n expect(signer).toBeInstanceOf(DefaultSignerEth);\n expect(\n signer[\"_container\"].get<ContextModule>(externalTypes.ContextModule),\n ).toBe(contextModule);\n });\n});\n"],
|
|
5
|
+
"mappings": "AAGA,OAAS,oBAAAA,MAAwB,wBACjC,OAAS,oBAAAC,MAAwB,6BACjC,OAAS,iBAAAC,MAAqB,0BAE9B,SAAS,mBAAoB,IAAM,CAEjC,MAAMC,EAAyB,CAAE,IADA,CAAC,EACI,UAAW,GAAI,YAAa,MAAO,EAEzE,KAAK,qCAAsC,IAAM,CAE/C,MAAMC,EAAU,IAAIJ,EAAiBG,CAAsB,EAG3DC,EAAQ,MAAM,EAGd,OAAOA,CAAO,EAAE,eAAeJ,CAAgB,CACjD,CAAC,EAED,KAAK,iDAAkD,IAAM,CAK3D,MAAMK,EAHU,IAAIL,EAAiBG,CAAsB,EAGpC,MAAM,EACvBG,EAAgBD,EAAO,WAAc,IACzCH,EAAc,aAChB,EAGA,OAAOG,CAAM,EAAE,eAAeJ,CAAgB,EAC9C,OAAOK,CAAa,EAAE,YAAY,CACpC,CAAC,EAED,KAAK,gDAAiD,IAAM,CAE1D,MAAMF,EAAU,IAAIJ,EAAiBG,CAAsB,EACrDG,EAAgB,CAAC,EAGjBD,EAASD,EAAQ,kBAAkBE,CAAa,EAAE,MAAM,EAG9D,OAAOD,CAAM,EAAE,eAAeJ,CAAgB,EAC9C,OACEI,EAAO,WAAc,IAAmBH,EAAc,aAAa,CACrE,EAAE,KAAKI,CAAa,CACtB,CAAC,CACH,CAAC",
|
|
6
6
|
"names": ["SignerEthBuilder", "DefaultSignerEth", "externalTypes", "defaultConstructorArgs", "builder", "signer", "contextModule"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var r=(e=>(e.OPEN_APP="signer.eth.steps.openApp",e.BUILD_CONTEXTS="signer.eth.steps.buildContexts",e.PROVIDE_CONTEXTS="signer.eth.steps.provideContexts",e.VERIFY_SAFE_ADDRESS="signer.eth.steps.verifySafeAddress",e))(r||{});export{r as VerifySafeAddressDAStep};
|
|
2
|
+
//# sourceMappingURL=VerifySafeAddressDeviceActionTypes.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/api/app-binder/VerifySafeAddressDeviceActionTypes.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n type ClearSignContextSuccess,\n type ContextModule,\n} from \"@ledgerhq/context-module\";\nimport {\n type CommandErrorResult,\n type DeviceActionState,\n type ExecuteDeviceActionReturnType,\n type OpenAppDAError,\n type OpenAppDARequiredInteraction,\n type UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type SafeAddressOptions } from \"@api/model/SafeAddressOptions\";\nimport { type EthErrorCodes } from \"@internal/app-binder/command/utils/ethAppErrors\";\n\nexport enum VerifySafeAddressDAStep {\n OPEN_APP = \"signer.eth.steps.openApp\",\n BUILD_CONTEXTS = \"signer.eth.steps.buildContexts\",\n PROVIDE_CONTEXTS = \"signer.eth.steps.provideContexts\",\n VERIFY_SAFE_ADDRESS = \"signer.eth.steps.verifySafeAddress\",\n}\n\nexport type VerifySafeAddressDAOutput = void;\n\nexport type VerifySafeAddressDAInput = {\n readonly safeContractAddress: string;\n readonly contextModule: ContextModule;\n readonly options: SafeAddressOptions;\n};\n\nexport type VerifySafeAddressDAError =\n | OpenAppDAError\n | CommandErrorResult<EthErrorCodes>[\"error\"];\n\ntype VerifySafeAddressDARequiredInteraction =\n | OpenAppDARequiredInteraction\n | UserInteractionRequired.VerifySafeAddress;\n\nexport type VerifySafeAddressDAIntermediateValue = {\n requiredUserInteraction: VerifySafeAddressDARequiredInteraction;\n step: VerifySafeAddressDAStep;\n};\n\nexport type VerifySafeAddressDAState = DeviceActionState<\n VerifySafeAddressDAOutput,\n VerifySafeAddressDAError,\n VerifySafeAddressDAIntermediateValue\n>;\n\nexport type VerifySafeAddressDAInternalState = {\n readonly error: VerifySafeAddressDAError | null;\n readonly contexts: ClearSignContextSuccess[];\n};\n\nexport type VerifySafeAddressDAReturnType = ExecuteDeviceActionReturnType<\n VerifySafeAddressDAOutput,\n VerifySafeAddressDAError,\n VerifySafeAddressDAIntermediateValue\n>;\n"],
|
|
5
|
+
"mappings": "AAgBO,IAAKA,OACVA,EAAA,SAAW,2BACXA,EAAA,eAAiB,iCACjBA,EAAA,iBAAmB,mCACnBA,EAAA,oBAAsB,qCAJZA,OAAA",
|
|
6
|
+
"names": ["VerifySafeAddressDAStep"]
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=SafeAddressOptions.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{addressTypes as i}from"./address/di/addressTypes";import{makeContainer as
|
|
1
|
+
import{addressTypes as i}from"./address/di/addressTypes";import{makeContainer as n}from"./di";import{messageTypes as o}from"./message/di/messageTypes";import{safeTypes as a}from"./safe/di/safeTypes";import{transactionTypes as p}from"./transaction/di/transactionTypes";import{typedDataTypes as m}from"./typed-data/di/typedDataTypes";import{eip7702Types as g}from"./eip7702/di/eip7702Types";class c{_container;constructor({dmk:e,sessionId:t,contextModule:r}){this._container=n({dmk:e,sessionId:t,contextModule:r})}signTransaction(e,t,r){return this._container.get(p.SignTransactionUseCase).execute(e,t,r)}signMessage(e,t,r){return this._container.get(o.SignMessageUseCase).execute(e,t,r)}signTypedData(e,t,r){return this._container.get(m.SignTypedDataUseCase).execute(e,t,r)}getAddress(e,t){return this._container.get(i.GetAddressUseCase).execute(e,t)}verifySafeAddress(e,t){return this._container.get(a.VerifySafeAddressUseCase).execute(e,t)}signDelegationAuthorization(e,t,r,s){return this._container.get(g.SignDelegationAuthorizationUseCase).execute(e,s,r,t)}}export{c as DefaultSignerEth};
|
|
2
2
|
//# sourceMappingURL=DefaultSignerEth.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/internal/DefaultSignerEth.ts"],
|
|
4
|
-
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n type DeviceManagementKit,\n type DeviceSessionId,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Container } from \"inversify\";\n\nimport { type GetAddressDAReturnType } from \"@api/app-binder/GetAddressDeviceActionTypes\";\nimport { type SignDelegationAuthorizationDAReturnType } from \"@api/app-binder/SignDelegationAuthorizationTypes\";\nimport { type SignPersonalMessageDAReturnType } from \"@api/app-binder/SignPersonalMessageDeviceActionTypes\";\nimport { type SignTransactionDAReturnType } from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type SignTypedDataDAReturnType } from \"@api/app-binder/SignTypedDataDeviceActionTypes\";\nimport { type AddressOptions } from \"@api/model/AddressOptions\";\nimport { type MessageOptions } from \"@api/model/MessageOptions\";\nimport { type TransactionOptions } from \"@api/model/TransactionOptions\";\nimport { type TypedData } from \"@api/model/TypedData\";\nimport { type TypedDataOptions } from \"@api/model/TypedDataOptions\";\nimport { type SignerEth } from \"@api/SignerEth\";\nimport { addressTypes } from \"@internal/address/di/addressTypes\";\nimport { type GetAddressUseCase } from \"@internal/address/use-case/GetAddressUseCase\";\nimport { makeContainer } from \"@internal/di\";\nimport { messageTypes } from \"@internal/message/di/messageTypes\";\nimport { type SignMessageUseCase } from \"@internal/message/use-case/SignMessageUseCase\";\nimport { transactionTypes } from \"@internal/transaction/di/transactionTypes\";\nimport { type SignTransactionUseCase } from \"@internal/transaction/use-case/SignTransactionUseCase\";\nimport { typedDataTypes } from \"@internal/typed-data/di/typedDataTypes\";\nimport { type SignTypedDataUseCase } from \"@internal/typed-data/use-case/SignTypedDataUseCase\";\n\nimport { eip7702Types } from \"./eip7702/di/eip7702Types\";\nimport { type SignDelegationAuthorizationUseCase } from \"./eip7702/use-case/SignDelegationAuthorizationUseCase\";\n\ntype DefaultSignerConstructorArgs = {\n dmk: DeviceManagementKit;\n sessionId: DeviceSessionId;\n contextModule: ContextModule;\n};\n\nexport class DefaultSignerEth implements SignerEth {\n private _container: Container;\n\n constructor({ dmk, sessionId, contextModule }: DefaultSignerConstructorArgs) {\n this._container = makeContainer({ dmk, sessionId, contextModule });\n }\n\n signTransaction(\n derivationPath: string,\n transaction: Uint8Array,\n options?: TransactionOptions,\n ): SignTransactionDAReturnType {\n return this._container\n .get<SignTransactionUseCase>(transactionTypes.SignTransactionUseCase)\n .execute(derivationPath, transaction, options);\n }\n\n signMessage(\n derivationPath: string,\n message: string | Uint8Array,\n options?: MessageOptions,\n ): SignPersonalMessageDAReturnType {\n return this._container\n .get<SignMessageUseCase>(messageTypes.SignMessageUseCase)\n .execute(derivationPath, message, options);\n }\n\n signTypedData(\n derivationPath: string,\n typedData: TypedData,\n options?: TypedDataOptions,\n ): SignTypedDataDAReturnType {\n return this._container\n .get<SignTypedDataUseCase>(typedDataTypes.SignTypedDataUseCase)\n .execute(derivationPath, typedData, options);\n }\n\n getAddress(\n derivationPath: string,\n options?: AddressOptions,\n ): GetAddressDAReturnType {\n return this._container\n .get<GetAddressUseCase>(addressTypes.GetAddressUseCase)\n .execute(derivationPath, options);\n }\n\n signDelegationAuthorization(\n derivationPath: string,\n chainId: number,\n contractAddress: string,\n nonce: number,\n ): SignDelegationAuthorizationDAReturnType {\n return this._container\n .get<SignDelegationAuthorizationUseCase>(\n eip7702Types.SignDelegationAuthorizationUseCase,\n )\n .execute(derivationPath, nonce, contractAddress, chainId);\n }\n}\n"],
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["addressTypes", "makeContainer", "messageTypes", "transactionTypes", "typedDataTypes", "eip7702Types", "DefaultSignerEth", "dmk", "sessionId", "contextModule", "derivationPath", "transaction", "options", "message", "typedData", "chainId", "contractAddress", "nonce"]
|
|
4
|
+
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n type DeviceManagementKit,\n type DeviceSessionId,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Container } from \"inversify\";\n\nimport { type GetAddressDAReturnType } from \"@api/app-binder/GetAddressDeviceActionTypes\";\nimport { type SignDelegationAuthorizationDAReturnType } from \"@api/app-binder/SignDelegationAuthorizationTypes\";\nimport { type SignPersonalMessageDAReturnType } from \"@api/app-binder/SignPersonalMessageDeviceActionTypes\";\nimport { type SignTransactionDAReturnType } from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type SignTypedDataDAReturnType } from \"@api/app-binder/SignTypedDataDeviceActionTypes\";\nimport { type VerifySafeAddressDAReturnType } from \"@api/app-binder/VerifySafeAddressDeviceActionTypes\";\nimport { type AddressOptions } from \"@api/model/AddressOptions\";\nimport { type MessageOptions } from \"@api/model/MessageOptions\";\nimport { type SafeAddressOptions } from \"@api/model/SafeAddressOptions\";\nimport { type TransactionOptions } from \"@api/model/TransactionOptions\";\nimport { type TypedData } from \"@api/model/TypedData\";\nimport { type TypedDataOptions } from \"@api/model/TypedDataOptions\";\nimport { type SignerEth } from \"@api/SignerEth\";\nimport { addressTypes } from \"@internal/address/di/addressTypes\";\nimport { type GetAddressUseCase } from \"@internal/address/use-case/GetAddressUseCase\";\nimport { makeContainer } from \"@internal/di\";\nimport { messageTypes } from \"@internal/message/di/messageTypes\";\nimport { type SignMessageUseCase } from \"@internal/message/use-case/SignMessageUseCase\";\nimport { safeTypes } from \"@internal/safe/di/safeTypes\";\nimport { type VerifySafeAddressUseCase } from \"@internal/safe/use-case/VerifySafeAddressUseCase\";\nimport { transactionTypes } from \"@internal/transaction/di/transactionTypes\";\nimport { type SignTransactionUseCase } from \"@internal/transaction/use-case/SignTransactionUseCase\";\nimport { typedDataTypes } from \"@internal/typed-data/di/typedDataTypes\";\nimport { type SignTypedDataUseCase } from \"@internal/typed-data/use-case/SignTypedDataUseCase\";\n\nimport { eip7702Types } from \"./eip7702/di/eip7702Types\";\nimport { type SignDelegationAuthorizationUseCase } from \"./eip7702/use-case/SignDelegationAuthorizationUseCase\";\n\ntype DefaultSignerConstructorArgs = {\n dmk: DeviceManagementKit;\n sessionId: DeviceSessionId;\n contextModule: ContextModule;\n};\n\nexport class DefaultSignerEth implements SignerEth {\n private _container: Container;\n\n constructor({ dmk, sessionId, contextModule }: DefaultSignerConstructorArgs) {\n this._container = makeContainer({ dmk, sessionId, contextModule });\n }\n\n signTransaction(\n derivationPath: string,\n transaction: Uint8Array,\n options?: TransactionOptions,\n ): SignTransactionDAReturnType {\n return this._container\n .get<SignTransactionUseCase>(transactionTypes.SignTransactionUseCase)\n .execute(derivationPath, transaction, options);\n }\n\n signMessage(\n derivationPath: string,\n message: string | Uint8Array,\n options?: MessageOptions,\n ): SignPersonalMessageDAReturnType {\n return this._container\n .get<SignMessageUseCase>(messageTypes.SignMessageUseCase)\n .execute(derivationPath, message, options);\n }\n\n signTypedData(\n derivationPath: string,\n typedData: TypedData,\n options?: TypedDataOptions,\n ): SignTypedDataDAReturnType {\n return this._container\n .get<SignTypedDataUseCase>(typedDataTypes.SignTypedDataUseCase)\n .execute(derivationPath, typedData, options);\n }\n\n getAddress(\n derivationPath: string,\n options?: AddressOptions,\n ): GetAddressDAReturnType {\n return this._container\n .get<GetAddressUseCase>(addressTypes.GetAddressUseCase)\n .execute(derivationPath, options);\n }\n\n verifySafeAddress(\n safeContractAddress: string,\n options?: SafeAddressOptions,\n ): VerifySafeAddressDAReturnType {\n return this._container\n .get<VerifySafeAddressUseCase>(safeTypes.VerifySafeAddressUseCase)\n .execute(safeContractAddress, options);\n }\n\n signDelegationAuthorization(\n derivationPath: string,\n chainId: number,\n contractAddress: string,\n nonce: number,\n ): SignDelegationAuthorizationDAReturnType {\n return this._container\n .get<SignDelegationAuthorizationUseCase>(\n eip7702Types.SignDelegationAuthorizationUseCase,\n )\n .execute(derivationPath, nonce, contractAddress, chainId);\n }\n}\n"],
|
|
5
|
+
"mappings": "AAoBA,OAAS,gBAAAA,MAAoB,oCAE7B,OAAS,iBAAAC,MAAqB,eAC9B,OAAS,gBAAAC,MAAoB,oCAE7B,OAAS,aAAAC,MAAiB,8BAE1B,OAAS,oBAAAC,MAAwB,4CAEjC,OAAS,kBAAAC,MAAsB,yCAG/B,OAAS,gBAAAC,MAAoB,4BAStB,MAAMC,CAAsC,CACzC,WAER,YAAY,CAAE,IAAAC,EAAK,UAAAC,EAAW,cAAAC,CAAc,EAAiC,CAC3E,KAAK,WAAaT,EAAc,CAAE,IAAAO,EAAK,UAAAC,EAAW,cAAAC,CAAc,CAAC,CACnE,CAEA,gBACEC,EACAC,EACAC,EAC6B,CAC7B,OAAO,KAAK,WACT,IAA4BT,EAAiB,sBAAsB,EACnE,QAAQO,EAAgBC,EAAaC,CAAO,CACjD,CAEA,YACEF,EACAG,EACAD,EACiC,CACjC,OAAO,KAAK,WACT,IAAwBX,EAAa,kBAAkB,EACvD,QAAQS,EAAgBG,EAASD,CAAO,CAC7C,CAEA,cACEF,EACAI,EACAF,EAC2B,CAC3B,OAAO,KAAK,WACT,IAA0BR,EAAe,oBAAoB,EAC7D,QAAQM,EAAgBI,EAAWF,CAAO,CAC/C,CAEA,WACEF,EACAE,EACwB,CACxB,OAAO,KAAK,WACT,IAAuBb,EAAa,iBAAiB,EACrD,QAAQW,EAAgBE,CAAO,CACpC,CAEA,kBACEG,EACAH,EAC+B,CAC/B,OAAO,KAAK,WACT,IAA8BV,EAAU,wBAAwB,EAChE,QAAQa,EAAqBH,CAAO,CACzC,CAEA,4BACEF,EACAM,EACAC,EACAC,EACyC,CACzC,OAAO,KAAK,WACT,IACCb,EAAa,kCACf,EACC,QAAQK,EAAgBQ,EAAOD,EAAiBD,CAAO,CAC5D,CACF",
|
|
6
|
+
"names": ["addressTypes", "makeContainer", "messageTypes", "safeTypes", "transactionTypes", "typedDataTypes", "eip7702Types", "DefaultSignerEth", "dmk", "sessionId", "contextModule", "derivationPath", "transaction", "options", "message", "typedData", "safeContractAddress", "chainId", "contractAddress", "nonce"]
|
|
7
7
|
}
|