@ledgerhq/context-module 2.0.0 → 2.2.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/lib/cjs/package.json +3 -2
- package/lib/cjs/src/ContextModuleBuilder.js +1 -1
- package/lib/cjs/src/ContextModuleBuilder.js.map +2 -2
- package/lib/cjs/src/DefaultContextModule.js +1 -1
- package/lib/cjs/src/DefaultContextModule.js.map +3 -3
- package/lib/cjs/src/di.js +1 -1
- package/lib/cjs/src/di.js.map +3 -3
- package/lib/cjs/src/index.js +1 -1
- package/lib/cjs/src/index.js.map +2 -2
- package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.js +1 -1
- package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.js.map +3 -3
- package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.test.js +1 -1
- package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.test.js.map +3 -3
- package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.js +1 -1
- package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.js.map +3 -3
- package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.test.js +1 -1
- package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.test.js.map +3 -3
- package/lib/cjs/src/modules/multichain/pki/model/KeyId.js +1 -1
- package/lib/cjs/src/modules/multichain/pki/model/KeyId.js.map +2 -2
- package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js +1 -1
- package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js.map +3 -3
- package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js +2 -0
- package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js.map +7 -0
- package/lib/cjs/src/modules/solana/alt-resolution/data/AltResolutionDataSource.js +2 -0
- package/lib/cjs/src/modules/solana/alt-resolution/data/AltResolutionDataSource.js.map +7 -0
- package/lib/cjs/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.js +2 -0
- package/lib/cjs/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.js.map +7 -0
- package/lib/cjs/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.test.js +2 -0
- package/lib/cjs/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.test.js.map +7 -0
- package/lib/cjs/src/modules/solana/alt-resolution/di/altResolutionModuleFactory.js +2 -0
- package/lib/cjs/src/modules/solana/alt-resolution/di/altResolutionModuleFactory.js.map +7 -0
- package/lib/cjs/src/modules/solana/alt-resolution/di/altResolutionTypes.js +2 -0
- package/lib/cjs/src/modules/solana/alt-resolution/di/altResolutionTypes.js.map +7 -0
- package/lib/cjs/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.js +2 -0
- package/lib/cjs/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.js.map +7 -0
- package/lib/cjs/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.test.js +2 -0
- package/lib/cjs/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.test.js.map +7 -0
- package/lib/cjs/src/modules/solana/enum-variant/di/enumVariantModuleFactory.js +2 -0
- package/lib/cjs/src/modules/solana/enum-variant/di/enumVariantModuleFactory.js.map +7 -0
- package/lib/cjs/src/modules/solana/enum-variant/di/enumVariantTypes.js +2 -0
- package/lib/cjs/src/modules/solana/enum-variant/di/enumVariantTypes.js.map +7 -0
- package/lib/cjs/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.js +2 -0
- package/lib/cjs/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.js.map +7 -0
- package/lib/cjs/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.test.js +2 -0
- package/lib/cjs/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.test.js.map +7 -0
- package/lib/cjs/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.js +2 -0
- package/lib/cjs/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.js.map +7 -0
- package/lib/cjs/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js +2 -0
- package/lib/cjs/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js.map +7 -0
- package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoDataSource.js +2 -0
- package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoDataSource.js.map +7 -0
- package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoDto.js +2 -0
- package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoDto.js.map +7 -0
- package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoMapper.js +2 -0
- package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoMapper.js.map +7 -0
- package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.js +2 -0
- package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.js.map +7 -0
- package/lib/cjs/src/modules/solana/instruction-info/di/instructionInfoModuleFactory.js +2 -0
- package/lib/cjs/src/modules/solana/instruction-info/di/instructionInfoModuleFactory.js.map +7 -0
- package/lib/cjs/src/modules/solana/instruction-info/di/instructionInfoTypes.js +2 -0
- package/lib/cjs/src/modules/solana/instruction-info/di/instructionInfoTypes.js.map +7 -0
- package/lib/cjs/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.js +2 -0
- package/lib/cjs/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.js.map +7 -0
- package/lib/cjs/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.js +2 -0
- package/lib/cjs/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.js.map +7 -0
- package/lib/cjs/src/modules/solana/lifi/data/HttpLifiDataSource.js +1 -1
- package/lib/cjs/src/modules/solana/lifi/data/HttpLifiDataSource.js.map +2 -2
- package/lib/cjs/src/modules/solana/lifi/data/HttpLifiDataSource.test.js +1 -1
- package/lib/cjs/src/modules/solana/lifi/data/HttpLifiDataSource.test.js.map +2 -2
- package/lib/cjs/src/modules/solana/model/SolanaClearSignContext.js +1 -1
- package/lib/cjs/src/modules/solana/model/SolanaClearSignContext.js.map +3 -3
- package/lib/cjs/src/modules/solana/model/SolanaContextTypes.js +1 -1
- package/lib/cjs/src/modules/solana/model/SolanaContextTypes.js.map +1 -1
- package/lib/cjs/src/modules/solana/model/SolanaPayloads.js +1 -1
- package/lib/cjs/src/modules/solana/model/SolanaPayloads.js.map +3 -3
- package/lib/cjs/src/modules/solana/model/SolanaTransactionScanChainId.js +1 -1
- package/lib/cjs/src/modules/solana/model/SolanaTransactionScanChainId.js.map +2 -2
- package/lib/cjs/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.js +1 -1
- package/lib/cjs/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.js.map +2 -2
- package/lib/cjs/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.test.js +1 -1
- package/lib/cjs/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.test.js.map +2 -2
- package/lib/cjs/src/modules/solana/owner-info/domain/solanaContextTypes.js +1 -1
- package/lib/cjs/src/modules/solana/owner-info/domain/solanaContextTypes.js.map +1 -1
- package/lib/cjs/src/modules/solana/token/domain/TokenContextLoader.js +1 -1
- package/lib/cjs/src/modules/solana/token/domain/TokenContextLoader.js.map +3 -3
- package/lib/cjs/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js +2 -0
- package/lib/cjs/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js.map +7 -0
- package/lib/cjs/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.js +2 -0
- package/lib/cjs/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.js.map +7 -0
- package/lib/cjs/src/modules/solana/token-account-state/data/TokenAccountStateDataSource.js +2 -0
- package/lib/cjs/src/modules/solana/token-account-state/data/TokenAccountStateDataSource.js.map +7 -0
- package/lib/cjs/src/modules/solana/token-account-state/di/tokenAccountStateModuleFactory.js +2 -0
- package/lib/cjs/src/modules/solana/token-account-state/di/tokenAccountStateModuleFactory.js.map +7 -0
- package/lib/cjs/src/modules/solana/token-account-state/di/tokenAccountStateTypes.js +2 -0
- package/lib/cjs/src/modules/solana/token-account-state/di/tokenAccountStateTypes.js.map +7 -0
- package/lib/cjs/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.js +2 -0
- package/lib/cjs/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.js.map +7 -0
- package/lib/cjs/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.test.js +2 -0
- package/lib/cjs/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.test.js.map +7 -0
- package/lib/cjs/src/modules/solana/token-info/data/HttpTokenInfoDataSource.js +2 -0
- package/lib/cjs/src/modules/solana/token-info/data/HttpTokenInfoDataSource.js.map +7 -0
- package/lib/cjs/src/modules/solana/token-info/data/HttpTokenInfoDataSource.test.js +2 -0
- package/lib/cjs/src/modules/solana/token-info/data/HttpTokenInfoDataSource.test.js.map +7 -0
- package/lib/cjs/src/modules/solana/token-info/data/TokenInfoDataSource.js +2 -0
- package/lib/cjs/src/modules/solana/token-info/data/TokenInfoDataSource.js.map +7 -0
- package/lib/cjs/src/modules/solana/token-info/di/tokenInfoModuleFactory.js +2 -0
- package/lib/cjs/src/modules/solana/token-info/di/tokenInfoModuleFactory.js.map +7 -0
- package/lib/cjs/src/modules/solana/token-info/di/tokenInfoTypes.js +2 -0
- package/lib/cjs/src/modules/solana/token-info/di/tokenInfoTypes.js.map +7 -0
- package/lib/cjs/src/modules/solana/token-info/domain/TokenInfoContextLoader.js +2 -0
- package/lib/cjs/src/modules/solana/token-info/domain/TokenInfoContextLoader.js.map +7 -0
- package/lib/cjs/src/modules/solana/token-info/domain/TokenInfoContextLoader.test.js +2 -0
- package/lib/cjs/src/modules/solana/token-info/domain/TokenInfoContextLoader.test.js.map +7 -0
- package/lib/cjs/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.js +2 -0
- package/lib/cjs/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.js.map +7 -0
- package/lib/cjs/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.js +2 -0
- package/lib/cjs/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.js.map +7 -0
- package/lib/cjs/src/modules/solana/trusted-name/data/TrustedNameDataSource.js +2 -0
- package/lib/cjs/src/modules/solana/trusted-name/data/TrustedNameDataSource.js.map +7 -0
- package/lib/cjs/src/modules/solana/trusted-name/di/trustedNameModuleFactory.js +2 -0
- package/lib/cjs/src/modules/solana/trusted-name/di/trustedNameModuleFactory.js.map +7 -0
- package/lib/cjs/src/modules/solana/trusted-name/di/trustedNameTypes.js +2 -0
- package/lib/cjs/src/modules/solana/trusted-name/di/trustedNameTypes.js.map +7 -0
- package/lib/cjs/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.js +2 -0
- package/lib/cjs/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.js.map +7 -0
- package/lib/cjs/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.js +2 -0
- package/lib/cjs/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.js.map +7 -0
- package/lib/cjs/src/shared/model/ClearSignContext.js +1 -1
- package/lib/cjs/src/shared/model/ClearSignContext.js.map +2 -2
- package/lib/cjs/src/shared/utils/HexStringUtils.js +1 -1
- package/lib/cjs/src/shared/utils/HexStringUtils.js.map +3 -3
- package/lib/cjs/src/shared/utils/HexStringUtils.test.js +1 -1
- package/lib/cjs/src/shared/utils/HexStringUtils.test.js.map +2 -2
- package/lib/cjs/src/shared/utils/bs58Encoder.js +2 -0
- package/lib/cjs/src/shared/utils/bs58Encoder.js.map +7 -0
- package/lib/cjs/src/shared/utils/certificateCache.js +2 -0
- package/lib/cjs/src/shared/utils/certificateCache.js.map +7 -0
- package/lib/cjs/src/shared/utils/certificateCache.test.js +2 -0
- package/lib/cjs/src/shared/utils/certificateCache.test.js.map +7 -0
- package/lib/cjs/src/shared/utils/certificateResult.js +2 -0
- package/lib/cjs/src/shared/utils/certificateResult.js.map +7 -0
- package/lib/cjs/src/shared/utils/certificateResult.test.js +2 -0
- package/lib/cjs/src/shared/utils/certificateResult.test.js.map +7 -0
- package/lib/cjs/src/shared/utils/challengeBoundLoader.js +2 -0
- package/lib/cjs/src/shared/utils/challengeBoundLoader.js.map +7 -0
- package/lib/cjs/src/shared/utils/challengeBoundLoader.test.js +2 -0
- package/lib/cjs/src/shared/utils/challengeBoundLoader.test.js.map +7 -0
- package/lib/cjs/src/shared/utils/deviceModelIdCodec.js +2 -0
- package/lib/cjs/src/shared/utils/deviceModelIdCodec.js.map +7 -0
- package/lib/cjs/src/shared/utils/deviceModelIdCodec.test.js +2 -0
- package/lib/cjs/src/shared/utils/deviceModelIdCodec.test.js.map +7 -0
- package/lib/cjs/src/shared/utils/signedDescriptorDto.js +2 -0
- package/lib/cjs/src/shared/utils/signedDescriptorDto.js.map +7 -0
- package/lib/cjs/src/shared/utils/signedDescriptorDto.test.js +2 -0
- package/lib/cjs/src/shared/utils/signedDescriptorDto.test.js.map +7 -0
- package/lib/cjs/src/shared/utils/uIntCodec.js +2 -0
- package/lib/cjs/src/shared/utils/uIntCodec.js.map +7 -0
- package/lib/cjs/src/shared/utils/uIntCodec.test.js +2 -0
- package/lib/cjs/src/shared/utils/uIntCodec.test.js.map +7 -0
- package/lib/cjs/src/shared/utils/uint8ArrayCodec.js +2 -0
- package/lib/cjs/src/shared/utils/uint8ArrayCodec.js.map +7 -0
- package/lib/cjs/src/shared/utils/uint8ArrayCodec.test.js +2 -0
- package/lib/cjs/src/shared/utils/uint8ArrayCodec.test.js.map +7 -0
- package/lib/esm/package.json +3 -2
- package/lib/esm/src/ContextModuleBuilder.js +1 -1
- package/lib/esm/src/ContextModuleBuilder.js.map +2 -2
- package/lib/esm/src/DefaultContextModule.js +1 -1
- package/lib/esm/src/DefaultContextModule.js.map +3 -3
- package/lib/esm/src/di.js +1 -1
- package/lib/esm/src/di.js.map +3 -3
- package/lib/esm/src/index.js +1 -1
- package/lib/esm/src/index.js.map +2 -2
- package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.js +1 -1
- package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.js.map +3 -3
- package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.test.js +1 -1
- package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.test.js.map +3 -3
- package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.js +1 -1
- package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.js.map +3 -3
- package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.test.js +1 -1
- package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.test.js.map +3 -3
- package/lib/esm/src/modules/multichain/pki/model/KeyId.js +1 -1
- package/lib/esm/src/modules/multichain/pki/model/KeyId.js.map +2 -2
- package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js +1 -1
- package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js.map +3 -3
- package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js +2 -0
- package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js.map +7 -0
- package/lib/esm/src/modules/solana/alt-resolution/data/AltResolutionDataSource.js +1 -0
- package/lib/esm/src/modules/solana/alt-resolution/data/AltResolutionDataSource.js.map +7 -0
- package/lib/esm/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.js +2 -0
- package/lib/esm/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.js.map +7 -0
- package/lib/esm/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.test.js +2 -0
- package/lib/esm/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.test.js.map +7 -0
- package/lib/esm/src/modules/solana/alt-resolution/di/altResolutionModuleFactory.js +2 -0
- package/lib/esm/src/modules/solana/alt-resolution/di/altResolutionModuleFactory.js.map +7 -0
- package/lib/esm/src/modules/solana/alt-resolution/di/altResolutionTypes.js +2 -0
- package/lib/esm/src/modules/solana/alt-resolution/di/altResolutionTypes.js.map +7 -0
- package/lib/esm/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.js +2 -0
- package/lib/esm/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.js.map +7 -0
- package/lib/esm/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.test.js +2 -0
- package/lib/esm/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.test.js.map +7 -0
- package/lib/esm/src/modules/solana/enum-variant/di/enumVariantModuleFactory.js +2 -0
- package/lib/esm/src/modules/solana/enum-variant/di/enumVariantModuleFactory.js.map +7 -0
- package/lib/esm/src/modules/solana/enum-variant/di/enumVariantTypes.js +2 -0
- package/lib/esm/src/modules/solana/enum-variant/di/enumVariantTypes.js.map +7 -0
- package/lib/esm/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.js +2 -0
- package/lib/esm/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.js.map +7 -0
- package/lib/esm/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.test.js +2 -0
- package/lib/esm/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.test.js.map +7 -0
- package/lib/esm/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.js +2 -0
- package/lib/esm/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.js.map +7 -0
- package/lib/esm/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js +2 -0
- package/lib/esm/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js.map +7 -0
- package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoDataSource.js +1 -0
- package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoDataSource.js.map +7 -0
- package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoDto.js +2 -0
- package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoDto.js.map +7 -0
- package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoMapper.js +2 -0
- package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoMapper.js.map +7 -0
- package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.js +2 -0
- package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.js.map +7 -0
- package/lib/esm/src/modules/solana/instruction-info/di/instructionInfoModuleFactory.js +2 -0
- package/lib/esm/src/modules/solana/instruction-info/di/instructionInfoModuleFactory.js.map +7 -0
- package/lib/esm/src/modules/solana/instruction-info/di/instructionInfoTypes.js +2 -0
- package/lib/esm/src/modules/solana/instruction-info/di/instructionInfoTypes.js.map +7 -0
- package/lib/esm/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.js +2 -0
- package/lib/esm/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.js.map +7 -0
- package/lib/esm/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.js +2 -0
- package/lib/esm/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.js.map +7 -0
- package/lib/esm/src/modules/solana/lifi/data/HttpLifiDataSource.js +1 -1
- package/lib/esm/src/modules/solana/lifi/data/HttpLifiDataSource.js.map +2 -2
- package/lib/esm/src/modules/solana/lifi/data/HttpLifiDataSource.test.js +1 -1
- package/lib/esm/src/modules/solana/lifi/data/HttpLifiDataSource.test.js.map +2 -2
- package/lib/esm/src/modules/solana/model/SolanaClearSignContext.js +1 -1
- package/lib/esm/src/modules/solana/model/SolanaClearSignContext.js.map +3 -3
- package/lib/esm/src/modules/solana/model/SolanaPayloads.js +1 -0
- package/lib/esm/src/modules/solana/model/SolanaPayloads.js.map +4 -4
- package/lib/esm/src/modules/solana/model/SolanaTransactionScanChainId.js +1 -1
- package/lib/esm/src/modules/solana/model/SolanaTransactionScanChainId.js.map +2 -2
- package/lib/esm/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.js +1 -1
- package/lib/esm/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.js.map +2 -2
- package/lib/esm/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.test.js +1 -1
- package/lib/esm/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.test.js.map +2 -2
- package/lib/esm/src/modules/solana/token/domain/TokenContextLoader.js +1 -1
- package/lib/esm/src/modules/solana/token/domain/TokenContextLoader.js.map +3 -3
- package/lib/esm/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js +2 -0
- package/lib/esm/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js.map +7 -0
- package/lib/esm/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.js +2 -0
- package/lib/esm/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.js.map +7 -0
- package/lib/esm/src/modules/solana/token-account-state/data/TokenAccountStateDataSource.js +1 -0
- package/lib/esm/src/modules/solana/token-account-state/data/TokenAccountStateDataSource.js.map +7 -0
- package/lib/esm/src/modules/solana/token-account-state/di/tokenAccountStateModuleFactory.js +2 -0
- package/lib/esm/src/modules/solana/token-account-state/di/tokenAccountStateModuleFactory.js.map +7 -0
- package/lib/esm/src/modules/solana/token-account-state/di/tokenAccountStateTypes.js +2 -0
- package/lib/esm/src/modules/solana/token-account-state/di/tokenAccountStateTypes.js.map +7 -0
- package/lib/esm/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.js +2 -0
- package/lib/esm/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.js.map +7 -0
- package/lib/esm/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.test.js +2 -0
- package/lib/esm/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.test.js.map +7 -0
- package/lib/esm/src/modules/solana/token-info/data/HttpTokenInfoDataSource.js +2 -0
- package/lib/esm/src/modules/solana/token-info/data/HttpTokenInfoDataSource.js.map +7 -0
- package/lib/esm/src/modules/solana/token-info/data/HttpTokenInfoDataSource.test.js +2 -0
- package/lib/esm/src/modules/solana/token-info/data/HttpTokenInfoDataSource.test.js.map +7 -0
- package/lib/esm/src/modules/solana/token-info/data/TokenInfoDataSource.js +1 -0
- package/lib/esm/src/modules/solana/token-info/data/TokenInfoDataSource.js.map +7 -0
- package/lib/esm/src/modules/solana/token-info/di/tokenInfoModuleFactory.js +2 -0
- package/lib/esm/src/modules/solana/token-info/di/tokenInfoModuleFactory.js.map +7 -0
- package/lib/esm/src/modules/solana/token-info/di/tokenInfoTypes.js +2 -0
- package/lib/esm/src/modules/solana/token-info/di/tokenInfoTypes.js.map +7 -0
- package/lib/esm/src/modules/solana/token-info/domain/TokenInfoContextLoader.js +2 -0
- package/lib/esm/src/modules/solana/token-info/domain/TokenInfoContextLoader.js.map +7 -0
- package/lib/esm/src/modules/solana/token-info/domain/TokenInfoContextLoader.test.js +2 -0
- package/lib/esm/src/modules/solana/token-info/domain/TokenInfoContextLoader.test.js.map +7 -0
- package/lib/esm/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.js +2 -0
- package/lib/esm/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.js.map +7 -0
- package/lib/esm/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.js +2 -0
- package/lib/esm/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.js.map +7 -0
- package/lib/esm/src/modules/solana/trusted-name/data/TrustedNameDataSource.js +1 -0
- package/lib/esm/src/modules/solana/trusted-name/data/TrustedNameDataSource.js.map +7 -0
- package/lib/esm/src/modules/solana/trusted-name/di/trustedNameModuleFactory.js +2 -0
- package/lib/esm/src/modules/solana/trusted-name/di/trustedNameModuleFactory.js.map +7 -0
- package/lib/esm/src/modules/solana/trusted-name/di/trustedNameTypes.js +2 -0
- package/lib/esm/src/modules/solana/trusted-name/di/trustedNameTypes.js.map +7 -0
- package/lib/esm/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.js +2 -0
- package/lib/esm/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.js.map +7 -0
- package/lib/esm/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.js +2 -0
- package/lib/esm/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.js.map +7 -0
- package/lib/esm/src/shared/model/ClearSignContext.js +1 -1
- package/lib/esm/src/shared/model/ClearSignContext.js.map +2 -2
- package/lib/esm/src/shared/utils/HexStringUtils.js +1 -1
- package/lib/esm/src/shared/utils/HexStringUtils.js.map +3 -3
- package/lib/esm/src/shared/utils/HexStringUtils.test.js +1 -1
- package/lib/esm/src/shared/utils/HexStringUtils.test.js.map +2 -2
- package/lib/esm/src/shared/utils/bs58Encoder.js +2 -0
- package/lib/esm/src/shared/utils/bs58Encoder.js.map +7 -0
- package/lib/esm/src/shared/utils/certificateCache.js +2 -0
- package/lib/esm/src/shared/utils/certificateCache.js.map +7 -0
- package/lib/esm/src/shared/utils/certificateCache.test.js +2 -0
- package/lib/esm/src/shared/utils/certificateCache.test.js.map +7 -0
- package/lib/esm/src/shared/utils/certificateResult.js +2 -0
- package/lib/esm/src/shared/utils/certificateResult.js.map +7 -0
- package/lib/esm/src/shared/utils/certificateResult.test.js +2 -0
- package/lib/esm/src/shared/utils/certificateResult.test.js.map +7 -0
- package/lib/esm/src/shared/utils/challengeBoundLoader.js +2 -0
- package/lib/esm/src/shared/utils/challengeBoundLoader.js.map +7 -0
- package/lib/esm/src/shared/utils/challengeBoundLoader.test.js +2 -0
- package/lib/esm/src/shared/utils/challengeBoundLoader.test.js.map +7 -0
- package/lib/esm/src/shared/utils/deviceModelIdCodec.js +2 -0
- package/lib/esm/src/shared/utils/deviceModelIdCodec.js.map +7 -0
- package/lib/esm/src/shared/utils/deviceModelIdCodec.test.js +2 -0
- package/lib/esm/src/shared/utils/deviceModelIdCodec.test.js.map +7 -0
- package/lib/esm/src/shared/utils/signedDescriptorDto.js +2 -0
- package/lib/esm/src/shared/utils/signedDescriptorDto.js.map +7 -0
- package/lib/esm/src/shared/utils/signedDescriptorDto.test.js +2 -0
- package/lib/esm/src/shared/utils/signedDescriptorDto.test.js.map +7 -0
- package/lib/esm/src/shared/utils/uIntCodec.js +2 -0
- package/lib/esm/src/shared/utils/uIntCodec.js.map +7 -0
- package/lib/esm/src/shared/utils/uIntCodec.test.js +2 -0
- package/lib/esm/src/shared/utils/uIntCodec.test.js.map +7 -0
- package/lib/esm/src/shared/utils/uint8ArrayCodec.js +2 -0
- package/lib/esm/src/shared/utils/uint8ArrayCodec.js.map +7 -0
- package/lib/esm/src/shared/utils/uint8ArrayCodec.test.js +2 -0
- package/lib/esm/src/shared/utils/uint8ArrayCodec.test.js.map +7 -0
- package/lib/types/src/DefaultContextModule.d.ts.map +1 -1
- package/lib/types/src/di.d.ts.map +1 -1
- package/lib/types/src/index.d.ts +16 -0
- package/lib/types/src/index.d.ts.map +1 -1
- package/lib/types/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.d.ts +3 -2
- package/lib/types/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.d.ts.map +1 -1
- package/lib/types/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.d.ts +3 -2
- package/lib/types/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.d.ts.map +1 -1
- package/lib/types/src/modules/multichain/pki/model/KeyId.d.ts +1 -0
- package/lib/types/src/modules/multichain/pki/model/KeyId.d.ts.map +1 -1
- package/lib/types/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.d.ts +17 -3
- package/lib/types/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.d.ts.map +1 -1
- package/lib/types/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.d.ts +2 -0
- package/lib/types/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.d.ts.map +1 -0
- package/lib/types/src/modules/solana/alt-resolution/data/AltResolutionDataSource.d.ts +17 -0
- package/lib/types/src/modules/solana/alt-resolution/data/AltResolutionDataSource.d.ts.map +1 -0
- package/lib/types/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.d.ts +11 -0
- package/lib/types/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.d.ts.map +1 -0
- package/lib/types/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.test.d.ts +2 -0
- package/lib/types/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.test.d.ts.map +1 -0
- package/lib/types/src/modules/solana/alt-resolution/di/altResolutionModuleFactory.d.ts +3 -0
- package/lib/types/src/modules/solana/alt-resolution/di/altResolutionModuleFactory.d.ts.map +1 -0
- package/lib/types/src/modules/solana/alt-resolution/di/altResolutionTypes.d.ts +5 -0
- package/lib/types/src/modules/solana/alt-resolution/di/altResolutionTypes.d.ts.map +1 -0
- package/lib/types/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.d.ts +23 -0
- package/lib/types/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.d.ts.map +1 -0
- package/lib/types/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.test.d.ts +2 -0
- package/lib/types/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.test.d.ts.map +1 -0
- package/lib/types/src/modules/solana/enum-variant/di/enumVariantModuleFactory.d.ts +3 -0
- package/lib/types/src/modules/solana/enum-variant/di/enumVariantModuleFactory.d.ts.map +1 -0
- package/lib/types/src/modules/solana/enum-variant/di/enumVariantTypes.d.ts +4 -0
- package/lib/types/src/modules/solana/enum-variant/di/enumVariantTypes.d.ts.map +1 -0
- package/lib/types/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.d.ts +45 -0
- package/lib/types/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.d.ts.map +1 -0
- package/lib/types/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.test.d.ts +2 -0
- package/lib/types/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.test.d.ts.map +1 -0
- package/lib/types/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.d.ts +11 -0
- package/lib/types/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.d.ts.map +1 -0
- package/lib/types/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.d.ts +2 -0
- package/lib/types/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.d.ts.map +1 -0
- package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoDataSource.d.ts +32 -0
- package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoDataSource.d.ts.map +1 -0
- package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoDto.d.ts +135 -0
- package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoDto.d.ts.map +1 -0
- package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoMapper.d.ts +23 -0
- package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoMapper.d.ts.map +1 -0
- package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.d.ts +2 -0
- package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.d.ts.map +1 -0
- package/lib/types/src/modules/solana/instruction-info/di/instructionInfoModuleFactory.d.ts +3 -0
- package/lib/types/src/modules/solana/instruction-info/di/instructionInfoModuleFactory.d.ts.map +1 -0
- package/lib/types/src/modules/solana/instruction-info/di/instructionInfoTypes.d.ts +5 -0
- package/lib/types/src/modules/solana/instruction-info/di/instructionInfoTypes.d.ts.map +1 -0
- package/lib/types/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.d.ts +39 -0
- package/lib/types/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.d.ts.map +1 -0
- package/lib/types/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.d.ts +2 -0
- package/lib/types/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.d.ts.map +1 -0
- package/lib/types/src/modules/solana/lifi/data/HttpLifiDataSource.d.ts.map +1 -1
- package/lib/types/src/modules/solana/model/SolanaClearSignContext.d.ts +33 -2
- package/lib/types/src/modules/solana/model/SolanaClearSignContext.d.ts.map +1 -1
- package/lib/types/src/modules/solana/model/SolanaContextTypes.d.ts +8 -1
- package/lib/types/src/modules/solana/model/SolanaContextTypes.d.ts.map +1 -1
- package/lib/types/src/modules/solana/model/SolanaPayloads.d.ts +126 -0
- package/lib/types/src/modules/solana/model/SolanaPayloads.d.ts.map +1 -1
- package/lib/types/src/modules/solana/model/SolanaTransactionScanChainId.d.ts +6 -5
- package/lib/types/src/modules/solana/model/SolanaTransactionScanChainId.d.ts.map +1 -1
- package/lib/types/src/modules/solana/owner-info/domain/solanaContextTypes.d.ts +2 -5
- package/lib/types/src/modules/solana/owner-info/domain/solanaContextTypes.d.ts.map +1 -1
- package/lib/types/src/modules/solana/token/domain/TokenContextLoader.d.ts.map +1 -1
- package/lib/types/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.d.ts +11 -0
- package/lib/types/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.d.ts.map +1 -0
- package/lib/types/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.d.ts +2 -0
- package/lib/types/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.d.ts.map +1 -0
- package/lib/types/src/modules/solana/token-account-state/data/TokenAccountStateDataSource.d.ts +15 -0
- package/lib/types/src/modules/solana/token-account-state/data/TokenAccountStateDataSource.d.ts.map +1 -0
- package/lib/types/src/modules/solana/token-account-state/di/tokenAccountStateModuleFactory.d.ts +3 -0
- package/lib/types/src/modules/solana/token-account-state/di/tokenAccountStateModuleFactory.d.ts.map +1 -0
- package/lib/types/src/modules/solana/token-account-state/di/tokenAccountStateTypes.d.ts +5 -0
- package/lib/types/src/modules/solana/token-account-state/di/tokenAccountStateTypes.d.ts.map +1 -0
- package/lib/types/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.d.ts +26 -0
- package/lib/types/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.d.ts.map +1 -0
- package/lib/types/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.test.d.ts +2 -0
- package/lib/types/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.test.d.ts.map +1 -0
- package/lib/types/src/modules/solana/token-info/data/HttpTokenInfoDataSource.d.ts +11 -0
- package/lib/types/src/modules/solana/token-info/data/HttpTokenInfoDataSource.d.ts.map +1 -0
- package/lib/types/src/modules/solana/token-info/data/HttpTokenInfoDataSource.test.d.ts +2 -0
- package/lib/types/src/modules/solana/token-info/data/HttpTokenInfoDataSource.test.d.ts.map +1 -0
- package/lib/types/src/modules/solana/token-info/data/TokenInfoDataSource.d.ts +24 -0
- package/lib/types/src/modules/solana/token-info/data/TokenInfoDataSource.d.ts.map +1 -0
- package/lib/types/src/modules/solana/token-info/di/tokenInfoModuleFactory.d.ts +3 -0
- package/lib/types/src/modules/solana/token-info/di/tokenInfoModuleFactory.d.ts.map +1 -0
- package/lib/types/src/modules/solana/token-info/di/tokenInfoTypes.d.ts +5 -0
- package/lib/types/src/modules/solana/token-info/di/tokenInfoTypes.d.ts.map +1 -0
- package/lib/types/src/modules/solana/token-info/domain/TokenInfoContextLoader.d.ts +26 -0
- package/lib/types/src/modules/solana/token-info/domain/TokenInfoContextLoader.d.ts.map +1 -0
- package/lib/types/src/modules/solana/token-info/domain/TokenInfoContextLoader.test.d.ts +2 -0
- package/lib/types/src/modules/solana/token-info/domain/TokenInfoContextLoader.test.d.ts.map +1 -0
- package/lib/types/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.d.ts +11 -0
- package/lib/types/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.d.ts.map +1 -0
- package/lib/types/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.d.ts +2 -0
- package/lib/types/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.d.ts.map +1 -0
- package/lib/types/src/modules/solana/trusted-name/data/TrustedNameDataSource.d.ts +18 -0
- package/lib/types/src/modules/solana/trusted-name/data/TrustedNameDataSource.d.ts.map +1 -0
- package/lib/types/src/modules/solana/trusted-name/di/trustedNameModuleFactory.d.ts +3 -0
- package/lib/types/src/modules/solana/trusted-name/di/trustedNameModuleFactory.d.ts.map +1 -0
- package/lib/types/src/modules/solana/trusted-name/di/trustedNameTypes.d.ts +5 -0
- package/lib/types/src/modules/solana/trusted-name/di/trustedNameTypes.d.ts.map +1 -0
- package/lib/types/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.d.ts +29 -0
- package/lib/types/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.d.ts.map +1 -0
- package/lib/types/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.d.ts +2 -0
- package/lib/types/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.d.ts.map +1 -0
- package/lib/types/src/shared/model/ClearSignContext.d.ts +7 -1
- package/lib/types/src/shared/model/ClearSignContext.d.ts.map +1 -1
- package/lib/types/src/shared/utils/HexStringUtils.d.ts +7 -0
- package/lib/types/src/shared/utils/HexStringUtils.d.ts.map +1 -1
- package/lib/types/src/shared/utils/bs58Encoder.d.ts +9 -0
- package/lib/types/src/shared/utils/bs58Encoder.d.ts.map +1 -0
- package/lib/types/src/shared/utils/certificateCache.d.ts +23 -0
- package/lib/types/src/shared/utils/certificateCache.d.ts.map +1 -0
- package/lib/types/src/shared/utils/certificateCache.test.d.ts +2 -0
- package/lib/types/src/shared/utils/certificateCache.test.d.ts.map +1 -0
- package/lib/types/src/shared/utils/certificateResult.d.ts +26 -0
- package/lib/types/src/shared/utils/certificateResult.d.ts.map +1 -0
- package/lib/types/src/shared/utils/certificateResult.test.d.ts +2 -0
- package/lib/types/src/shared/utils/certificateResult.test.d.ts.map +1 -0
- package/lib/types/src/shared/utils/challengeBoundLoader.d.ts +43 -0
- package/lib/types/src/shared/utils/challengeBoundLoader.d.ts.map +1 -0
- package/lib/types/src/shared/utils/challengeBoundLoader.test.d.ts +2 -0
- package/lib/types/src/shared/utils/challengeBoundLoader.test.d.ts.map +1 -0
- package/lib/types/src/shared/utils/deviceModelIdCodec.d.ts +7 -0
- package/lib/types/src/shared/utils/deviceModelIdCodec.d.ts.map +1 -0
- package/lib/types/src/shared/utils/deviceModelIdCodec.test.d.ts +2 -0
- package/lib/types/src/shared/utils/deviceModelIdCodec.test.d.ts.map +1 -0
- package/lib/types/src/shared/utils/signedDescriptorDto.d.ts +15 -0
- package/lib/types/src/shared/utils/signedDescriptorDto.d.ts.map +1 -0
- package/lib/types/src/shared/utils/signedDescriptorDto.test.d.ts +2 -0
- package/lib/types/src/shared/utils/signedDescriptorDto.test.d.ts.map +1 -0
- package/lib/types/src/shared/utils/uIntCodec.d.ts +20 -0
- package/lib/types/src/shared/utils/uIntCodec.d.ts.map +1 -0
- package/lib/types/src/shared/utils/uIntCodec.test.d.ts +2 -0
- package/lib/types/src/shared/utils/uIntCodec.test.d.ts.map +1 -0
- package/lib/types/src/shared/utils/uint8ArrayCodec.d.ts +3 -0
- package/lib/types/src/shared/utils/uint8ArrayCodec.d.ts.map +1 -0
- package/lib/types/src/shared/utils/uint8ArrayCodec.test.d.ts +2 -0
- package/lib/types/src/shared/utils/uint8ArrayCodec.test.d.ts.map +1 -0
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +7 -6
package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.test.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { type GatedDescriptorDataSource } from \"@/modules/ethereum/gated-signing/data/GatedDescriptorDataSource\";\nimport {\n type GatedSigningContextInput,\n GatedSigningContextLoader,\n} from \"@/modules/ethereum/gated-signing/domain/GatedSigningContextLoader\";\nimport type { ProxyDataSource } from \"@/modules/ethereum/proxy/data/ProxyDataSource\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { KeyId } from \"@/modules/multichain/pki/model/KeyId\";\nimport { KeyUsage } from \"@/modules/multichain/pki/model/KeyUsage\";\nimport { type PkiCertificate } from \"@/modules/multichain/pki/model/PkiCertificate\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\ndescribe(\"GatedSigningContextLoader\", () => {\n const mockGatedDescriptorDataSource: GatedDescriptorDataSource = {\n getGatedDescriptor: vi.fn(),\n getGatedDescriptorForTypedData: vi.fn(),\n };\n\n const mockCertificateLoader: PkiCertificateLoader = {\n loadCertificate: vi.fn(),\n };\n\n const mockProxyDataSource: ProxyDataSource = {\n getProxyImplementationAddress: vi.fn(),\n };\n\n const loader = new GatedSigningContextLoader(\n mockGatedDescriptorDataSource,\n mockCertificateLoader,\n mockProxyDataSource,\n );\n\n const mockCertificate: PkiCertificate = {\n keyUsageNumber: 1,\n payload: new Uint8Array([0x01, 0x02, 0x03]),\n };\n\n const SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.ETHEREUM_GATED_SIGNING,\n ];\n\n beforeEach(() => {\n vi.resetAllMocks();\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n mockCertificate,\n );\n });\n\n describe(\"canHandle function\", () => {\n const validInput: GatedSigningContextInput = {\n to: \"0x1111111254fb6c44bac0bed2854e76f90643097d\",\n selector: \"0xa1251d75\",\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n };\n\n it(\"should return true for valid input\", () => {\n expect(loader.canHandle(validInput, SUPPORTED_TYPES)).toBe(true);\n });\n\n it(\"should return false for invalid expected type\", () => {\n expect(\n loader.canHandle(validInput, [ClearSignContextType.ETHEREUM_TOKEN]),\n ).toBe(false);\n expect(\n loader.canHandle(validInput, [\n ClearSignContextType.ETHEREUM_DYNAMIC_NETWORK,\n ]),\n ).toBe(false);\n });\n\n it.each([\n [null, \"null input\"],\n [undefined, \"undefined input\"],\n [{}, \"empty object\"],\n [\"string\", \"string input\"],\n [123, \"number input\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it.each([\n [{ ...validInput, to: undefined }, \"missing to\"],\n [{ ...validInput, selector: undefined }, \"missing selector\"],\n [{ ...validInput, chainId: undefined }, \"missing chainId\"],\n [{ ...validInput, deviceModelId: undefined }, \"missing deviceModelId\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it.each([\n [{ ...validInput, to: \"0x\" }, \"empty to (0x)\"],\n [{ ...validInput, to: \"not-hex\" }, \"non-hex to\"],\n [{ ...validInput, selector: \"not-hex\" }, \"non-hex selector\"],\n [{ ...validInput, chainId: \"1\" as unknown as number }, \"string chainId\"],\n [{ ...validInput, chainId: null as unknown as number }, \"null chainId\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n });\n\n describe(\"load function\", () => {\n const validInput: GatedSigningContextInput = {\n to: \"0x1111111254fb6c44bac0bed2854e76f90643097d\",\n selector: \"0xa1251d75\",\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n };\n\n const signedDescriptor =\n \"010122020101222a30783131313131313235346662366334346261633062656432383534653736663930363433303937642308000000000000000140086131323531643735150100\";\n\n it(\"should return error context when getGatedDescriptor returns Left and proxy resolution fails\", async () => {\n const error = new Error(\"Failed to fetch gated descriptors\");\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptor\",\n ).mockResolvedValue(Left(error));\n vi.spyOn(\n mockProxyDataSource,\n \"getProxyImplementationAddress\",\n ).mockResolvedValue(Left(new Error(\"Not a proxy\")));\n\n const result = await loader.load(validInput);\n\n expect(result).toEqual([\n {\n type: ClearSignContextType.ERROR,\n error,\n },\n ]);\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptor,\n ).toHaveBeenCalledWith({\n contractAddress: validInput.to,\n selector: validInput.selector,\n chainId: validInput.chainId,\n });\n expect(\n mockProxyDataSource.getProxyImplementationAddress,\n ).toHaveBeenCalledWith({\n proxyAddress: validInput.to,\n chainId: validInput.chainId,\n challenge: \"\",\n calldata: \"0x\",\n });\n expect(mockCertificateLoader.loadCertificate).not.toHaveBeenCalled();\n });\n\n it(\"should return gated signing context when getGatedDescriptor succeeds\", async () => {\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptor\",\n ).mockResolvedValue(Right({ signedDescriptor }));\n\n const result = await loader.load(validInput);\n\n expect(result).toHaveLength(1);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.ETHEREUM_GATED_SIGNING,\n payload: signedDescriptor,\n certificate: mockCertificate,\n });\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptor,\n ).toHaveBeenCalledWith({\n contractAddress: validInput.to,\n selector: validInput.selector,\n chainId: validInput.chainId,\n });\n expect(mockCertificateLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: KeyId.CalGatedSigning,\n keyUsage: KeyUsage.GatedSigning,\n targetDevice: validInput.deviceModelId,\n });\n });\n\n it(\"should pass to as contractAddress to getGatedDescriptor\", async () => {\n const customTo = \"0xabcdef1234567890abcdef1234567890abcdef12\";\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptor\",\n ).mockResolvedValue(Right({ signedDescriptor }));\n\n await loader.load({\n ...validInput,\n to: customTo,\n });\n\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptor,\n ).toHaveBeenCalledWith(\n expect.objectContaining({\n contractAddress: customTo,\n }),\n );\n });\n\n it(\"should request certificate for correct device model\", async () => {\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptor\",\n ).mockResolvedValue(Right({ signedDescriptor }));\n\n await loader.load({\n ...validInput,\n deviceModelId: DeviceModelId.FLEX,\n });\n\n expect(mockCertificateLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: KeyId.CalGatedSigning,\n keyUsage: KeyUsage.GatedSigning,\n targetDevice: DeviceModelId.FLEX,\n });\n });\n\n it(\"should reject when certificate loading fails\", async () => {\n const certificateError = new Error(\"Certificate loading failed\");\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptor\",\n ).mockResolvedValue(Right({ signedDescriptor }));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockRejectedValue(\n certificateError,\n );\n\n await expect(loader.load(validInput)).rejects.toThrow(certificateError);\n });\n\n it(\"should return PROXY_INFO and GATED_SIGNING when to is proxy and gated descriptor exists for implementation\", async () => {\n const implementationAddress =\n \"0xabcdef1234567890abcdef1234567890abcdef12\";\n const proxySignedDescriptor = \"0xproxy-descriptor\";\n vi.spyOn(mockGatedDescriptorDataSource, \"getGatedDescriptor\")\n .mockResolvedValueOnce(Left(new Error(\"No gated descriptor\")))\n .mockResolvedValueOnce(Right({ signedDescriptor }));\n vi.spyOn(\n mockProxyDataSource,\n \"getProxyImplementationAddress\",\n ).mockResolvedValue(\n Right({\n implementationAddress,\n signedDescriptor: proxySignedDescriptor,\n keyId: \"domain-metadata\",\n keyUsage: \"trusted-name\",\n }),\n );\n\n const result = await loader.load(validInput);\n\n expect(result).toHaveLength(2);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.ETHEREUM_PROXY_INFO,\n payload: proxySignedDescriptor,\n });\n expect(result[1]).toMatchObject({\n type: ClearSignContextType.ETHEREUM_GATED_SIGNING,\n payload: signedDescriptor,\n });\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptor,\n ).toHaveBeenCalledTimes(2);\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptor,\n ).toHaveBeenNthCalledWith(1, {\n contractAddress: validInput.to,\n selector: validInput.selector,\n chainId: validInput.chainId,\n });\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptor,\n ).toHaveBeenNthCalledWith(2, {\n contractAddress: implementationAddress.toLowerCase(),\n selector: validInput.selector,\n chainId: validInput.chainId,\n });\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "aAAA,IAAAA,EAA8B,2CAC9BC,EAA4B,qBAG5BC,EAGO,6EAGPC,EAAsB,gDACtBC,EAAyB,mDAEzBC,EAAqC,2CAErC,SAAS,4BAA6B,IAAM,CAC1C,MAAMC,EAA2D,CAC/D,mBAAoB,GAAG,GAAG,EAC1B,+BAAgC,GAAG,GAAG,CACxC,EAEMC,EAA8C,CAClD,gBAAiB,GAAG,GAAG,CACzB,EAEMC,EAAuC,CAC3C,8BAA+B,GAAG,GAAG,CACvC,EAEMC,EAAS,IAAI,
|
|
6
|
-
"names": ["import_device_management_kit", "import_purify_ts", "import_GatedSigningContextLoader", "import_KeyId", "import_KeyUsage", "import_ClearSignContext", "mockGatedDescriptorDataSource", "mockCertificateLoader", "mockProxyDataSource", "loader", "mockCertificate", "SUPPORTED_TYPES", "validInput", "input", "_description", "signedDescriptor", "error", "result", "customTo", "certificateError", "implementationAddress", "proxySignedDescriptor"]
|
|
4
|
+
"sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { type GatedDescriptorDataSource } from \"@/modules/ethereum/gated-signing/data/GatedDescriptorDataSource\";\nimport {\n type GatedSigningContextInput,\n GatedSigningContextLoader,\n} from \"@/modules/ethereum/gated-signing/domain/GatedSigningContextLoader\";\nimport type { ProxyDataSource } from \"@/modules/ethereum/proxy/data/ProxyDataSource\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { KeyId } from \"@/modules/multichain/pki/model/KeyId\";\nimport { KeyUsage } from \"@/modules/multichain/pki/model/KeyUsage\";\nimport { type PkiCertificate } from \"@/modules/multichain/pki/model/PkiCertificate\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\ndescribe(\"GatedSigningContextLoader\", () => {\n const mockGatedDescriptorDataSource: GatedDescriptorDataSource = {\n getGatedDescriptor: vi.fn(),\n getGatedDescriptorForTypedData: vi.fn(),\n };\n\n const mockCertificateLoader: PkiCertificateLoader = {\n loadCertificate: vi.fn(),\n };\n\n const mockProxyDataSource: ProxyDataSource = {\n getProxyImplementationAddress: vi.fn(),\n };\n\n const mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n });\n\n const loader = new GatedSigningContextLoader(\n mockGatedDescriptorDataSource,\n mockCertificateLoader,\n mockProxyDataSource,\n mockLoggerFactory,\n );\n\n const mockCertificate: PkiCertificate = {\n keyUsageNumber: 1,\n payload: new Uint8Array([0x01, 0x02, 0x03]),\n };\n\n const SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.ETHEREUM_GATED_SIGNING,\n ];\n\n beforeEach(() => {\n vi.resetAllMocks();\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n mockCertificate,\n );\n });\n\n describe(\"canHandle function\", () => {\n const validInput: GatedSigningContextInput = {\n to: \"0x1111111254fb6c44bac0bed2854e76f90643097d\",\n selector: \"0xa1251d75\",\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n };\n\n it(\"should return true for valid input\", () => {\n expect(loader.canHandle(validInput, SUPPORTED_TYPES)).toBe(true);\n });\n\n it(\"should return false for invalid expected type\", () => {\n expect(\n loader.canHandle(validInput, [ClearSignContextType.ETHEREUM_TOKEN]),\n ).toBe(false);\n expect(\n loader.canHandle(validInput, [\n ClearSignContextType.ETHEREUM_DYNAMIC_NETWORK,\n ]),\n ).toBe(false);\n });\n\n it.each([\n [null, \"null input\"],\n [undefined, \"undefined input\"],\n [{}, \"empty object\"],\n [\"string\", \"string input\"],\n [123, \"number input\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it.each([\n [{ ...validInput, to: undefined }, \"missing to\"],\n [{ ...validInput, selector: undefined }, \"missing selector\"],\n [{ ...validInput, chainId: undefined }, \"missing chainId\"],\n [{ ...validInput, deviceModelId: undefined }, \"missing deviceModelId\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it.each([\n [{ ...validInput, to: \"0x\" }, \"empty to (0x)\"],\n [{ ...validInput, to: \"not-hex\" }, \"non-hex to\"],\n [{ ...validInput, selector: \"not-hex\" }, \"non-hex selector\"],\n [{ ...validInput, chainId: \"1\" as unknown as number }, \"string chainId\"],\n [{ ...validInput, chainId: null as unknown as number }, \"null chainId\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n });\n\n describe(\"load function\", () => {\n const validInput: GatedSigningContextInput = {\n to: \"0x1111111254fb6c44bac0bed2854e76f90643097d\",\n selector: \"0xa1251d75\",\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n };\n\n const signedDescriptor =\n \"010122020101222a30783131313131313235346662366334346261633062656432383534653736663930363433303937642308000000000000000140086131323531643735150100\";\n\n it(\"should return error context when getGatedDescriptor returns Left and proxy resolution fails\", async () => {\n const error = new Error(\"Failed to fetch gated descriptors\");\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptor\",\n ).mockResolvedValue(Left(error));\n vi.spyOn(\n mockProxyDataSource,\n \"getProxyImplementationAddress\",\n ).mockResolvedValue(Left(new Error(\"Not a proxy\")));\n\n const result = await loader.load(validInput);\n\n expect(result).toEqual([\n {\n type: ClearSignContextType.ERROR,\n error,\n },\n ]);\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptor,\n ).toHaveBeenCalledWith({\n contractAddress: validInput.to,\n selector: validInput.selector,\n chainId: validInput.chainId,\n });\n expect(\n mockProxyDataSource.getProxyImplementationAddress,\n ).toHaveBeenCalledWith({\n proxyAddress: validInput.to,\n chainId: validInput.chainId,\n challenge: \"\",\n calldata: \"0x\",\n });\n expect(mockCertificateLoader.loadCertificate).not.toHaveBeenCalled();\n });\n\n it(\"should return gated signing context when getGatedDescriptor succeeds\", async () => {\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptor\",\n ).mockResolvedValue(Right({ signedDescriptor }));\n\n const result = await loader.load(validInput);\n\n expect(result).toHaveLength(1);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.ETHEREUM_GATED_SIGNING,\n payload: signedDescriptor,\n certificate: mockCertificate,\n });\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptor,\n ).toHaveBeenCalledWith({\n contractAddress: validInput.to,\n selector: validInput.selector,\n chainId: validInput.chainId,\n });\n expect(mockCertificateLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: KeyId.CalGatedSigning,\n keyUsage: KeyUsage.GatedSigning,\n targetDevice: validInput.deviceModelId,\n });\n });\n\n it(\"should pass to as contractAddress to getGatedDescriptor\", async () => {\n const customTo = \"0xabcdef1234567890abcdef1234567890abcdef12\";\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptor\",\n ).mockResolvedValue(Right({ signedDescriptor }));\n\n await loader.load({\n ...validInput,\n to: customTo,\n });\n\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptor,\n ).toHaveBeenCalledWith(\n expect.objectContaining({\n contractAddress: customTo,\n }),\n );\n });\n\n it(\"should request certificate for correct device model\", async () => {\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptor\",\n ).mockResolvedValue(Right({ signedDescriptor }));\n\n await loader.load({\n ...validInput,\n deviceModelId: DeviceModelId.FLEX,\n });\n\n expect(mockCertificateLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: KeyId.CalGatedSigning,\n keyUsage: KeyUsage.GatedSigning,\n targetDevice: DeviceModelId.FLEX,\n });\n });\n\n it(\"should reject when certificate loading fails\", async () => {\n const certificateError = new Error(\"Certificate loading failed\");\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptor\",\n ).mockResolvedValue(Right({ signedDescriptor }));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockRejectedValue(\n certificateError,\n );\n\n await expect(loader.load(validInput)).rejects.toThrow(certificateError);\n });\n\n it(\"should return PROXY_INFO and GATED_SIGNING when to is proxy and gated descriptor exists for implementation\", async () => {\n const implementationAddress =\n \"0xabcdef1234567890abcdef1234567890abcdef12\";\n const proxySignedDescriptor = \"0xproxy-descriptor\";\n vi.spyOn(mockGatedDescriptorDataSource, \"getGatedDescriptor\")\n .mockResolvedValueOnce(Left(new Error(\"No gated descriptor\")))\n .mockResolvedValueOnce(Right({ signedDescriptor }));\n vi.spyOn(\n mockProxyDataSource,\n \"getProxyImplementationAddress\",\n ).mockResolvedValue(\n Right({\n implementationAddress,\n signedDescriptor: proxySignedDescriptor,\n keyId: \"domain-metadata\",\n keyUsage: \"trusted-name\",\n }),\n );\n\n const result = await loader.load(validInput);\n\n expect(result).toHaveLength(2);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.ETHEREUM_PROXY_INFO,\n payload: proxySignedDescriptor,\n });\n expect(result[1]).toMatchObject({\n type: ClearSignContextType.ETHEREUM_GATED_SIGNING,\n payload: signedDescriptor,\n });\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptor,\n ).toHaveBeenCalledTimes(2);\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptor,\n ).toHaveBeenNthCalledWith(1, {\n contractAddress: validInput.to,\n selector: validInput.selector,\n chainId: validInput.chainId,\n });\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptor,\n ).toHaveBeenNthCalledWith(2, {\n contractAddress: implementationAddress.toLowerCase(),\n selector: validInput.selector,\n chainId: validInput.chainId,\n });\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_device_management_kit", "import_purify_ts", "import_GatedSigningContextLoader", "import_KeyId", "import_KeyUsage", "import_ClearSignContext", "mockGatedDescriptorDataSource", "mockCertificateLoader", "mockProxyDataSource", "mockLoggerFactory", "loader", "mockCertificate", "SUPPORTED_TYPES", "validInput", "input", "_description", "signedDescriptor", "error", "result", "customTo", "certificateError", "implementationAddress", "proxySignedDescriptor"]
|
|
7
7
|
}
|
package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var m=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var L=Object.getOwnPropertyNames;var b=Object.prototype.hasOwnProperty;var N=(o,e)=>{for(var t in e)m(o,t,{get:e[t],enumerable:!0})},U=(o,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of L(e))!b.call(o,r)&&r!==t&&m(o,r,{get:()=>e[r],enumerable:!(a=h(e,r))||a.enumerable});return o};var M=o=>U(m({},"__esModule",{value:!0}),o),G=(o,e,t,a)=>{for(var r=a>1?void 0:a?h(e,t):e,i=o.length-1,n;i>=0;i--)(n=o[i])&&(r=(a?n(e,t,r):n(r))||r);return a&&r&&m(e,t,r),r},g=(o,e)=>(t,a)=>e(t,a,o);var Y={};N(Y,{GatedSigningTypedDataContextLoader:()=>y});module.exports=M(Y);var d=require("inversify"),R=require("../../../../config/di/configTypes"),_=require("../../../../modules/ethereum/gated-signing/di/gatedSigningTypes"),I=require("../../../../modules/ethereum/proxy/di/proxyTypes"),k=require("../../../../modules/ethereum/typed-data/utils/getSchemaHash"),v=require("../../../../modules/multichain/pki/di/pkiTypes"),C=require("../../../../modules/multichain/pki/model/KeyId"),T=require("../../../../modules/multichain/pki/model/KeyUsage"),s=require("../../../../shared/model/ClearSignContext");const O="0x0000000000000000000000000000000000000000",j=[s.ClearSignContextType.ETHEREUM_GATED_SIGNING];function F(o){if(!o||typeof o!="object")return!1;const e=o;if(!e.types||typeof e.types!="object"||Array.isArray(e.types))return!1;const t=e.types;for(const a of Object.keys(t)){if(typeof a!="string")return!1;const r=t[a];if(!Array.isArray(r))return!1;for(const i of r)if(!i||typeof i!="object"||typeof i.name!="string"||typeof i.type!="string")return!1}return!0}let y=class{constructor(e,t,a,r){this._dataSource=e;this._certificateLoader=t;this._proxyDataSource=a;this.logger=r("GatedSigningTypedDataContextLoader")}logger;canHandle(e,t){return j.every(a=>t.includes(a))&&typeof e=="object"&&e!==null&&"data"in e&&F(e.data)&&"chainId"in e&&"deviceModelId"in e&&e.deviceModelId!==void 0&&"challenge"in e&&typeof e.challenge=="string"}async load({data:e,chainId:t,deviceModelId:a,challenge:r}){const i=e.domain?.verifyingContract?.toLowerCase()??O,n=i.startsWith("0x")?i:`0x${i}`,p=(0,k.getSchemaHash)(e.types),u=await this._dataSource.getGatedDescriptorForTypedData({contractAddress:n,schemaHash:p,chainId:t});if(u.isRight()){const{signedDescriptor:c}=u.unsafeCoerce(),A=await this._certificateLoader.loadCertificate({keyId:C.KeyId.CalGatedSigning,keyUsage:T.KeyUsage.GatedSigning,targetDevice:a});return this.logger.debug("load result",{data:{path:"direct",verifyingContract:n,schemaHash:p,chainId:t,contextTypes:[s.ClearSignContextType.ETHEREUM_GATED_SIGNING]}}),[{type:s.ClearSignContextType.ETHEREUM_GATED_SIGNING,payload:c,certificate:A}]}const l=u.caseOf({Left:c=>c,Right:()=>new Error("unreachable")}),x=await this._proxyDataSource.getProxyImplementationAddress({proxyAddress:n,chainId:t,challenge:r,calldata:"0x"});if(x.isLeft()){const c=x.extract();return this.logger.warn("Direct gated descriptor lookup failed and proxy resolution failed",{data:{verifyingContract:n,schemaHash:p,chainId:t,directError:l.message,proxyError:c.message}}),[{type:s.ClearSignContextType.ERROR,error:l}]}const f=x.unsafeCoerce(),S=f.implementationAddress.toLowerCase(),D=S.startsWith("0x")?S:`0x${S}`,E=await this._dataSource.getGatedDescriptorForTypedData({contractAddress:D,schemaHash:p,chainId:t});if(E.isLeft()){const c=E.extract();return this.logger.warn("No gated descriptor found for proxy implementation address",{data:{verifyingContract:n,implementationAddress:D,schemaHash:p,chainId:t,directError:l.message,implError:c.message}}),[{type:s.ClearSignContextType.ERROR,error:l}]}const{signedDescriptor:w}=E.unsafeCoerce(),[P,H]=await Promise.all([this._certificateLoader.loadCertificate({keyId:f.keyId,keyUsage:f.keyUsage,targetDevice:a}),this._certificateLoader.loadCertificate({keyId:C.KeyId.CalGatedSigning,keyUsage:T.KeyUsage.GatedSigning,targetDevice:a})]);return this.logger.debug("load result",{data:{path:"proxy",verifyingContract:n,implementationAddress:D,schemaHash:p,chainId:t,contextTypes:[s.ClearSignContextType.ETHEREUM_PROXY_INFO,s.ClearSignContextType.ETHEREUM_GATED_SIGNING]}}),[{type:s.ClearSignContextType.ETHEREUM_PROXY_INFO,payload:f.signedDescriptor,certificate:P},{type:s.ClearSignContextType.ETHEREUM_GATED_SIGNING,payload:w,certificate:H}]}};y=G([(0,d.injectable)(),g(0,(0,d.inject)(_.gatedSigningTypes.GatedDescriptorDataSource)),g(1,(0,d.inject)(v.pkiTypes.PkiCertificateLoader)),g(2,(0,d.inject)(I.proxyTypes.ProxyDataSource)),g(3,(0,d.inject)(R.configTypes.ContextModuleLoggerFactory))],y);0&&(module.exports={GatedSigningTypedDataContextLoader});
|
|
2
2
|
//# sourceMappingURL=GatedSigningTypedDataContextLoader.js.map
|
package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n DeviceModelId,\n type HexaString,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { type GatedDescriptorDataSource } from \"@/modules/ethereum/gated-signing/data/GatedDescriptorDataSource\";\nimport { gatedSigningTypes } from \"@/modules/ethereum/gated-signing/di/gatedSigningTypes\";\nimport type { TypedDataSchema } from \"@/modules/ethereum/model/TypedDataContext\";\nimport type { ProxyDataSource } from \"@/modules/ethereum/proxy/data/ProxyDataSource\";\nimport { proxyTypes } from \"@/modules/ethereum/proxy/di/proxyTypes\";\nimport { getSchemaHash } from \"@/modules/ethereum/typed-data/utils/getSchemaHash\";\nimport { pkiTypes } from \"@/modules/multichain/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { KeyId } from \"@/modules/multichain/pki/model/KeyId\";\nimport { KeyUsage } from \"@/modules/multichain/pki/model/KeyUsage\";\nimport { ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\n\nconst ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\";\n\nexport type GatedSigningTypedDataContextInput = {\n data: {\n types: TypedDataSchema;\n domain?: { verifyingContract?: string };\n };\n chainId: number;\n deviceModelId: DeviceModelId;\n challenge: string;\n};\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.ETHEREUM_GATED_SIGNING,\n];\n\nfunction hasTypedDataShape(\n data: unknown,\n): data is { types: TypedDataSchema; domain?: { verifyingContract?: string } } {\n if (!data || typeof data !== \"object\") return false;\n const obj = data as Record<string, unknown>;\n if (\n !obj[\"types\"] ||\n typeof obj[\"types\"] !== \"object\" ||\n Array.isArray(obj[\"types\"])\n ) {\n return false;\n }\n const types = obj[\"types\"] as Record<string, unknown>;\n for (const key of Object.keys(types)) {\n if (typeof key !== \"string\") return false;\n const value = types[key];\n if (!Array.isArray(value)) return false;\n for (const item of value) {\n if (\n !item ||\n typeof item !== \"object\" ||\n typeof (item as { name?: unknown }).name !== \"string\" ||\n typeof (item as { type?: unknown }).type !== \"string\"\n ) {\n return false;\n }\n }\n }\n return true;\n}\n\n@injectable()\nexport class GatedSigningTypedDataContextLoader\n implements ContextLoader<GatedSigningTypedDataContextInput>\n{\n constructor(\n @inject(gatedSigningTypes.GatedDescriptorDataSource)\n private readonly _dataSource: GatedDescriptorDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly _certificateLoader: PkiCertificateLoader,\n @inject(proxyTypes.ProxyDataSource)\n private readonly _proxyDataSource: ProxyDataSource,\n ) {}\n\n canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is GatedSigningTypedDataContextInput {\n return (\n SUPPORTED_TYPES.every((type) => expectedTypes.includes(type)) &&\n typeof input === \"object\" &&\n input !== null &&\n \"data\" in input &&\n hasTypedDataShape((input as GatedSigningTypedDataContextInput).data) &&\n \"chainId\" in input &&\n \"deviceModelId\" in input &&\n (input as GatedSigningTypedDataContextInput).deviceModelId !==\n undefined &&\n \"challenge\" in input &&\n typeof (input as GatedSigningTypedDataContextInput).challenge === \"string\"\n );\n }\n\n async load({\n data,\n chainId,\n deviceModelId,\n challenge,\n }: GatedSigningTypedDataContextInput): Promise<ClearSignContext[]> {\n const raw = data.domain?.verifyingContract?.toLowerCase() ?? ZERO_ADDRESS;\n const verifyingContract: HexaString = raw.startsWith(\"0x\")\n ? (raw as HexaString)\n : (`0x${raw}` as HexaString);\n const schemaHash = getSchemaHash(data.types);\n\n const directResult = await this._dataSource.getGatedDescriptorForTypedData({\n contractAddress: verifyingContract,\n schemaHash,\n chainId,\n });\n\n if (directResult.isRight()) {\n const { signedDescriptor } = directResult.unsafeCoerce();\n const certificate = await this._certificateLoader.loadCertificate({\n keyId: KeyId.CalGatedSigning,\n keyUsage: KeyUsage.GatedSigning,\n targetDevice: deviceModelId,\n });\n return [\n {\n type: ClearSignContextType.ETHEREUM_GATED_SIGNING,\n payload: signedDescriptor,\n certificate,\n },\n ];\n }\n\n const firstError: Error = directResult.caseOf({\n Left: (error) => error,\n Right: () => new Error(\"unreachable\"),\n });\n\n const proxyResult =\n await this._proxyDataSource.getProxyImplementationAddress({\n proxyAddress: verifyingContract,\n chainId,\n challenge,\n calldata: \"0x\",\n });\n\n if (proxyResult.isLeft()) {\n return [\n {\n type: ClearSignContextType.ERROR,\n error: firstError,\n },\n ];\n }\n\n const proxyData = proxyResult.unsafeCoerce();\n const implRaw = proxyData.implementationAddress.toLowerCase();\n const implementationAddress: HexaString = implRaw.startsWith(\"0x\")\n ? (implRaw as HexaString)\n : (`0x${implRaw}` as HexaString);\n\n const implGatedResult =\n await this._dataSource.getGatedDescriptorForTypedData({\n contractAddress: implementationAddress,\n schemaHash,\n chainId,\n });\n\n if (implGatedResult.isLeft()) {\n return [\n {\n type: ClearSignContextType.ERROR,\n error: firstError,\n },\n ];\n }\n\n const { signedDescriptor } = implGatedResult.unsafeCoerce();\n const [proxyCertificate, gatedCertificate] = await Promise.all([\n this._certificateLoader.loadCertificate({\n keyId: proxyData.keyId,\n keyUsage: proxyData.keyUsage,\n targetDevice: deviceModelId,\n }),\n this._certificateLoader.loadCertificate({\n keyId: KeyId.CalGatedSigning,\n keyUsage: KeyUsage.GatedSigning,\n targetDevice: deviceModelId,\n }),\n ]);\n\n return [\n {\n type: ClearSignContextType.ETHEREUM_PROXY_INFO,\n payload: proxyData.signedDescriptor,\n certificate: proxyCertificate,\n },\n {\n type: ClearSignContextType.ETHEREUM_GATED_SIGNING,\n payload: signedDescriptor,\n certificate: gatedCertificate,\n },\n ];\n }\n}\n"],
|
|
5
|
-
"mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wCAAAE,IAAA,eAAAC,EAAAH,
|
|
6
|
-
"names": ["GatedSigningTypedDataContextLoader_exports", "__export", "GatedSigningTypedDataContextLoader", "__toCommonJS", "import_inversify", "import_gatedSigningTypes", "import_proxyTypes", "import_getSchemaHash", "import_pkiTypes", "import_KeyId", "import_KeyUsage", "import_ClearSignContext", "ZERO_ADDRESS", "SUPPORTED_TYPES", "hasTypedDataShape", "data", "obj", "types", "key", "value", "item", "GatedSigningTypedDataContextLoader", "_dataSource", "_certificateLoader", "_proxyDataSource", "input", "expectedTypes", "type", "chainId", "deviceModelId", "challenge", "raw", "verifyingContract", "schemaHash", "directResult", "signedDescriptor", "certificate", "firstError", "error", "proxyResult", "proxyData", "implRaw", "implementationAddress", "implGatedResult", "proxyCertificate", "gatedCertificate", "__decorateClass", "__decorateParam"]
|
|
4
|
+
"sourcesContent": ["import {\n DeviceModelId,\n type HexaString,\n LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type GatedDescriptorDataSource } from \"@/modules/ethereum/gated-signing/data/GatedDescriptorDataSource\";\nimport { gatedSigningTypes } from \"@/modules/ethereum/gated-signing/di/gatedSigningTypes\";\nimport type { TypedDataSchema } from \"@/modules/ethereum/model/TypedDataContext\";\nimport type { ProxyDataSource } from \"@/modules/ethereum/proxy/data/ProxyDataSource\";\nimport { proxyTypes } from \"@/modules/ethereum/proxy/di/proxyTypes\";\nimport { getSchemaHash } from \"@/modules/ethereum/typed-data/utils/getSchemaHash\";\nimport { pkiTypes } from \"@/modules/multichain/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { KeyId } from \"@/modules/multichain/pki/model/KeyId\";\nimport { KeyUsage } from \"@/modules/multichain/pki/model/KeyUsage\";\nimport { ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\n\nconst ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\";\n\nexport type GatedSigningTypedDataContextInput = {\n data: {\n types: TypedDataSchema;\n domain?: { verifyingContract?: string };\n };\n chainId: number;\n deviceModelId: DeviceModelId;\n challenge: string;\n};\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.ETHEREUM_GATED_SIGNING,\n];\n\nfunction hasTypedDataShape(\n data: unknown,\n): data is { types: TypedDataSchema; domain?: { verifyingContract?: string } } {\n if (!data || typeof data !== \"object\") return false;\n const obj = data as Record<string, unknown>;\n if (\n !obj[\"types\"] ||\n typeof obj[\"types\"] !== \"object\" ||\n Array.isArray(obj[\"types\"])\n ) {\n return false;\n }\n const types = obj[\"types\"] as Record<string, unknown>;\n for (const key of Object.keys(types)) {\n if (typeof key !== \"string\") return false;\n const value = types[key];\n if (!Array.isArray(value)) return false;\n for (const item of value) {\n if (\n !item ||\n typeof item !== \"object\" ||\n typeof (item as { name?: unknown }).name !== \"string\" ||\n typeof (item as { type?: unknown }).type !== \"string\"\n ) {\n return false;\n }\n }\n }\n return true;\n}\n\n@injectable()\nexport class GatedSigningTypedDataContextLoader\n implements ContextLoader<GatedSigningTypedDataContextInput>\n{\n private readonly logger: LoggerPublisherService;\n\n constructor(\n @inject(gatedSigningTypes.GatedDescriptorDataSource)\n private readonly _dataSource: GatedDescriptorDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly _certificateLoader: PkiCertificateLoader,\n @inject(proxyTypes.ProxyDataSource)\n private readonly _proxyDataSource: ProxyDataSource,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this.logger = loggerFactory(\"GatedSigningTypedDataContextLoader\");\n }\n\n canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is GatedSigningTypedDataContextInput {\n return (\n SUPPORTED_TYPES.every((type) => expectedTypes.includes(type)) &&\n typeof input === \"object\" &&\n input !== null &&\n \"data\" in input &&\n hasTypedDataShape((input as GatedSigningTypedDataContextInput).data) &&\n \"chainId\" in input &&\n \"deviceModelId\" in input &&\n (input as GatedSigningTypedDataContextInput).deviceModelId !==\n undefined &&\n \"challenge\" in input &&\n typeof (input as GatedSigningTypedDataContextInput).challenge === \"string\"\n );\n }\n\n async load({\n data,\n chainId,\n deviceModelId,\n challenge,\n }: GatedSigningTypedDataContextInput): Promise<ClearSignContext[]> {\n const raw = data.domain?.verifyingContract?.toLowerCase() ?? ZERO_ADDRESS;\n const verifyingContract: HexaString = raw.startsWith(\"0x\")\n ? (raw as HexaString)\n : (`0x${raw}` as HexaString);\n const schemaHash = getSchemaHash(data.types);\n\n const directResult = await this._dataSource.getGatedDescriptorForTypedData({\n contractAddress: verifyingContract,\n schemaHash,\n chainId,\n });\n\n if (directResult.isRight()) {\n const { signedDescriptor } = directResult.unsafeCoerce();\n const certificate = await this._certificateLoader.loadCertificate({\n keyId: KeyId.CalGatedSigning,\n keyUsage: KeyUsage.GatedSigning,\n targetDevice: deviceModelId,\n });\n this.logger.debug(\"load result\", {\n data: {\n path: \"direct\",\n verifyingContract,\n schemaHash,\n chainId,\n contextTypes: [ClearSignContextType.ETHEREUM_GATED_SIGNING],\n },\n });\n return [\n {\n type: ClearSignContextType.ETHEREUM_GATED_SIGNING,\n payload: signedDescriptor,\n certificate,\n },\n ];\n }\n\n const firstError: Error = directResult.caseOf({\n Left: (error) => error,\n Right: () => new Error(\"unreachable\"),\n });\n\n const proxyResult =\n await this._proxyDataSource.getProxyImplementationAddress({\n proxyAddress: verifyingContract,\n chainId,\n challenge,\n calldata: \"0x\",\n });\n\n if (proxyResult.isLeft()) {\n const proxyError = proxyResult.extract() as Error;\n this.logger.warn(\n \"Direct gated descriptor lookup failed and proxy resolution failed\",\n {\n data: {\n verifyingContract,\n schemaHash,\n chainId,\n directError: firstError.message,\n proxyError: proxyError.message,\n },\n },\n );\n return [\n {\n type: ClearSignContextType.ERROR,\n error: firstError,\n },\n ];\n }\n\n const proxyData = proxyResult.unsafeCoerce();\n const implRaw = proxyData.implementationAddress.toLowerCase();\n const implementationAddress: HexaString = implRaw.startsWith(\"0x\")\n ? (implRaw as HexaString)\n : (`0x${implRaw}` as HexaString);\n\n const implGatedResult =\n await this._dataSource.getGatedDescriptorForTypedData({\n contractAddress: implementationAddress,\n schemaHash,\n chainId,\n });\n\n if (implGatedResult.isLeft()) {\n const implError = implGatedResult.extract() as Error;\n this.logger.warn(\n \"No gated descriptor found for proxy implementation address\",\n {\n data: {\n verifyingContract,\n implementationAddress,\n schemaHash,\n chainId,\n directError: firstError.message,\n implError: implError.message,\n },\n },\n );\n return [\n {\n type: ClearSignContextType.ERROR,\n error: firstError,\n },\n ];\n }\n\n const { signedDescriptor } = implGatedResult.unsafeCoerce();\n const [proxyCertificate, gatedCertificate] = await Promise.all([\n this._certificateLoader.loadCertificate({\n keyId: proxyData.keyId,\n keyUsage: proxyData.keyUsage,\n targetDevice: deviceModelId,\n }),\n this._certificateLoader.loadCertificate({\n keyId: KeyId.CalGatedSigning,\n keyUsage: KeyUsage.GatedSigning,\n targetDevice: deviceModelId,\n }),\n ]);\n\n this.logger.debug(\"load result\", {\n data: {\n path: \"proxy\",\n verifyingContract,\n implementationAddress,\n schemaHash,\n chainId,\n contextTypes: [\n ClearSignContextType.ETHEREUM_PROXY_INFO,\n ClearSignContextType.ETHEREUM_GATED_SIGNING,\n ],\n },\n });\n return [\n {\n type: ClearSignContextType.ETHEREUM_PROXY_INFO,\n payload: proxyData.signedDescriptor,\n certificate: proxyCertificate,\n },\n {\n type: ClearSignContextType.ETHEREUM_GATED_SIGNING,\n payload: signedDescriptor,\n certificate: gatedCertificate,\n },\n ];\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["GatedSigningTypedDataContextLoader_exports", "__export", "GatedSigningTypedDataContextLoader", "__toCommonJS", "import_inversify", "import_configTypes", "import_gatedSigningTypes", "import_proxyTypes", "import_getSchemaHash", "import_pkiTypes", "import_KeyId", "import_KeyUsage", "import_ClearSignContext", "ZERO_ADDRESS", "SUPPORTED_TYPES", "hasTypedDataShape", "data", "obj", "types", "key", "value", "item", "GatedSigningTypedDataContextLoader", "_dataSource", "_certificateLoader", "_proxyDataSource", "loggerFactory", "input", "expectedTypes", "type", "chainId", "deviceModelId", "challenge", "raw", "verifyingContract", "schemaHash", "directResult", "signedDescriptor", "certificate", "firstError", "error", "proxyResult", "proxyError", "proxyData", "implRaw", "implementationAddress", "implGatedResult", "implError", "proxyCertificate", "gatedCertificate", "__decorateClass", "__decorateParam"]
|
|
7
7
|
}
|
package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.test.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var r=require("@ledgerhq/device-management-kit"),n=require("purify-ts"),m=require("../../../../modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader"),g=require("../../../../modules/multichain/pki/model/KeyId"),h=require("../../../../modules/multichain/pki/model/KeyUsage"),c=require("../../../../shared/model/ClearSignContext");describe("GatedSigningTypedDataContextLoader",()=>{const a={getGatedDescriptor:vi.fn(),getGatedDescriptorForTypedData:vi.fn()},s={loadCertificate:vi.fn()},l={getProxyImplementationAddress:vi.fn()},u=()=>({debug:vi.fn(),info:vi.fn(),warn:vi.fn(),error:vi.fn(),subscribers:[]}),t=new m.GatedSigningTypedDataContextLoader(a,s,l,u),f={keyUsageNumber:1,payload:new Uint8Array([1,2,3])},i=[c.ClearSignContextType.ETHEREUM_GATED_SIGNING],e={data:{types:{EIP712Domain:[{name:"name",type:"string"},{name:"chainId",type:"uint256"}],Mail:[{name:"subject",type:"string"}]},domain:{verifyingContract:"0x1111111254fb6c44bac0bed2854e76f90643097d"}},chainId:1,deviceModelId:r.DeviceModelId.STAX,challenge:"test-challenge"};beforeEach(()=>{vi.resetAllMocks(),vi.spyOn(s,"loadCertificate").mockResolvedValue(f)}),describe("canHandle",()=>{it("should return true for valid typed data input",()=>{expect(t.canHandle(e,i)).toBe(!0)}),it("should return false when expected types do not include GATED_SIGNING",()=>{expect(t.canHandle(e,[c.ClearSignContextType.ETHEREUM_TOKEN])).toBe(!1),expect(t.canHandle(e,[c.ClearSignContextType.ETHEREUM_DYNAMIC_NETWORK])).toBe(!1)}),it.each([[null,"null input"],[void 0,"undefined input"],[{},"empty object"],["string","string input"]])("should return false for %s",(d,o)=>{expect(t.canHandle(d,i)).toBe(!1)}),it("should return false for transaction-style input (selector, to)",()=>{const d={to:"0x1111111254fb6c44bac0bed2854e76f90643097d",selector:"0xa1251d75",chainId:1,deviceModelId:r.DeviceModelId.STAX};expect(t.canHandle(d,i)).toBe(!1)}),it("should return false when data is missing",()=>{expect(t.canHandle({chainId:1,deviceModelId:r.DeviceModelId.STAX},i)).toBe(!1)}),it("should return false when data.types is not a valid schema",()=>{expect(t.canHandle({data:{types:"not-an-object"},chainId:1,deviceModelId:r.DeviceModelId.STAX,challenge:e.challenge},i)).toBe(!1),expect(t.canHandle({data:{types:{}},chainId:1,deviceModelId:r.DeviceModelId.STAX,challenge:e.challenge},i)).toBe(!0)}),it("should return false when chainId or deviceModelId is missing",()=>{expect(t.canHandle({data:e.data,deviceModelId:r.DeviceModelId.STAX,challenge:e.challenge},i)).toBe(!1),expect(t.canHandle({data:e.data,chainId:1,challenge:e.challenge},i)).toBe(!1)}),it("should return false when challenge is missing",()=>{expect(t.canHandle({data:e.data,chainId:1,deviceModelId:r.DeviceModelId.STAX},i)).toBe(!1)})}),describe("load",()=>{const d="010122020101222a30783131313131313235346662366334346261633062656432383534653736663930363433303937642308000000000000000140086131323531643735150100";it("should return error context when getGatedDescriptorForTypedData returns Left and proxy resolution fails",async()=>{const o=new Error("No gated descriptor for schema hash");vi.spyOn(a,"getGatedDescriptorForTypedData").mockResolvedValue((0,n.Left)(o)),vi.spyOn(l,"getProxyImplementationAddress").mockResolvedValue((0,n.Left)(new Error("Not a proxy")));const p=await t.load(e);expect(p).toEqual([{type:c.ClearSignContextType.ERROR,error:o}]),expect(a.getGatedDescriptorForTypedData).toHaveBeenCalledWith({contractAddress:e.data.domain.verifyingContract.toLowerCase(),schemaHash:expect.any(String),chainId:e.chainId}),expect(l.getProxyImplementationAddress).toHaveBeenCalledWith({proxyAddress:e.data.domain.verifyingContract.toLowerCase(),chainId:e.chainId,challenge:e.challenge,calldata:"0x"}),expect(s.loadCertificate).not.toHaveBeenCalled()}),it("should return gated signing context when getGatedDescriptorForTypedData succeeds",async()=>{vi.spyOn(a,"getGatedDescriptorForTypedData").mockResolvedValue((0,n.Right)({signedDescriptor:d}));const o=await t.load(e);expect(o).toHaveLength(1),expect(o[0]).toMatchObject({type:c.ClearSignContextType.ETHEREUM_GATED_SIGNING,payload:d,certificate:f}),expect(a.getGatedDescriptorForTypedData).toHaveBeenCalledWith({contractAddress:e.data.domain.verifyingContract.toLowerCase(),schemaHash:expect.any(String),chainId:e.chainId}),expect(s.loadCertificate).toHaveBeenCalledWith({keyId:g.KeyId.CalGatedSigning,keyUsage:h.KeyUsage.GatedSigning,targetDevice:e.deviceModelId})}),it("should use zero address when domain.verifyingContract is missing",async()=>{vi.spyOn(a,"getGatedDescriptorForTypedData").mockResolvedValue((0,n.Right)({signedDescriptor:d})),await t.load({data:{types:e.data.types},chainId:e.chainId,deviceModelId:e.deviceModelId,challenge:e.challenge}),expect(a.getGatedDescriptorForTypedData).toHaveBeenCalledWith(expect.objectContaining({contractAddress:"0x0000000000000000000000000000000000000000"}))}),it("should request certificate for correct device model",async()=>{vi.spyOn(a,"getGatedDescriptorForTypedData").mockResolvedValue((0,n.Right)({signedDescriptor:d})),await t.load({...e,deviceModelId:r.DeviceModelId.FLEX}),expect(s.loadCertificate).toHaveBeenCalledWith({keyId:g.KeyId.CalGatedSigning,keyUsage:h.KeyUsage.GatedSigning,targetDevice:r.DeviceModelId.FLEX})}),it("should reject when certificate loading fails",async()=>{const o=new Error("Certificate loading failed");vi.spyOn(a,"getGatedDescriptorForTypedData").mockResolvedValue((0,n.Right)({signedDescriptor:d})),vi.spyOn(s,"loadCertificate").mockRejectedValue(o),await expect(t.load(e)).rejects.toThrow(o)}),it("should return PROXY_INFO and GATED_SIGNING when verifying contract is proxy and gated descriptor exists for implementation",async()=>{const o="0xabcdef1234567890abcdef1234567890abcdef12",p="0xproxy-descriptor";vi.spyOn(a,"getGatedDescriptorForTypedData").mockResolvedValueOnce((0,n.Left)(new Error("No gated descriptor"))).mockResolvedValueOnce((0,n.Right)({signedDescriptor:d})),vi.spyOn(l,"getProxyImplementationAddress").mockResolvedValue((0,n.Right)({implementationAddress:o,signedDescriptor:p,keyId:"domain-metadata",keyUsage:"trusted-name"}));const y=await t.load(e);expect(y).toHaveLength(2),expect(y[0]).toMatchObject({type:c.ClearSignContextType.ETHEREUM_PROXY_INFO,payload:p}),expect(y[1]).toMatchObject({type:c.ClearSignContextType.ETHEREUM_GATED_SIGNING,payload:d}),expect(a.getGatedDescriptorForTypedData).toHaveBeenCalledTimes(2),expect(a.getGatedDescriptorForTypedData).toHaveBeenNthCalledWith(1,{contractAddress:e.data.domain.verifyingContract.toLowerCase(),schemaHash:expect.any(String),chainId:e.chainId}),expect(a.getGatedDescriptorForTypedData).toHaveBeenNthCalledWith(2,{contractAddress:o.toLowerCase(),schemaHash:expect.any(String),chainId:e.chainId})})})});
|
|
2
2
|
//# sourceMappingURL=GatedSigningTypedDataContextLoader.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { type GatedDescriptorDataSource } from \"@/modules/ethereum/gated-signing/data/GatedDescriptorDataSource\";\nimport {\n type GatedSigningTypedDataContextInput,\n GatedSigningTypedDataContextLoader,\n} from \"@/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader\";\nimport type { ProxyDataSource } from \"@/modules/ethereum/proxy/data/ProxyDataSource\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { KeyId } from \"@/modules/multichain/pki/model/KeyId\";\nimport { KeyUsage } from \"@/modules/multichain/pki/model/KeyUsage\";\nimport { type PkiCertificate } from \"@/modules/multichain/pki/model/PkiCertificate\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\ndescribe(\"GatedSigningTypedDataContextLoader\", () => {\n const mockGatedDescriptorDataSource: GatedDescriptorDataSource = {\n getGatedDescriptor: vi.fn(),\n getGatedDescriptorForTypedData: vi.fn(),\n };\n\n const mockCertificateLoader: PkiCertificateLoader = {\n loadCertificate: vi.fn(),\n };\n\n const mockProxyDataSource: ProxyDataSource = {\n getProxyImplementationAddress: vi.fn(),\n };\n\n const loader = new GatedSigningTypedDataContextLoader(\n mockGatedDescriptorDataSource,\n mockCertificateLoader,\n mockProxyDataSource,\n );\n\n const mockCertificate: PkiCertificate = {\n keyUsageNumber: 1,\n payload: new Uint8Array([0x01, 0x02, 0x03]),\n };\n\n const SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.ETHEREUM_GATED_SIGNING,\n ];\n\n const validInput: GatedSigningTypedDataContextInput = {\n data: {\n types: {\n EIP712Domain: [\n { name: \"name\", type: \"string\" },\n { name: \"chainId\", type: \"uint256\" },\n ],\n Mail: [{ name: \"subject\", type: \"string\" }],\n },\n domain: {\n verifyingContract: \"0x1111111254fb6c44bac0bed2854e76f90643097d\",\n },\n },\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n challenge: \"test-challenge\",\n };\n\n beforeEach(() => {\n vi.resetAllMocks();\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n mockCertificate,\n );\n });\n\n describe(\"canHandle\", () => {\n it(\"should return true for valid typed data input\", () => {\n expect(loader.canHandle(validInput, SUPPORTED_TYPES)).toBe(true);\n });\n\n it(\"should return false when expected types do not include GATED_SIGNING\", () => {\n expect(\n loader.canHandle(validInput, [ClearSignContextType.ETHEREUM_TOKEN]),\n ).toBe(false);\n expect(\n loader.canHandle(validInput, [\n ClearSignContextType.ETHEREUM_DYNAMIC_NETWORK,\n ]),\n ).toBe(false);\n });\n\n it.each([\n [null, \"null input\"],\n [undefined, \"undefined input\"],\n [{}, \"empty object\"],\n [\"string\", \"string input\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it(\"should return false for transaction-style input (selector, to)\", () => {\n const transactionInput = {\n to: \"0x1111111254fb6c44bac0bed2854e76f90643097d\",\n selector: \"0xa1251d75\",\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n };\n expect(loader.canHandle(transactionInput, SUPPORTED_TYPES)).toBe(false);\n });\n\n it(\"should return false when data is missing\", () => {\n expect(\n loader.canHandle(\n { chainId: 1, deviceModelId: DeviceModelId.STAX },\n SUPPORTED_TYPES,\n ),\n ).toBe(false);\n });\n\n it(\"should return false when data.types is not a valid schema\", () => {\n expect(\n loader.canHandle(\n {\n data: { types: \"not-an-object\" },\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n challenge: validInput.challenge,\n },\n SUPPORTED_TYPES,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n {\n data: { types: {} },\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n challenge: validInput.challenge,\n },\n SUPPORTED_TYPES,\n ),\n ).toBe(true);\n });\n\n it(\"should return false when chainId or deviceModelId is missing\", () => {\n expect(\n loader.canHandle(\n {\n data: validInput.data,\n deviceModelId: DeviceModelId.STAX,\n challenge: validInput.challenge,\n },\n SUPPORTED_TYPES,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n {\n data: validInput.data,\n chainId: 1,\n challenge: validInput.challenge,\n },\n SUPPORTED_TYPES,\n ),\n ).toBe(false);\n });\n\n it(\"should return false when challenge is missing\", () => {\n expect(\n loader.canHandle(\n {\n data: validInput.data,\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n },\n SUPPORTED_TYPES,\n ),\n ).toBe(false);\n });\n });\n\n describe(\"load\", () => {\n const signedDescriptor =\n \"010122020101222a30783131313131313235346662366334346261633062656432383534653736663930363433303937642308000000000000000140086131323531643735150100\";\n\n it(\"should return error context when getGatedDescriptorForTypedData returns Left and proxy resolution fails\", async () => {\n const error = new Error(\"No gated descriptor for schema hash\");\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptorForTypedData\",\n ).mockResolvedValue(Left(error));\n vi.spyOn(\n mockProxyDataSource,\n \"getProxyImplementationAddress\",\n ).mockResolvedValue(Left(new Error(\"Not a proxy\")));\n\n const result = await loader.load(validInput);\n\n expect(result).toEqual([\n {\n type: ClearSignContextType.ERROR,\n error,\n },\n ]);\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptorForTypedData,\n ).toHaveBeenCalledWith({\n contractAddress:\n validInput.data.domain!.verifyingContract!.toLowerCase(),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n schemaHash: expect.any(String),\n chainId: validInput.chainId,\n });\n expect(\n mockProxyDataSource.getProxyImplementationAddress,\n ).toHaveBeenCalledWith({\n proxyAddress: validInput.data.domain!.verifyingContract!.toLowerCase(),\n chainId: validInput.chainId,\n challenge: validInput.challenge,\n calldata: \"0x\",\n });\n expect(mockCertificateLoader.loadCertificate).not.toHaveBeenCalled();\n });\n\n it(\"should return gated signing context when getGatedDescriptorForTypedData succeeds\", async () => {\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptorForTypedData\",\n ).mockResolvedValue(Right({ signedDescriptor }));\n\n const result = await loader.load(validInput);\n\n expect(result).toHaveLength(1);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.ETHEREUM_GATED_SIGNING,\n payload: signedDescriptor,\n certificate: mockCertificate,\n });\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptorForTypedData,\n ).toHaveBeenCalledWith({\n contractAddress:\n validInput.data.domain!.verifyingContract!.toLowerCase(),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n schemaHash: expect.any(String),\n chainId: validInput.chainId,\n });\n expect(mockCertificateLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: KeyId.CalGatedSigning,\n keyUsage: KeyUsage.GatedSigning,\n targetDevice: validInput.deviceModelId,\n });\n });\n\n it(\"should use zero address when domain.verifyingContract is missing\", async () => {\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptorForTypedData\",\n ).mockResolvedValue(Right({ signedDescriptor }));\n\n await loader.load({\n data: { types: validInput.data.types },\n chainId: validInput.chainId,\n deviceModelId: validInput.deviceModelId,\n challenge: validInput.challenge,\n });\n\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptorForTypedData,\n ).toHaveBeenCalledWith(\n expect.objectContaining({\n contractAddress: \"0x0000000000000000000000000000000000000000\",\n }),\n );\n });\n\n it(\"should request certificate for correct device model\", async () => {\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptorForTypedData\",\n ).mockResolvedValue(Right({ signedDescriptor }));\n\n await loader.load({\n ...validInput,\n deviceModelId: DeviceModelId.FLEX,\n });\n\n expect(mockCertificateLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: KeyId.CalGatedSigning,\n keyUsage: KeyUsage.GatedSigning,\n targetDevice: DeviceModelId.FLEX,\n });\n });\n\n it(\"should reject when certificate loading fails\", async () => {\n const certificateError = new Error(\"Certificate loading failed\");\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptorForTypedData\",\n ).mockResolvedValue(Right({ signedDescriptor }));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockRejectedValue(\n certificateError,\n );\n\n await expect(loader.load(validInput)).rejects.toThrow(certificateError);\n });\n\n it(\"should return PROXY_INFO and GATED_SIGNING when verifying contract is proxy and gated descriptor exists for implementation\", async () => {\n const implementationAddress =\n \"0xabcdef1234567890abcdef1234567890abcdef12\";\n const proxySignedDescriptor = \"0xproxy-descriptor\";\n vi.spyOn(mockGatedDescriptorDataSource, \"getGatedDescriptorForTypedData\")\n .mockResolvedValueOnce(Left(new Error(\"No gated descriptor\")))\n .mockResolvedValueOnce(Right({ signedDescriptor }));\n vi.spyOn(\n mockProxyDataSource,\n \"getProxyImplementationAddress\",\n ).mockResolvedValue(\n Right({\n implementationAddress,\n signedDescriptor: proxySignedDescriptor,\n keyId: \"domain-metadata\",\n keyUsage: \"trusted-name\",\n }),\n );\n\n const result = await loader.load(validInput);\n\n expect(result).toHaveLength(2);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.ETHEREUM_PROXY_INFO,\n payload: proxySignedDescriptor,\n });\n expect(result[1]).toMatchObject({\n type: ClearSignContextType.ETHEREUM_GATED_SIGNING,\n payload: signedDescriptor,\n });\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptorForTypedData,\n ).toHaveBeenCalledTimes(2);\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptorForTypedData,\n ).toHaveBeenNthCalledWith(1, {\n contractAddress:\n validInput.data.domain!.verifyingContract!.toLowerCase(),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n schemaHash: expect.any(String),\n chainId: validInput.chainId,\n });\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptorForTypedData,\n ).toHaveBeenNthCalledWith(2, {\n contractAddress: implementationAddress.toLowerCase(),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n schemaHash: expect.any(String),\n chainId: validInput.chainId,\n });\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "aAAA,IAAAA,EAA8B,2CAC9BC,EAA4B,qBAG5BC,EAGO,sFAGPC,EAAsB,gDACtBC,EAAyB,mDAEzBC,EAAqC,2CAErC,SAAS,qCAAsC,IAAM,CACnD,MAAMC,EAA2D,CAC/D,mBAAoB,GAAG,GAAG,EAC1B,+BAAgC,GAAG,GAAG,CACxC,EAEMC,EAA8C,CAClD,gBAAiB,GAAG,GAAG,CACzB,EAEMC,EAAuC,CAC3C,8BAA+B,GAAG,GAAG,CACvC,EAEMC,EAAS,IAAI,
|
|
6
|
-
"names": ["import_device_management_kit", "import_purify_ts", "import_GatedSigningTypedDataContextLoader", "import_KeyId", "import_KeyUsage", "import_ClearSignContext", "mockGatedDescriptorDataSource", "mockCertificateLoader", "mockProxyDataSource", "loader", "mockCertificate", "SUPPORTED_TYPES", "validInput", "input", "_description", "transactionInput", "signedDescriptor", "error", "result", "certificateError", "implementationAddress", "proxySignedDescriptor"]
|
|
4
|
+
"sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { type GatedDescriptorDataSource } from \"@/modules/ethereum/gated-signing/data/GatedDescriptorDataSource\";\nimport {\n type GatedSigningTypedDataContextInput,\n GatedSigningTypedDataContextLoader,\n} from \"@/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader\";\nimport type { ProxyDataSource } from \"@/modules/ethereum/proxy/data/ProxyDataSource\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { KeyId } from \"@/modules/multichain/pki/model/KeyId\";\nimport { KeyUsage } from \"@/modules/multichain/pki/model/KeyUsage\";\nimport { type PkiCertificate } from \"@/modules/multichain/pki/model/PkiCertificate\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\ndescribe(\"GatedSigningTypedDataContextLoader\", () => {\n const mockGatedDescriptorDataSource: GatedDescriptorDataSource = {\n getGatedDescriptor: vi.fn(),\n getGatedDescriptorForTypedData: vi.fn(),\n };\n\n const mockCertificateLoader: PkiCertificateLoader = {\n loadCertificate: vi.fn(),\n };\n\n const mockProxyDataSource: ProxyDataSource = {\n getProxyImplementationAddress: vi.fn(),\n };\n\n const mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n });\n\n const loader = new GatedSigningTypedDataContextLoader(\n mockGatedDescriptorDataSource,\n mockCertificateLoader,\n mockProxyDataSource,\n mockLoggerFactory,\n );\n\n const mockCertificate: PkiCertificate = {\n keyUsageNumber: 1,\n payload: new Uint8Array([0x01, 0x02, 0x03]),\n };\n\n const SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.ETHEREUM_GATED_SIGNING,\n ];\n\n const validInput: GatedSigningTypedDataContextInput = {\n data: {\n types: {\n EIP712Domain: [\n { name: \"name\", type: \"string\" },\n { name: \"chainId\", type: \"uint256\" },\n ],\n Mail: [{ name: \"subject\", type: \"string\" }],\n },\n domain: {\n verifyingContract: \"0x1111111254fb6c44bac0bed2854e76f90643097d\",\n },\n },\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n challenge: \"test-challenge\",\n };\n\n beforeEach(() => {\n vi.resetAllMocks();\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n mockCertificate,\n );\n });\n\n describe(\"canHandle\", () => {\n it(\"should return true for valid typed data input\", () => {\n expect(loader.canHandle(validInput, SUPPORTED_TYPES)).toBe(true);\n });\n\n it(\"should return false when expected types do not include GATED_SIGNING\", () => {\n expect(\n loader.canHandle(validInput, [ClearSignContextType.ETHEREUM_TOKEN]),\n ).toBe(false);\n expect(\n loader.canHandle(validInput, [\n ClearSignContextType.ETHEREUM_DYNAMIC_NETWORK,\n ]),\n ).toBe(false);\n });\n\n it.each([\n [null, \"null input\"],\n [undefined, \"undefined input\"],\n [{}, \"empty object\"],\n [\"string\", \"string input\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it(\"should return false for transaction-style input (selector, to)\", () => {\n const transactionInput = {\n to: \"0x1111111254fb6c44bac0bed2854e76f90643097d\",\n selector: \"0xa1251d75\",\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n };\n expect(loader.canHandle(transactionInput, SUPPORTED_TYPES)).toBe(false);\n });\n\n it(\"should return false when data is missing\", () => {\n expect(\n loader.canHandle(\n { chainId: 1, deviceModelId: DeviceModelId.STAX },\n SUPPORTED_TYPES,\n ),\n ).toBe(false);\n });\n\n it(\"should return false when data.types is not a valid schema\", () => {\n expect(\n loader.canHandle(\n {\n data: { types: \"not-an-object\" },\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n challenge: validInput.challenge,\n },\n SUPPORTED_TYPES,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n {\n data: { types: {} },\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n challenge: validInput.challenge,\n },\n SUPPORTED_TYPES,\n ),\n ).toBe(true);\n });\n\n it(\"should return false when chainId or deviceModelId is missing\", () => {\n expect(\n loader.canHandle(\n {\n data: validInput.data,\n deviceModelId: DeviceModelId.STAX,\n challenge: validInput.challenge,\n },\n SUPPORTED_TYPES,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n {\n data: validInput.data,\n chainId: 1,\n challenge: validInput.challenge,\n },\n SUPPORTED_TYPES,\n ),\n ).toBe(false);\n });\n\n it(\"should return false when challenge is missing\", () => {\n expect(\n loader.canHandle(\n {\n data: validInput.data,\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n },\n SUPPORTED_TYPES,\n ),\n ).toBe(false);\n });\n });\n\n describe(\"load\", () => {\n const signedDescriptor =\n \"010122020101222a30783131313131313235346662366334346261633062656432383534653736663930363433303937642308000000000000000140086131323531643735150100\";\n\n it(\"should return error context when getGatedDescriptorForTypedData returns Left and proxy resolution fails\", async () => {\n const error = new Error(\"No gated descriptor for schema hash\");\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptorForTypedData\",\n ).mockResolvedValue(Left(error));\n vi.spyOn(\n mockProxyDataSource,\n \"getProxyImplementationAddress\",\n ).mockResolvedValue(Left(new Error(\"Not a proxy\")));\n\n const result = await loader.load(validInput);\n\n expect(result).toEqual([\n {\n type: ClearSignContextType.ERROR,\n error,\n },\n ]);\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptorForTypedData,\n ).toHaveBeenCalledWith({\n contractAddress:\n validInput.data.domain!.verifyingContract!.toLowerCase(),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n schemaHash: expect.any(String),\n chainId: validInput.chainId,\n });\n expect(\n mockProxyDataSource.getProxyImplementationAddress,\n ).toHaveBeenCalledWith({\n proxyAddress: validInput.data.domain!.verifyingContract!.toLowerCase(),\n chainId: validInput.chainId,\n challenge: validInput.challenge,\n calldata: \"0x\",\n });\n expect(mockCertificateLoader.loadCertificate).not.toHaveBeenCalled();\n });\n\n it(\"should return gated signing context when getGatedDescriptorForTypedData succeeds\", async () => {\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptorForTypedData\",\n ).mockResolvedValue(Right({ signedDescriptor }));\n\n const result = await loader.load(validInput);\n\n expect(result).toHaveLength(1);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.ETHEREUM_GATED_SIGNING,\n payload: signedDescriptor,\n certificate: mockCertificate,\n });\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptorForTypedData,\n ).toHaveBeenCalledWith({\n contractAddress:\n validInput.data.domain!.verifyingContract!.toLowerCase(),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n schemaHash: expect.any(String),\n chainId: validInput.chainId,\n });\n expect(mockCertificateLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: KeyId.CalGatedSigning,\n keyUsage: KeyUsage.GatedSigning,\n targetDevice: validInput.deviceModelId,\n });\n });\n\n it(\"should use zero address when domain.verifyingContract is missing\", async () => {\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptorForTypedData\",\n ).mockResolvedValue(Right({ signedDescriptor }));\n\n await loader.load({\n data: { types: validInput.data.types },\n chainId: validInput.chainId,\n deviceModelId: validInput.deviceModelId,\n challenge: validInput.challenge,\n });\n\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptorForTypedData,\n ).toHaveBeenCalledWith(\n expect.objectContaining({\n contractAddress: \"0x0000000000000000000000000000000000000000\",\n }),\n );\n });\n\n it(\"should request certificate for correct device model\", async () => {\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptorForTypedData\",\n ).mockResolvedValue(Right({ signedDescriptor }));\n\n await loader.load({\n ...validInput,\n deviceModelId: DeviceModelId.FLEX,\n });\n\n expect(mockCertificateLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: KeyId.CalGatedSigning,\n keyUsage: KeyUsage.GatedSigning,\n targetDevice: DeviceModelId.FLEX,\n });\n });\n\n it(\"should reject when certificate loading fails\", async () => {\n const certificateError = new Error(\"Certificate loading failed\");\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptorForTypedData\",\n ).mockResolvedValue(Right({ signedDescriptor }));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockRejectedValue(\n certificateError,\n );\n\n await expect(loader.load(validInput)).rejects.toThrow(certificateError);\n });\n\n it(\"should return PROXY_INFO and GATED_SIGNING when verifying contract is proxy and gated descriptor exists for implementation\", async () => {\n const implementationAddress =\n \"0xabcdef1234567890abcdef1234567890abcdef12\";\n const proxySignedDescriptor = \"0xproxy-descriptor\";\n vi.spyOn(mockGatedDescriptorDataSource, \"getGatedDescriptorForTypedData\")\n .mockResolvedValueOnce(Left(new Error(\"No gated descriptor\")))\n .mockResolvedValueOnce(Right({ signedDescriptor }));\n vi.spyOn(\n mockProxyDataSource,\n \"getProxyImplementationAddress\",\n ).mockResolvedValue(\n Right({\n implementationAddress,\n signedDescriptor: proxySignedDescriptor,\n keyId: \"domain-metadata\",\n keyUsage: \"trusted-name\",\n }),\n );\n\n const result = await loader.load(validInput);\n\n expect(result).toHaveLength(2);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.ETHEREUM_PROXY_INFO,\n payload: proxySignedDescriptor,\n });\n expect(result[1]).toMatchObject({\n type: ClearSignContextType.ETHEREUM_GATED_SIGNING,\n payload: signedDescriptor,\n });\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptorForTypedData,\n ).toHaveBeenCalledTimes(2);\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptorForTypedData,\n ).toHaveBeenNthCalledWith(1, {\n contractAddress:\n validInput.data.domain!.verifyingContract!.toLowerCase(),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n schemaHash: expect.any(String),\n chainId: validInput.chainId,\n });\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptorForTypedData,\n ).toHaveBeenNthCalledWith(2, {\n contractAddress: implementationAddress.toLowerCase(),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n schemaHash: expect.any(String),\n chainId: validInput.chainId,\n });\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "aAAA,IAAAA,EAA8B,2CAC9BC,EAA4B,qBAG5BC,EAGO,sFAGPC,EAAsB,gDACtBC,EAAyB,mDAEzBC,EAAqC,2CAErC,SAAS,qCAAsC,IAAM,CACnD,MAAMC,EAA2D,CAC/D,mBAAoB,GAAG,GAAG,EAC1B,+BAAgC,GAAG,GAAG,CACxC,EAEMC,EAA8C,CAClD,gBAAiB,GAAG,GAAG,CACzB,EAEMC,EAAuC,CAC3C,8BAA+B,GAAG,GAAG,CACvC,EAEMC,EAAoB,KAAO,CAC/B,MAAO,GAAG,GAAG,EACb,KAAM,GAAG,GAAG,EACZ,KAAM,GAAG,GAAG,EACZ,MAAO,GAAG,GAAG,EACb,YAAa,CAAC,CAChB,GAEMC,EAAS,IAAI,qCACjBJ,EACAC,EACAC,EACAC,CACF,EAEME,EAAkC,CACtC,eAAgB,EAChB,QAAS,IAAI,WAAW,CAAC,EAAM,EAAM,CAAI,CAAC,CAC5C,EAEMC,EAA0C,CAC9C,uBAAqB,sBACvB,EAEMC,EAAgD,CACpD,KAAM,CACJ,MAAO,CACL,aAAc,CACZ,CAAE,KAAM,OAAQ,KAAM,QAAS,EAC/B,CAAE,KAAM,UAAW,KAAM,SAAU,CACrC,EACA,KAAM,CAAC,CAAE,KAAM,UAAW,KAAM,QAAS,CAAC,CAC5C,EACA,OAAQ,CACN,kBAAmB,4CACrB,CACF,EACA,QAAS,EACT,cAAe,gBAAc,KAC7B,UAAW,gBACb,EAEA,WAAW,IAAM,CACf,GAAG,cAAc,EACjB,GAAG,MAAMN,EAAuB,iBAAiB,EAAE,kBACjDI,CACF,CACF,CAAC,EAED,SAAS,YAAa,IAAM,CAC1B,GAAG,gDAAiD,IAAM,CACxD,OAAOD,EAAO,UAAUG,EAAYD,CAAe,CAAC,EAAE,KAAK,EAAI,CACjE,CAAC,EAED,GAAG,uEAAwE,IAAM,CAC/E,OACEF,EAAO,UAAUG,EAAY,CAAC,uBAAqB,cAAc,CAAC,CACpE,EAAE,KAAK,EAAK,EACZ,OACEH,EAAO,UAAUG,EAAY,CAC3B,uBAAqB,wBACvB,CAAC,CACH,EAAE,KAAK,EAAK,CACd,CAAC,EAED,GAAG,KAAK,CACN,CAAC,KAAM,YAAY,EACnB,CAAC,OAAW,iBAAiB,EAC7B,CAAC,CAAC,EAAG,cAAc,EACnB,CAAC,SAAU,cAAc,CAC3B,CAAC,EAAE,6BAA8B,CAACC,EAAOC,IAAiB,CACxD,OAAOL,EAAO,UAAUI,EAAOF,CAAe,CAAC,EAAE,KAAK,EAAK,CAC7D,CAAC,EAED,GAAG,iEAAkE,IAAM,CACzE,MAAMI,EAAmB,CACvB,GAAI,6CACJ,SAAU,aACV,QAAS,EACT,cAAe,gBAAc,IAC/B,EACA,OAAON,EAAO,UAAUM,EAAkBJ,CAAe,CAAC,EAAE,KAAK,EAAK,CACxE,CAAC,EAED,GAAG,2CAA4C,IAAM,CACnD,OACEF,EAAO,UACL,CAAE,QAAS,EAAG,cAAe,gBAAc,IAAK,EAChDE,CACF,CACF,EAAE,KAAK,EAAK,CACd,CAAC,EAED,GAAG,4DAA6D,IAAM,CACpE,OACEF,EAAO,UACL,CACE,KAAM,CAAE,MAAO,eAAgB,EAC/B,QAAS,EACT,cAAe,gBAAc,KAC7B,UAAWG,EAAW,SACxB,EACAD,CACF,CACF,EAAE,KAAK,EAAK,EACZ,OACEF,EAAO,UACL,CACE,KAAM,CAAE,MAAO,CAAC,CAAE,EAClB,QAAS,EACT,cAAe,gBAAc,KAC7B,UAAWG,EAAW,SACxB,EACAD,CACF,CACF,EAAE,KAAK,EAAI,CACb,CAAC,EAED,GAAG,+DAAgE,IAAM,CACvE,OACEF,EAAO,UACL,CACE,KAAMG,EAAW,KACjB,cAAe,gBAAc,KAC7B,UAAWA,EAAW,SACxB,EACAD,CACF,CACF,EAAE,KAAK,EAAK,EACZ,OACEF,EAAO,UACL,CACE,KAAMG,EAAW,KACjB,QAAS,EACT,UAAWA,EAAW,SACxB,EACAD,CACF,CACF,EAAE,KAAK,EAAK,CACd,CAAC,EAED,GAAG,gDAAiD,IAAM,CACxD,OACEF,EAAO,UACL,CACE,KAAMG,EAAW,KACjB,QAAS,EACT,cAAe,gBAAc,IAC/B,EACAD,CACF,CACF,EAAE,KAAK,EAAK,CACd,CAAC,CACH,CAAC,EAED,SAAS,OAAQ,IAAM,CACrB,MAAMK,EACJ,mJAEF,GAAG,0GAA2G,SAAY,CACxH,MAAMC,EAAQ,IAAI,MAAM,qCAAqC,EAC7D,GAAG,MACDZ,EACA,gCACF,EAAE,qBAAkB,QAAKY,CAAK,CAAC,EAC/B,GAAG,MACDV,EACA,+BACF,EAAE,qBAAkB,QAAK,IAAI,MAAM,aAAa,CAAC,CAAC,EAElD,MAAMW,EAAS,MAAMT,EAAO,KAAKG,CAAU,EAE3C,OAAOM,CAAM,EAAE,QAAQ,CACrB,CACE,KAAM,uBAAqB,MAC3B,MAAAD,CACF,CACF,CAAC,EACD,OACEZ,EAA8B,8BAChC,EAAE,qBAAqB,CACrB,gBACEO,EAAW,KAAK,OAAQ,kBAAmB,YAAY,EAEzD,WAAY,OAAO,IAAI,MAAM,EAC7B,QAASA,EAAW,OACtB,CAAC,EACD,OACEL,EAAoB,6BACtB,EAAE,qBAAqB,CACrB,aAAcK,EAAW,KAAK,OAAQ,kBAAmB,YAAY,EACrE,QAASA,EAAW,QACpB,UAAWA,EAAW,UACtB,SAAU,IACZ,CAAC,EACD,OAAON,EAAsB,eAAe,EAAE,IAAI,iBAAiB,CACrE,CAAC,EAED,GAAG,mFAAoF,SAAY,CACjG,GAAG,MACDD,EACA,gCACF,EAAE,qBAAkB,SAAM,CAAE,iBAAAW,CAAiB,CAAC,CAAC,EAE/C,MAAME,EAAS,MAAMT,EAAO,KAAKG,CAAU,EAE3C,OAAOM,CAAM,EAAE,aAAa,CAAC,EAC7B,OAAOA,EAAO,CAAC,CAAC,EAAE,cAAc,CAC9B,KAAM,uBAAqB,uBAC3B,QAASF,EACT,YAAaN,CACf,CAAC,EACD,OACEL,EAA8B,8BAChC,EAAE,qBAAqB,CACrB,gBACEO,EAAW,KAAK,OAAQ,kBAAmB,YAAY,EAEzD,WAAY,OAAO,IAAI,MAAM,EAC7B,QAASA,EAAW,OACtB,CAAC,EACD,OAAON,EAAsB,eAAe,EAAE,qBAAqB,CACjE,MAAO,QAAM,gBACb,SAAU,WAAS,aACnB,aAAcM,EAAW,aAC3B,CAAC,CACH,CAAC,EAED,GAAG,mEAAoE,SAAY,CACjF,GAAG,MACDP,EACA,gCACF,EAAE,qBAAkB,SAAM,CAAE,iBAAAW,CAAiB,CAAC,CAAC,EAE/C,MAAMP,EAAO,KAAK,CAChB,KAAM,CAAE,MAAOG,EAAW,KAAK,KAAM,EACrC,QAASA,EAAW,QACpB,cAAeA,EAAW,cAC1B,UAAWA,EAAW,SACxB,CAAC,EAED,OACEP,EAA8B,8BAChC,EAAE,qBACA,OAAO,iBAAiB,CACtB,gBAAiB,4CACnB,CAAC,CACH,CACF,CAAC,EAED,GAAG,sDAAuD,SAAY,CACpE,GAAG,MACDA,EACA,gCACF,EAAE,qBAAkB,SAAM,CAAE,iBAAAW,CAAiB,CAAC,CAAC,EAE/C,MAAMP,EAAO,KAAK,CAChB,GAAGG,EACH,cAAe,gBAAc,IAC/B,CAAC,EAED,OAAON,EAAsB,eAAe,EAAE,qBAAqB,CACjE,MAAO,QAAM,gBACb,SAAU,WAAS,aACnB,aAAc,gBAAc,IAC9B,CAAC,CACH,CAAC,EAED,GAAG,+CAAgD,SAAY,CAC7D,MAAMa,EAAmB,IAAI,MAAM,4BAA4B,EAC/D,GAAG,MACDd,EACA,gCACF,EAAE,qBAAkB,SAAM,CAAE,iBAAAW,CAAiB,CAAC,CAAC,EAC/C,GAAG,MAAMV,EAAuB,iBAAiB,EAAE,kBACjDa,CACF,EAEA,MAAM,OAAOV,EAAO,KAAKG,CAAU,CAAC,EAAE,QAAQ,QAAQO,CAAgB,CACxE,CAAC,EAED,GAAG,6HAA8H,SAAY,CAC3I,MAAMC,EACJ,6CACIC,EAAwB,qBAC9B,GAAG,MAAMhB,EAA+B,gCAAgC,EACrE,yBAAsB,QAAK,IAAI,MAAM,qBAAqB,CAAC,CAAC,EAC5D,yBAAsB,SAAM,CAAE,iBAAAW,CAAiB,CAAC,CAAC,EACpD,GAAG,MACDT,EACA,+BACF,EAAE,qBACA,SAAM,CACJ,sBAAAa,EACA,iBAAkBC,EAClB,MAAO,kBACP,SAAU,cACZ,CAAC,CACH,EAEA,MAAMH,EAAS,MAAMT,EAAO,KAAKG,CAAU,EAE3C,OAAOM,CAAM,EAAE,aAAa,CAAC,EAC7B,OAAOA,EAAO,CAAC,CAAC,EAAE,cAAc,CAC9B,KAAM,uBAAqB,oBAC3B,QAASG,CACX,CAAC,EACD,OAAOH,EAAO,CAAC,CAAC,EAAE,cAAc,CAC9B,KAAM,uBAAqB,uBAC3B,QAASF,CACX,CAAC,EACD,OACEX,EAA8B,8BAChC,EAAE,sBAAsB,CAAC,EACzB,OACEA,EAA8B,8BAChC,EAAE,wBAAwB,EAAG,CAC3B,gBACEO,EAAW,KAAK,OAAQ,kBAAmB,YAAY,EAEzD,WAAY,OAAO,IAAI,MAAM,EAC7B,QAASA,EAAW,OACtB,CAAC,EACD,OACEP,EAA8B,8BAChC,EAAE,wBAAwB,EAAG,CAC3B,gBAAiBe,EAAsB,YAAY,EAEnD,WAAY,OAAO,IAAI,MAAM,EAC7B,QAASR,EAAW,OACtB,CAAC,CACH,CAAC,CACH,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["import_device_management_kit", "import_purify_ts", "import_GatedSigningTypedDataContextLoader", "import_KeyId", "import_KeyUsage", "import_ClearSignContext", "mockGatedDescriptorDataSource", "mockCertificateLoader", "mockProxyDataSource", "mockLoggerFactory", "loader", "mockCertificate", "SUPPORTED_TYPES", "validInput", "input", "_description", "transactionInput", "signedDescriptor", "error", "result", "certificateError", "implementationAddress", "proxySignedDescriptor"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var r=Object.defineProperty;var
|
|
1
|
+
"use strict";var r=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var g=(t,e)=>{for(var l in e)r(t,l,{get:e[l],enumerable:!0})},s=(t,e,l,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let _ of m(e))!c.call(t,_)&&_!==l&&r(t,_,{get:()=>e[_],enumerable:!(n=k(e,_))||n.enumerable});return t};var i=t=>s(r({},"__esModule",{value:!0}),t);var p={};g(p,{KeyId:()=>o});module.exports=i(p);var o=(a=>(a.Test="test",a.PersoV2="persov2",a.LedgerRootV3="ledger_root_v3",a.PluginSelectorKey="plugin_selector_key",a.NftMetadataKey="nft_metadata_key",a.TokenMetadataKey="token_metadata_key",a.PartnerMetadataKey="partner_metadata_key",a.Erc20MetadataKey="erc20_metadata_key",a.DomainMetadataKey="domain_metadata_key",a.CalCalldataKey="cal_calldata_key",a.CalTrustedNameKey="cal_trusted_name_key",a.CalNetwork="cal_network",a.CalGatedSigning="cal_gated_signing",a.SwapTemplateKey="swap_template_key",a))(o||{});0&&(module.exports={KeyId});
|
|
2
2
|
//# sourceMappingURL=KeyId.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../src/modules/multichain/pki/model/KeyId.ts"],
|
|
4
|
-
"sourcesContent": ["export enum KeyId {\n Test = \"test\",\n PersoV2 = \"persov2\",\n LedgerRootV3 = \"ledger_root_v3\",\n PluginSelectorKey = \"plugin_selector_key\",\n NftMetadataKey = \"nft_metadata_key\",\n PartnerMetadataKey = \"partner_metadata_key\",\n Erc20MetadataKey = \"erc20_metadata_key\",\n DomainMetadataKey = \"domain_metadata_key\",\n CalCalldataKey = \"cal_calldata_key\",\n CalTrustedNameKey = \"cal_trusted_name_key\",\n CalNetwork = \"cal_network\",\n CalGatedSigning = \"cal_gated_signing\",\n SwapTemplateKey = \"swap_template_key\",\n}\n"],
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,WAAAE,IAAA,eAAAC,EAAAH,GAAO,IAAKE,OACVA,EAAA,KAAO,OACPA,EAAA,QAAU,UACVA,EAAA,aAAe,iBACfA,EAAA,kBAAoB,sBACpBA,EAAA,eAAiB,mBACjBA,EAAA,mBAAqB,uBACrBA,EAAA,iBAAmB,qBACnBA,EAAA,kBAAoB,sBACpBA,EAAA,eAAiB,mBACjBA,EAAA,kBAAoB,uBACpBA,EAAA,WAAa,cACbA,EAAA,gBAAkB,oBAClBA,EAAA,gBAAkB,
|
|
4
|
+
"sourcesContent": ["export enum KeyId {\n Test = \"test\",\n PersoV2 = \"persov2\",\n LedgerRootV3 = \"ledger_root_v3\",\n PluginSelectorKey = \"plugin_selector_key\",\n NftMetadataKey = \"nft_metadata_key\",\n TokenMetadataKey = \"token_metadata_key\",\n PartnerMetadataKey = \"partner_metadata_key\",\n Erc20MetadataKey = \"erc20_metadata_key\",\n DomainMetadataKey = \"domain_metadata_key\",\n CalCalldataKey = \"cal_calldata_key\",\n CalTrustedNameKey = \"cal_trusted_name_key\",\n CalNetwork = \"cal_network\",\n CalGatedSigning = \"cal_gated_signing\",\n SwapTemplateKey = \"swap_template_key\",\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,WAAAE,IAAA,eAAAC,EAAAH,GAAO,IAAKE,OACVA,EAAA,KAAO,OACPA,EAAA,QAAU,UACVA,EAAA,aAAe,iBACfA,EAAA,kBAAoB,sBACpBA,EAAA,eAAiB,mBACjBA,EAAA,iBAAmB,qBACnBA,EAAA,mBAAqB,uBACrBA,EAAA,iBAAmB,qBACnBA,EAAA,kBAAoB,sBACpBA,EAAA,eAAiB,mBACjBA,EAAA,kBAAoB,uBACpBA,EAAA,WAAa,cACbA,EAAA,gBAAkB,oBAClBA,EAAA,gBAAkB,oBAdRA,OAAA",
|
|
6
6
|
"names": ["KeyId_exports", "__export", "KeyId", "__toCommonJS"]
|
|
7
7
|
}
|
package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var p=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var L=Object.getOwnPropertyNames;var N=Object.prototype.hasOwnProperty;var O=(a,e)=>{for(var n in e)p(a,n,{get:e[n],enumerable:!0})},_=(a,e,n,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of L(e))!N.call(a,r)&&r!==n&&p(a,r,{get:()=>e[r],enumerable:!(t=m(e,r))||t.enumerable});return a};var v=a=>_(p({},"__esModule",{value:!0}),a),g=(a,e,n,t)=>{for(var r=t>1?void 0:t?m(e,n):e,o=a.length-1,u;o>=0;o--)(u=a[o])&&(r=(t?u(e,n,r):u(r))||r);return t&&r&&p(e,n,r),r},h=(a,e)=>(n,t)=>e(n,t,a);var V={};O(V,{SolanaTransactionCheckLoader:()=>d});module.exports=v(V);var s=require("inversify"),c=require("purify-ts"),y=require("../../../../config/di/configTypes"),T=require("../../../../modules/multichain/pki/di/pkiTypes"),A=require("../../../../modules/multichain/pki/model/KeyUsage"),k=require("../../../../modules/multichain/transaction-check/di/transactionCheckTypes"),x=require("../../../../modules/multichain/transaction-check/utils/constants"),l=require("../../../../shared/model/ClearSignContext"),E=require("../../../../shared/utils/bs58Encoder"),R=require("../../../../shared/utils/deviceModelIdCodec"),I=require("../../../../shared/utils/uint8ArrayCodec");const w=[l.ClearSignContextType.SOLANA_TRANSACTION_CHECK],b=64,f=64,M=128,P=128,U=127,D=7,B=c.Codec.interface({deviceModelId:R.deviceModelIdCodec,transactionCheck:c.Codec.interface({from:c.string,transactionBytes:I.uint8ArrayCodec,chain:c.number})});let d=class{constructor(e,n,t,r=E.DefaultBs58Encoder){this.transactionCheckDataSource=e;this.certificateLoader=n;this.bs58Encoder=r;this.logger=t("SolanaTransactionCheckLoader")}logger;canHandle(e,n){return w.every(t=>n.includes(t))?B.decode(e).caseOf({Left:()=>!1,Right:({transactionCheck:{from:t,transactionBytes:r}})=>t.length>0&&r.length>0}):!1}async load(e){const{from:n,transactionBytes:t,chain:r}=e.transactionCheck;let o;try{o=this.bs58Encoder.encode(this.wrapMessageAsTransaction(t))}catch(i){const C=[{type:l.ClearSignContextType.ERROR,error:i instanceof Error?i:new Error(String(i))}];return this.logger.debug("load result",{data:{result:C}}),C}const S=[await(await this.transactionCheckDataSource.check({path:x.TransactionCheckPaths.SOLANA_TRANSACTION,body:{tx:{from:n,raw:o},chain:r}})).caseOf({Left:i=>Promise.resolve({type:l.ClearSignContextType.ERROR,error:i}),Right:async i=>{const C=await this.certificateLoader.loadCertificate({keyId:i.publicKeyId,keyUsage:A.KeyUsage.TxSimulationSigner,targetDevice:e.deviceModelId});return{type:l.ClearSignContextType.SOLANA_TRANSACTION_CHECK,payload:{descriptor:i.descriptor},certificate:C}}})];return this.logger.debug("load result",{data:{result:S}}),S}wrapMessageAsTransaction(e){const n=this.readNumRequiredSignatures(e),t=this.encodeShortVec(n),r=n*b,o=new Uint8Array(t.length+r+e.length);return o.set(t,0),o.set(e,t.length+r),o}readNumRequiredSignatures(e){const n=e[0];if(n===void 0)throw new Error("[ContextModule] SolanaTransactionCheckLoader: empty transaction bytes");const r=(n&M)!==0?1:0,o=e[r];if(o===void 0)throw new Error("[ContextModule] SolanaTransactionCheckLoader: malformed message header");if(o>f)throw new Error(`[ContextModule] SolanaTransactionCheckLoader: numRequiredSignatures (${o}) exceeds SOLANA_MAX_SIGNATURES (${f})`);return o}encodeShortVec(e){const n=[];let t=e;for(;;){const r=t&U;if(t>>>=D,t===0){n.push(r);break}n.push(r|P)}return Uint8Array.from(n)}};d=g([(0,s.injectable)(),h(0,(0,s.inject)(k.transactionCheckTypes.TransactionCheckDataSource)),h(1,(0,s.inject)(T.pkiTypes.PkiCertificateLoader)),h(2,(0,s.inject)(y.configTypes.ContextModuleLoggerFactory))],d);0&&(module.exports={SolanaTransactionCheckLoader});
|
|
2
2
|
//# sourceMappingURL=SolanaTransactionCheckLoader.js.map
|
package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n DeviceModelId,\n LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Codec,
|
|
5
|
-
"mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,kCAAAE,IAAA,eAAAC,EAAAH,
|
|
6
|
-
"names": ["SolanaTransactionCheckLoader_exports", "__export", "SolanaTransactionCheckLoader", "__toCommonJS", "
|
|
4
|
+
"sourcesContent": ["import {\n type DeviceModelId,\n LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Codec, number, string } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { pkiTypes } from \"@/modules/multichain/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { KeyUsage } from \"@/modules/multichain/pki/model/KeyUsage\";\nimport { type TransactionCheckDataSource } from \"@/modules/multichain/transaction-check/data/TransactionCheckDataSource\";\nimport { transactionCheckTypes } from \"@/modules/multichain/transaction-check/di/transactionCheckTypes\";\nimport { type TransactionCheckLoader } from \"@/modules/multichain/transaction-check/loaders/TransactionCheckLoader\";\nimport { TransactionCheckPaths } from \"@/modules/multichain/transaction-check/utils/constants\";\nimport {\n ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport {\n type Bs58Encoder,\n DefaultBs58Encoder,\n} from \"@/shared/utils/bs58Encoder\";\nimport { deviceModelIdCodec } from \"@/shared/utils/deviceModelIdCodec\";\nimport { uint8ArrayCodec } from \"@/shared/utils/uint8ArrayCodec\";\n\nexport type SolanaTransactionCheckRequest = {\n from: string;\n transactionBytes: Uint8Array;\n chain: number;\n};\n\nexport type SolanaTransactionCheckContextInput = {\n deviceModelId: DeviceModelId;\n transactionCheck: SolanaTransactionCheckRequest;\n};\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n];\n\nconst SOLANA_SIGNATURE_LENGTH = 64;\nconst SOLANA_MAX_SIGNATURES = 64;\nconst VERSIONED_MESSAGE_PREFIX_MASK = 0x80;\nconst SHORTVEC_CONTINUATION_BIT = 0x80;\nconst SHORTVEC_DATA_MASK = 0x7f;\nconst SHORTVEC_DATA_BITS = 7;\n\nconst solanaTransactionCheckInputCodec = Codec.interface({\n deviceModelId: deviceModelIdCodec,\n transactionCheck: Codec.interface({\n from: string,\n transactionBytes: uint8ArrayCodec,\n chain: number,\n }),\n});\n\n@injectable()\nexport class SolanaTransactionCheckLoader\n implements TransactionCheckLoader<SolanaTransactionCheckContextInput>\n{\n private readonly logger: LoggerPublisherService;\n\n constructor(\n @inject(transactionCheckTypes.TransactionCheckDataSource)\n private readonly transactionCheckDataSource: TransactionCheckDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n private readonly bs58Encoder: Bs58Encoder = DefaultBs58Encoder,\n ) {\n this.logger = loggerFactory(\"SolanaTransactionCheckLoader\");\n }\n\n canHandle(\n input: unknown,\n expectedType: ClearSignContextType[],\n ): input is SolanaTransactionCheckContextInput {\n if (!SUPPORTED_TYPES.every((type) => expectedType.includes(type)))\n return false;\n return solanaTransactionCheckInputCodec.decode(input).caseOf({\n Left: () => false,\n Right: ({ transactionCheck: { from, transactionBytes } }) =>\n from.length > 0 && transactionBytes.length > 0,\n });\n }\n\n async load(\n ctx: SolanaTransactionCheckContextInput,\n ): Promise<ClearSignContext[]> {\n const { from, transactionBytes, chain } = ctx.transactionCheck;\n\n let rawTx: string;\n try {\n rawTx = this.bs58Encoder.encode(\n this.wrapMessageAsTransaction(transactionBytes),\n );\n } catch (error) {\n const result: ClearSignContext[] = [\n {\n type: ClearSignContextType.ERROR,\n error: error instanceof Error ? error : new Error(String(error)),\n },\n ];\n this.logger.debug(\"load result\", { data: { result } });\n return result;\n }\n\n const txCheck = await this.transactionCheckDataSource.check({\n path: TransactionCheckPaths.SOLANA_TRANSACTION,\n body: { tx: { from, raw: rawTx }, chain },\n });\n\n const context = await txCheck.caseOf<Promise<ClearSignContext>>({\n Left: (error) =>\n Promise.resolve({\n type: ClearSignContextType.ERROR,\n error,\n }),\n Right: async (data) => {\n const certificate = await this.certificateLoader.loadCertificate({\n keyId: data.publicKeyId,\n keyUsage: KeyUsage.TxSimulationSigner,\n targetDevice: ctx.deviceModelId,\n });\n\n return {\n type: ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n payload: { descriptor: data.descriptor },\n certificate,\n };\n },\n });\n\n const result = [context];\n this.logger.debug(\"load result\", { data: { result } });\n return result;\n }\n\n /**\n * Wrap a serialized Solana Message into a serialized Transaction expected\n * by the web3checks endpoint, by prepending a compact-u16 signature count\n * and the matching number of zero-filled signature placeholders.\n *\n * Supports legacy and versioned messages: versioned messages start with a\n * version prefix byte (high bit set), shifting `numRequiredSignatures` by\n * one position.\n */\n private wrapMessageAsTransaction(message: Uint8Array): Uint8Array {\n const numRequiredSignatures = this.readNumRequiredSignatures(message);\n const sigCount = this.encodeShortVec(numRequiredSignatures);\n const placeholdersLength = numRequiredSignatures * SOLANA_SIGNATURE_LENGTH;\n\n const wrapped = new Uint8Array(\n sigCount.length + placeholdersLength + message.length,\n );\n wrapped.set(sigCount, 0);\n wrapped.set(message, sigCount.length + placeholdersLength);\n return wrapped;\n }\n\n private readNumRequiredSignatures(message: Uint8Array): number {\n const firstByte = message[0];\n if (firstByte === undefined) {\n throw new Error(\n \"[ContextModule] SolanaTransactionCheckLoader: empty transaction bytes\",\n );\n }\n const isVersioned = (firstByte & VERSIONED_MESSAGE_PREFIX_MASK) !== 0;\n const headerOffset = isVersioned ? 1 : 0;\n const numRequiredSignatures = message[headerOffset];\n if (numRequiredSignatures === undefined) {\n throw new Error(\n \"[ContextModule] SolanaTransactionCheckLoader: malformed message header\",\n );\n }\n if (numRequiredSignatures > SOLANA_MAX_SIGNATURES) {\n throw new Error(\n `[ContextModule] SolanaTransactionCheckLoader: numRequiredSignatures (${numRequiredSignatures}) exceeds SOLANA_MAX_SIGNATURES (${SOLANA_MAX_SIGNATURES})`,\n );\n }\n return numRequiredSignatures;\n }\n\n private encodeShortVec(value: number): Uint8Array {\n const bytes: number[] = [];\n let remaining = value;\n while (true) {\n const lowBits = remaining & SHORTVEC_DATA_MASK;\n remaining >>>= SHORTVEC_DATA_BITS;\n if (remaining === 0) {\n bytes.push(lowBits);\n break;\n }\n bytes.push(lowBits | SHORTVEC_CONTINUATION_BIT);\n }\n return Uint8Array.from(bytes);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["SolanaTransactionCheckLoader_exports", "__export", "SolanaTransactionCheckLoader", "__toCommonJS", "import_inversify", "import_purify_ts", "import_configTypes", "import_pkiTypes", "import_KeyUsage", "import_transactionCheckTypes", "import_constants", "import_ClearSignContext", "import_bs58Encoder", "import_deviceModelIdCodec", "import_uint8ArrayCodec", "SUPPORTED_TYPES", "SOLANA_SIGNATURE_LENGTH", "SOLANA_MAX_SIGNATURES", "VERSIONED_MESSAGE_PREFIX_MASK", "SHORTVEC_CONTINUATION_BIT", "SHORTVEC_DATA_MASK", "SHORTVEC_DATA_BITS", "solanaTransactionCheckInputCodec", "SolanaTransactionCheckLoader", "transactionCheckDataSource", "certificateLoader", "loggerFactory", "bs58Encoder", "input", "expectedType", "type", "from", "transactionBytes", "ctx", "chain", "rawTx", "error", "result", "data", "certificate", "message", "numRequiredSignatures", "sigCount", "placeholdersLength", "wrapped", "firstByte", "headerOffset", "value", "bytes", "remaining", "lowBits", "__decorateClass", "__decorateParam"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var h=Object.create;var f=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var x=Object.getPrototypeOf,k=Object.prototype.hasOwnProperty;var u=(e,t,a,p)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of m(t))!k.call(e,s)&&s!==a&&f(e,s,{get:()=>t[s],enumerable:!(p=C(t,s))||p.enumerable});return e};var w=(e,t,a)=>(a=e!=null?h(x(e)):{},u(t||!e||!e.__esModule?f(a,"default",{value:e,enumerable:!0}):a,e));var c=require("@ledgerhq/device-management-kit"),l=w(require("bs58")),d=require("purify-ts"),N=require("../../../../modules/multichain/transaction-check/utils/constants"),i=require("../../../../modules/solana/model/SolanaTransactionScanChainId"),r=require("../../../../shared/model/ClearSignContext"),y=require("./SolanaTransactionCheckLoader");const S={debug:vi.fn(),info:vi.fn(),warn:vi.fn(),error:vi.fn(),subscribers:[]},T=()=>S,A={loadCertificate:vi.fn()};let o,n;beforeEach(()=>{vi.resetAllMocks(),o={check:vi.fn()},n=new y.SolanaTransactionCheckLoader(o,A,T)});describe("SolanaTransactionCheckLoader",()=>{describe("canHandle",()=>{const e={deviceModelId:c.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:new Uint8Array([1,0,3,222]),chain:1}};it("returns true for a valid Solana transaction-check input",()=>{expect(n.canHandle(e,[r.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!0)}),it("returns false when expected types do not include SOLANA_TRANSACTION_CHECK",()=>{expect(n.canHandle(e,[r.ClearSignContextType.SOLANA_TOKEN])).toBe(!1)}),it("returns false when transactionBytes is not a Uint8Array",()=>{expect(n.canHandle({...e,transactionCheck:{...e.transactionCheck,transactionBytes:"0xdead"}},[r.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!1)}),it("returns false when transactionBytes is empty",()=>{expect(n.canHandle({...e,transactionCheck:{...e.transactionCheck,transactionBytes:new Uint8Array}},[r.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!1)}),it("returns false when from is empty",()=>{expect(n.canHandle({...e,transactionCheck:{...e.transactionCheck,from:""}},[r.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!1)}),it("returns false for unsupported device models (NANO_S)",()=>{expect(n.canHandle({...e,deviceModelId:c.DeviceModelId.NANO_S},[r.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!1)})}),describe("load \u2014 wire format",()=>{beforeEach(()=>{o.check.mockResolvedValue((0,d.Right)({publicKeyId:"pk",descriptor:"aabb"})),A.loadCertificate.mockResolvedValue({payload:new Uint8Array([204]),keyUsageNumber:14})}),it("wraps a legacy message with zero-filled signature placeholders before bs58-encoding",async()=>{const e=new Uint8Array([2,0,3,170,187,204]),t=new Uint8Array(1+2*64+e.length);t[0]=2,t.set(e,1+2*64),await n.load({deviceModelId:c.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:e,chain:i.SolanaTransactionScanChainId.MAINNET}});const a=o.check.mock.calls[0][0];expect(a.path).toBe(N.TransactionCheckPaths.SOLANA_TRANSACTION),expect(a.body.tx.from).toBe("signer"),expect(a.body.chain).toBe(i.SolanaTransactionScanChainId.MAINNET),expect(Array.from(l.default.decode(a.body.tx.raw))).toEqual(Array.from(t)),expect(a.body.tx.raw).toBe(l.default.encode(t))}),it("wraps a versioned (v0) message with signature placeholders",async()=>{const e=new Uint8Array([128,1,0,3,222,173]),t=new Uint8Array(1+1*64+e.length);t[0]=1,t.set(e,1+1*64),await n.load({deviceModelId:c.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:e,chain:i.SolanaTransactionScanChainId.MAINNET}});const a=o.check.mock.calls[0][0].body.tx.raw;expect(Array.from(l.default.decode(a))).toEqual(Array.from(t))})}),describe("load \u2014 result mapping",()=>{it("returns a SOLANA_TRANSACTION_CHECK context with descriptor and certificate on success",async()=>{o.check.mockResolvedValue((0,d.Right)({publicKeyId:"pk-1",descriptor:"deadbeef"}));const e={payload:new Uint8Array([153]),keyUsageNumber:14};A.loadCertificate.mockResolvedValue(e);const[t]=await n.load({deviceModelId:c.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:new Uint8Array([1,0,3,170]),chain:i.SolanaTransactionScanChainId.MAINNET}});expect(t).toEqual({type:r.ClearSignContextType.SOLANA_TRANSACTION_CHECK,payload:{descriptor:"deadbeef"},certificate:e})}),it("returns an ERROR context when the data source returns Left",async()=>{const e=new Error("network fail");o.check.mockResolvedValue((0,d.Left)(e));const[t]=await n.load({deviceModelId:c.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:new Uint8Array([1,0,3,170]),chain:i.SolanaTransactionScanChainId.MAINNET}});expect(t).toEqual({type:r.ClearSignContextType.ERROR,error:e}),expect(A.loadCertificate).not.toHaveBeenCalled()}),it("returns an ERROR context when numRequiredSignatures exceeds the 64-signature limit",async()=>{const e=new Uint8Array([65,0,3,170]),[t]=await n.load({deviceModelId:c.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:e,chain:i.SolanaTransactionScanChainId.MAINNET}});expect(t).toMatchObject({type:r.ClearSignContextType.ERROR,error:expect.objectContaining({message:expect.stringContaining("exceeds SOLANA_MAX_SIGNATURES")})}),expect(o.check).not.toHaveBeenCalled()})})});
|
|
2
|
+
//# sourceMappingURL=SolanaTransactionCheckLoader.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.ts"],
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport bs58 from \"bs58\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { type TransactionCheckDataSource } from \"@/modules/multichain/transaction-check/data/TransactionCheckDataSource\";\nimport { TransactionCheckPaths } from \"@/modules/multichain/transaction-check/utils/constants\";\nimport { SolanaTransactionScanChainId } from \"@/modules/solana/model/SolanaTransactionScanChainId\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { SolanaTransactionCheckLoader } from \"./SolanaTransactionCheckLoader\";\n\nconst loggerMock = {\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n};\nconst loggerFactory = () => loggerMock;\n\nconst certificateLoaderMock: PkiCertificateLoader = {\n loadCertificate: vi.fn(),\n};\n\nlet dataSourceMock: { check: ReturnType<typeof vi.fn> };\nlet loader: SolanaTransactionCheckLoader;\n\nbeforeEach(() => {\n vi.resetAllMocks();\n dataSourceMock = { check: vi.fn() };\n loader = new SolanaTransactionCheckLoader(\n dataSourceMock as unknown as TransactionCheckDataSource,\n certificateLoaderMock,\n loggerFactory,\n );\n});\n\ndescribe(\"SolanaTransactionCheckLoader\", () => {\n describe(\"canHandle\", () => {\n const validInput = {\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: new Uint8Array([1, 0, 3, 0xde]),\n chain: 1,\n },\n };\n\n it(\"returns true for a valid Solana transaction-check input\", () => {\n expect(\n loader.canHandle(validInput, [\n ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n ]),\n ).toBe(true);\n });\n\n it(\"returns false when expected types do not include SOLANA_TRANSACTION_CHECK\", () => {\n expect(\n loader.canHandle(validInput, [ClearSignContextType.SOLANA_TOKEN]),\n ).toBe(false);\n });\n\n it(\"returns false when transactionBytes is not a Uint8Array\", () => {\n expect(\n loader.canHandle(\n {\n ...validInput,\n transactionCheck: {\n ...validInput.transactionCheck,\n transactionBytes: \"0xdead\" as unknown as Uint8Array,\n },\n },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n\n it(\"returns false when transactionBytes is empty\", () => {\n expect(\n loader.canHandle(\n {\n ...validInput,\n transactionCheck: {\n ...validInput.transactionCheck,\n transactionBytes: new Uint8Array(),\n },\n },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n\n it(\"returns false when from is empty\", () => {\n expect(\n loader.canHandle(\n {\n ...validInput,\n transactionCheck: { ...validInput.transactionCheck, from: \"\" },\n },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n\n it(\"returns false for unsupported device models (NANO_S)\", () => {\n expect(\n loader.canHandle(\n { ...validInput, deviceModelId: DeviceModelId.NANO_S },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n });\n\n describe(\"load \u2014 wire format\", () => {\n beforeEach(() => {\n dataSourceMock.check.mockResolvedValue(\n Right({ publicKeyId: \"pk\", descriptor: \"aabb\" }),\n );\n (certificateLoaderMock.loadCertificate as any).mockResolvedValue({\n payload: new Uint8Array([0xcc]),\n keyUsageNumber: 14,\n });\n });\n\n it(\"wraps a legacy message with zero-filled signature placeholders before bs58-encoding\", async () => {\n // message[0] = 2 \u2192 numRequiredSignatures = 2 (legacy, high bit clear)\n const message = new Uint8Array([2, 0, 3, 0xaa, 0xbb, 0xcc]);\n // expected: compact-u16(2) + 2*64 zero bytes + message\n const expected = new Uint8Array(1 + 2 * 64 + message.length);\n expected[0] = 2; // compact-u16 encoding of 2\n expected.set(message, 1 + 2 * 64);\n\n await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: message,\n chain: SolanaTransactionScanChainId.MAINNET,\n },\n });\n\n const sent = dataSourceMock.check.mock.calls[0]![0];\n\n expect(sent.path).toBe(TransactionCheckPaths.SOLANA_TRANSACTION);\n expect(sent.body.tx.from).toBe(\"signer\");\n expect(sent.body.chain).toBe(SolanaTransactionScanChainId.MAINNET);\n expect(Array.from(bs58.decode(sent.body.tx.raw))).toEqual(\n Array.from(expected),\n );\n expect(sent.body.tx.raw).toBe(bs58.encode(expected));\n });\n\n it(\"wraps a versioned (v0) message with signature placeholders\", async () => {\n // message[0] = 0x80 \u2192 versioned prefix; message[1] = 1 \u2192 numRequiredSignatures = 1\n const message = new Uint8Array([0x80, 1, 0, 3, 0xde, 0xad]);\n // expected: compact-u16(1) + 1*64 zero bytes + message\n const expected = new Uint8Array(1 + 1 * 64 + message.length);\n expected[0] = 1; // compact-u16 encoding of 1\n expected.set(message, 1 + 1 * 64);\n\n await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: message,\n chain: SolanaTransactionScanChainId.MAINNET,\n },\n });\n\n const raw = dataSourceMock.check.mock.calls[0]![0].body.tx.raw;\n\n expect(Array.from(bs58.decode(raw))).toEqual(Array.from(expected));\n });\n });\n\n describe(\"load \u2014 result mapping\", () => {\n it(\"returns a SOLANA_TRANSACTION_CHECK context with descriptor and certificate on success\", async () => {\n dataSourceMock.check.mockResolvedValue(\n Right({ publicKeyId: \"pk-1\", descriptor: \"deadbeef\" }),\n );\n const cert = { payload: new Uint8Array([0x99]), keyUsageNumber: 14 };\n (certificateLoaderMock.loadCertificate as any).mockResolvedValue(cert);\n\n const [ctx] = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: new Uint8Array([1, 0, 3, 0xaa]),\n chain: SolanaTransactionScanChainId.MAINNET,\n },\n });\n\n expect(ctx).toEqual({\n type: ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n payload: { descriptor: \"deadbeef\" },\n certificate: cert,\n });\n });\n\n it(\"returns an ERROR context when the data source returns Left\", async () => {\n const error = new Error(\"network fail\");\n dataSourceMock.check.mockResolvedValue(Left(error));\n\n const [ctx] = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: new Uint8Array([1, 0, 3, 0xaa]),\n chain: SolanaTransactionScanChainId.MAINNET,\n },\n });\n\n expect(ctx).toEqual({ type: ClearSignContextType.ERROR, error });\n expect(certificateLoaderMock.loadCertificate).not.toHaveBeenCalled();\n });\n\n it(\"returns an ERROR context when numRequiredSignatures exceeds the 64-signature limit\", async () => {\n // message[0] = 65 \u2192 numRequiredSignatures = 65 (legacy, high bit clear), which exceeds SOLANA_MAX_SIGNATURES\n const message = new Uint8Array([65, 0, 3, 0xaa]);\n\n const [ctx] = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: message,\n chain: SolanaTransactionScanChainId.MAINNET,\n },\n });\n\n expect(ctx).toMatchObject({\n type: ClearSignContextType.ERROR,\n error: expect.objectContaining({\n message: expect.stringContaining(\"exceeds SOLANA_MAX_SIGNATURES\"),\n }),\n });\n expect(dataSourceMock.check).not.toHaveBeenCalled();\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_device_management_kit", "import_bs58", "import_purify_ts", "import_constants", "import_SolanaTransactionScanChainId", "import_ClearSignContext", "import_SolanaTransactionCheckLoader", "loggerMock", "loggerFactory", "certificateLoaderMock", "dataSourceMock", "loader", "validInput", "message", "expected", "sent", "bs58", "raw", "cert", "ctx", "error"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var o=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var u=(e,t,n,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of l(t))!a.call(e,r)&&r!==n&&o(e,r,{get:()=>t[r],enumerable:!(s=i(t,r))||s.enumerable});return e};var p=e=>u(o({},"__esModule",{value:!0}),e);var A={};module.exports=p(A);
|
|
2
|
+
//# sourceMappingURL=AltResolutionDataSource.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/alt-resolution/data/AltResolutionDataSource.ts"],
|
|
4
|
+
"sourcesContent": ["import { type Either } from \"purify-ts\";\n\nexport type GetAltResolutionParams = {\n altAddress: string;\n entryIndex: number;\n challenge: string;\n};\n\nexport type AltResolutionResult = {\n altAddress: string;\n entryIndex: number;\n // Raw signed TLV bytes decoded from the backend response.\n descriptor: Uint8Array;\n keyId: string;\n keyUsage: string;\n};\n\nexport interface AltResolutionDataSource {\n getAltResolution(\n params: GetAltResolutionParams,\n ): Promise<Either<Error, AltResolutionResult>>;\n}\n"],
|
|
5
|
+
"mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
|
|
6
|
+
"names": ["AltResolutionDataSource_exports", "__toCommonJS"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var c=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var $=Object.prototype.hasOwnProperty;var A=(r,e)=>{for(var t in e)c(r,t,{get:e[t],enumerable:!0})},E=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of k(e))!$.call(r,o)&&o!==t&&c(r,o,{get:()=>e[o],enumerable:!(s=g(e,o))||s.enumerable});return r};var w=r=>E(c({},"__esModule",{value:!0}),r),f=(r,e,t,s)=>{for(var o=s>1?void 0:s?g(e,t):e,l=r.length-1,i;l>=0;l--)(i=r[l])&&(o=(s?i(e,t,o):i(o))||o);return s&&o&&c(e,t,o),o},m=(r,e)=>(t,s)=>e(t,s,r);var x={};A(x,{HttpAltResolutionDataSource:()=>a});module.exports=w(x);var p=require("inversify"),n=require("purify-ts"),d=require("../../../../config/di/configTypes"),R=require("../../../../shared/network/di/networkTypes"),y=require("../../../../shared/utils/HexStringUtils"),D=require("../../../../shared/utils/signedDescriptorDto"),h=require("../../../../shared/utils/uIntCodec");let a=class{constructor(e,t){this.config=e;this.http=t}async getAltResolution({altAddress:e,entryIndex:t,challenge:s}){const o=h.u8Codec.decode(t);if(o.isLeft())return(0,n.Left)(new Error(`[ContextModule] HttpAltResolutionDataSource: invalid entryIndex (got ${t}): ${o.leftOrDefault("")}`));let l;try{l=await this.http.get(`${this.config.metadataServiceDomain.url}/v2/solana/alt-resolution/${e}/${t}`,{params:{challenge:s}})}catch(i){const u=i instanceof Error?i.message:String(i);return(0,n.Left)(new Error(`[ContextModule] HttpAltResolutionDataSource: Failed to fetch ALT resolution: ${u}`))}return D.signedDescriptorDtoCodec.decode(l).caseOf({Left:i=>(0,n.Left)(new Error(`[ContextModule] HttpAltResolutionDataSource: malformed response for (${e}, ${t}): ${i}`)),Right:i=>{let u;try{u=y.HexStringUtils.hexToBytes(i.signedDescriptor)}catch(C){return(0,n.Left)(new Error(`[ContextModule] HttpAltResolutionDataSource: invalid hex in signedDescriptor for (${e}, ${t}): ${C.message}`))}return(0,n.Right)({altAddress:e,entryIndex:t,descriptor:u,keyId:i.keyId,keyUsage:i.keyUsage})}})}};a=f([(0,p.injectable)(),m(0,(0,p.inject)(d.configTypes.Config)),m(1,(0,p.inject)(R.networkTypes.NetworkClient))],a);0&&(module.exports={HttpAltResolutionDataSource});
|
|
2
|
+
//# sourceMappingURL=HttpAltResolutionDataSource.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.ts"],
|
|
4
|
+
"sourcesContent": ["import { DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Either, Left, Right } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { networkTypes } from \"@/shared/network/di/networkTypes\";\nimport { HexStringUtils } from \"@/shared/utils/HexStringUtils\";\nimport { signedDescriptorDtoCodec } from \"@/shared/utils/signedDescriptorDto\";\nimport { u8Codec } from \"@/shared/utils/uIntCodec\";\n\nimport {\n type AltResolutionDataSource,\n type AltResolutionResult,\n type GetAltResolutionParams,\n} from \"./AltResolutionDataSource\";\n\ntype AltResolutionResponseDto = {\n descriptorType?: string;\n descriptorVersion?: string;\n alt_address?: string;\n entry_index?: number;\n resolved_address?: string;\n signedDescriptor: string;\n keyId: string;\n keyUsage: string;\n};\n\n@injectable()\nexport class HttpAltResolutionDataSource implements AltResolutionDataSource {\n constructor(\n @inject(configTypes.Config)\n private readonly config: ContextModuleServiceConfig,\n @inject(networkTypes.NetworkClient)\n private readonly http: DmkNetworkClient,\n ) {}\n\n public async getAltResolution({\n altAddress,\n entryIndex,\n challenge,\n }: GetAltResolutionParams): Promise<Either<Error, AltResolutionResult>> {\n const entryIndexResult = u8Codec.decode(entryIndex);\n if (entryIndexResult.isLeft()) {\n return Left(\n new Error(\n `[ContextModule] HttpAltResolutionDataSource: invalid entryIndex (got ${entryIndex}): ${entryIndexResult.leftOrDefault(\"\")}`,\n ),\n );\n }\n\n let dto: AltResolutionResponseDto;\n try {\n dto = (await this.http.get(\n `${this.config.metadataServiceDomain.url}/v2/solana/alt-resolution/${altAddress}/${entryIndex}`,\n { params: { challenge } },\n )) as AltResolutionResponseDto;\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n return Left(\n new Error(\n `[ContextModule] HttpAltResolutionDataSource: Failed to fetch ALT resolution: ${reason}`,\n ),\n );\n }\n\n return signedDescriptorDtoCodec\n .decode(dto)\n .caseOf<Either<Error, AltResolutionResult>>({\n Left: (error) =>\n Left(\n new Error(\n `[ContextModule] HttpAltResolutionDataSource: malformed response for (${altAddress}, ${entryIndex}): ${error}`,\n ),\n ),\n Right: (validated) => {\n let descriptor: Uint8Array;\n try {\n descriptor = HexStringUtils.hexToBytes(validated.signedDescriptor);\n } catch (error) {\n return Left(\n new Error(\n `[ContextModule] HttpAltResolutionDataSource: invalid hex in signedDescriptor for (${altAddress}, ${entryIndex}): ${(error as Error).message}`,\n ),\n );\n }\n\n return Right({\n altAddress,\n entryIndex,\n descriptor,\n keyId: validated.keyId,\n keyUsage: validated.keyUsage,\n });\n },\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iCAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAAmC,qBACnCC,EAAoC,qBAEpCC,EAA4B,mCAE5BC,EAA6B,4CAC7BC,EAA+B,yCAC/BC,EAAyC,8CACzCC,EAAwB,oCAoBjB,IAAMC,EAAN,KAAqE,CAC1E,YAEmBC,EAEAC,EACjB,CAHiB,YAAAD,EAEA,UAAAC,CAChB,CAEH,MAAa,iBAAiB,CAC5B,WAAAC,EACA,WAAAC,EACA,UAAAC,CACF,EAAwE,CACtE,MAAMC,EAAmB,UAAQ,OAAOF,CAAU,EAClD,GAAIE,EAAiB,OAAO,EAC1B,SAAO,QACL,IAAI,MACF,wEAAwEF,CAAU,MAAME,EAAiB,cAAc,EAAE,CAAC,EAC5H,CACF,EAGF,IAAIC,EACJ,GAAI,CACFA,EAAO,MAAM,KAAK,KAAK,IACrB,GAAG,KAAK,OAAO,sBAAsB,GAAG,6BAA6BJ,CAAU,IAAIC,CAAU,GAC7F,CAAE,OAAQ,CAAE,UAAAC,CAAU,CAAE,CAC1B,CACF,OAASG,EAAO,CACd,MAAMC,EAASD,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EACpE,SAAO,QACL,IAAI,MACF,gFAAgFC,CAAM,EACxF,CACF,CACF,CAEA,OAAO,2BACJ,OAAOF,CAAG,EACV,OAA2C,CAC1C,KAAOC,MACL,QACE,IAAI,MACF,wEAAwEL,CAAU,KAAKC,CAAU,MAAMI,CAAK,EAC9G,CACF,EACF,MAAQE,GAAc,CACpB,IAAIC,EACJ,GAAI,CACFA,EAAa,iBAAe,WAAWD,EAAU,gBAAgB,CACnE,OAASF,EAAO,CACd,SAAO,QACL,IAAI,MACF,qFAAqFL,CAAU,KAAKC,CAAU,MAAOI,EAAgB,OAAO,EAC9I,CACF,CACF,CAEA,SAAO,SAAM,CACX,WAAAL,EACA,WAAAC,EACA,WAAAO,EACA,MAAOD,EAAU,MACjB,SAAUA,EAAU,QACtB,CAAC,CACH,CACF,CAAC,CACL,CACF,EApEaV,EAANY,EAAA,IADN,cAAW,EAGPC,EAAA,eAAO,cAAY,MAAM,GAEzBA,EAAA,eAAO,eAAa,aAAa,IAJzBb",
|
|
6
|
+
"names": ["HttpAltResolutionDataSource_exports", "__export", "HttpAltResolutionDataSource", "__toCommonJS", "import_inversify", "import_purify_ts", "import_configTypes", "import_networkTypes", "import_HexStringUtils", "import_signedDescriptorDto", "import_uIntCodec", "HttpAltResolutionDataSource", "config", "http", "altAddress", "entryIndex", "challenge", "entryIndexResult", "dto", "error", "reason", "validated", "descriptor", "__decorateClass", "__decorateParam"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var a=require("purify-ts"),l=require("./HttpAltResolutionDataSource");describe("HttpAltResolutionDataSource",()=>{let n,o;const e="AltAddress1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",r="cafebabe",i={metadataServiceDomain:{url:"https://nft.api.ledger.com"}};beforeEach(()=>{vi.clearAllMocks(),o={get:vi.fn()},n=new l.HttpAltResolutionDataSource(i,o)}),it("calls the metadata endpoint with the right path and challenge",async()=>{o.get.mockResolvedValue({signedDescriptor:"01020304",keyId:"alt_key",keyUsage:"coin_meta"}),await n.getAltResolution({altAddress:e,entryIndex:3,challenge:r}),expect(o.get).toHaveBeenCalledWith(`https://nft.api.ledger.com/v2/solana/alt-resolution/${e}/3`,{params:{challenge:r}})}),it("decodes signedDescriptor hex into Uint8Array",async()=>{o.get.mockResolvedValue({signedDescriptor:"abcd",keyId:"k",keyUsage:"u"});const t=await n.getAltResolution({altAddress:e,entryIndex:3,challenge:r});expect(t).toEqual((0,a.Right)({altAddress:e,entryIndex:3,descriptor:new Uint8Array([171,205]),keyId:"k",keyUsage:"u"}))}),it.each([-1,256,1.5,Number.NaN])("rejects entryIndex out of u8 range: %s",async t=>{const s=await n.getAltResolution({altAddress:e,entryIndex:t,challenge:r});expect(s.isLeft()).toBe(!0),expect(s.extract().message).toMatch(/entryIndex/)}),it("returns Left on malformed response",async()=>{o.get.mockResolvedValue({keyId:"k"});const t=await n.getAltResolution({altAddress:e,entryIndex:3,challenge:r});expect(t.isLeft()).toBe(!0),expect(t.extract().message).toMatch(new RegExp(String.raw`\[ContextModule\] HttpAltResolutionDataSource: malformed response for \(${e}, ${3}\):`))}),it("returns Left when HTTP client throws",async()=>{o.get.mockRejectedValue(new Error("net"));const t=await n.getAltResolution({altAddress:e,entryIndex:3,challenge:r});expect(t).toEqual((0,a.Left)(new Error("[ContextModule] HttpAltResolutionDataSource: Failed to fetch ALT resolution: net")))})});
|
|
2
|
+
//# sourceMappingURL=HttpAltResolutionDataSource.test.js.map
|
package/lib/cjs/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.test.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.test.ts"],
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\n\nimport { type AltResolutionDataSource } from \"./AltResolutionDataSource\";\nimport { HttpAltResolutionDataSource } from \"./HttpAltResolutionDataSource\";\n\ndescribe(\"HttpAltResolutionDataSource\", () => {\n let datasource: AltResolutionDataSource;\n let httpMock: { get: ReturnType<typeof vi.fn> };\n const altAddress = \"AltAddress1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\";\n const entryIndex = 3;\n const challenge = \"cafebabe\";\n const config: ContextModuleServiceConfig = {\n metadataServiceDomain: { url: \"https://nft.api.ledger.com\" },\n } as ContextModuleServiceConfig;\n\n beforeEach(() => {\n vi.clearAllMocks();\n httpMock = { get: vi.fn() };\n datasource = new HttpAltResolutionDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n });\n\n it(\"calls the metadata endpoint with the right path and challenge\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"01020304\",\n keyId: \"alt_key\",\n keyUsage: \"coin_meta\",\n });\n\n await datasource.getAltResolution({ altAddress, entryIndex, challenge });\n\n expect(httpMock.get).toHaveBeenCalledWith(\n `https://nft.api.ledger.com/v2/solana/alt-resolution/${altAddress}/${entryIndex}`,\n { params: { challenge } },\n );\n });\n\n it(\"decodes signedDescriptor hex into Uint8Array\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"abcd\",\n keyId: \"k\",\n keyUsage: \"u\",\n });\n\n const result = await datasource.getAltResolution({\n altAddress,\n entryIndex,\n challenge,\n });\n\n expect(result).toEqual(\n Right({\n altAddress,\n entryIndex,\n descriptor: new Uint8Array([0xab, 0xcd]),\n keyId: \"k\",\n keyUsage: \"u\",\n }),\n );\n });\n\n it.each([-1, 256, 1.5, Number.NaN])(\n \"rejects entryIndex out of u8 range: %s\",\n async (badIndex) => {\n const result = await datasource.getAltResolution({\n altAddress,\n entryIndex: badIndex,\n challenge,\n });\n expect(result.isLeft()).toBe(true);\n expect((result.extract() as Error).message).toMatch(/entryIndex/);\n },\n );\n\n it(\"returns Left on malformed response\", async () => {\n httpMock.get.mockResolvedValue({ keyId: \"k\" } as any);\n\n const result = await datasource.getAltResolution({\n altAddress,\n entryIndex,\n challenge,\n });\n\n expect(result.isLeft()).toBe(true);\n expect((result.extract() as Error).message).toMatch(\n new RegExp(\n String.raw`\\[ContextModule\\] HttpAltResolutionDataSource: malformed response for \\(${altAddress}, ${entryIndex}\\):`,\n ),\n );\n });\n\n it(\"returns Left when HTTP client throws\", async () => {\n httpMock.get.mockRejectedValue(new Error(\"net\"));\n\n const result = await datasource.getAltResolution({\n altAddress,\n entryIndex,\n challenge,\n });\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpAltResolutionDataSource: Failed to fetch ALT resolution: net\",\n ),\n ),\n );\n });\n});\n"],
|
|
5
|
+
"mappings": "aAEA,IAAAA,EAA4B,qBAK5BC,EAA4C,yCAE5C,SAAS,8BAA+B,IAAM,CAC5C,IAAIC,EACAC,EACJ,MAAMC,EAAa,8CAEbC,EAAY,WACZC,EAAqC,CACzC,sBAAuB,CAAE,IAAK,4BAA6B,CAC7D,EAEA,WAAW,IAAM,CACf,GAAG,cAAc,EACjBH,EAAW,CAAE,IAAK,GAAG,GAAG,CAAE,EAC1BD,EAAa,IAAI,8BACfI,EACAH,CACF,CACF,CAAC,EAED,GAAG,gEAAiE,SAAY,CAC9EA,EAAS,IAAI,kBAAkB,CAC7B,iBAAkB,WAClB,MAAO,UACP,SAAU,WACZ,CAAC,EAED,MAAMD,EAAW,iBAAiB,CAAE,WAAAE,EAAY,aAAY,UAAAC,CAAU,CAAC,EAEvE,OAAOF,EAAS,GAAG,EAAE,qBACnB,uDAAuDC,CAAU,KACjE,CAAE,OAAQ,CAAE,UAAAC,CAAU,CAAE,CAC1B,CACF,CAAC,EAED,GAAG,+CAAgD,SAAY,CAC7DF,EAAS,IAAI,kBAAkB,CAC7B,iBAAkB,OAClB,MAAO,IACP,SAAU,GACZ,CAAC,EAED,MAAMI,EAAS,MAAML,EAAW,iBAAiB,CAC/C,WAAAE,EACA,aACA,UAAAC,CACF,CAAC,EAED,OAAOE,CAAM,EAAE,WACb,SAAM,CACJ,WAAAH,EACA,aACA,WAAY,IAAI,WAAW,CAAC,IAAM,GAAI,CAAC,EACvC,MAAO,IACP,SAAU,GACZ,CAAC,CACH,CACF,CAAC,EAED,GAAG,KAAK,CAAC,GAAI,IAAK,IAAK,OAAO,GAAG,CAAC,EAChC,yCACA,MAAOI,GAAa,CAClB,MAAMD,EAAS,MAAML,EAAW,iBAAiB,CAC/C,WAAAE,EACA,WAAYI,EACZ,UAAAH,CACF,CAAC,EACD,OAAOE,EAAO,OAAO,CAAC,EAAE,KAAK,EAAI,EACjC,OAAQA,EAAO,QAAQ,EAAY,OAAO,EAAE,QAAQ,YAAY,CAClE,CACF,EAEA,GAAG,qCAAsC,SAAY,CACnDJ,EAAS,IAAI,kBAAkB,CAAE,MAAO,GAAI,CAAQ,EAEpD,MAAMI,EAAS,MAAML,EAAW,iBAAiB,CAC/C,WAAAE,EACA,aACA,UAAAC,CACF,CAAC,EAED,OAAOE,EAAO,OAAO,CAAC,EAAE,KAAK,EAAI,EACjC,OAAQA,EAAO,QAAQ,EAAY,OAAO,EAAE,QAC1C,IAAI,OACF,OAAO,8EAA8EH,CAAU,KAAK,CAAU,KAChH,CACF,CACF,CAAC,EAED,GAAG,uCAAwC,SAAY,CACrDD,EAAS,IAAI,kBAAkB,IAAI,MAAM,KAAK,CAAC,EAE/C,MAAMI,EAAS,MAAML,EAAW,iBAAiB,CAC/C,WAAAE,EACA,aACA,UAAAC,CACF,CAAC,EAED,OAAOE,CAAM,EAAE,WACb,QACE,IAAI,MACF,kFACF,CACF,CACF,CACF,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["import_purify_ts", "import_HttpAltResolutionDataSource", "datasource", "httpMock", "altAddress", "challenge", "config", "result", "badIndex"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var l=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var R=Object.prototype.hasOwnProperty;var c=(o,t)=>{for(var r in t)l(o,r,{get:t[r],enumerable:!0})},f=(o,t,r,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of p(t))!R.call(o,e)&&e!==r&&l(o,e,{get:()=>t[e],enumerable:!(a=s(t,e))||a.enumerable});return o};var A=o=>f(l({},"__esModule",{value:!0}),o);var x={};c(x,{altResolutionModuleFactory:()=>d});module.exports=A(x);var i=require("inversify"),u=require("../../../../modules/solana/alt-resolution/data/HttpAltResolutionDataSource"),n=require("../../../../modules/solana/alt-resolution/di/altResolutionTypes"),m=require("../../../../modules/solana/alt-resolution/domain/AltResolutionContextLoader");const d=()=>new i.ContainerModule(({bind:o})=>{o(n.altResolutionTypes.AltResolutionDataSource).to(u.HttpAltResolutionDataSource),o(n.altResolutionTypes.AltResolutionContextLoader).to(m.AltResolutionContextLoader)});0&&(module.exports={altResolutionModuleFactory});
|
|
2
|
+
//# sourceMappingURL=altResolutionModuleFactory.js.map
|