@ledgerhq/context-module 2.1.0 → 2.3.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 +2 -2
- package/lib/cjs/src/ContextModuleBuilder.js +1 -1
- package/lib/cjs/src/ContextModuleBuilder.js.map +2 -2
- package/lib/cjs/src/ContextModuleBuilder.test.js +1 -1
- package/lib/cjs/src/ContextModuleBuilder.test.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/calldata/data/HttpCalldataDescriptorDataSource.test.js +1 -1
- package/lib/cjs/src/modules/ethereum/calldata/data/HttpCalldataDescriptorDataSource.test.js.map +2 -2
- package/lib/cjs/src/modules/ethereum/dynamic-network/data/HttpDynamicNetworkDataSource.test.js +1 -1
- package/lib/cjs/src/modules/ethereum/dynamic-network/data/HttpDynamicNetworkDataSource.test.js.map +2 -2
- package/lib/cjs/src/modules/ethereum/dynamic-network/domain/DynamicNetworkContextLoader.test.js +1 -1
- package/lib/cjs/src/modules/ethereum/dynamic-network/domain/DynamicNetworkContextLoader.test.js.map +2 -2
- package/lib/cjs/src/modules/ethereum/external-plugin/data/HttpExternalPluginDataSource.test.js +1 -1
- package/lib/cjs/src/modules/ethereum/external-plugin/data/HttpExternalPluginDataSource.test.js.map +2 -2
- package/lib/cjs/src/modules/ethereum/gated-signing/data/HttpGatedDescriptorDataSource.test.js +1 -1
- package/lib/cjs/src/modules/ethereum/gated-signing/data/HttpGatedDescriptorDataSource.test.js.map +2 -2
- package/lib/cjs/src/modules/ethereum/token/data/HttpTokenDataSource.test.js +1 -1
- package/lib/cjs/src/modules/ethereum/token/data/HttpTokenDataSource.test.js.map +2 -2
- package/lib/cjs/src/modules/ethereum/trusted-name/data/HttpTrustedNameDataSource.test.js +1 -1
- package/lib/cjs/src/modules/ethereum/trusted-name/data/HttpTrustedNameDataSource.test.js.map +2 -2
- package/lib/cjs/src/modules/ethereum/typed-data/data/HttpTypedDataDataSource.test.js +1 -1
- package/lib/cjs/src/modules/ethereum/typed-data/data/HttpTypedDataDataSource.test.js.map +2 -2
- 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 +1 -1
- package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js.map +3 -3
- 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.test.js +1 -1
- package/lib/cjs/src/modules/solana/lifi/data/HttpLifiDataSource.test.js.map +2 -2
- package/lib/cjs/src/modules/solana/lifi/domain/LifiContextLoader.test.js +1 -1
- package/lib/cjs/src/modules/solana/lifi/domain/LifiContextLoader.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/data/HttpTokenDataSource.test.js +2 -2
- package/lib/cjs/src/modules/solana/token/data/HttpTokenDataSource.test.js.map +2 -2
- 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/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/esm/package.json +2 -2
- package/lib/esm/src/ContextModuleBuilder.js +1 -1
- package/lib/esm/src/ContextModuleBuilder.js.map +2 -2
- package/lib/esm/src/ContextModuleBuilder.test.js +1 -1
- package/lib/esm/src/ContextModuleBuilder.test.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/calldata/data/HttpCalldataDescriptorDataSource.test.js +1 -1
- package/lib/esm/src/modules/ethereum/calldata/data/HttpCalldataDescriptorDataSource.test.js.map +2 -2
- package/lib/esm/src/modules/ethereum/dynamic-network/data/HttpDynamicNetworkDataSource.test.js +1 -1
- package/lib/esm/src/modules/ethereum/dynamic-network/data/HttpDynamicNetworkDataSource.test.js.map +2 -2
- package/lib/esm/src/modules/ethereum/dynamic-network/domain/DynamicNetworkContextLoader.test.js +1 -1
- package/lib/esm/src/modules/ethereum/dynamic-network/domain/DynamicNetworkContextLoader.test.js.map +2 -2
- package/lib/esm/src/modules/ethereum/external-plugin/data/HttpExternalPluginDataSource.test.js +1 -1
- package/lib/esm/src/modules/ethereum/external-plugin/data/HttpExternalPluginDataSource.test.js.map +2 -2
- package/lib/esm/src/modules/ethereum/gated-signing/data/HttpGatedDescriptorDataSource.test.js +1 -1
- package/lib/esm/src/modules/ethereum/gated-signing/data/HttpGatedDescriptorDataSource.test.js.map +2 -2
- package/lib/esm/src/modules/ethereum/token/data/HttpTokenDataSource.test.js +1 -1
- package/lib/esm/src/modules/ethereum/token/data/HttpTokenDataSource.test.js.map +2 -2
- package/lib/esm/src/modules/ethereum/trusted-name/data/HttpTrustedNameDataSource.test.js +1 -1
- package/lib/esm/src/modules/ethereum/trusted-name/data/HttpTrustedNameDataSource.test.js.map +2 -2
- package/lib/esm/src/modules/ethereum/typed-data/data/HttpTypedDataDataSource.test.js +1 -1
- package/lib/esm/src/modules/ethereum/typed-data/data/HttpTypedDataDataSource.test.js.map +2 -2
- 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 +1 -1
- package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js.map +3 -3
- 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.test.js +1 -1
- package/lib/esm/src/modules/solana/lifi/data/HttpLifiDataSource.test.js.map +2 -2
- package/lib/esm/src/modules/solana/lifi/domain/LifiContextLoader.test.js +1 -1
- package/lib/esm/src/modules/solana/lifi/domain/LifiContextLoader.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/data/HttpTokenDataSource.test.js +2 -2
- package/lib/esm/src/modules/solana/token/data/HttpTokenDataSource.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/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/types/src/ContextModuleBuilder.d.ts.map +1 -1
- 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/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 +1 -1
- package/lib/types/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.d.ts.map +1 -1
- 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 +129 -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 +26 -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/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 +124 -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 +17 -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 +28 -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/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/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +6 -6
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
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
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
2
|
//# sourceMappingURL=SolanaTransactionCheckLoader.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
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 { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { SolanaTransactionCheckLoader } from \"./SolanaTransactionCheckLoader\";\n\nconst
|
|
5
|
-
"mappings": "wdAEA,IAAAA,EAA8B,2CAC9BC,EAAiB,mBACjBC,EAA4B,qBAI5BC,EAAsC,kEACtCC,EAAqC,2CAErCC,EAA6C,0CAE7C,MAAMC,EAAa,
|
|
6
|
-
"names": ["import_device_management_kit", "import_bs58", "import_purify_ts", "import_constants", "
|
|
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
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 f=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var k=Object.prototype.hasOwnProperty;var $=(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 A(e))!k.call(r,o)&&o!==t&&c(r,o,{get:()=>e[o],enumerable:!(s=f(e,o))||s.enumerable});return r};var w=r=>E(c({},"__esModule",{value:!0}),r),g=(r,e,t,s)=>{for(var o=s>1?void 0:s?f(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={};$(x,{HttpAltResolutionDataSource:()=>a});module.exports=w(x);var u=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 p=i instanceof Error?i.message:String(i);return(0,n.Left)(new Error(`[ContextModule] HttpAltResolutionDataSource: Failed to fetch ALT resolution: ${p}`))}return D.signedDescriptorDtoCodec.decode(l).caseOf({Left:i=>(0,n.Left)(new Error(`[ContextModule] HttpAltResolutionDataSource: malformed response for (${e}, ${t}): ${i}`)),Right:i=>{let p;try{p=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:p,keyId:i.keyId,keyUsage:i.keyUsage})}})}};a=g([(0,u.injectable)(),m(0,(0,u.inject)(d.configTypes.Config)),m(1,(0,u.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?: number;\n altAddress?: string;\n entryIndex?: number;\n resolvedAddress?: 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
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/alt-resolution/di/altResolutionModuleFactory.ts"],
|
|
4
|
+
"sourcesContent": ["import { ContainerModule } from \"inversify\";\n\nimport { HttpAltResolutionDataSource } from \"@/modules/solana/alt-resolution/data/HttpAltResolutionDataSource\";\nimport { altResolutionTypes } from \"@/modules/solana/alt-resolution/di/altResolutionTypes\";\nimport { AltResolutionContextLoader } from \"@/modules/solana/alt-resolution/domain/AltResolutionContextLoader\";\n\nexport const altResolutionModuleFactory = () =>\n new ContainerModule(({ bind }) => {\n bind(altResolutionTypes.AltResolutionDataSource).to(\n HttpAltResolutionDataSource,\n );\n bind(altResolutionTypes.AltResolutionContextLoader).to(\n AltResolutionContextLoader,\n );\n });\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,gCAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAgC,qBAEhCC,EAA4C,4EAC5CC,EAAmC,iEACnCC,EAA2C,6EAEpC,MAAML,EAA6B,IACxC,IAAI,kBAAgB,CAAC,CAAE,KAAAM,CAAK,IAAM,CAChCA,EAAK,qBAAmB,uBAAuB,EAAE,GAC/C,6BACF,EACAA,EAAK,qBAAmB,0BAA0B,EAAE,GAClD,4BACF,CACF,CAAC",
|
|
6
|
+
"names": ["altResolutionModuleFactory_exports", "__export", "altResolutionModuleFactory", "__toCommonJS", "import_inversify", "import_HttpAltResolutionDataSource", "import_altResolutionTypes", "import_AltResolutionContextLoader", "bind"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var n=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var i=(t,o)=>{for(var l in o)n(t,l,{get:o[l],enumerable:!0})},R=(t,o,l,a)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of s(o))!u.call(t,e)&&e!==l&&n(t,e,{get:()=>o[e],enumerable:!(a=r(o,e))||a.enumerable});return t};var A=t=>R(n({},"__esModule",{value:!0}),t);var c={};i(c,{altResolutionTypes:()=>S});module.exports=A(c);const S={AltResolutionDataSource:Symbol.for("AltResolutionDataSource"),AltResolutionContextLoader:Symbol.for("AltResolutionContextLoader")};0&&(module.exports={altResolutionTypes});
|
|
2
|
+
//# sourceMappingURL=altResolutionTypes.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/alt-resolution/di/altResolutionTypes.ts"],
|
|
4
|
+
"sourcesContent": ["export const altResolutionTypes = {\n AltResolutionDataSource: Symbol.for(\"AltResolutionDataSource\"),\n AltResolutionContextLoader: Symbol.for(\"AltResolutionContextLoader\"),\n};\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wBAAAE,IAAA,eAAAC,EAAAH,GAAO,MAAME,EAAqB,CAChC,wBAAyB,OAAO,IAAI,yBAAyB,EAC7D,2BAA4B,OAAO,IAAI,4BAA4B,CACrE",
|
|
6
|
+
"names": ["altResolutionTypes_exports", "__export", "altResolutionTypes", "__toCommonJS"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var s=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var I=Object.prototype.hasOwnProperty;var L=(l,e)=>{for(var t in e)s(l,t,{get:e[t],enumerable:!0})},h=(l,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of x(e))!I.call(l,r)&&r!==t&&s(l,r,{get:()=>e[r],enumerable:!(o=g(e,r))||o.enumerable});return l};var v=l=>h(s({},"__esModule",{value:!0}),l),m=(l,e,t,o)=>{for(var r=o>1?void 0:o?g(e,t):e,c=l.length-1,p;c>=0;c--)(p=l[c])&&(r=(o?p(e,t,r):p(r))||r);return o&&r&&s(e,t,r),r},d=(l,e)=>(t,o)=>e(t,o,l);var b={};L(b,{AltResolutionContextLoader:()=>a});module.exports=v(b);var i=require("inversify"),n=require("purify-ts"),y=require("../../../../config/di/configTypes"),f=require("../../../../modules/multichain/pki/di/pkiTypes"),S=require("../../../../modules/solana/alt-resolution/di/altResolutionTypes"),u=require("../../../../shared/model/ClearSignContext"),C=require("../../../../shared/utils/challengeBoundLoader"),A=require("../../../../shared/utils/deviceModelIdCodec"),R=require("../../../../shared/utils/uIntCodec");const T=[u.ClearSignContextType.SOLANA_ALT_RESOLUTION],P=n.Codec.interface({altAddress:n.string,entryIndex:R.u8Codec,challenge:n.string}),O=n.Codec.interface({deviceModelId:A.deviceModelIdCodec,requests:(0,n.array)(P)});let a=class{constructor(e,t,o){this.dataSource=e;this.certificateLoader=t;this.logger=o("AltResolutionContextLoader")}logger;canHandle(e,t){return T.every(o=>t.includes(o))?O.decode(e).caseOf({Left:()=>!1,Right:({requests:o})=>o.length>0&&o.every(r=>r.altAddress.length>0&&r.challenge.length>0)}):!1}async load(e){return(0,C.loadChallengeBoundContexts)({requests:e.requests,deviceModelId:e.deviceModelId,certificateLoader:this.certificateLoader,logger:this.logger,label:"ALT_RESOLUTION",fetch:t=>this.dataSource.getAltResolution(t),toContext:(t,o)=>{const r={descriptor:t.descriptor};return{type:u.ClearSignContextType.SOLANA_ALT_RESOLUTION,payload:r,certificate:o}},describe:t=>({altAddress:t.altAddress,entryIndex:t.entryIndex})})}};a=m([(0,i.injectable)(),d(0,(0,i.inject)(S.altResolutionTypes.AltResolutionDataSource)),d(1,(0,i.inject)(f.pkiTypes.PkiCertificateLoader)),d(2,(0,i.inject)(y.configTypes.ContextModuleLoggerFactory))],a);0&&(module.exports={AltResolutionContextLoader});
|
|
2
|
+
//# sourceMappingURL=AltResolutionContextLoader.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n type DeviceModelId,\n type LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { array, Codec, 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 { type AltResolutionDataSource } from \"@/modules/solana/alt-resolution/data/AltResolutionDataSource\";\nimport { altResolutionTypes } from \"@/modules/solana/alt-resolution/di/altResolutionTypes\";\nimport { type SolanaAltResolutionPayload } from \"@/modules/solana/model/SolanaPayloads\";\nimport { type ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n type ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport { loadChallengeBoundContexts } from \"@/shared/utils/challengeBoundLoader\";\nimport { deviceModelIdCodec } from \"@/shared/utils/deviceModelIdCodec\";\nimport { u8Codec } from \"@/shared/utils/uIntCodec\";\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.SOLANA_ALT_RESOLUTION,\n];\n\nexport type SolanaAltResolutionRequest = {\n altAddress: string;\n entryIndex: number;\n challenge: string;\n};\n\nexport type SolanaAltResolutionContextInput = {\n deviceModelId: DeviceModelId;\n requests: SolanaAltResolutionRequest[];\n};\n\nconst altResolutionRequestCodec = Codec.interface({\n altAddress: string,\n entryIndex: u8Codec,\n challenge: string,\n});\n\nconst solanaAltResolutionInputCodec = Codec.interface({\n deviceModelId: deviceModelIdCodec,\n requests: array(altResolutionRequestCodec),\n});\n\n@injectable()\nexport class AltResolutionContextLoader\n implements ContextLoader<SolanaAltResolutionContextInput>\n{\n private readonly logger: LoggerPublisherService;\n\n constructor(\n @inject(altResolutionTypes.AltResolutionDataSource)\n private readonly dataSource: AltResolutionDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this.logger = loggerFactory(\"AltResolutionContextLoader\");\n }\n\n public canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is SolanaAltResolutionContextInput {\n if (!SUPPORTED_TYPES.every((t) => expectedTypes.includes(t))) return false;\n return solanaAltResolutionInputCodec.decode(input).caseOf({\n Left: () => false,\n Right: ({ requests }) =>\n requests.length > 0 &&\n requests.every(\n (r) => r.altAddress.length > 0 && r.challenge.length > 0,\n ),\n });\n }\n\n public async load(\n input: SolanaAltResolutionContextInput,\n ): Promise<ClearSignContext[]> {\n return loadChallengeBoundContexts({\n requests: input.requests,\n deviceModelId: input.deviceModelId,\n certificateLoader: this.certificateLoader,\n logger: this.logger,\n label: \"ALT_RESOLUTION\",\n fetch: (request) => this.dataSource.getAltResolution(request),\n toContext: (value, certificate) => {\n const payload: SolanaAltResolutionPayload = {\n descriptor: value.descriptor,\n };\n return {\n type: ClearSignContextType.SOLANA_ALT_RESOLUTION,\n payload,\n certificate,\n };\n },\n describe: (request) => ({\n altAddress: request.altAddress,\n entryIndex: request.entryIndex,\n }),\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,gCAAAE,IAAA,eAAAC,EAAAH,GAIA,IAAAI,EAAmC,qBACnCC,EAAqC,qBAErCC,EAA4B,mCAC5BC,EAAyB,gDAGzBC,EAAmC,iEAGnCC,EAGO,2CACPC,EAA2C,+CAC3CC,EAAmC,6CACnCC,EAAwB,oCAExB,MAAMC,EAA0C,CAC9C,uBAAqB,qBACvB,EAaMC,EAA4B,QAAM,UAAU,CAChD,WAAY,SACZ,WAAY,UACZ,UAAW,QACb,CAAC,EAEKC,EAAgC,QAAM,UAAU,CACpD,cAAe,qBACf,YAAU,SAAMD,CAAyB,CAC3C,CAAC,EAGM,IAAME,EAAN,KAEP,CAGE,YAEmBC,EAEAC,EAEjBC,EACA,CALiB,gBAAAF,EAEA,uBAAAC,EAIjB,KAAK,OAASC,EAAc,4BAA4B,CAC1D,CAXiB,OAaV,UACLC,EACAC,EAC0C,CAC1C,OAAKR,EAAgB,MAAOS,GAAMD,EAAc,SAASC,CAAC,CAAC,EACpDP,EAA8B,OAAOK,CAAK,EAAE,OAAO,CACxD,KAAM,IAAM,GACZ,MAAO,CAAC,CAAE,SAAAG,CAAS,IACjBA,EAAS,OAAS,GAClBA,EAAS,MACN,GAAM,EAAE,WAAW,OAAS,GAAK,EAAE,UAAU,OAAS,CACzD,CACJ,CAAC,EARoE,EASvE,CAEA,MAAa,KACXH,EAC6B,CAC7B,SAAO,8BAA2B,CAChC,SAAUA,EAAM,SAChB,cAAeA,EAAM,cACrB,kBAAmB,KAAK,kBACxB,OAAQ,KAAK,OACb,MAAO,iBACP,MAAQI,GAAY,KAAK,WAAW,iBAAiBA,CAAO,EAC5D,UAAW,CAACC,EAAOC,IAAgB,CACjC,MAAMC,EAAsC,CAC1C,WAAYF,EAAM,UACpB,EACA,MAAO,CACL,KAAM,uBAAqB,sBAC3B,QAAAE,EACA,YAAAD,CACF,CACF,EACA,SAAWF,IAAa,CACtB,WAAYA,EAAQ,WACpB,WAAYA,EAAQ,UACtB,EACF,CAAC,CACH,CACF,EAzDaR,EAANY,EAAA,IADN,cAAW,EAOPC,EAAA,eAAO,qBAAmB,uBAAuB,GAEjDA,EAAA,eAAO,WAAS,oBAAoB,GAEpCA,EAAA,eAAO,cAAY,0BAA0B,IAVrCb",
|
|
6
|
+
"names": ["AltResolutionContextLoader_exports", "__export", "AltResolutionContextLoader", "__toCommonJS", "import_inversify", "import_purify_ts", "import_configTypes", "import_pkiTypes", "import_altResolutionTypes", "import_ClearSignContext", "import_challengeBoundLoader", "import_deviceModelIdCodec", "import_uIntCodec", "SUPPORTED_TYPES", "altResolutionRequestCodec", "solanaAltResolutionInputCodec", "AltResolutionContextLoader", "dataSource", "certificateLoader", "loggerFactory", "input", "expectedTypes", "t", "requests", "request", "value", "certificate", "payload", "__decorateClass", "__decorateParam"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var s=require("@ledgerhq/device-management-kit"),o=require("purify-ts"),n=require("../../../../shared/model/ClearSignContext"),y=require("./AltResolutionContextLoader");const p=()=>({debug:vi.fn(),info:vi.fn(),warn:vi.fn(),error:vi.fn(),subscribers:[]}),A={keyUsageNumber:8,payload:new Uint8Array([1])},a="AltA1111111111111111111111111111111111111111",d="AltB2222222222222222222222222222222222222222";describe("AltResolutionContextLoader",()=>{let c,l;beforeEach(()=>{vi.restoreAllMocks(),c={getAltResolution:vi.fn()},l={loadCertificate:vi.fn().mockResolvedValue(A)}});const r=()=>new y.AltResolutionContextLoader(c,l,p);describe("canHandle",()=>{it("returns true when SOLANA_ALT_RESOLUTION is requested with valid requests",()=>{expect(r().canHandle({deviceModelId:s.DeviceModelId.NANO_X,requests:[{altAddress:a,entryIndex:0,challenge:"c"}]},[n.ClearSignContextType.SOLANA_ALT_RESOLUTION])).toBe(!0)}),it("returns false when SOLANA_ALT_RESOLUTION is not requested",()=>{expect(r().canHandle({deviceModelId:s.DeviceModelId.NANO_X,requests:[{altAddress:a,entryIndex:0,challenge:"c"}]},[n.ClearSignContextType.SOLANA_TOKEN])).toBe(!1)}),it("rejects out-of-range entryIndex",()=>{const e=r(),t=[n.ClearSignContextType.SOLANA_ALT_RESOLUTION];expect(e.canHandle({requests:[{altAddress:a,entryIndex:-1,challenge:"c"}]},t)).toBe(!1),expect(e.canHandle({requests:[{altAddress:a,entryIndex:256,challenge:"c"}]},t)).toBe(!1),expect(e.canHandle({requests:[{altAddress:a,entryIndex:1.5,challenge:"c"}]},t)).toBe(!1)})}),describe("load",()=>{it("emits one SOLANA_ALT_RESOLUTION per request",async()=>{vi.spyOn(c,"getAltResolution").mockImplementation(async({altAddress:t,entryIndex:i})=>(0,o.Right)({altAddress:t,entryIndex:i,descriptor:new Uint8Array([i]),keyId:"alt_key",keyUsage:"coin_meta"}));const e=await r().load({deviceModelId:s.DeviceModelId.NANO_X,requests:[{altAddress:a,entryIndex:1,challenge:"c1"},{altAddress:d,entryIndex:7,challenge:"c2"}]});expect(e).toHaveLength(2),expect(e[0]).toMatchObject({type:n.ClearSignContextType.SOLANA_ALT_RESOLUTION,payload:{descriptor:new Uint8Array([1])},certificate:A}),expect(e[1]).toMatchObject({type:n.ClearSignContextType.SOLANA_ALT_RESOLUTION,payload:{descriptor:new Uint8Array([7])}})}),it("dedups certificate loads across requests sharing the same (keyId, keyUsage)",async()=>{vi.spyOn(c,"getAltResolution").mockImplementation(async({altAddress:e,entryIndex:t})=>(0,o.Right)({altAddress:e,entryIndex:t,descriptor:new Uint8Array([t]),keyId:"alt_key",keyUsage:"coin_meta"})),await r().load({deviceModelId:s.DeviceModelId.NANO_X,requests:[{altAddress:a,entryIndex:0,challenge:"c1"},{altAddress:a,entryIndex:1,challenge:"c2"},{altAddress:d,entryIndex:2,challenge:"c3"}]}),expect(l.loadCertificate).toHaveBeenCalledTimes(1)}),it("issues distinct cert loads when (keyId, keyUsage) differ",async()=>{vi.spyOn(c,"getAltResolution").mockImplementation(async({altAddress:e,entryIndex:t})=>(0,o.Right)({altAddress:e,entryIndex:t,descriptor:new Uint8Array([t]),keyId:e===a?"alt_key_a":"alt_key_b",keyUsage:"coin_meta"})),await r().load({deviceModelId:s.DeviceModelId.NANO_X,requests:[{altAddress:a,entryIndex:0,challenge:"c1"},{altAddress:d,entryIndex:1,challenge:"c2"}]}),expect(l.loadCertificate).toHaveBeenCalledTimes(2)}),it("emits an ERROR per failing request and keeps the others",async()=>{vi.spyOn(c,"getAltResolution").mockImplementation(async({altAddress:t})=>t===a?(0,o.Right)({altAddress:t,entryIndex:0,descriptor:new Uint8Array([170]),keyId:"k",keyUsage:"u"}):(0,o.Left)(new Error("upstream-500")));const e=await r().load({deviceModelId:s.DeviceModelId.NANO_X,requests:[{altAddress:a,entryIndex:0,challenge:"c1"},{altAddress:d,entryIndex:1,challenge:"c2"}]});expect(e[0]?.type).toBe(n.ClearSignContextType.SOLANA_ALT_RESOLUTION),expect(e[1]?.type).toBe(n.ClearSignContextType.ERROR)})})});
|
|
2
|
+
//# sourceMappingURL=AltResolutionContextLoader.test.js.map
|
package/lib/cjs/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.test.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.test.ts"],
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { type AltResolutionDataSource } from \"@/modules/solana/alt-resolution/data/AltResolutionDataSource\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { AltResolutionContextLoader } from \"./AltResolutionContextLoader\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\nconst mockCertificate = { keyUsageNumber: 8, payload: new Uint8Array([1]) };\nconst ALT_A = \"AltA1111111111111111111111111111111111111111\";\nconst ALT_B = \"AltB2222222222222222222222222222222222222222\";\n\ndescribe(\"AltResolutionContextLoader\", () => {\n let dataSource: AltResolutionDataSource;\n let certificateLoader: PkiCertificateLoader;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n dataSource = {\n getAltResolution: vi.fn(),\n };\n certificateLoader = {\n loadCertificate: vi.fn().mockResolvedValue(mockCertificate),\n };\n });\n\n const makeLoader = () =>\n new AltResolutionContextLoader(\n dataSource,\n certificateLoader,\n mockLoggerFactory,\n );\n\n describe(\"canHandle\", () => {\n it(\"returns true when SOLANA_ALT_RESOLUTION is requested with valid requests\", () => {\n expect(\n makeLoader().canHandle(\n {\n deviceModelId: DeviceModelId.NANO_X,\n requests: [{ altAddress: ALT_A, entryIndex: 0, challenge: \"c\" }],\n },\n [ClearSignContextType.SOLANA_ALT_RESOLUTION],\n ),\n ).toBe(true);\n });\n\n it(\"returns false when SOLANA_ALT_RESOLUTION is not requested\", () => {\n expect(\n makeLoader().canHandle(\n {\n deviceModelId: DeviceModelId.NANO_X,\n requests: [{ altAddress: ALT_A, entryIndex: 0, challenge: \"c\" }],\n },\n [ClearSignContextType.SOLANA_TOKEN],\n ),\n ).toBe(false);\n });\n\n it(\"rejects out-of-range entryIndex\", () => {\n const loader = makeLoader();\n const types = [ClearSignContextType.SOLANA_ALT_RESOLUTION];\n expect(\n loader.canHandle(\n {\n requests: [{ altAddress: ALT_A, entryIndex: -1, challenge: \"c\" }],\n } as any,\n types,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n {\n requests: [{ altAddress: ALT_A, entryIndex: 256, challenge: \"c\" }],\n } as any,\n types,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n {\n requests: [{ altAddress: ALT_A, entryIndex: 1.5, challenge: \"c\" }],\n } as any,\n types,\n ),\n ).toBe(false);\n });\n });\n\n describe(\"load\", () => {\n it(\"emits one SOLANA_ALT_RESOLUTION per request\", async () => {\n vi.spyOn(dataSource, \"getAltResolution\").mockImplementation(\n async ({ altAddress, entryIndex }) =>\n Right({\n altAddress,\n entryIndex,\n descriptor: new Uint8Array([entryIndex]),\n keyId: \"alt_key\",\n keyUsage: \"coin_meta\",\n }),\n );\n\n const result = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n requests: [\n { altAddress: ALT_A, entryIndex: 1, challenge: \"c1\" },\n { altAddress: ALT_B, entryIndex: 7, challenge: \"c2\" },\n ],\n });\n\n expect(result).toHaveLength(2);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.SOLANA_ALT_RESOLUTION,\n payload: { descriptor: new Uint8Array([1]) },\n certificate: mockCertificate,\n });\n expect(result[1]).toMatchObject({\n type: ClearSignContextType.SOLANA_ALT_RESOLUTION,\n payload: { descriptor: new Uint8Array([7]) },\n });\n });\n\n it(\"dedups certificate loads across requests sharing the same (keyId, keyUsage)\", async () => {\n vi.spyOn(dataSource, \"getAltResolution\").mockImplementation(\n async ({ altAddress, entryIndex }) =>\n Right({\n altAddress,\n entryIndex,\n descriptor: new Uint8Array([entryIndex]),\n keyId: \"alt_key\",\n keyUsage: \"coin_meta\",\n }),\n );\n\n await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n requests: [\n { altAddress: ALT_A, entryIndex: 0, challenge: \"c1\" },\n { altAddress: ALT_A, entryIndex: 1, challenge: \"c2\" },\n { altAddress: ALT_B, entryIndex: 2, challenge: \"c3\" },\n ],\n });\n\n expect(certificateLoader.loadCertificate).toHaveBeenCalledTimes(1);\n });\n\n it(\"issues distinct cert loads when (keyId, keyUsage) differ\", async () => {\n vi.spyOn(dataSource, \"getAltResolution\").mockImplementation(\n async ({ altAddress, entryIndex }) =>\n Right({\n altAddress,\n entryIndex,\n descriptor: new Uint8Array([entryIndex]),\n keyId: altAddress === ALT_A ? \"alt_key_a\" : \"alt_key_b\",\n keyUsage: \"coin_meta\",\n }),\n );\n\n await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n requests: [\n { altAddress: ALT_A, entryIndex: 0, challenge: \"c1\" },\n { altAddress: ALT_B, entryIndex: 1, challenge: \"c2\" },\n ],\n });\n\n expect(certificateLoader.loadCertificate).toHaveBeenCalledTimes(2);\n });\n\n it(\"emits an ERROR per failing request and keeps the others\", async () => {\n vi.spyOn(dataSource, \"getAltResolution\").mockImplementation(\n async ({ altAddress }) => {\n if (altAddress === ALT_A) {\n return Right({\n altAddress,\n entryIndex: 0,\n descriptor: new Uint8Array([0xaa]),\n keyId: \"k\",\n keyUsage: \"u\",\n });\n }\n return Left(new Error(\"upstream-500\"));\n },\n );\n\n const out = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n requests: [\n { altAddress: ALT_A, entryIndex: 0, challenge: \"c1\" },\n { altAddress: ALT_B, entryIndex: 1, challenge: \"c2\" },\n ],\n });\n\n expect(out[0]?.type).toBe(ClearSignContextType.SOLANA_ALT_RESOLUTION);\n expect(out[1]?.type).toBe(ClearSignContextType.ERROR);\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_device_management_kit", "import_purify_ts", "import_ClearSignContext", "import_AltResolutionContextLoader", "mockLoggerFactory", "mockCertificate", "ALT_A", "ALT_B", "dataSource", "certificateLoader", "makeLoader", "loader", "types", "altAddress", "entryIndex", "result", "out"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var a=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var V=Object.prototype.hasOwnProperty;var f=(o,t)=>{for(var n in t)a(o,n,{get:t[n],enumerable:!0})},x=(o,t,n,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of d(t))!V.call(o,r)&&r!==n&&a(o,r,{get:()=>t[r],enumerable:!(e=p(t,r))||e.enumerable});return o};var C=o=>x(a({},"__esModule",{value:!0}),o);var l={};f(l,{enumVariantModuleFactory:()=>c});module.exports=C(l);var m=require("inversify"),i=require("../../../../modules/solana/enum-variant/di/enumVariantTypes"),u=require("../../../../modules/solana/enum-variant/domain/EnumVariantContextLoader");const c=()=>new m.ContainerModule(({bind:o})=>{o(i.enumVariantTypes.EnumVariantContextLoader).to(u.EnumVariantContextLoader)});0&&(module.exports={enumVariantModuleFactory});
|
|
2
|
+
//# sourceMappingURL=enumVariantModuleFactory.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/enum-variant/di/enumVariantModuleFactory.ts"],
|
|
4
|
+
"sourcesContent": ["import { ContainerModule } from \"inversify\";\n\nimport { enumVariantTypes } from \"@/modules/solana/enum-variant/di/enumVariantTypes\";\nimport { EnumVariantContextLoader } from \"@/modules/solana/enum-variant/domain/EnumVariantContextLoader\";\n\n// EnumVariantContextLoader shares InstructionInfoDataSource \u2014 its binding\n// is owned by `instructionInfoModuleFactory` and reused here via DI.\nexport const enumVariantModuleFactory = () =>\n new ContainerModule(({ bind }) => {\n bind(enumVariantTypes.EnumVariantContextLoader).to(\n EnumVariantContextLoader,\n );\n });\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,8BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAgC,qBAEhCC,EAAiC,6DACjCC,EAAyC,yEAIlC,MAAMJ,EAA2B,IACtC,IAAI,kBAAgB,CAAC,CAAE,KAAAK,CAAK,IAAM,CAChCA,EAAK,mBAAiB,wBAAwB,EAAE,GAC9C,0BACF,CACF,CAAC",
|
|
6
|
+
"names": ["enumVariantModuleFactory_exports", "__export", "enumVariantModuleFactory", "__toCommonJS", "import_inversify", "import_enumVariantTypes", "import_EnumVariantContextLoader", "bind"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var e=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var x=(t,n)=>{for(var o in n)e(t,o,{get:n[o],enumerable:!0})},V=(t,n,o,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let a of i(n))!u.call(t,a)&&a!==o&&e(t,a,{get:()=>n[a],enumerable:!(r=m(n,a))||r.enumerable});return t};var d=t=>V(e({},"__esModule",{value:!0}),t);var s={};x(s,{enumVariantTypes:()=>p});module.exports=d(s);const p={EnumVariantContextLoader:Symbol.for("EnumVariantContextLoader")};0&&(module.exports={enumVariantTypes});
|
|
2
|
+
//# sourceMappingURL=enumVariantTypes.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/enum-variant/di/enumVariantTypes.ts"],
|
|
4
|
+
"sourcesContent": ["export const enumVariantTypes = {\n EnumVariantContextLoader: Symbol.for(\"EnumVariantContextLoader\"),\n};\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,sBAAAE,IAAA,eAAAC,EAAAH,GAAO,MAAME,EAAmB,CAC9B,yBAA0B,OAAO,IAAI,0BAA0B,CACjE",
|
|
6
|
+
"names": ["enumVariantTypes_exports", "__export", "enumVariantTypes", "__toCommonJS"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var c=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var O=Object.prototype.hasOwnProperty;var U=(o,e)=>{for(var n in e)c(o,n,{get:e[n],enumerable:!0})},_=(o,e,n,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of k(e))!O.call(o,a)&&a!==n&&c(o,a,{get:()=>e[a],enumerable:!(t=x(e,a))||t.enumerable});return o};var b=o=>_(c({},"__esModule",{value:!0}),o),S=(o,e,n,t)=>{for(var a=t>1?void 0:t?x(e,n):e,s=o.length-1,d;s>=0;s--)(d=o[s])&&(a=(t?d(e,n,a):d(a))||a);return t&&a&&c(e,n,a),a},g=(o,e)=>(n,t)=>e(n,t,o);var j={};U(j,{EnumVariantContextLoader:()=>I});module.exports=b(j);var p=require("inversify"),i=require("purify-ts"),y=require("../../../../config/di/configTypes"),E=require("../../../../modules/multichain/pki/di/pkiTypes"),R=require("../../../../modules/multichain/pki/model/KeyId"),h=require("../../../../modules/multichain/pki/model/KeyUsage"),V=require("../../../../modules/solana/instruction-info/di/instructionInfoTypes"),m=require("../../../../shared/model/ClearSignContext"),A=require("../../../../shared/utils/certificateResult"),L=require("../../../../shared/utils/deviceModelIdCodec"),M=require("../../../../shared/utils/uIntCodec");const D=[m.ClearSignContextType.SOLANA_ENUM_VARIANT],$="solana-mainnet",K=i.Codec.interface({programId:i.string,enumId:i.string,variantIndex:M.u16Codec}),F=i.Codec.interface({deviceModelId:L.deviceModelIdCodec,selections:(0,i.array)(K),network:(0,i.optional)(i.string)});let I=class{constructor(e,n,t,a){this.dataSource=e;this.config=n;this.certificateLoader=t;this.logger=a("EnumVariantContextLoader")}logger;canHandle(e,n){return D.every(t=>n.includes(t))?F.decode(e).caseOf({Left:()=>!1,Right:({selections:t})=>t.length>0&&t.every(a=>a.programId.length>0&&a.enumId.length>0)}):!1}async load(e){const n=e.network||$,t=Array.from(new Set(e.selections.map(r=>r.programId)));this.logger.debug("[load] Fetching enum variants",{data:{network:n,programCount:t.length,selectionCount:e.selections.length}});const a=(0,A.loadCertificateResult)(this.certificateLoader,{keyId:R.KeyId.CalCalldataKey,keyUsage:h.KeyUsage.Calldata,targetDevice:e.deviceModelId}),s=Promise.all(t.map(r=>this.dataSource.getInstructionInfo({programId:r,network:n}))),[d,T]=await Promise.all([a,s]);if(!d.ok||!d.value){const r=d.ok?new Error("[ContextModule] EnumVariantContextLoader: certificate is missing"):d.error;return this.logger.warn("[load] ENUM_VARIANT certificate unavailable",{data:{error:r.message}}),e.selections.map(()=>({type:m.ClearSignContextType.ERROR,error:r}))}const w=d.value,N=new Map(t.map((r,l)=>[r,T[l]])),v=this.config.cal.mode??"prod";return e.selections.map(r=>{const l=N.get(r.programId);if(!l){const u=new Error(`[ContextModule] EnumVariantContextLoader: no CAL response for program ${r.programId}`);return this.logger.warn("[load] ENUM_VARIANT fetch failed",{data:{programId:r.programId,enumId:r.enumId,variantIndex:r.variantIndex,error:u.message}}),{type:m.ClearSignContextType.ERROR,error:u}}return l.caseOf({Left:u=>(this.logger.warn("[load] ENUM_VARIANT fetch failed",{data:{programId:r.programId,enumId:r.enumId,variantIndex:r.variantIndex,error:u.message}}),{type:m.ClearSignContextType.ERROR,error:u}),Right:u=>{const f=this.lookupVariant(u,r);if(!f){const C=new Error(`[ContextModule] EnumVariantContextLoader: CAL has no enum variant for (${r.programId}, ${r.enumId}, ${r.variantIndex})`);return this.logger.warn("[load] ENUM_VARIANT not found in CAL response",{data:{programId:r.programId,enumId:r.enumId,variantIndex:r.variantIndex}}),{type:m.ClearSignContextType.ERROR,error:C}}if(!f.descriptor.signature){const C=new Error(`[ContextModule] EnumVariantContextLoader: missing '${v}' signature for (${r.programId}, ${r.enumId}, ${r.variantIndex})`);return this.logger.warn("[load] ENUM_VARIANT missing signature",{data:{programId:r.programId,enumId:r.enumId,variantIndex:r.variantIndex,mode:v}}),{type:m.ClearSignContextType.ERROR,error:C}}const P={programId:r.programId,enumId:r.enumId,variantIndex:r.variantIndex,descriptor:f.descriptor};return{type:m.ClearSignContextType.SOLANA_ENUM_VARIANT,payload:P,certificate:w}}})})}lookupVariant(e,n){return e.enumVariants.find(t=>t.enumId===n.enumId&&t.variantIndex===n.variantIndex)}};I=S([(0,p.injectable)(),g(0,(0,p.inject)(V.instructionInfoTypes.InstructionInfoDataSource)),g(1,(0,p.inject)(y.configTypes.Config)),g(2,(0,p.inject)(E.pkiTypes.PkiCertificateLoader)),g(3,(0,p.inject)(y.configTypes.ContextModuleLoggerFactory))],I);0&&(module.exports={EnumVariantContextLoader});
|
|
2
|
+
//# sourceMappingURL=EnumVariantContextLoader.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/enum-variant/domain/EnumVariantContextLoader.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n type DeviceModelId,\n type LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { array, Codec, optional, string } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\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 {\n type InstructionInfoDataSource,\n type InstructionInfoResult,\n} from \"@/modules/solana/instruction-info/data/InstructionInfoDataSource\";\nimport { instructionInfoTypes } from \"@/modules/solana/instruction-info/di/instructionInfoTypes\";\nimport {\n type SolanaEnumVariantPayload,\n type SolanaInstructionEnumVariant,\n} from \"@/modules/solana/model/SolanaPayloads\";\nimport { type ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n type ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport { loadCertificateResult } from \"@/shared/utils/certificateResult\";\nimport { deviceModelIdCodec } from \"@/shared/utils/deviceModelIdCodec\";\nimport { u16Codec } from \"@/shared/utils/uIntCodec\";\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.SOLANA_ENUM_VARIANT,\n];\n\nconst NETWORK_DEFAULT = \"solana-mainnet\";\n\n/**\n * One enum-variant selection the caller wants resolved. `variantIndex` is\n * constrained to a u16 (0..=65535).\n */\nexport type SolanaEnumVariantSelection = {\n programId: string;\n enumId: string;\n variantIndex: number;\n};\n\nexport type SolanaEnumVariantContextInput = {\n deviceModelId: DeviceModelId;\n selections: SolanaEnumVariantSelection[];\n network?: string;\n};\n\nconst enumVariantSelectionCodec = Codec.interface({\n programId: string,\n enumId: string,\n variantIndex: u16Codec,\n});\n\nconst solanaEnumVariantInputCodec = Codec.interface({\n deviceModelId: deviceModelIdCodec,\n selections: array(enumVariantSelectionCodec),\n network: optional(string),\n});\n\n/**\n * Emits one SOLANA_ENUM_VARIANT context per `(programId, enumId,\n * variantIndex)` selection: fetches the CAL response for each distinct\n * program, looks up the matching variant, and emits only the selected ones.\n *\n * Shares {@link InstructionInfoDataSource} with\n * {@link InstructionInfoContextLoader}.\n */\n@injectable()\nexport class EnumVariantContextLoader\n implements ContextLoader<SolanaEnumVariantContextInput>\n{\n private readonly logger: LoggerPublisherService;\n\n constructor(\n @inject(instructionInfoTypes.InstructionInfoDataSource)\n private readonly dataSource: InstructionInfoDataSource,\n @inject(configTypes.Config)\n private readonly config: ContextModuleServiceConfig,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this.logger = loggerFactory(\"EnumVariantContextLoader\");\n }\n\n public canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is SolanaEnumVariantContextInput {\n if (!SUPPORTED_TYPES.every((t) => expectedTypes.includes(t))) return false;\n return solanaEnumVariantInputCodec.decode(input).caseOf({\n Left: () => false,\n Right: ({ selections }) =>\n selections.length > 0 &&\n selections.every((s) => s.programId.length > 0 && s.enumId.length > 0),\n });\n }\n\n public async load(\n input: SolanaEnumVariantContextInput,\n ): Promise<ClearSignContext[]> {\n const network = input.network || NETWORK_DEFAULT;\n const distinctProgramIds = Array.from(\n new Set(input.selections.map((s) => s.programId)),\n );\n\n this.logger.debug(\"[load] Fetching enum variants\", {\n data: {\n network,\n programCount: distinctProgramIds.length,\n selectionCount: input.selections.length,\n },\n });\n\n // Cert load and CAL fetches are independent \u2014 run them in parallel. A\n // PKI failure still degrades each selection to ERROR.\n const certPromise = loadCertificateResult(this.certificateLoader, {\n keyId: KeyId.CalCalldataKey,\n keyUsage: KeyUsage.Calldata,\n targetDevice: input.deviceModelId,\n });\n\n const dataPromise = Promise.all(\n distinctProgramIds.map((programId) =>\n this.dataSource.getInstructionInfo({ programId, network }),\n ),\n );\n\n const [certResult, results] = await Promise.all([certPromise, dataPromise]);\n\n if (!certResult.ok || !certResult.value) {\n const error = certResult.ok\n ? new Error(\n \"[ContextModule] EnumVariantContextLoader: certificate is missing\",\n )\n : certResult.error;\n this.logger.warn(\"[load] ENUM_VARIANT certificate unavailable\", {\n data: { error: error.message },\n });\n return input.selections.map(() => ({\n type: ClearSignContextType.ERROR,\n error,\n }));\n }\n const certificate = certResult.value;\n\n const programToEither = new Map(\n distinctProgramIds.map((programId, i) => [programId, results[i]!]),\n );\n\n const mode = this.config.cal.mode ?? \"prod\";\n\n return input.selections.map((selection) => {\n const either = programToEither.get(selection.programId);\n if (!either) {\n const error = new Error(\n `[ContextModule] EnumVariantContextLoader: no CAL response for program ${selection.programId}`,\n );\n this.logger.warn(\"[load] ENUM_VARIANT fetch failed\", {\n data: {\n programId: selection.programId,\n enumId: selection.enumId,\n variantIndex: selection.variantIndex,\n error: error.message,\n },\n });\n return { type: ClearSignContextType.ERROR, error };\n }\n\n return either.caseOf<ClearSignContext>({\n Left: (err) => {\n this.logger.warn(\"[load] ENUM_VARIANT fetch failed\", {\n data: {\n programId: selection.programId,\n enumId: selection.enumId,\n variantIndex: selection.variantIndex,\n error: err.message,\n },\n });\n return { type: ClearSignContextType.ERROR, error: err };\n },\n Right: (value) => {\n const variant = this.lookupVariant(value, selection);\n if (!variant) {\n const error = new Error(\n `[ContextModule] EnumVariantContextLoader: CAL has no enum variant for (${selection.programId}, ${selection.enumId}, ${selection.variantIndex})`,\n );\n this.logger.warn(\"[load] ENUM_VARIANT not found in CAL response\", {\n data: {\n programId: selection.programId,\n enumId: selection.enumId,\n variantIndex: selection.variantIndex,\n },\n });\n return { type: ClearSignContextType.ERROR, error };\n }\n\n // The mapper already picked the signature for the configured mode (or\n // left it empty when CAL has none for that mode).\n if (!variant.descriptor.signature) {\n const error = new Error(\n `[ContextModule] EnumVariantContextLoader: missing '${mode}' signature for (${selection.programId}, ${selection.enumId}, ${selection.variantIndex})`,\n );\n this.logger.warn(\"[load] ENUM_VARIANT missing signature\", {\n data: {\n programId: selection.programId,\n enumId: selection.enumId,\n variantIndex: selection.variantIndex,\n mode,\n },\n });\n return { type: ClearSignContextType.ERROR, error };\n }\n\n const payload: SolanaEnumVariantPayload = {\n programId: selection.programId,\n enumId: selection.enumId,\n variantIndex: selection.variantIndex,\n descriptor: variant.descriptor,\n };\n return {\n type: ClearSignContextType.SOLANA_ENUM_VARIANT,\n payload,\n certificate,\n };\n },\n });\n });\n }\n\n /**\n * Find the decoded enum variant for a selection. The data source flattens\n * `enum_variants` across all of the program's descriptors into a single list\n * (malformed `u16` keys already dropped), and CAL guarantees `(enumId,\n * variantIndex)` is unique across a program's instructions.\n */\n private lookupVariant(\n result: InstructionInfoResult,\n selection: SolanaEnumVariantSelection,\n ): SolanaInstructionEnumVariant | undefined {\n return result.enumVariants.find(\n (variant) =>\n variant.enumId === selection.enumId &&\n variant.variantIndex === selection.variantIndex,\n );\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["EnumVariantContextLoader_exports", "__export", "EnumVariantContextLoader", "__toCommonJS", "import_inversify", "import_purify_ts", "import_configTypes", "import_pkiTypes", "import_KeyId", "import_KeyUsage", "import_instructionInfoTypes", "import_ClearSignContext", "import_certificateResult", "import_deviceModelIdCodec", "import_uIntCodec", "SUPPORTED_TYPES", "NETWORK_DEFAULT", "enumVariantSelectionCodec", "solanaEnumVariantInputCodec", "EnumVariantContextLoader", "dataSource", "config", "certificateLoader", "loggerFactory", "input", "expectedTypes", "selections", "s", "network", "distinctProgramIds", "certPromise", "dataPromise", "programId", "certResult", "results", "error", "certificate", "programToEither", "i", "mode", "selection", "either", "err", "value", "variant", "payload", "result", "__decorateClass", "__decorateParam"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var r=require("@ledgerhq/device-management-kit"),i=require("purify-ts"),e=require("vitest"),s=require("../../../../shared/model/ClearSignContext"),u=require("./EnumVariantContextLoader");const g=()=>({debug:e.vi.fn(),info:e.vi.fn(),warn:e.vi.fn(),error:e.vi.fn(),subscribers:[]}),p={keyUsageNumber:8,payload:new Uint8Array([66])},I={cal:{url:"https://global.api.prd.ledger.com/cal/v1",mode:"prod",branch:"main"}},t="JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4",v="OtherProgram111111111111111111111111111111";function c(){return{programId:t,descriptors:{},enumVariants:[{enumId:"swap",variantIndex:46,descriptor:{data:"01_raydium_tlv",signature:"prodsig_v46"}},{enumId:"swap",variantIndex:12,descriptor:{data:"01_orca_tlv",signature:"prodsig_v12"}}]}}(0,e.describe)("EnumVariantContextLoader",()=>{let d,l;(0,e.beforeEach)(()=>{e.vi.restoreAllMocks(),d={getInstructionInfo:e.vi.fn()},l={loadCertificate:e.vi.fn().mockResolvedValue(p)}});const n=(a=I)=>new u.EnumVariantContextLoader(d,a,l,g);(0,e.describe)("canHandle",()=>{(0,e.it)("returns true when SOLANA_ENUM_VARIANT is requested and selections are valid",()=>{(0,e.expect)(n().canHandle({deviceModelId:r.DeviceModelId.NANO_X,selections:[{programId:t,enumId:"swap",variantIndex:46}]},[s.ClearSignContextType.SOLANA_ENUM_VARIANT])).toBe(!0)}),(0,e.it)("returns false when SOLANA_ENUM_VARIANT is not requested",()=>{(0,e.expect)(n().canHandle({deviceModelId:r.DeviceModelId.NANO_X,selections:[{programId:t,enumId:"swap",variantIndex:46}]},[s.ClearSignContextType.SOLANA_INSTRUCTION_INFO])).toBe(!1)}),e.it.each([-1,65536,1.5,"46",null])("rejects non-u16 variantIndex: %s",a=>{const o=n();(0,e.expect)(o.canHandle({deviceModelId:r.DeviceModelId.NANO_X,selections:[{programId:t,enumId:"swap",variantIndex:a}]},[s.ClearSignContextType.SOLANA_ENUM_VARIANT])).toBe(!1)}),(0,e.it)("rejects empty programId / enumId / selections",()=>{const a=n(),o=[s.ClearSignContextType.SOLANA_ENUM_VARIANT];(0,e.expect)(a.canHandle({selections:[]},o)).toBe(!1),(0,e.expect)(a.canHandle({selections:[{programId:"",enumId:"swap",variantIndex:1}]},o)).toBe(!1),(0,e.expect)(a.canHandle({selections:[{programId:t,enumId:"",variantIndex:1}]},o)).toBe(!1)})}),(0,e.describe)("load",()=>{(0,e.it)("emits one SOLANA_ENUM_VARIANT per selection with certificate",async()=>{e.vi.spyOn(d,"getInstructionInfo").mockResolvedValue((0,i.Right)(c()));const a=await n().load({deviceModelId:r.DeviceModelId.NANO_X,selections:[{programId:t,enumId:"swap",variantIndex:46},{programId:t,enumId:"swap",variantIndex:12}]});(0,e.expect)(a).toHaveLength(2),(0,e.expect)(a[0]).toMatchObject({type:s.ClearSignContextType.SOLANA_ENUM_VARIANT,payload:{programId:t,enumId:"swap",variantIndex:46,descriptor:{data:"01_raydium_tlv",signature:"prodsig_v46"}},certificate:p}),(0,e.expect)(a[1]).toMatchObject({payload:{variantIndex:12,descriptor:{data:"01_orca_tlv",signature:"prodsig_v12"}}})}),(0,e.it)("dedups CAL fetches across selections that share a programId",async()=>{const a=e.vi.spyOn(d,"getInstructionInfo").mockResolvedValue((0,i.Right)(c()));await n().load({deviceModelId:r.DeviceModelId.NANO_X,selections:[{programId:t,enumId:"swap",variantIndex:46},{programId:t,enumId:"swap",variantIndex:12}]}),(0,e.expect)(a).toHaveBeenCalledTimes(1)}),(0,e.it)("resolves a variant index > 255 (u16, disc_kind U16 enums)",async()=>{const a={programId:t,descriptors:{},enumVariants:[{enumId:"swap",variantIndex:300,descriptor:{data:"01_big_tlv",signature:"prodsig_v300"}}]};e.vi.spyOn(d,"getInstructionInfo").mockResolvedValue((0,i.Right)(a));const o=await n().load({deviceModelId:r.DeviceModelId.NANO_X,selections:[{programId:t,enumId:"swap",variantIndex:300}]});(0,e.expect)(o).toHaveLength(1),(0,e.expect)(o[0]?.type).toBe(s.ClearSignContextType.SOLANA_ENUM_VARIANT),(0,e.expect)(o[0].payload).toMatchObject({variantIndex:300,descriptor:{data:"01_big_tlv",signature:"prodsig_v300"}})}),(0,e.it)("emits ERROR when CAL has no matching variant for a selection",async()=>{e.vi.spyOn(d,"getInstructionInfo").mockResolvedValue((0,i.Right)(c()));const a=await n().load({deviceModelId:r.DeviceModelId.NANO_X,selections:[{programId:t,enumId:"swap",variantIndex:99}]});(0,e.expect)(a).toHaveLength(1),(0,e.expect)(a[0]?.type).toBe(s.ClearSignContextType.ERROR),(0,e.expect)(a[0].error.message).toMatch(/no enum variant/)}),(0,e.it)("emits ERROR when CAL fetch fails",async()=>{e.vi.spyOn(d,"getInstructionInfo").mockResolvedValue((0,i.Left)(new Error("upstream-500")));const a=await n().load({deviceModelId:r.DeviceModelId.NANO_X,selections:[{programId:v,enumId:"x",variantIndex:0}]});(0,e.expect)(a[0]?.type).toBe(s.ClearSignContextType.ERROR),(0,e.expect)(a[0].error.message).toBe("upstream-500")}),(0,e.it)("emits ERROR when configured signature mode is missing",async()=>{const a={programId:t,descriptors:{},enumVariants:[{enumId:"swap",variantIndex:46,descriptor:{data:"01_raydium_tlv",signature:""}}]};e.vi.spyOn(d,"getInstructionInfo").mockResolvedValue((0,i.Right)(a));const m=await n({...I,cal:{...I.cal,mode:"test"}}).load({deviceModelId:r.DeviceModelId.NANO_X,selections:[{programId:t,enumId:"swap",variantIndex:46}]});(0,e.expect)(m[0]?.type).toBe(s.ClearSignContextType.ERROR),(0,e.expect)(m[0].error.message).toMatch(/missing 'test' signature/)}),(0,e.it)("degrades every selection to ERROR when certificate loading fails",async()=>{e.vi.spyOn(l,"loadCertificate").mockRejectedValue(new Error("pki-down")),e.vi.spyOn(d,"getInstructionInfo").mockResolvedValue((0,i.Right)(c()));const a=await n().load({deviceModelId:r.DeviceModelId.NANO_X,selections:[{programId:t,enumId:"swap",variantIndex:46},{programId:t,enumId:"swap",variantIndex:12}]});(0,e.expect)(a).toHaveLength(2),(0,e.expect)(a.every(o=>o.type===s.ClearSignContextType.ERROR)).toBe(!0)}),(0,e.it)("falls back to default network when input.network is empty / missing",async()=>{const a=e.vi.spyOn(d,"getInstructionInfo").mockResolvedValue((0,i.Right)(c()));await n().load({deviceModelId:r.DeviceModelId.NANO_X,selections:[{programId:t,enumId:"swap",variantIndex:46}],network:""}),(0,e.expect)(a).toHaveBeenCalledWith({programId:t,network:"solana-mainnet"})})})});
|
|
2
|
+
//# sourceMappingURL=EnumVariantContextLoader.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/enum-variant/domain/EnumVariantContextLoader.test.ts"],
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport {\n type InstructionInfoDataSource,\n type InstructionInfoResult,\n} from \"@/modules/solana/instruction-info/data/InstructionInfoDataSource\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { EnumVariantContextLoader } from \"./EnumVariantContextLoader\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\nconst mockCertificate = {\n keyUsageNumber: 8,\n payload: new Uint8Array([0x42]),\n};\n\nconst mockConfig = {\n cal: {\n url: \"https://global.api.prd.ledger.com/cal/v1\",\n mode: \"prod\",\n branch: \"main\",\n },\n} as ContextModuleServiceConfig;\n\nconst JUPITER_PROGRAM = \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\";\nconst OTHER_PROGRAM = \"OtherProgram111111111111111111111111111111\";\n\n// The data source flattens enum variants into core models, with the signature\n// already picked for the configured mode.\nfunction makeJupiterWithVariants(): InstructionInfoResult {\n return {\n programId: JUPITER_PROGRAM,\n descriptors: {},\n enumVariants: [\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n },\n {\n enumId: \"swap\",\n variantIndex: 12,\n descriptor: { data: \"01_orca_tlv\", signature: \"prodsig_v12\" },\n },\n ],\n };\n}\n\ndescribe(\"EnumVariantContextLoader\", () => {\n let dataSource: InstructionInfoDataSource;\n let certificateLoader: PkiCertificateLoader;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n dataSource = {\n getInstructionInfo: vi.fn(),\n };\n certificateLoader = {\n loadCertificate: vi.fn().mockResolvedValue(mockCertificate),\n };\n });\n\n const makeLoader = (config = mockConfig) =>\n new EnumVariantContextLoader(\n dataSource,\n config,\n certificateLoader,\n mockLoggerFactory,\n );\n\n describe(\"canHandle\", () => {\n it(\"returns true when SOLANA_ENUM_VARIANT is requested and selections are valid\", () => {\n expect(\n makeLoader().canHandle(\n {\n deviceModelId: DeviceModelId.NANO_X,\n selections: [\n {\n programId: JUPITER_PROGRAM,\n enumId: \"swap\",\n variantIndex: 46,\n },\n ],\n },\n [ClearSignContextType.SOLANA_ENUM_VARIANT],\n ),\n ).toBe(true);\n });\n\n it(\"returns false when SOLANA_ENUM_VARIANT is not requested\", () => {\n expect(\n makeLoader().canHandle(\n {\n deviceModelId: DeviceModelId.NANO_X,\n selections: [\n { programId: JUPITER_PROGRAM, enumId: \"swap\", variantIndex: 46 },\n ],\n },\n [ClearSignContextType.SOLANA_INSTRUCTION_INFO],\n ),\n ).toBe(false);\n });\n\n it.each([-1, 65536, 1.5, \"46\", null])(\n \"rejects non-u16 variantIndex: %s\",\n (badIndex) => {\n const loader = makeLoader();\n expect(\n loader.canHandle(\n {\n deviceModelId: DeviceModelId.NANO_X,\n selections: [\n {\n programId: JUPITER_PROGRAM,\n enumId: \"swap\",\n variantIndex: badIndex,\n },\n ],\n } as any,\n [ClearSignContextType.SOLANA_ENUM_VARIANT],\n ),\n ).toBe(false);\n },\n );\n\n it(\"rejects empty programId / enumId / selections\", () => {\n const loader = makeLoader();\n const types = [ClearSignContextType.SOLANA_ENUM_VARIANT];\n expect(loader.canHandle({ selections: [] } as any, types)).toBe(false);\n expect(\n loader.canHandle(\n {\n selections: [{ programId: \"\", enumId: \"swap\", variantIndex: 1 }],\n } as any,\n types,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n {\n selections: [\n { programId: JUPITER_PROGRAM, enumId: \"\", variantIndex: 1 },\n ],\n } as any,\n types,\n ),\n ).toBe(false);\n });\n });\n\n describe(\"load\", () => {\n it(\"emits one SOLANA_ENUM_VARIANT per selection with certificate\", async () => {\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(makeJupiterWithVariants()),\n );\n\n const result = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n selections: [\n { programId: JUPITER_PROGRAM, enumId: \"swap\", variantIndex: 46 },\n { programId: JUPITER_PROGRAM, enumId: \"swap\", variantIndex: 12 },\n ],\n });\n\n expect(result).toHaveLength(2);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.SOLANA_ENUM_VARIANT,\n payload: {\n programId: JUPITER_PROGRAM,\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n },\n certificate: mockCertificate,\n });\n expect(result[1]).toMatchObject({\n payload: {\n variantIndex: 12,\n descriptor: { data: \"01_orca_tlv\", signature: \"prodsig_v12\" },\n },\n });\n });\n\n it(\"dedups CAL fetches across selections that share a programId\", async () => {\n const spy = vi\n .spyOn(dataSource, \"getInstructionInfo\")\n .mockResolvedValue(Right(makeJupiterWithVariants()));\n\n await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n selections: [\n { programId: JUPITER_PROGRAM, enumId: \"swap\", variantIndex: 46 },\n { programId: JUPITER_PROGRAM, enumId: \"swap\", variantIndex: 12 },\n ],\n });\n\n expect(spy).toHaveBeenCalledTimes(1);\n });\n\n it(\"resolves a variant index > 255 (u16, disc_kind U16 enums)\", async () => {\n const result: InstructionInfoResult = {\n programId: JUPITER_PROGRAM,\n descriptors: {},\n enumVariants: [\n {\n enumId: \"swap\",\n variantIndex: 300,\n descriptor: { data: \"01_big_tlv\", signature: \"prodsig_v300\" },\n },\n ],\n };\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(result),\n );\n\n const out = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n selections: [\n { programId: JUPITER_PROGRAM, enumId: \"swap\", variantIndex: 300 },\n ],\n });\n\n expect(out).toHaveLength(1);\n expect(out[0]?.type).toBe(ClearSignContextType.SOLANA_ENUM_VARIANT);\n expect((out[0] as any).payload).toMatchObject({\n variantIndex: 300,\n descriptor: { data: \"01_big_tlv\", signature: \"prodsig_v300\" },\n });\n });\n\n it(\"emits ERROR when CAL has no matching variant for a selection\", async () => {\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(makeJupiterWithVariants()),\n );\n\n const result = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n selections: [\n { programId: JUPITER_PROGRAM, enumId: \"swap\", variantIndex: 99 },\n ],\n });\n\n expect(result).toHaveLength(1);\n expect(result[0]?.type).toBe(ClearSignContextType.ERROR);\n expect((result[0] as any).error.message).toMatch(/no enum variant/);\n });\n\n it(\"emits ERROR when CAL fetch fails\", async () => {\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Left(new Error(\"upstream-500\")),\n );\n\n const result = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n selections: [\n { programId: OTHER_PROGRAM, enumId: \"x\", variantIndex: 0 },\n ],\n });\n\n expect(result[0]?.type).toBe(ClearSignContextType.ERROR);\n expect((result[0] as any).error.message).toBe(\"upstream-500\");\n });\n\n it(\"emits ERROR when configured signature mode is missing\", async () => {\n // The mapper leaves the signature empty when CAL has none for the mode.\n const result: InstructionInfoResult = {\n programId: JUPITER_PROGRAM,\n descriptors: {},\n enumVariants: [\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"\" },\n },\n ],\n };\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(result),\n );\n\n const loader = makeLoader({\n ...mockConfig,\n cal: { ...mockConfig.cal, mode: \"test\" },\n } as any);\n\n const out = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n selections: [\n { programId: JUPITER_PROGRAM, enumId: \"swap\", variantIndex: 46 },\n ],\n });\n\n expect(out[0]?.type).toBe(ClearSignContextType.ERROR);\n expect((out[0] as any).error.message).toMatch(/missing 'test' signature/);\n });\n\n it(\"degrades every selection to ERROR when certificate loading fails\", async () => {\n vi.spyOn(certificateLoader, \"loadCertificate\").mockRejectedValue(\n new Error(\"pki-down\"),\n );\n // Data fetches run in parallel with cert load; resolve so awaits settle.\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(makeJupiterWithVariants()),\n );\n\n const out = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n selections: [\n { programId: JUPITER_PROGRAM, enumId: \"swap\", variantIndex: 46 },\n { programId: JUPITER_PROGRAM, enumId: \"swap\", variantIndex: 12 },\n ],\n });\n\n expect(out).toHaveLength(2);\n expect(out.every((c) => c.type === ClearSignContextType.ERROR)).toBe(\n true,\n );\n });\n\n it(\"falls back to default network when input.network is empty / missing\", async () => {\n const spy = vi\n .spyOn(dataSource, \"getInstructionInfo\")\n .mockResolvedValue(Right(makeJupiterWithVariants()));\n\n await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n selections: [\n { programId: JUPITER_PROGRAM, enumId: \"swap\", variantIndex: 46 },\n ],\n network: \"\",\n });\n\n expect(spy).toHaveBeenCalledWith({\n programId: JUPITER_PROGRAM,\n network: \"solana-mainnet\",\n });\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_device_management_kit", "import_purify_ts", "import_vitest", "import_ClearSignContext", "import_EnumVariantContextLoader", "mockLoggerFactory", "mockCertificate", "mockConfig", "JUPITER_PROGRAM", "OTHER_PROGRAM", "makeJupiterWithVariants", "dataSource", "certificateLoader", "makeLoader", "config", "badIndex", "loader", "types", "result", "spy", "out", "c"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var l=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var M=(n,t)=>{for(var e in t)l(n,e,{get:t[e],enumerable:!0})},k=(n,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of S(t))!T.call(n,o)&&o!==e&&l(n,o,{get:()=>t[o],enumerable:!(i=C(t,o))||i.enumerable});return n};var b=n=>k(l({},"__esModule",{value:!0}),n),g=(n,t,e,i)=>{for(var o=i>1?void 0:i?C(t,e):t,s=n.length-1,r;s>=0;s--)(r=n[s])&&(o=(i?r(t,e,o):r(o))||o);return i&&o&&l(t,e,o),o},I=(n,t)=>(e,i)=>t(e,i,n);var P={};M(P,{HttpInstructionInfoDataSource:()=>u});module.exports=b(P);var f=require("inversify"),a=require("purify-ts"),E=require("../../../../config/di/configTypes"),m=require("../../../../modules/solana/model/SolanaTransactionScanChainId"),y=require("../../../../shared/network/di/networkTypes"),D=require("./InstructionInfoDto"),p=require("./InstructionInfoMapper");const x={"solana-mainnet":m.SolanaTransactionScanChainId.MAINNET,"solana-devnet":m.SolanaTransactionScanChainId.DEVNET,"solana-testnet":m.SolanaTransactionScanChainId.TESTNET};let u=class{constructor(t,e){this.config=t;this.http=e}async getInstructionInfo({programId:t,network:e}){const i=x[e]??m.SolanaTransactionScanChainId.MAINNET;let o;try{o=await this.http.get(`${this.config.cal.url}/solana_programs`,{params:{id:t,chain_id:i,output:"id,chain_id,instructions",ref:`branch:${this.config.cal.branch}`}})}catch(r){const d=r instanceof Error?r.message:String(r);return(0,a.Left)(new Error(`[ContextModule] HttpInstructionInfoDataSource: Failed to fetch instruction descriptors: ${d}`))}if(!Array.isArray(o)||o.length===0)return(0,a.Left)(new Error(`[ContextModule] HttpInstructionInfoDataSource: empty response for program ${t}`));const s=o.find(r=>r!=null&&typeof r=="object"&&r.id===t);return s===void 0?(0,a.Left)(new Error(`[ContextModule] HttpInstructionInfoDataSource: no descriptors for program ${t}`)):D.calInstructionProgramCodec.decode(s).caseOf({Left:r=>(0,a.Left)(new Error(`[ContextModule] HttpInstructionInfoDataSource: malformed descriptors for program ${t}: ${r}`)),Right:()=>{const r=this.config.cal.mode??"prod",d=s.instructions,h=Object.fromEntries(d.map(c=>[c.discriminator_hex,c])),w=Object.fromEntries(Object.entries(h).map(([c,N])=>[c,(0,p.toInstructionInfoPayload)(t,c,N,r)]));return(0,a.Right)({programId:t,descriptors:w,enumVariants:(0,p.toProgramEnumVariants)(h,r)})}})}};u=g([(0,f.injectable)(),I(0,(0,f.inject)(E.configTypes.Config)),I(1,(0,f.inject)(y.networkTypes.NetworkClient))],u);0&&(module.exports={HttpInstructionInfoDataSource});
|
|
2
|
+
//# sourceMappingURL=HttpInstructionInfoDataSource.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.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 { SolanaTransactionScanChainId } from \"@/modules/solana/model/SolanaTransactionScanChainId\";\nimport { networkTypes } from \"@/shared/network/di/networkTypes\";\n\nimport {\n GetInstructionInfoParams,\n InstructionInfoDataSource,\n InstructionInfoResult,\n} from \"./InstructionInfoDataSource\";\nimport {\n type CalInstructionDescriptorDto,\n calInstructionProgramCodec,\n type CalInstructionProgramDto,\n} from \"./InstructionInfoDto\";\nimport {\n type CalMode,\n toInstructionInfoPayload,\n toProgramEnumVariants,\n} from \"./InstructionInfoMapper\";\n\n// Maps the DMK network label to the numeric CAL `chain_id` (the extended\n// Solana network ids 900/901/902). Unknown labels fall back to mainnet.\nconst CHAIN_ID_BY_NETWORK: Record<string, SolanaTransactionScanChainId> = {\n \"solana-mainnet\": SolanaTransactionScanChainId.MAINNET,\n \"solana-devnet\": SolanaTransactionScanChainId.DEVNET,\n \"solana-testnet\": SolanaTransactionScanChainId.TESTNET,\n};\n\n@injectable()\nexport class HttpInstructionInfoDataSource\n implements InstructionInfoDataSource\n{\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 getInstructionInfo({\n programId,\n network,\n }: GetInstructionInfoParams): Promise<Either<Error, InstructionInfoResult>> {\n const chainId =\n CHAIN_ID_BY_NETWORK[network] ?? SolanaTransactionScanChainId.MAINNET;\n let data: unknown;\n try {\n data = await this.http.get(`${this.config.cal.url}/solana_programs`, {\n params: {\n id: programId,\n chain_id: chainId,\n output: \"id,chain_id,instructions\",\n ref: `branch:${this.config.cal.branch}`,\n },\n });\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n return Left(\n new Error(\n `[ContextModule] HttpInstructionInfoDataSource: Failed to fetch instruction descriptors: ${reason}`,\n ),\n );\n }\n\n if (!Array.isArray(data) || data.length === 0) {\n return Left(\n new Error(\n `[ContextModule] HttpInstructionInfoDataSource: empty response for program ${programId}`,\n ),\n );\n }\n\n // Select the program object whose `id` matches the requested `programId`\n // (the response is an array, one object per requested id).\n const program = data.find(\n (entry): entry is { id: unknown } =>\n entry != null &&\n typeof entry === \"object\" &&\n (entry as { id?: unknown }).id === programId,\n );\n if (program === undefined) {\n return Left(\n new Error(\n `[ContextModule] HttpInstructionInfoDataSource: no descriptors for program ${programId}`,\n ),\n );\n }\n\n // Validate the program shape so the mapper can dereference `descriptor` /\n // `enum_variants` without runtime-throwing on a malformed CAL payload. A\n // malformed program degrades to a per-program ERROR rather than rejecting\n // the batch. On success we transform each validated DTO into the core\n // payload so the loader never sees the CAL DTO shapes.\n return calInstructionProgramCodec\n .decode(program)\n .caseOf<Either<Error, InstructionInfoResult>>({\n Left: (error) =>\n Left(\n new Error(\n `[ContextModule] HttpInstructionInfoDataSource: malformed descriptors for program ${programId}: ${error}`,\n ),\n ),\n Right: () => {\n const mode: CalMode = this.config.cal.mode ?? \"prod\";\n // The codec strips undeclared fields, so we key the original\n // (full) instruction objects by `discriminator_hex` \u2014 the cast is\n // justified now that the shape has been validated.\n const instructions = (program as CalInstructionProgramDto)\n .instructions;\n const descriptorsByDiscriminator: Record<\n string,\n CalInstructionDescriptorDto\n > = Object.fromEntries(\n instructions.map((dto) => [dto.discriminator_hex, dto]),\n );\n const mapped = Object.fromEntries(\n Object.entries(descriptorsByDiscriminator).map(\n ([discriminator, dto]) => [\n discriminator,\n toInstructionInfoPayload(programId, discriminator, dto, mode),\n ],\n ),\n );\n return Right({\n programId,\n descriptors: mapped,\n enumVariants: toProgramEnumVariants(\n descriptorsByDiscriminator,\n mode,\n ),\n });\n },\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mCAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAAmC,qBACnCC,EAAoC,qBAEpCC,EAA4B,mCAE5BC,EAA6C,+DAC7CC,EAA6B,4CAO7BC,EAIO,gCACPC,EAIO,mCAIP,MAAMC,EAAoE,CACxE,iBAAkB,+BAA6B,QAC/C,gBAAiB,+BAA6B,OAC9C,iBAAkB,+BAA6B,OACjD,EAGO,IAAMC,EAAN,KAEP,CACE,YAEmBC,EAEAC,EACjB,CAHiB,YAAAD,EAEA,UAAAC,CAChB,CAEH,MAAa,mBAAmB,CAC9B,UAAAC,EACA,QAAAC,CACF,EAA4E,CAC1E,MAAMC,EACJN,EAAoBK,CAAO,GAAK,+BAA6B,QAC/D,IAAIE,EACJ,GAAI,CACFA,EAAO,MAAM,KAAK,KAAK,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,mBAAoB,CACnE,OAAQ,CACN,GAAIH,EACJ,SAAUE,EACV,OAAQ,2BACR,IAAK,UAAU,KAAK,OAAO,IAAI,MAAM,EACvC,CACF,CAAC,CACH,OAASE,EAAO,CACd,MAAMC,EAASD,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EACpE,SAAO,QACL,IAAI,MACF,2FAA2FC,CAAM,EACnG,CACF,CACF,CAEA,GAAI,CAAC,MAAM,QAAQF,CAAI,GAAKA,EAAK,SAAW,EAC1C,SAAO,QACL,IAAI,MACF,6EAA6EH,CAAS,EACxF,CACF,EAKF,MAAMM,EAAUH,EAAK,KAClBI,GACCA,GAAS,MACT,OAAOA,GAAU,UAChBA,EAA2B,KAAOP,CACvC,EACA,OAAIM,IAAY,UACP,QACL,IAAI,MACF,6EAA6EN,CAAS,EACxF,CACF,EAQK,6BACJ,OAAOM,CAAO,EACd,OAA6C,CAC5C,KAAOF,MACL,QACE,IAAI,MACF,oFAAoFJ,CAAS,KAAKI,CAAK,EACzG,CACF,EACF,MAAO,IAAM,CACX,MAAMI,EAAgB,KAAK,OAAO,IAAI,MAAQ,OAIxCC,EAAgBH,EACnB,aACGI,EAGF,OAAO,YACTD,EAAa,IAAKE,GAAQ,CAACA,EAAI,kBAAmBA,CAAG,CAAC,CACxD,EACMC,EAAS,OAAO,YACpB,OAAO,QAAQF,CAA0B,EAAE,IACzC,CAAC,CAACG,EAAeF,CAAG,IAAM,CACxBE,KACA,4BAAyBb,EAAWa,EAAeF,EAAKH,CAAI,CAC9D,CACF,CACF,EACA,SAAO,SAAM,CACX,UAAAR,EACA,YAAaY,EACb,gBAAc,yBACZF,EACAF,CACF,CACF,CAAC,CACH,CACF,CAAC,CACL,CACF,EAzGaX,EAANiB,EAAA,IADN,cAAW,EAKPC,EAAA,eAAO,cAAY,MAAM,GAEzBA,EAAA,eAAO,eAAa,aAAa,IANzBlB",
|
|
6
|
+
"names": ["HttpInstructionInfoDataSource_exports", "__export", "HttpInstructionInfoDataSource", "__toCommonJS", "import_inversify", "import_purify_ts", "import_configTypes", "import_SolanaTransactionScanChainId", "import_networkTypes", "import_InstructionInfoDto", "import_InstructionInfoMapper", "CHAIN_ID_BY_NETWORK", "HttpInstructionInfoDataSource", "config", "http", "programId", "network", "chainId", "data", "error", "reason", "program", "entry", "mode", "instructions", "descriptorsByDiscriminator", "dto", "mapped", "discriminator", "__decorateClass", "__decorateParam"]
|
|
7
|
+
}
|