@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
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { type DmkNetworkClient } 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\";\n\nimport { HttpTokenAccountStateDataSource } from \"./HttpTokenAccountStateDataSource\";\nimport { type TokenAccountStateDataSource } from \"./TokenAccountStateDataSource\";\n\ndescribe(\"HttpTokenAccountStateDataSource\", () => {\n let datasource: TokenAccountStateDataSource;\n let httpMock: { get: ReturnType<typeof vi.fn> };\n const tokenAccount = \"TokenAccountAddrXXXXXXXXXXXXXXXXXXXXXXXXXXX\";\n const challenge = \"deadbeef\";\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 HttpTokenAccountStateDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n });\n\n it(\"calls the metadata endpoint with the challenge param\", async () => {\n httpMock.get.mockResolvedValue({\n descriptorType: \"token_account_state\",\n signedDescriptor: \"01020304\",\n keyId: \"tas_key\",\n keyUsage: \"coin_meta\",\n });\n\n await datasource.getTokenAccountState({ tokenAccount, challenge });\n\n expect(httpMock.get).toHaveBeenCalledWith(\n `https://nft.api.ledger.com/v2/solana/token-account-state/${tokenAccount}`,\n { params: { challenge } },\n );\n });\n\n it(\"decodes signedDescriptor hex into Uint8Array\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"deadbeef\",\n keyId: \"k\",\n keyUsage: \"u\",\n });\n\n const result = await datasource.getTokenAccountState({\n tokenAccount,\n challenge,\n });\n\n expect(result).toEqual(\n Right({\n tokenAccount,\n descriptor: new Uint8Array([0xde, 0xad, 0xbe, 0xef]),\n keyId: \"k\",\n keyUsage: \"u\",\n }),\n );\n });\n\n it(\"returns Left on malformed response (missing signedDescriptor)\", async () => {\n httpMock.get.mockResolvedValue({ keyId: \"k\", keyUsage: \"u\" });\n\n const result = await datasource.getTokenAccountState({\n tokenAccount,\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\\] HttpTokenAccountStateDataSource: malformed response for ${tokenAccount}:`,\n ),\n );\n });\n\n it(\"returns Left when signedDescriptor is not valid hex\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"ZZZZ\",\n keyId: \"k\",\n keyUsage: \"u\",\n });\n\n const result = await datasource.getTokenAccountState({\n tokenAccount,\n challenge,\n });\n\n expect(result.isLeft()).toBe(true);\n expect((result.extract() as Error).message).toMatch(/invalid hex/);\n });\n\n it(\"returns Left when HTTP client throws\", async () => {\n httpMock.get.mockRejectedValue(new Error(\"net\"));\n\n const result = await datasource.getTokenAccountState({\n tokenAccount,\n challenge,\n });\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpTokenAccountStateDataSource: Failed to fetch token account state: net\",\n ),\n ),\n );\n });\n});\n"],
|
|
5
|
+
"mappings": "aACA,IAAAA,EAA4B,qBAC5BC,EAAqD,kBAIrDC,EAAgD,gDAGhD,YAAS,kCAAmC,IAAM,CAChD,IAAIC,EACAC,EACJ,MAAMC,EAAe,8CACfC,EAAY,WACZC,EAAqC,CACzC,sBAAuB,CAAE,IAAK,4BAA6B,CAC7D,KAEA,cAAW,IAAM,CACf,KAAG,cAAc,EACjBH,EAAW,CAAE,IAAK,KAAG,GAAG,CAAE,EAC1BD,EAAa,IAAI,kCACfI,EACAH,CACF,CACF,CAAC,KAED,MAAG,uDAAwD,SAAY,CACrEA,EAAS,IAAI,kBAAkB,CAC7B,eAAgB,sBAChB,iBAAkB,WAClB,MAAO,UACP,SAAU,WACZ,CAAC,EAED,MAAMD,EAAW,qBAAqB,CAAE,aAAAE,EAAc,UAAAC,CAAU,CAAC,KAEjE,UAAOF,EAAS,GAAG,EAAE,qBACnB,4DAA4DC,CAAY,GACxE,CAAE,OAAQ,CAAE,UAAAC,CAAU,CAAE,CAC1B,CACF,CAAC,KAED,MAAG,+CAAgD,SAAY,CAC7DF,EAAS,IAAI,kBAAkB,CAC7B,iBAAkB,WAClB,MAAO,IACP,SAAU,GACZ,CAAC,EAED,MAAMI,EAAS,MAAML,EAAW,qBAAqB,CACnD,aAAAE,EACA,UAAAC,CACF,CAAC,KAED,UAAOE,CAAM,EAAE,WACb,SAAM,CACJ,aAAAH,EACA,WAAY,IAAI,WAAW,CAAC,IAAM,IAAM,IAAM,GAAI,CAAC,EACnD,MAAO,IACP,SAAU,GACZ,CAAC,CACH,CACF,CAAC,KAED,MAAG,gEAAiE,SAAY,CAC9ED,EAAS,IAAI,kBAAkB,CAAE,MAAO,IAAK,SAAU,GAAI,CAAC,EAE5D,MAAMI,EAAS,MAAML,EAAW,qBAAqB,CACnD,aAAAE,EACA,UAAAC,CACF,CAAC,KAED,UAAOE,EAAO,OAAO,CAAC,EAAE,KAAK,EAAI,KACjC,UAAQA,EAAO,QAAQ,EAAY,OAAO,EAAE,QAC1C,IAAI,OACF,OAAO,gFAAgFH,CAAY,GACrG,CACF,CACF,CAAC,KAED,MAAG,sDAAuD,SAAY,CACpED,EAAS,IAAI,kBAAkB,CAC7B,iBAAkB,OAClB,MAAO,IACP,SAAU,GACZ,CAAC,EAED,MAAMI,EAAS,MAAML,EAAW,qBAAqB,CACnD,aAAAE,EACA,UAAAC,CACF,CAAC,KAED,UAAOE,EAAO,OAAO,CAAC,EAAE,KAAK,EAAI,KACjC,UAAQA,EAAO,QAAQ,EAAY,OAAO,EAAE,QAAQ,aAAa,CACnE,CAAC,KAED,MAAG,uCAAwC,SAAY,CACrDJ,EAAS,IAAI,kBAAkB,IAAI,MAAM,KAAK,CAAC,EAE/C,MAAMI,EAAS,MAAML,EAAW,qBAAqB,CACnD,aAAAE,EACA,UAAAC,CACF,CAAC,KAED,UAAOE,CAAM,EAAE,WACb,QACE,IAAI,MACF,2FACF,CACF,CACF,CACF,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["import_purify_ts", "import_vitest", "import_HttpTokenAccountStateDataSource", "datasource", "httpMock", "tokenAccount", "challenge", "config", "result"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var n=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var i=Object.prototype.hasOwnProperty;var u=(e,t,c,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of s(t))!i.call(e,o)&&o!==c&&n(e,o,{get:()=>t[o],enumerable:!(r=a(t,o))||r.enumerable});return e};var k=e=>u(n({},"__esModule",{value:!0}),e);var p={};module.exports=k(p);
|
|
2
|
+
//# sourceMappingURL=TokenAccountStateDataSource.js.map
|
package/lib/cjs/src/modules/solana/token-account-state/data/TokenAccountStateDataSource.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/token-account-state/data/TokenAccountStateDataSource.ts"],
|
|
4
|
+
"sourcesContent": ["import { type Either } from \"purify-ts\";\n\nexport type GetTokenAccountStateParams = {\n tokenAccount: string;\n challenge: string;\n};\n\nexport type TokenAccountStateResult = {\n tokenAccount: string;\n // Raw signed TLV bytes decoded from the backend response.\n descriptor: Uint8Array;\n keyId: string;\n keyUsage: string;\n};\n\nexport interface TokenAccountStateDataSource {\n getTokenAccountState(\n params: GetTokenAccountStateParams,\n ): Promise<Either<Error, TokenAccountStateResult>>;\n}\n"],
|
|
5
|
+
"mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
|
|
6
|
+
"names": ["TokenAccountStateDataSource_exports", "__toCommonJS"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var c=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var A=Object.prototype.hasOwnProperty;var T=(t,o)=>{for(var n in o)c(t,n,{get:o[n],enumerable:!0})},f=(t,o,n,a)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of k(o))!A.call(t,e)&&e!==n&&c(t,e,{get:()=>o[e],enumerable:!(a=p(o,e))||a.enumerable});return t};var i=t=>f(c({},"__esModule",{value:!0}),t);var x={};T(x,{tokenAccountStateModuleFactory:()=>d});module.exports=i(x);var u=require("inversify"),m=require("../../../../modules/solana/token-account-state/data/HttpTokenAccountStateDataSource"),r=require("../../../../modules/solana/token-account-state/di/tokenAccountStateTypes"),S=require("../../../../modules/solana/token-account-state/domain/TokenAccountStateContextLoader");const d=()=>new u.ContainerModule(({bind:t})=>{t(r.tokenAccountStateTypes.TokenAccountStateDataSource).to(m.HttpTokenAccountStateDataSource),t(r.tokenAccountStateTypes.TokenAccountStateContextLoader).to(S.TokenAccountStateContextLoader)});0&&(module.exports={tokenAccountStateModuleFactory});
|
|
2
|
+
//# sourceMappingURL=tokenAccountStateModuleFactory.js.map
|
package/lib/cjs/src/modules/solana/token-account-state/di/tokenAccountStateModuleFactory.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/token-account-state/di/tokenAccountStateModuleFactory.ts"],
|
|
4
|
+
"sourcesContent": ["import { ContainerModule } from \"inversify\";\n\nimport { HttpTokenAccountStateDataSource } from \"@/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource\";\nimport { tokenAccountStateTypes } from \"@/modules/solana/token-account-state/di/tokenAccountStateTypes\";\nimport { TokenAccountStateContextLoader } from \"@/modules/solana/token-account-state/domain/TokenAccountStateContextLoader\";\n\nexport const tokenAccountStateModuleFactory = () =>\n new ContainerModule(({ bind }) => {\n bind(tokenAccountStateTypes.TokenAccountStateDataSource).to(\n HttpTokenAccountStateDataSource,\n );\n bind(tokenAccountStateTypes.TokenAccountStateContextLoader).to(\n TokenAccountStateContextLoader,\n );\n });\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oCAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAgC,qBAEhCC,EAAgD,qFAChDC,EAAuC,0EACvCC,EAA+C,sFAExC,MAAML,EAAiC,IAC5C,IAAI,kBAAgB,CAAC,CAAE,KAAAM,CAAK,IAAM,CAChCA,EAAK,yBAAuB,2BAA2B,EAAE,GACvD,iCACF,EACAA,EAAK,yBAAuB,8BAA8B,EAAE,GAC1D,gCACF,CACF,CAAC",
|
|
6
|
+
"names": ["tokenAccountStateModuleFactory_exports", "__export", "tokenAccountStateModuleFactory", "__toCommonJS", "import_inversify", "import_HttpTokenAccountStateDataSource", "import_tokenAccountStateTypes", "import_TokenAccountStateContextLoader", "bind"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var n=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var r=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var k=(o,t)=>{for(var c in t)n(o,c,{get:t[c],enumerable:!0})},A=(o,t,c,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of r(t))!u.call(o,e)&&e!==c&&n(o,e,{get:()=>t[e],enumerable:!(a=S(t,e))||a.enumerable});return o};var T=o=>A(n({},"__esModule",{value:!0}),o);var y={};k(y,{tokenAccountStateTypes:()=>x});module.exports=T(y);const x={TokenAccountStateDataSource:Symbol.for("TokenAccountStateDataSource"),TokenAccountStateContextLoader:Symbol.for("TokenAccountStateContextLoader")};0&&(module.exports={tokenAccountStateTypes});
|
|
2
|
+
//# sourceMappingURL=tokenAccountStateTypes.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/token-account-state/di/tokenAccountStateTypes.ts"],
|
|
4
|
+
"sourcesContent": ["export const tokenAccountStateTypes = {\n TokenAccountStateDataSource: Symbol.for(\"TokenAccountStateDataSource\"),\n TokenAccountStateContextLoader: Symbol.for(\"TokenAccountStateContextLoader\"),\n};\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,4BAAAE,IAAA,eAAAC,EAAAH,GAAO,MAAME,EAAyB,CACpC,4BAA6B,OAAO,IAAI,6BAA6B,EACrE,+BAAgC,OAAO,IAAI,gCAAgC,CAC7E",
|
|
6
|
+
"names": ["tokenAccountStateTypes_exports", "__export", "tokenAccountStateTypes", "__toCommonJS"]
|
|
7
|
+
}
|
package/lib/cjs/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var l=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var k=Object.prototype.hasOwnProperty;var h=(r,e)=>{for(var t in e)l(r,t,{get:e[t],enumerable:!0})},v=(r,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of y(e))!k.call(r,n)&&n!==t&&l(r,n,{get:()=>e[n],enumerable:!(o=S(e,n))||o.enumerable});return r};var x=r=>v(l({},"__esModule",{value:!0}),r),g=(r,e,t,o)=>{for(var n=o>1?void 0:o?S(e,t):e,u=r.length-1,p;u>=0;u--)(p=r[u])&&(n=(o?p(e,t,n):p(n))||n);return o&&n&&l(e,t,n),n},d=(r,e)=>(t,o)=>e(t,o,r);var O={};h(O,{TokenAccountStateContextLoader:()=>i});module.exports=x(O);var c=require("inversify"),a=require("purify-ts"),C=require("../../../../config/di/configTypes"),T=require("../../../../modules/multichain/pki/di/pkiTypes"),m=require("../../../../modules/solana/token-account-state/di/tokenAccountStateTypes"),s=require("../../../../shared/model/ClearSignContext"),f=require("../../../../shared/utils/challengeBoundLoader"),A=require("../../../../shared/utils/deviceModelIdCodec");const L=[s.ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE],I=a.Codec.interface({tokenAccount:a.string,challenge:a.string}),P=a.Codec.interface({deviceModelId:A.deviceModelIdCodec,requests:(0,a.array)(I)});let i=class{constructor(e,t,o){this.dataSource=e;this.certificateLoader=t;this.logger=o("TokenAccountStateContextLoader")}logger;canHandle(e,t){return L.every(o=>t.includes(o))?P.decode(e).caseOf({Left:()=>!1,Right:({requests:o})=>o.length>0&&o.every(n=>n.tokenAccount.length>0&&n.challenge.length>0)}):!1}async load(e){return(0,f.loadChallengeBoundContexts)({requests:e.requests,deviceModelId:e.deviceModelId,certificateLoader:this.certificateLoader,logger:this.logger,label:"TOKEN_ACCOUNT_STATE",fetch:t=>this.dataSource.getTokenAccountState(t),toContext:(t,o)=>{const n={descriptor:t.descriptor};return{type:s.ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE,payload:n,certificate:o}},describe:t=>({tokenAccount:t.tokenAccount})})}};i=g([(0,c.injectable)(),d(0,(0,c.inject)(m.tokenAccountStateTypes.TokenAccountStateDataSource)),d(1,(0,c.inject)(T.pkiTypes.PkiCertificateLoader)),d(2,(0,c.inject)(C.configTypes.ContextModuleLoggerFactory))],i);0&&(module.exports={TokenAccountStateContextLoader});
|
|
2
|
+
//# sourceMappingURL=TokenAccountStateContextLoader.js.map
|
package/lib/cjs/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.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 SolanaTokenAccountStatePayload } from \"@/modules/solana/model/SolanaPayloads\";\nimport { type TokenAccountStateDataSource } from \"@/modules/solana/token-account-state/data/TokenAccountStateDataSource\";\nimport { tokenAccountStateTypes } from \"@/modules/solana/token-account-state/di/tokenAccountStateTypes\";\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\";\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE,\n];\n\n/**\n * One token-account-state request. The caller must obtain a fresh challenge\n * immediately before fetching each entry.\n */\nexport type SolanaTokenAccountStateRequest = {\n tokenAccount: string;\n challenge: string;\n};\n\nexport type SolanaTokenAccountStateContextInput = {\n deviceModelId: DeviceModelId;\n requests: SolanaTokenAccountStateRequest[];\n};\n\nconst tokenAccountStateRequestCodec = Codec.interface({\n tokenAccount: string,\n challenge: string,\n});\n\nconst solanaTokenAccountStateInputCodec = Codec.interface({\n deviceModelId: deviceModelIdCodec,\n requests: array(tokenAccountStateRequestCodec),\n});\n\n@injectable()\nexport class TokenAccountStateContextLoader\n implements ContextLoader<SolanaTokenAccountStateContextInput>\n{\n private readonly logger: LoggerPublisherService;\n\n constructor(\n @inject(tokenAccountStateTypes.TokenAccountStateDataSource)\n private readonly dataSource: TokenAccountStateDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this.logger = loggerFactory(\"TokenAccountStateContextLoader\");\n }\n\n public canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is SolanaTokenAccountStateContextInput {\n if (!SUPPORTED_TYPES.every((t) => expectedTypes.includes(t))) return false;\n return solanaTokenAccountStateInputCodec.decode(input).caseOf({\n Left: () => false,\n Right: ({ requests }) =>\n requests.length > 0 &&\n requests.every(\n (r) => r.tokenAccount.length > 0 && r.challenge.length > 0,\n ),\n });\n }\n\n public async load(\n input: SolanaTokenAccountStateContextInput,\n ): Promise<ClearSignContext[]> {\n return loadChallengeBoundContexts({\n requests: input.requests,\n deviceModelId: input.deviceModelId,\n certificateLoader: this.certificateLoader,\n logger: this.logger,\n label: \"TOKEN_ACCOUNT_STATE\",\n fetch: (request) => this.dataSource.getTokenAccountState(request),\n toContext: (value, certificate) => {\n const payload: SolanaTokenAccountStatePayload = {\n descriptor: value.descriptor,\n };\n return {\n type: ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE,\n payload,\n certificate,\n };\n },\n describe: (request) => ({ tokenAccount: request.tokenAccount }),\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oCAAAE,IAAA,eAAAC,EAAAH,GAIA,IAAAI,EAAmC,qBACnCC,EAAqC,qBAErCC,EAA4B,mCAC5BC,EAAyB,gDAIzBC,EAAuC,0EAEvCC,EAGO,2CACPC,EAA2C,+CAC3CC,EAAmC,6CAEnC,MAAMC,EAA0C,CAC9C,uBAAqB,0BACvB,EAgBMC,EAAgC,QAAM,UAAU,CACpD,aAAc,SACd,UAAW,QACb,CAAC,EAEKC,EAAoC,QAAM,UAAU,CACxD,cAAe,qBACf,YAAU,SAAMD,CAA6B,CAC/C,CAAC,EAGM,IAAME,EAAN,KAEP,CAGE,YAEmBC,EAEAC,EAEjBC,EACA,CALiB,gBAAAF,EAEA,uBAAAC,EAIjB,KAAK,OAASC,EAAc,gCAAgC,CAC9D,CAXiB,OAaV,UACLC,EACAC,EAC8C,CAC9C,OAAKR,EAAgB,MAAOS,GAAMD,EAAc,SAASC,CAAC,CAAC,EACpDP,EAAkC,OAAOK,CAAK,EAAE,OAAO,CAC5D,KAAM,IAAM,GACZ,MAAO,CAAC,CAAE,SAAAG,CAAS,IACjBA,EAAS,OAAS,GAClBA,EAAS,MACNC,GAAMA,EAAE,aAAa,OAAS,GAAKA,EAAE,UAAU,OAAS,CAC3D,CACJ,CAAC,EARoE,EASvE,CAEA,MAAa,KACXJ,EAC6B,CAC7B,SAAO,8BAA2B,CAChC,SAAUA,EAAM,SAChB,cAAeA,EAAM,cACrB,kBAAmB,KAAK,kBACxB,OAAQ,KAAK,OACb,MAAO,sBACP,MAAQK,GAAY,KAAK,WAAW,qBAAqBA,CAAO,EAChE,UAAW,CAACC,EAAOC,IAAgB,CACjC,MAAMC,EAA0C,CAC9C,WAAYF,EAAM,UACpB,EACA,MAAO,CACL,KAAM,uBAAqB,2BAC3B,QAAAE,EACA,YAAAD,CACF,CACF,EACA,SAAWF,IAAa,CAAE,aAAcA,EAAQ,YAAa,EAC/D,CAAC,CACH,CACF,EAtDaT,EAANa,EAAA,IADN,cAAW,EAOPC,EAAA,eAAO,yBAAuB,2BAA2B,GAEzDA,EAAA,eAAO,WAAS,oBAAoB,GAEpCA,EAAA,eAAO,cAAY,0BAA0B,IAVrCd",
|
|
6
|
+
"names": ["TokenAccountStateContextLoader_exports", "__export", "TokenAccountStateContextLoader", "__toCommonJS", "import_inversify", "import_purify_ts", "import_configTypes", "import_pkiTypes", "import_tokenAccountStateTypes", "import_ClearSignContext", "import_challengeBoundLoader", "import_deviceModelIdCodec", "SUPPORTED_TYPES", "tokenAccountStateRequestCodec", "solanaTokenAccountStateInputCodec", "TokenAccountStateContextLoader", "dataSource", "certificateLoader", "loggerFactory", "input", "expectedTypes", "t", "requests", "r", "request", "value", "certificate", "payload", "__decorateClass", "__decorateParam"]
|
|
7
|
+
}
|
package/lib/cjs/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.test.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var c=require("@ledgerhq/device-management-kit"),s=require("purify-ts"),e=require("vitest"),o=require("../../../../shared/model/ClearSignContext"),A=require("./TokenAccountStateContextLoader");const u=()=>({debug:e.vi.fn(),info:e.vi.fn(),warn:e.vi.fn(),error:e.vi.fn(),subscribers:[]}),x={keyUsageNumber:8,payload:new Uint8Array([66])},a="TokenAccountUSDCxxxxxxxxxxxxxxxxxxxxxxxxxxx",d="TokenAccountSOLxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";(0,e.describe)("TokenAccountStateContextLoader",()=>{let i,l;(0,e.beforeEach)(()=>{e.vi.restoreAllMocks(),i={getTokenAccountState:e.vi.fn()},l={loadCertificate:e.vi.fn().mockResolvedValue(x)}});const r=()=>new A.TokenAccountStateContextLoader(i,l,u);(0,e.describe)("canHandle",()=>{(0,e.it)("returns true when SOLANA_TOKEN_ACCOUNT_STATE is requested and requests are well-formed",()=>{(0,e.expect)(r().canHandle({deviceModelId:c.DeviceModelId.NANO_X,requests:[{tokenAccount:a,challenge:"c1"}]},[o.ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE])).toBe(!0)}),(0,e.it)("returns false when SOLANA_TOKEN_ACCOUNT_STATE is not requested",()=>{(0,e.expect)(r().canHandle({deviceModelId:c.DeviceModelId.NANO_X,requests:[{tokenAccount:a,challenge:"c1"}]},[o.ClearSignContextType.SOLANA_TOKEN])).toBe(!1)}),(0,e.it)("returns false on malformed input",()=>{const t=r(),n=[o.ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE];(0,e.expect)(t.canHandle({requests:[]},n)).toBe(!1),(0,e.expect)(t.canHandle({requests:[{tokenAccount:"",challenge:"c"}]},n)).toBe(!1),(0,e.expect)(t.canHandle({requests:[{tokenAccount:a,challenge:""}]},n)).toBe(!1),(0,e.expect)(t.canHandle(null,n)).toBe(!1)})}),(0,e.describe)("load",()=>{(0,e.it)("emits one SOLANA_TOKEN_ACCOUNT_STATE per request with certificate",async()=>{e.vi.spyOn(i,"getTokenAccountState").mockImplementation(async({tokenAccount:n})=>(0,s.Right)({tokenAccount:n,descriptor:new Uint8Array([171,205]),keyId:"k1",keyUsage:"coin_meta"}));const t=await r().load({deviceModelId:c.DeviceModelId.NANO_X,requests:[{tokenAccount:a,challenge:"c1"},{tokenAccount:d,challenge:"c2"}]});(0,e.expect)(t).toHaveLength(2),(0,e.expect)(t[0]).toMatchObject({type:o.ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE,payload:{descriptor:new Uint8Array([171,205])},certificate:x}),(0,e.expect)(l.loadCertificate).toHaveBeenCalledWith({keyId:"k1",keyUsage:"coin_meta",targetDevice:c.DeviceModelId.NANO_X})}),(0,e.it)("emits an ERROR (not a cert-less success) when the certificate resolves undefined",async()=>{e.vi.spyOn(l,"loadCertificate").mockResolvedValue(void 0),e.vi.spyOn(i,"getTokenAccountState").mockImplementation(async({tokenAccount:n})=>(0,s.Right)({tokenAccount:n,descriptor:new Uint8Array([171]),keyId:"k",keyUsage:"u"}));const t=await r().load({deviceModelId:c.DeviceModelId.NANO_X,requests:[{tokenAccount:a,challenge:"c1"}]});(0,e.expect)(t).toHaveLength(1),(0,e.expect)(t[0]?.type).toBe(o.ClearSignContextType.ERROR),(0,e.expect)(t[0].error.message).toMatch(/certificate is missing/)}),(0,e.it)("emits an ERROR per failing request and keeps the others",async()=>{e.vi.spyOn(i,"getTokenAccountState").mockImplementation(async({tokenAccount:n})=>n===a?(0,s.Right)({tokenAccount:n,descriptor:new Uint8Array([171]),keyId:"k",keyUsage:"u"}):(0,s.Left)(new Error("upstream-404")));const t=await r().load({deviceModelId:c.DeviceModelId.NANO_X,requests:[{tokenAccount:a,challenge:"c1"},{tokenAccount:d,challenge:"c2"}]});(0,e.expect)(t[0]?.type).toBe(o.ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE),(0,e.expect)(t[1]?.type).toBe(o.ClearSignContextType.ERROR)})})});
|
|
2
|
+
//# sourceMappingURL=TokenAccountStateContextLoader.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.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 PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { type TokenAccountStateDataSource } from \"@/modules/solana/token-account-state/data/TokenAccountStateDataSource\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { TokenAccountStateContextLoader } from \"./TokenAccountStateContextLoader\";\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 TA_USDC = \"TokenAccountUSDCxxxxxxxxxxxxxxxxxxxxxxxxxxx\";\nconst TA_SOL = \"TokenAccountSOLxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\";\n\ndescribe(\"TokenAccountStateContextLoader\", () => {\n let dataSource: TokenAccountStateDataSource;\n let certificateLoader: PkiCertificateLoader;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n dataSource = {\n getTokenAccountState: vi.fn(),\n };\n certificateLoader = {\n loadCertificate: vi.fn().mockResolvedValue(mockCertificate),\n };\n });\n\n const makeLoader = () =>\n new TokenAccountStateContextLoader(\n dataSource,\n certificateLoader,\n mockLoggerFactory,\n );\n\n describe(\"canHandle\", () => {\n it(\"returns true when SOLANA_TOKEN_ACCOUNT_STATE is requested and requests are well-formed\", () => {\n expect(\n makeLoader().canHandle(\n {\n deviceModelId: DeviceModelId.NANO_X,\n requests: [{ tokenAccount: TA_USDC, challenge: \"c1\" }],\n },\n [ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE],\n ),\n ).toBe(true);\n });\n\n it(\"returns false when SOLANA_TOKEN_ACCOUNT_STATE is not requested\", () => {\n expect(\n makeLoader().canHandle(\n {\n deviceModelId: DeviceModelId.NANO_X,\n requests: [{ tokenAccount: TA_USDC, challenge: \"c1\" }],\n },\n [ClearSignContextType.SOLANA_TOKEN],\n ),\n ).toBe(false);\n });\n\n it(\"returns false on malformed input\", () => {\n const loader = makeLoader();\n const types = [ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE];\n expect(loader.canHandle({ requests: [] } as any, types)).toBe(false);\n expect(\n loader.canHandle(\n { requests: [{ tokenAccount: \"\", challenge: \"c\" }] } as any,\n types,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n { requests: [{ tokenAccount: TA_USDC, challenge: \"\" }] } as any,\n types,\n ),\n ).toBe(false);\n expect(loader.canHandle(null, types)).toBe(false);\n });\n });\n\n describe(\"load\", () => {\n it(\"emits one SOLANA_TOKEN_ACCOUNT_STATE per request with certificate\", async () => {\n vi.spyOn(dataSource, \"getTokenAccountState\").mockImplementation(\n async ({ tokenAccount }) =>\n Right({\n tokenAccount,\n descriptor: new Uint8Array([0xab, 0xcd]),\n keyId: \"k1\",\n keyUsage: \"coin_meta\",\n }),\n );\n\n const result = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n requests: [\n { tokenAccount: TA_USDC, challenge: \"c1\" },\n { tokenAccount: TA_SOL, challenge: \"c2\" },\n ],\n });\n\n expect(result).toHaveLength(2);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE,\n payload: { descriptor: new Uint8Array([0xab, 0xcd]) },\n certificate: mockCertificate,\n });\n expect(certificateLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: \"k1\",\n keyUsage: \"coin_meta\",\n targetDevice: DeviceModelId.NANO_X,\n });\n });\n\n it(\"emits an ERROR (not a cert-less success) when the certificate resolves undefined\", async () => {\n vi.spyOn(certificateLoader, \"loadCertificate\").mockResolvedValue(\n undefined,\n );\n vi.spyOn(dataSource, \"getTokenAccountState\").mockImplementation(\n async ({ tokenAccount }) =>\n Right({\n tokenAccount,\n descriptor: new Uint8Array([0xab]),\n keyId: \"k\",\n keyUsage: \"u\",\n }),\n );\n\n const out = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n requests: [{ tokenAccount: TA_USDC, challenge: \"c1\" }],\n });\n\n expect(out).toHaveLength(1);\n expect(out[0]?.type).toBe(ClearSignContextType.ERROR);\n expect((out[0] as any).error.message).toMatch(/certificate is missing/);\n });\n\n it(\"emits an ERROR per failing request and keeps the others\", async () => {\n vi.spyOn(dataSource, \"getTokenAccountState\").mockImplementation(\n async ({ tokenAccount }) => {\n if (tokenAccount === TA_USDC) {\n return Right({\n tokenAccount,\n descriptor: new Uint8Array([0xab]),\n keyId: \"k\",\n keyUsage: \"u\",\n });\n }\n return Left(new Error(\"upstream-404\"));\n },\n );\n\n const out = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n requests: [\n { tokenAccount: TA_USDC, challenge: \"c1\" },\n { tokenAccount: TA_SOL, challenge: \"c2\" },\n ],\n });\n\n expect(out[0]?.type).toBe(\n ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE,\n );\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_vitest", "import_ClearSignContext", "import_TokenAccountStateContextLoader", "mockLoggerFactory", "mockCertificate", "TA_USDC", "TA_SOL", "dataSource", "certificateLoader", "makeLoader", "loader", "types", "tokenAccount", "result", "out"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var f=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var C=(n,e)=>{for(var i in e)f(n,i,{get:e[i],enumerable:!0})},y=(n,e,i,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of g(e))!h.call(n,o)&&o!==i&&f(n,o,{get:()=>e[o],enumerable:!(r=l(e,o))||r.enumerable});return n};var w=n=>y(f({},"__esModule",{value:!0}),n),m=(n,e,i,r)=>{for(var o=r>1?void 0:r?l(e,i):e,a=n.length-1,p;a>=0;a--)(p=n[a])&&(o=(r?p(e,i,o):p(o))||o);return r&&o&&f(e,i,o),o},d=(n,e)=>(i,r)=>e(i,r,n);var I={};C(I,{HttpTokenInfoDataSource:()=>c});module.exports=w(I);var s=require("inversify"),t=require("purify-ts"),u=require("../../../../config/di/configTypes"),k=require("../../../../shared/network/di/networkTypes");const E=t.Codec.interface({prod:(0,t.optional)(t.string),test:(0,t.optional)(t.string)}),T=t.Codec.interface({descriptor:t.Codec.interface({data:t.string,signatures:E})});let c=class{constructor(e,i){this.config=e;this.http=i}async getTokenInfo({mint:e,network:i}){let r;try{r=await this.http.get(`${this.config.cal.url}/tokens`,{params:{contract_address:e,network:i,output:"contract_address,network,descriptor",ref:`branch:${this.config.cal.branch}`}})}catch(o){const a=o instanceof Error?o.message:String(o);return(0,t.Left)(new Error(`[ContextModule] HttpTokenInfoDataSource: Failed to fetch token info: ${a}`))}return!Array.isArray(r)||r.length===0?(0,t.Left)(new Error(`[ContextModule] HttpTokenInfoDataSource: no token info for mint ${e}`)):T.decode(r[0]).caseOf({Left:o=>(0,t.Left)(new Error(`[ContextModule] HttpTokenInfoDataSource: malformed descriptor for mint ${e}: ${o}`)),Right:o=>(0,t.Right)({mint:e,descriptor:o.descriptor})})}};c=m([(0,s.injectable)(),d(0,(0,s.inject)(u.configTypes.Config)),d(1,(0,s.inject)(k.networkTypes.NetworkClient))],c);0&&(module.exports={HttpTokenInfoDataSource});
|
|
2
|
+
//# sourceMappingURL=HttpTokenInfoDataSource.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/token-info/data/HttpTokenInfoDataSource.ts"],
|
|
4
|
+
"sourcesContent": ["import { DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Codec, Either, Left, optional, Right, string } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { networkTypes } from \"@/shared/network/di/networkTypes\";\n\nimport {\n type GetTokenInfoParams,\n type TokenInfoDataSource,\n type TokenInfoResult,\n} from \"./TokenInfoDataSource\";\n\nconst calSignaturesCodec = Codec.interface({\n prod: optional(string),\n test: optional(string),\n});\n\nconst tokenInfoResponseEntryCodec = Codec.interface({\n descriptor: Codec.interface({\n data: string,\n signatures: calSignaturesCodec,\n }),\n});\n\n@injectable()\nexport class HttpTokenInfoDataSource implements TokenInfoDataSource {\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 getTokenInfo({\n mint,\n network,\n }: GetTokenInfoParams): Promise<Either<Error, TokenInfoResult>> {\n let data: unknown;\n try {\n data = await this.http.get(`${this.config.cal.url}/tokens`, {\n params: {\n contract_address: mint,\n network,\n output: \"contract_address,network,descriptor\",\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] HttpTokenInfoDataSource: Failed to fetch token info: ${reason}`,\n ),\n );\n }\n\n if (!Array.isArray(data) || data.length === 0) {\n return Left(\n new Error(\n `[ContextModule] HttpTokenInfoDataSource: no token info for mint ${mint}`,\n ),\n );\n }\n\n return tokenInfoResponseEntryCodec\n .decode(data[0])\n .caseOf<Either<Error, TokenInfoResult>>({\n Left: (error) =>\n Left(\n new Error(\n `[ContextModule] HttpTokenInfoDataSource: malformed descriptor for mint ${mint}: ${error}`,\n ),\n ),\n Right: (entry) =>\n Right({\n mint,\n descriptor: entry.descriptor,\n }),\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,6BAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAAmC,qBACnCC,EAA6D,qBAE7DC,EAA4B,mCAE5BC,EAA6B,4CAQ7B,MAAMC,EAAqB,QAAM,UAAU,CACzC,QAAM,YAAS,QAAM,EACrB,QAAM,YAAS,QAAM,CACvB,CAAC,EAEKC,EAA8B,QAAM,UAAU,CAClD,WAAY,QAAM,UAAU,CAC1B,KAAM,SACN,WAAYD,CACd,CAAC,CACH,CAAC,EAGM,IAAME,EAAN,KAA6D,CAClE,YAEmBC,EAEAC,EACjB,CAHiB,YAAAD,EAEA,UAAAC,CAChB,CAEH,MAAa,aAAa,CACxB,KAAAC,EACA,QAAAC,CACF,EAAgE,CAC9D,IAAIC,EACJ,GAAI,CACFA,EAAO,MAAM,KAAK,KAAK,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,UAAW,CAC1D,OAAQ,CACN,iBAAkBF,EAClB,QAAAC,EACA,OAAQ,sCACR,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,wEAAwEC,CAAM,EAChF,CACF,CACF,CAEA,MAAI,CAAC,MAAM,QAAQF,CAAI,GAAKA,EAAK,SAAW,KACnC,QACL,IAAI,MACF,mEAAmEF,CAAI,EACzE,CACF,EAGKJ,EACJ,OAAOM,EAAK,CAAC,CAAC,EACd,OAAuC,CACtC,KAAOC,MACL,QACE,IAAI,MACF,0EAA0EH,CAAI,KAAKG,CAAK,EAC1F,CACF,EACF,MAAQE,MACN,SAAM,CACJ,KAAAL,EACA,WAAYK,EAAM,UACpB,CAAC,CACL,CAAC,CACL,CACF,EAvDaR,EAANS,EAAA,IADN,cAAW,EAGPC,EAAA,eAAO,cAAY,MAAM,GAEzBA,EAAA,eAAO,eAAa,aAAa,IAJzBV",
|
|
6
|
+
"names": ["HttpTokenInfoDataSource_exports", "__export", "HttpTokenInfoDataSource", "__toCommonJS", "import_inversify", "import_purify_ts", "import_configTypes", "import_networkTypes", "calSignaturesCodec", "tokenInfoResponseEntryCodec", "HttpTokenInfoDataSource", "config", "http", "mint", "network", "data", "error", "reason", "entry", "__decorateClass", "__decorateParam"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var s=require("purify-ts"),t=require("vitest"),c=require("./HttpTokenInfoDataSource");(0,t.describe)("HttpTokenInfoDataSource",()=>{let n,o;const e="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",a="solana-mainnet",i={cal:{url:"https://global.api.prd.ledger.com/cal/v1",mode:"prod",branch:"main"}};(0,t.beforeEach)(()=>{t.vi.clearAllMocks(),o={get:t.vi.fn()},n=new c.HttpTokenInfoDataSource(i,o)}),(0,t.it)("calls /tokens with contract_address, network and ref params",async()=>{o.get.mockResolvedValue([{contract_address:e,network:"solana-mainnet",descriptor:{data:"01020304",signatures:{prod:"p",test:"t"}}}]),await n.getTokenInfo({mint:e,network:a}),(0,t.expect)(o.get).toHaveBeenCalledWith("https://global.api.prd.ledger.com/cal/v1/tokens",{params:{contract_address:e,network:a,output:"contract_address,network,descriptor",ref:"branch:main"}})}),(0,t.it)("returns Right on success",async()=>{o.get.mockResolvedValue([{contract_address:e,descriptor:{data:"01020304",signatures:{prod:"psig",test:"tsig"}}}]);const r=await n.getTokenInfo({mint:e,network:a});(0,t.expect)(r).toEqual((0,s.Right)({mint:e,descriptor:{data:"01020304",signatures:{prod:"psig",test:"tsig"}}}))}),(0,t.it)("returns Left when response is empty",async()=>{o.get.mockResolvedValue([]);const r=await n.getTokenInfo({mint:e,network:a});(0,t.expect)(r).toEqual((0,s.Left)(new Error(`[ContextModule] HttpTokenInfoDataSource: no token info for mint ${e}`)))}),(0,t.it)("returns Left when descriptor is malformed",async()=>{o.get.mockResolvedValue([{contract_address:e}]);const r=await n.getTokenInfo({mint:e,network:a});(0,t.expect)(r.isLeft()).toBe(!0),(0,t.expect)(r.extract().message).toMatch(new RegExp(String.raw`\[ContextModule\] HttpTokenInfoDataSource: malformed descriptor for mint ${e}:`))}),(0,t.it)("returns Left when HTTP client throws",async()=>{o.get.mockRejectedValue(new Error("net"));const r=await n.getTokenInfo({mint:e,network:a});(0,t.expect)(r).toEqual((0,s.Left)(new Error("[ContextModule] HttpTokenInfoDataSource: Failed to fetch token info: net")))})});
|
|
2
|
+
//# sourceMappingURL=HttpTokenInfoDataSource.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/token-info/data/HttpTokenInfoDataSource.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\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\n\nimport { HttpTokenInfoDataSource } from \"./HttpTokenInfoDataSource\";\nimport { type TokenInfoDataSource } from \"./TokenInfoDataSource\";\n\ndescribe(\"HttpTokenInfoDataSource\", () => {\n let datasource: TokenInfoDataSource;\n let httpMock: { get: ReturnType<typeof vi.fn> };\n const mint = \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\";\n const network = \"solana-mainnet\";\n const config: ContextModuleServiceConfig = {\n cal: {\n url: \"https://global.api.prd.ledger.com/cal/v1\",\n mode: \"prod\",\n branch: \"main\",\n },\n } as ContextModuleServiceConfig;\n\n beforeEach(() => {\n vi.clearAllMocks();\n httpMock = { get: vi.fn() };\n datasource = new HttpTokenInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n });\n\n it(\"calls /tokens with contract_address, network and ref params\", async () => {\n httpMock.get.mockResolvedValue([\n {\n contract_address: mint,\n network: \"solana-mainnet\",\n descriptor: { data: \"01020304\", signatures: { prod: \"p\", test: \"t\" } },\n },\n ]);\n\n await datasource.getTokenInfo({ mint, network });\n\n expect(httpMock.get).toHaveBeenCalledWith(\n \"https://global.api.prd.ledger.com/cal/v1/tokens\",\n {\n params: {\n contract_address: mint,\n network,\n output: \"contract_address,network,descriptor\",\n ref: \"branch:main\",\n },\n },\n );\n });\n\n it(\"returns Right on success\", async () => {\n httpMock.get.mockResolvedValue([\n {\n contract_address: mint,\n descriptor: {\n data: \"01020304\",\n signatures: { prod: \"psig\", test: \"tsig\" },\n },\n },\n ]);\n\n const result = await datasource.getTokenInfo({ mint, network });\n\n expect(result).toEqual(\n Right({\n mint,\n descriptor: {\n data: \"01020304\",\n signatures: { prod: \"psig\", test: \"tsig\" },\n },\n }),\n );\n });\n\n it(\"returns Left when response is empty\", async () => {\n httpMock.get.mockResolvedValue([]);\n\n const result = await datasource.getTokenInfo({ mint, network });\n\n expect(result).toEqual(\n Left(\n new Error(\n `[ContextModule] HttpTokenInfoDataSource: no token info for mint ${mint}`,\n ),\n ),\n );\n });\n\n it(\"returns Left when descriptor is malformed\", async () => {\n httpMock.get.mockResolvedValue([{ contract_address: mint } as any]);\n\n const result = await datasource.getTokenInfo({ mint, network });\n\n expect(result.isLeft()).toBe(true);\n expect((result.extract() as Error).message).toMatch(\n new RegExp(\n String.raw`\\[ContextModule\\] HttpTokenInfoDataSource: malformed descriptor for mint ${mint}:`,\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.getTokenInfo({ mint, network });\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpTokenInfoDataSource: Failed to fetch token info: net\",\n ),\n ),\n );\n });\n});\n"],
|
|
5
|
+
"mappings": "aAEA,IAAAA,EAA4B,qBAC5BC,EAAqD,kBAIrDC,EAAwC,wCAGxC,YAAS,0BAA2B,IAAM,CACxC,IAAIC,EACAC,EACJ,MAAMC,EAAO,+CACPC,EAAU,iBACVC,EAAqC,CACzC,IAAK,CACH,IAAK,2CACL,KAAM,OACN,OAAQ,MACV,CACF,KAEA,cAAW,IAAM,CACf,KAAG,cAAc,EACjBH,EAAW,CAAE,IAAK,KAAG,GAAG,CAAE,EAC1BD,EAAa,IAAI,0BACfI,EACAH,CACF,CACF,CAAC,KAED,MAAG,8DAA+D,SAAY,CAC5EA,EAAS,IAAI,kBAAkB,CAC7B,CACE,iBAAkBC,EAClB,QAAS,iBACT,WAAY,CAAE,KAAM,WAAY,WAAY,CAAE,KAAM,IAAK,KAAM,GAAI,CAAE,CACvE,CACF,CAAC,EAED,MAAMF,EAAW,aAAa,CAAE,KAAAE,EAAM,QAAAC,CAAQ,CAAC,KAE/C,UAAOF,EAAS,GAAG,EAAE,qBACnB,kDACA,CACE,OAAQ,CACN,iBAAkBC,EAClB,QAAAC,EACA,OAAQ,sCACR,IAAK,aACP,CACF,CACF,CACF,CAAC,KAED,MAAG,2BAA4B,SAAY,CACzCF,EAAS,IAAI,kBAAkB,CAC7B,CACE,iBAAkBC,EAClB,WAAY,CACV,KAAM,WACN,WAAY,CAAE,KAAM,OAAQ,KAAM,MAAO,CAC3C,CACF,CACF,CAAC,EAED,MAAMG,EAAS,MAAML,EAAW,aAAa,CAAE,KAAAE,EAAM,QAAAC,CAAQ,CAAC,KAE9D,UAAOE,CAAM,EAAE,WACb,SAAM,CACJ,KAAAH,EACA,WAAY,CACV,KAAM,WACN,WAAY,CAAE,KAAM,OAAQ,KAAM,MAAO,CAC3C,CACF,CAAC,CACH,CACF,CAAC,KAED,MAAG,sCAAuC,SAAY,CACpDD,EAAS,IAAI,kBAAkB,CAAC,CAAC,EAEjC,MAAMI,EAAS,MAAML,EAAW,aAAa,CAAE,KAAAE,EAAM,QAAAC,CAAQ,CAAC,KAE9D,UAAOE,CAAM,EAAE,WACb,QACE,IAAI,MACF,mEAAmEH,CAAI,EACzE,CACF,CACF,CACF,CAAC,KAED,MAAG,4CAA6C,SAAY,CAC1DD,EAAS,IAAI,kBAAkB,CAAC,CAAE,iBAAkBC,CAAK,CAAQ,CAAC,EAElE,MAAMG,EAAS,MAAML,EAAW,aAAa,CAAE,KAAAE,EAAM,QAAAC,CAAQ,CAAC,KAE9D,UAAOE,EAAO,OAAO,CAAC,EAAE,KAAK,EAAI,KACjC,UAAQA,EAAO,QAAQ,EAAY,OAAO,EAAE,QAC1C,IAAI,OACF,OAAO,+EAA+EH,CAAI,GAC5F,CACF,CACF,CAAC,KAED,MAAG,uCAAwC,SAAY,CACrDD,EAAS,IAAI,kBAAkB,IAAI,MAAM,KAAK,CAAC,EAE/C,MAAMI,EAAS,MAAML,EAAW,aAAa,CAAE,KAAAE,EAAM,QAAAC,CAAQ,CAAC,KAE9D,UAAOE,CAAM,EAAE,WACb,QACE,IAAI,MACF,0EACF,CACF,CACF,CACF,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["import_purify_ts", "import_vitest", "import_HttpTokenInfoDataSource", "datasource", "httpMock", "mint", "network", "config", "result"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var o=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var f=(e,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of a(t))!p.call(e,r)&&r!==s&&o(e,r,{get:()=>t[r],enumerable:!(n=i(t,r))||n.enumerable});return e};var g=e=>f(o({},"__esModule",{value:!0}),e);var m={};module.exports=g(m);
|
|
2
|
+
//# sourceMappingURL=TokenInfoDataSource.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/token-info/data/TokenInfoDataSource.ts"],
|
|
4
|
+
"sourcesContent": ["import { type Either } from \"purify-ts\";\n\nexport type GetTokenInfoParams = {\n mint: string;\n network: string;\n};\n\nexport type TokenInfoResult = {\n mint: string;\n descriptor: {\n data: string;\n signatures: { prod?: string; test?: string };\n };\n};\n\n/**\n * Resolves the CAL `TOKEN_INFO` descriptor for a given Solana mint pubkey.\n * The lookup key is the on-chain mint pubkey, rather than the legacy CAL\n * internal token id consumed by the existing {@link TokenContextLoader}.\n */\nexport interface TokenInfoDataSource {\n getTokenInfo(\n params: GetTokenInfoParams,\n ): Promise<Either<Error, TokenInfoResult>>;\n}\n"],
|
|
5
|
+
"mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
|
|
6
|
+
"names": ["TokenInfoDataSource_exports", "__toCommonJS"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var r=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var i=(o,t)=>{for(var n in t)r(o,n,{get:t[n],enumerable:!0})},u=(o,t,n,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of T(t))!c.call(o,e)&&e!==n&&r(o,e,{get:()=>t[e],enumerable:!(a=I(t,e))||a.enumerable});return o};var d=o=>u(r({},"__esModule",{value:!0}),o);var C={};i(C,{tokenInfoModuleFactory:()=>x});module.exports=d(C);var m=require("inversify"),p=require("../../../../modules/solana/token-info/data/HttpTokenInfoDataSource"),f=require("../../../../modules/solana/token-info/di/tokenInfoTypes"),k=require("../../../../modules/solana/token-info/domain/TokenInfoContextLoader");const x=()=>new m.ContainerModule(({bind:o})=>{o(f.tokenInfoTypes.TokenInfoDataSource).to(p.HttpTokenInfoDataSource),o(f.tokenInfoTypes.TokenInfoContextLoader).to(k.TokenInfoContextLoader)});0&&(module.exports={tokenInfoModuleFactory});
|
|
2
|
+
//# sourceMappingURL=tokenInfoModuleFactory.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/token-info/di/tokenInfoModuleFactory.ts"],
|
|
4
|
+
"sourcesContent": ["import { ContainerModule } from \"inversify\";\n\nimport { HttpTokenInfoDataSource } from \"@/modules/solana/token-info/data/HttpTokenInfoDataSource\";\nimport { tokenInfoTypes } from \"@/modules/solana/token-info/di/tokenInfoTypes\";\nimport { TokenInfoContextLoader } from \"@/modules/solana/token-info/domain/TokenInfoContextLoader\";\n\nexport const tokenInfoModuleFactory = () =>\n new ContainerModule(({ bind }) => {\n bind(tokenInfoTypes.TokenInfoDataSource).to(HttpTokenInfoDataSource);\n bind(tokenInfoTypes.TokenInfoContextLoader).to(TokenInfoContextLoader);\n });\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,4BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAgC,qBAEhCC,EAAwC,oEACxCC,EAA+B,yDAC/BC,EAAuC,qEAEhC,MAAML,EAAyB,IACpC,IAAI,kBAAgB,CAAC,CAAE,KAAAM,CAAK,IAAM,CAChCA,EAAK,iBAAe,mBAAmB,EAAE,GAAG,yBAAuB,EACnEA,EAAK,iBAAe,sBAAsB,EAAE,GAAG,wBAAsB,CACvE,CAAC",
|
|
6
|
+
"names": ["tokenInfoModuleFactory_exports", "__export", "tokenInfoModuleFactory", "__toCommonJS", "import_inversify", "import_HttpTokenInfoDataSource", "import_tokenInfoTypes", "import_TokenInfoContextLoader", "bind"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var f=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var I=Object.prototype.hasOwnProperty;var T=(e,o)=>{for(var t in o)f(e,t,{get:o[t],enumerable:!0})},S=(e,o,t,r)=>{if(o&&typeof o=="object"||typeof o=="function")for(let n of k(o))!I.call(e,n)&&n!==t&&f(e,n,{get:()=>o[n],enumerable:!(r=a(o,n))||r.enumerable});return e};var c=e=>S(f({},"__esModule",{value:!0}),e);var y={};T(y,{tokenInfoTypes:()=>x});module.exports=c(y);const x={TokenInfoDataSource:Symbol.for("TokenInfoDataSource"),TokenInfoContextLoader:Symbol.for("TokenInfoContextLoader")};0&&(module.exports={tokenInfoTypes});
|
|
2
|
+
//# sourceMappingURL=tokenInfoTypes.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/token-info/di/tokenInfoTypes.ts"],
|
|
4
|
+
"sourcesContent": ["export const tokenInfoTypes = {\n TokenInfoDataSource: Symbol.for(\"TokenInfoDataSource\"),\n TokenInfoContextLoader: Symbol.for(\"TokenInfoContextLoader\"),\n};\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oBAAAE,IAAA,eAAAC,EAAAH,GAAO,MAAME,EAAiB,CAC5B,oBAAqB,OAAO,IAAI,qBAAqB,EACrD,uBAAwB,OAAO,IAAI,wBAAwB,CAC7D",
|
|
6
|
+
"names": ["tokenInfoTypes_exports", "__export", "tokenInfoTypes", "__toCommonJS"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var m=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var w=Object.prototype.hasOwnProperty;var K=(n,e)=>{for(var r in e)m(n,r,{get:e[r],enumerable:!0})},_=(n,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of M(e))!w.call(n,t)&&t!==r&&m(n,t,{get:()=>e[t],enumerable:!(o=I(e,t))||o.enumerable});return n};var F=n=>_(m({},"__esModule",{value:!0}),n),T=(n,e,r,o)=>{for(var t=o>1?void 0:o?I(e,r):e,d=n.length-1,i;d>=0;d--)(i=n[d])&&(t=(o?i(e,r,t):i(t))||t);return o&&t&&m(e,r,t),t},f=(n,e)=>(r,o)=>e(r,o,n);var U={};K(U,{TokenInfoContextLoader:()=>g});module.exports=F(U);var c=require("inversify"),s=require("purify-ts"),y=require("../../../../config/di/configTypes"),k=require("../../../../modules/multichain/pki/di/pkiTypes"),S=require("../../../../modules/multichain/pki/model/KeyId"),O=require("../../../../modules/multichain/pki/model/KeyUsage"),v=require("../../../../modules/solana/token-info/di/tokenInfoTypes"),l=require("../../../../shared/model/ClearSignContext"),h=require("../../../../shared/utils/certificateResult"),x=require("../../../../shared/utils/deviceModelIdCodec");const b=[l.ClearSignContextType.SOLANA_TOKEN_INFO],D="solana-mainnet",A=s.Codec.interface({deviceModelId:x.deviceModelIdCodec,mints:(0,s.array)(s.string),network:(0,s.optional)(s.string)});let g=class{constructor(e,r,o,t){this.dataSource=e;this.config=r;this.certificateLoader=o;this.logger=t("TokenInfoContextLoader")}logger;canHandle(e,r){return b.every(o=>r.includes(o))?A.decode(e).caseOf({Left:()=>!1,Right:({mints:o})=>o.length>0&&o.every(t=>t.length>0)}):!1}async load(e){const r=e.network||D,o=Array.from(new Set(e.mints));this.logger.debug("[load] Fetching TOKEN_INFO descriptors",{data:{network:r,mintCount:o.length}});const t=(0,h.loadCertificateResult)(this.certificateLoader,{keyId:S.KeyId.TokenMetadataKey,keyUsage:O.KeyUsage.CoinMeta,targetDevice:e.deviceModelId}),d=Promise.all(o.map(async a=>({mint:a,either:await this.dataSource.getTokenInfo({mint:a,network:r})}))),[i,R]=await Promise.all([t,d]);if(!i.ok||!i.value){const a=i.ok?new Error("[ContextModule] TokenInfoContextLoader: certificate is missing"):i.error;return this.logger.warn("[load] TOKEN_INFO certificate unavailable",{data:{error:a.message}}),o.map(()=>({type:l.ClearSignContextType.ERROR,error:a}))}const L=i.value,u=this.config.cal.mode??"prod";return R.map(({mint:a,either:P})=>P.caseOf({Left:p=>(this.logger.warn("[load] TOKEN_INFO fetch failed",{data:{mint:a,error:p.message}}),{type:l.ClearSignContextType.ERROR,error:p}),Right:p=>{const C=p.descriptor.signatures[u];if(!C){const N=new Error(`[ContextModule] TokenInfoContextLoader: missing '${u}' signature for mint ${a}`);return this.logger.warn("[load] TOKEN_INFO missing signature",{data:{mint:a,mode:u}}),{type:l.ClearSignContextType.ERROR,error:N}}const E={mint:a,descriptor:{data:p.descriptor.data,signature:C}};return{type:l.ClearSignContextType.SOLANA_TOKEN_INFO,payload:E,certificate:L}}}))}};g=T([(0,c.injectable)(),f(0,(0,c.inject)(v.tokenInfoTypes.TokenInfoDataSource)),f(1,(0,c.inject)(y.configTypes.Config)),f(2,(0,c.inject)(k.pkiTypes.PkiCertificateLoader)),f(3,(0,c.inject)(y.configTypes.ContextModuleLoggerFactory))],g);0&&(module.exports={TokenInfoContextLoader});
|
|
2
|
+
//# sourceMappingURL=TokenInfoContextLoader.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/token-info/domain/TokenInfoContextLoader.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 { type SolanaTokenInfoPayload } from \"@/modules/solana/model/SolanaPayloads\";\nimport {\n type TokenInfoDataSource,\n type TokenInfoResult,\n} from \"@/modules/solana/token-info/data/TokenInfoDataSource\";\nimport { tokenInfoTypes } from \"@/modules/solana/token-info/di/tokenInfoTypes\";\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\";\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.SOLANA_TOKEN_INFO,\n];\n\nconst NETWORK_DEFAULT = \"solana-mainnet\";\n\n/**\n * Input shape for the new clear-signing token-info lookup. The dedup key\n * is the on-chain **mint pubkey**, not the legacy Ledger CAL internal id\n * used by the original {@link TokenContextLoader}.\n */\nexport type SolanaTokenInfoContextInput = {\n deviceModelId: DeviceModelId;\n mints: string[];\n network?: string;\n};\n\nconst solanaTokenInfoInputCodec = Codec.interface({\n deviceModelId: deviceModelIdCodec,\n mints: array(string),\n network: optional(string),\n});\n\n@injectable()\nexport class TokenInfoContextLoader\n implements ContextLoader<SolanaTokenInfoContextInput>\n{\n private readonly logger: LoggerPublisherService;\n\n constructor(\n @inject(tokenInfoTypes.TokenInfoDataSource)\n private readonly dataSource: TokenInfoDataSource,\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(\"TokenInfoContextLoader\");\n }\n\n public canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is SolanaTokenInfoContextInput {\n if (!SUPPORTED_TYPES.every((t) => expectedTypes.includes(t))) return false;\n return solanaTokenInfoInputCodec.decode(input).caseOf({\n Left: () => false,\n Right: ({ mints }) =>\n mints.length > 0 && mints.every((m) => m.length > 0),\n });\n }\n\n public async load(\n input: SolanaTokenInfoContextInput,\n ): Promise<ClearSignContext[]> {\n const network = input.network || NETWORK_DEFAULT;\n const uniqueMints = Array.from(new Set(input.mints));\n\n this.logger.debug(\"[load] Fetching TOKEN_INFO descriptors\", {\n data: { network, mintCount: uniqueMints.length },\n });\n\n // Cert load and per-mint fetches are independent \u2014 kick them off\n // together. The tagged-Result wrapper on the cert lets us still\n // return per-mint ERROR contexts on PKI failure without dropping\n // the data fetches that already started.\n const certPromise = loadCertificateResult(this.certificateLoader, {\n keyId: KeyId.TokenMetadataKey,\n keyUsage: KeyUsage.CoinMeta,\n targetDevice: input.deviceModelId,\n });\n\n const dataPromise = Promise.all(\n uniqueMints.map(async (mint) => ({\n mint,\n either: await this.dataSource.getTokenInfo({ mint, 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] TokenInfoContextLoader: certificate is missing\",\n )\n : certResult.error;\n this.logger.warn(\"[load] TOKEN_INFO certificate unavailable\", {\n data: { error: error.message },\n });\n return uniqueMints.map(() => ({\n type: ClearSignContextType.ERROR,\n error,\n }));\n }\n const certificate = certResult.value;\n\n const mode = this.config.cal.mode ?? \"prod\";\n\n return results.map(({ mint, either }) =>\n either.caseOf<ClearSignContext>({\n Left: (error) => {\n this.logger.warn(\"[load] TOKEN_INFO fetch failed\", {\n data: { mint, error: error.message },\n });\n return { type: ClearSignContextType.ERROR, error };\n },\n Right: (value: TokenInfoResult) => {\n const signature = value.descriptor.signatures[mode];\n if (!signature) {\n const error = new Error(\n `[ContextModule] TokenInfoContextLoader: missing '${mode}' signature for mint ${mint}`,\n );\n this.logger.warn(\"[load] TOKEN_INFO missing signature\", {\n data: { mint, mode },\n });\n return { type: ClearSignContextType.ERROR, error };\n }\n const payload: SolanaTokenInfoPayload = {\n mint,\n descriptor: {\n data: value.descriptor.data,\n signature,\n },\n };\n return {\n type: ClearSignContextType.SOLANA_TOKEN_INFO,\n payload,\n certificate,\n };\n },\n }),\n );\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["TokenInfoContextLoader_exports", "__export", "TokenInfoContextLoader", "__toCommonJS", "import_inversify", "import_purify_ts", "import_configTypes", "import_pkiTypes", "import_KeyId", "import_KeyUsage", "import_tokenInfoTypes", "import_ClearSignContext", "import_certificateResult", "import_deviceModelIdCodec", "SUPPORTED_TYPES", "NETWORK_DEFAULT", "solanaTokenInfoInputCodec", "TokenInfoContextLoader", "dataSource", "config", "certificateLoader", "loggerFactory", "input", "expectedTypes", "t", "mints", "m", "network", "uniqueMints", "certPromise", "dataPromise", "mint", "certResult", "results", "error", "certificate", "mode", "either", "value", "signature", "payload", "__decorateClass", "__decorateParam"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var r=require("@ledgerhq/device-management-kit"),i=require("purify-ts"),e=require("vitest"),n=require("../../../../shared/model/ClearSignContext"),f=require("./TokenInfoContextLoader");const O=()=>({debug:e.vi.fn(),info:e.vi.fn(),warn:e.vi.fn(),error:e.vi.fn(),subscribers:[]}),p={keyUsageNumber:13,payload:new Uint8Array([16])},c={cal:{url:"https://global.api.prd.ledger.com/cal/v1",mode:"prod",branch:"main"}},o="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",l="So11111111111111111111111111111111111111112";(0,e.describe)("TokenInfoContextLoader",()=>{let d,m;(0,e.beforeEach)(()=>{e.vi.restoreAllMocks(),d={getTokenInfo:e.vi.fn()},m={loadCertificate:e.vi.fn().mockResolvedValue(p)}});const s=(t=c)=>new f.TokenInfoContextLoader(d,t,m,O);(0,e.describe)("canHandle",()=>{(0,e.it)("returns true when SOLANA_TOKEN_INFO is requested and mints are non-empty",()=>{(0,e.expect)(s().canHandle({deviceModelId:r.DeviceModelId.NANO_X,mints:[o]},[n.ClearSignContextType.SOLANA_TOKEN_INFO])).toBe(!0)}),(0,e.it)("returns false when SOLANA_TOKEN_INFO is not requested",()=>{(0,e.expect)(s().canHandle({deviceModelId:r.DeviceModelId.NANO_X,mints:[o]},[n.ClearSignContextType.SOLANA_TOKEN])).toBe(!1)}),(0,e.it)("returns false on missing / empty / malformed mints",()=>{const t=s(),a=[n.ClearSignContextType.SOLANA_TOKEN_INFO];(0,e.expect)(t.canHandle({},a)).toBe(!1),(0,e.expect)(t.canHandle({mints:[]},a)).toBe(!1),(0,e.expect)(t.canHandle({mints:[""]},a)).toBe(!1),(0,e.expect)(t.canHandle(null,a)).toBe(!1)})}),(0,e.describe)("load",()=>{(0,e.it)("emits one SOLANA_TOKEN_INFO per unique mint with certificate",async()=>{e.vi.spyOn(d,"getTokenInfo").mockImplementation(async({mint:a})=>(0,i.Right)({mint:a,descriptor:{data:`data_${a.slice(0,4)}`,signatures:{prod:`psig_${a.slice(0,4)}`,test:"tsig"}}}));const t=await s().load({deviceModelId:r.DeviceModelId.NANO_X,mints:[o,l,o]});(0,e.expect)(t).toHaveLength(2),(0,e.expect)(t[0]).toMatchObject({type:n.ClearSignContextType.SOLANA_TOKEN_INFO,payload:{mint:o,descriptor:{data:"data_EPjF",signature:"psig_EPjF"}},certificate:p}),(0,e.expect)(t[1]).toMatchObject({type:n.ClearSignContextType.SOLANA_TOKEN_INFO,payload:{mint:l,descriptor:{data:"data_So11",signature:"psig_So11"}}})}),(0,e.it)("emits an ERROR context per failing mint and keeps the others",async()=>{e.vi.spyOn(d,"getTokenInfo").mockImplementation(async({mint:a})=>a===o?(0,i.Right)({mint:a,descriptor:{data:"usdc_data",signatures:{prod:"psig",test:"tsig"}}}):(0,i.Left)(new Error("upstream-500")));const t=await s().load({deviceModelId:r.DeviceModelId.NANO_X,mints:[o,l]});(0,e.expect)(t).toHaveLength(2),(0,e.expect)(t[0]?.type).toBe(n.ClearSignContextType.SOLANA_TOKEN_INFO),(0,e.expect)(t[1]?.type).toBe(n.ClearSignContextType.ERROR)}),(0,e.it)("selects signature based on config.cal.mode (test)",async()=>{e.vi.spyOn(d,"getTokenInfo").mockResolvedValue((0,i.Right)({mint:o,descriptor:{data:"data",signatures:{prod:"p",test:"T"}}}));const t=await s({...c,cal:{...c.cal,mode:"test"}}).load({deviceModelId:r.DeviceModelId.NANO_X,mints:[o]});(0,e.expect)(t[0].payload.descriptor.signature).toBe("T")}),(0,e.it)("falls back to default network when input.network is omitted",async()=>{const t=e.vi.spyOn(d,"getTokenInfo").mockResolvedValue((0,i.Right)({mint:o,descriptor:{data:"x",signatures:{prod:"p",test:"t"}}}));await s().load({deviceModelId:r.DeviceModelId.NANO_X,mints:[o]}),(0,e.expect)(t).toHaveBeenCalledWith({mint:o,network:"solana-mainnet"})})})});
|
|
2
|
+
//# sourceMappingURL=TokenInfoContextLoader.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/token-info/domain/TokenInfoContextLoader.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 { type TokenInfoDataSource } from \"@/modules/solana/token-info/data/TokenInfoDataSource\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { TokenInfoContextLoader } from \"./TokenInfoContextLoader\";\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: 13,\n payload: new Uint8Array([0x10]),\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 USDC = \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\";\nconst SOL = \"So11111111111111111111111111111111111111112\";\n\ndescribe(\"TokenInfoContextLoader\", () => {\n let dataSource: TokenInfoDataSource;\n let certificateLoader: PkiCertificateLoader;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n dataSource = {\n getTokenInfo: vi.fn(),\n };\n certificateLoader = {\n loadCertificate: vi.fn().mockResolvedValue(mockCertificate),\n };\n });\n\n const makeLoader = (config = mockConfig) =>\n new TokenInfoContextLoader(\n dataSource,\n config,\n certificateLoader,\n mockLoggerFactory,\n );\n\n describe(\"canHandle\", () => {\n it(\"returns true when SOLANA_TOKEN_INFO is requested and mints are non-empty\", () => {\n expect(\n makeLoader().canHandle(\n { deviceModelId: DeviceModelId.NANO_X, mints: [USDC] },\n [ClearSignContextType.SOLANA_TOKEN_INFO],\n ),\n ).toBe(true);\n });\n\n it(\"returns false when SOLANA_TOKEN_INFO is not requested\", () => {\n expect(\n makeLoader().canHandle(\n { deviceModelId: DeviceModelId.NANO_X, mints: [USDC] },\n [ClearSignContextType.SOLANA_TOKEN],\n ),\n ).toBe(false);\n });\n\n it(\"returns false on missing / empty / malformed mints\", () => {\n const loader = makeLoader();\n const types = [ClearSignContextType.SOLANA_TOKEN_INFO];\n expect(loader.canHandle({} as any, types)).toBe(false);\n expect(loader.canHandle({ mints: [] } as any, types)).toBe(false);\n expect(loader.canHandle({ mints: [\"\"] } as any, types)).toBe(false);\n expect(loader.canHandle(null, types)).toBe(false);\n });\n });\n\n describe(\"load\", () => {\n it(\"emits one SOLANA_TOKEN_INFO per unique mint with certificate\", async () => {\n vi.spyOn(dataSource, \"getTokenInfo\").mockImplementation(\n async ({ mint }) =>\n Right({\n mint,\n descriptor: {\n data: `data_${mint.slice(0, 4)}`,\n signatures: { prod: `psig_${mint.slice(0, 4)}`, test: \"tsig\" },\n },\n }),\n );\n\n const result = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n mints: [USDC, SOL, USDC], // duplicate USDC must dedup\n });\n\n expect(result).toHaveLength(2);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.SOLANA_TOKEN_INFO,\n payload: {\n mint: USDC,\n descriptor: { data: \"data_EPjF\", signature: \"psig_EPjF\" },\n },\n certificate: mockCertificate,\n });\n expect(result[1]).toMatchObject({\n type: ClearSignContextType.SOLANA_TOKEN_INFO,\n payload: {\n mint: SOL,\n descriptor: { data: \"data_So11\", signature: \"psig_So11\" },\n },\n });\n });\n\n it(\"emits an ERROR context per failing mint and keeps the others\", async () => {\n vi.spyOn(dataSource, \"getTokenInfo\").mockImplementation(\n async ({ mint }) => {\n if (mint === USDC) {\n return Right({\n mint,\n descriptor: {\n data: \"usdc_data\",\n signatures: { prod: \"psig\", test: \"tsig\" },\n },\n });\n }\n return Left(new Error(\"upstream-500\"));\n },\n );\n\n const result = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n mints: [USDC, SOL],\n });\n\n expect(result).toHaveLength(2);\n expect(result[0]?.type).toBe(ClearSignContextType.SOLANA_TOKEN_INFO);\n expect(result[1]?.type).toBe(ClearSignContextType.ERROR);\n });\n\n it(\"selects signature based on config.cal.mode (test)\", async () => {\n vi.spyOn(dataSource, \"getTokenInfo\").mockResolvedValue(\n Right({\n mint: USDC,\n descriptor: {\n data: \"data\",\n signatures: { prod: \"p\", test: \"T\" },\n },\n }),\n );\n\n const result = await makeLoader({\n ...mockConfig,\n cal: { ...mockConfig.cal, mode: \"test\" },\n } as any).load({ deviceModelId: DeviceModelId.NANO_X, mints: [USDC] });\n\n expect((result[0] as any).payload.descriptor.signature).toBe(\"T\");\n });\n\n it(\"falls back to default network when input.network is omitted\", async () => {\n const spy = vi.spyOn(dataSource, \"getTokenInfo\").mockResolvedValue(\n Right({\n mint: USDC,\n descriptor: { data: \"x\", signatures: { prod: \"p\", test: \"t\" } },\n }),\n );\n\n await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n mints: [USDC],\n });\n\n expect(spy).toHaveBeenCalledWith({\n mint: USDC,\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_TokenInfoContextLoader", "mockLoggerFactory", "mockCertificate", "mockConfig", "USDC", "SOL", "dataSource", "certificateLoader", "makeLoader", "config", "loader", "types", "mint", "result", "spy"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var l=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var E=Object.prototype.hasOwnProperty;var x=(n,e)=>{for(var a in e)l(n,a,{get:e[a],enumerable:!0})},w=(n,e,a,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of k(e))!E.call(n,r)&&r!==a&&l(n,r,{get:()=>e[r],enumerable:!(i=y(e,r))||i.enumerable});return n};var M=n=>w(l({},"__esModule",{value:!0}),n),C=(n,e,a,i)=>{for(var r=i>1?void 0:i?y(e,a):e,s=n.length-1,o;s>=0;s--)(o=n[s])&&(r=(i?o(e,a,r):o(r))||r);return i&&r&&l(e,a,r),r},p=(n,e)=>(a,i)=>e(a,i,n);var D={};x(D,{HttpSolanaTrustedNameDataSource:()=>m});module.exports=M(D);var c=require("inversify"),t=require("purify-ts"),S=require("../../../../config/di/configTypes"),T=require("../../../../shared/model/SignatureTags"),h=require("../../../../shared/network/di/networkTypes"),d=require("../../../../shared/utils/HexStringUtils");const $=t.Codec.interface({signedDescriptor:t.Codec.interface({data:t.string,signatures:t.Codec.interface({prod:(0,t.optional)(t.string),test:(0,t.optional)(t.string)})}),keyId:t.string,keyUsage:t.string});let m=class{constructor(e,a){this.config=e;this.http=a}async getTrustedName({address:e,network:a,challenge:i,sources:r}){let s;try{s=await this.http.get(`${this.config.metadataServiceDomain.url}/v2/names/solana/${a}/reverse/${e}`,{params:{sources:r.join(","),challenge:i}})}catch(o){const u=o instanceof Error?o.message:String(o);return(0,t.Left)(new Error(`[ContextModule] HttpSolanaTrustedNameDataSource: Failed to fetch trusted name: ${u}`))}return $.decode(s).caseOf({Left:o=>(0,t.Left)(new Error(`[ContextModule] HttpSolanaTrustedNameDataSource: malformed response for ${e}: ${o}`)),Right:o=>{const u=this.config.cal.mode??"prod",f=o.signedDescriptor.signatures[u];if(!f)return(0,t.Left)(new Error(`[ContextModule] HttpSolanaTrustedNameDataSource: missing ${u} signature for ${e}`));let g;try{g=d.HexStringUtils.hexToBytes(d.HexStringUtils.appendSignatureToPayload(o.signedDescriptor.data,f,T.SIGNATURE_TAG))}catch(N){return(0,t.Left)(new Error(`[ContextModule] HttpSolanaTrustedNameDataSource: invalid signed descriptor for ${e}: ${N.message}`))}return(0,t.Right)({address:e,descriptor:g,keyId:o.keyId,keyUsage:o.keyUsage})}})}};m=C([(0,c.injectable)(),p(0,(0,c.inject)(S.configTypes.Config)),p(1,(0,c.inject)(h.networkTypes.NetworkClient))],m);0&&(module.exports={HttpSolanaTrustedNameDataSource});
|
|
2
|
+
//# sourceMappingURL=HttpTrustedNameDataSource.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.ts"],
|
|
4
|
+
"sourcesContent": ["import { DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Codec, Either, Left, optional, Right, string } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport {\n type ContextModuleCalMode,\n type ContextModuleServiceConfig,\n} from \"@/config/model/ContextModuleConfig\";\nimport { SIGNATURE_TAG } from \"@/shared/model/SignatureTags\";\nimport { networkTypes } from \"@/shared/network/di/networkTypes\";\nimport { HexStringUtils } from \"@/shared/utils/HexStringUtils\";\n\nimport {\n type GetSolanaTrustedNameParams,\n type SolanaTrustedNameDataSource,\n type SolanaTrustedNameResult,\n} from \"./TrustedNameDataSource\";\n\nconst trustedNameResponseCodec = Codec.interface({\n signedDescriptor: Codec.interface({\n data: string,\n signatures: Codec.interface({\n prod: optional(string),\n test: optional(string),\n }),\n }),\n keyId: string,\n keyUsage: string,\n});\n\n@injectable()\nexport class HttpSolanaTrustedNameDataSource\n implements SolanaTrustedNameDataSource\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 getTrustedName({\n address,\n network,\n challenge,\n sources,\n }: GetSolanaTrustedNameParams): Promise<\n Either<Error, SolanaTrustedNameResult>\n > {\n let dto: unknown;\n try {\n dto = await this.http.get(\n `${this.config.metadataServiceDomain.url}/v2/names/solana/${network}/reverse/${address}`,\n {\n params: {\n sources: sources.join(\",\"),\n challenge,\n },\n },\n );\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n return Left(\n new Error(\n `[ContextModule] HttpSolanaTrustedNameDataSource: Failed to fetch trusted name: ${reason}`,\n ),\n );\n }\n\n return trustedNameResponseCodec\n .decode(dto)\n .caseOf<Either<Error, SolanaTrustedNameResult>>({\n Left: (error) =>\n Left(\n new Error(\n `[ContextModule] HttpSolanaTrustedNameDataSource: malformed response for ${address}: ${error}`,\n ),\n ),\n Right: (validated) => {\n const mode: ContextModuleCalMode = this.config.cal.mode ?? \"prod\";\n const signature = validated.signedDescriptor.signatures[mode];\n if (!signature) {\n return Left(\n new Error(\n `[ContextModule] HttpSolanaTrustedNameDataSource: missing ${mode} signature for ${address}`,\n ),\n );\n }\n\n let descriptor: Uint8Array;\n try {\n descriptor = HexStringUtils.hexToBytes(\n HexStringUtils.appendSignatureToPayload(\n validated.signedDescriptor.data,\n signature,\n SIGNATURE_TAG,\n ),\n );\n } catch (error) {\n return Left(\n new Error(\n `[ContextModule] HttpSolanaTrustedNameDataSource: invalid signed descriptor for ${address}: ${(error as Error).message}`,\n ),\n );\n }\n\n return Right({\n address,\n descriptor,\n keyId: validated.keyId,\n keyUsage: validated.keyUsage,\n });\n },\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qCAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAAmC,qBACnCC,EAA6D,qBAE7DC,EAA4B,mCAK5BC,EAA8B,wCAC9BC,EAA6B,4CAC7BC,EAA+B,yCAQ/B,MAAMC,EAA2B,QAAM,UAAU,CAC/C,iBAAkB,QAAM,UAAU,CAChC,KAAM,SACN,WAAY,QAAM,UAAU,CAC1B,QAAM,YAAS,QAAM,EACrB,QAAM,YAAS,QAAM,CACvB,CAAC,CACH,CAAC,EACD,MAAO,SACP,SAAU,QACZ,CAAC,EAGM,IAAMC,EAAN,KAEP,CACE,YAEmBC,EAEAC,EACjB,CAHiB,YAAAD,EAEA,UAAAC,CAChB,CAEH,MAAa,eAAe,CAC1B,QAAAC,EACA,QAAAC,EACA,UAAAC,EACA,QAAAC,CACF,EAEE,CACA,IAAIC,EACJ,GAAI,CACFA,EAAM,MAAM,KAAK,KAAK,IACpB,GAAG,KAAK,OAAO,sBAAsB,GAAG,oBAAoBH,CAAO,YAAYD,CAAO,GACtF,CACE,OAAQ,CACN,QAASG,EAAQ,KAAK,GAAG,EACzB,UAAAD,CACF,CACF,CACF,CACF,OAASG,EAAO,CACd,MAAMC,EAASD,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EACpE,SAAO,QACL,IAAI,MACF,kFAAkFC,CAAM,EAC1F,CACF,CACF,CAEA,OAAOV,EACJ,OAAOQ,CAAG,EACV,OAA+C,CAC9C,KAAOC,MACL,QACE,IAAI,MACF,2EAA2EL,CAAO,KAAKK,CAAK,EAC9F,CACF,EACF,MAAQE,GAAc,CACpB,MAAMC,EAA6B,KAAK,OAAO,IAAI,MAAQ,OACrDC,EAAYF,EAAU,iBAAiB,WAAWC,CAAI,EAC5D,GAAI,CAACC,EACH,SAAO,QACL,IAAI,MACF,4DAA4DD,CAAI,kBAAkBR,CAAO,EAC3F,CACF,EAGF,IAAIU,EACJ,GAAI,CACFA,EAAa,iBAAe,WAC1B,iBAAe,yBACbH,EAAU,iBAAiB,KAC3BE,EACA,eACF,CACF,CACF,OAASJ,EAAO,CACd,SAAO,QACL,IAAI,MACF,kFAAkFL,CAAO,KAAMK,EAAgB,OAAO,EACxH,CACF,CACF,CAEA,SAAO,SAAM,CACX,QAAAL,EACA,WAAAU,EACA,MAAOH,EAAU,MACjB,SAAUA,EAAU,QACtB,CAAC,CACH,CACF,CAAC,CACL,CACF,EApFaV,EAANc,EAAA,IADN,cAAW,EAKPC,EAAA,eAAO,cAAY,MAAM,GAEzBA,EAAA,eAAO,eAAa,aAAa,IANzBf",
|
|
6
|
+
"names": ["HttpTrustedNameDataSource_exports", "__export", "HttpSolanaTrustedNameDataSource", "__toCommonJS", "import_inversify", "import_purify_ts", "import_configTypes", "import_SignatureTags", "import_networkTypes", "import_HexStringUtils", "trustedNameResponseCodec", "HttpSolanaTrustedNameDataSource", "config", "http", "address", "network", "challenge", "sources", "dto", "error", "reason", "validated", "mode", "signature", "descriptor", "__decorateClass", "__decorateParam"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var c=require("purify-ts"),e=require("vitest"),o=require("../../../../modules/solana/model/SolanaTransactionScanChainId"),u=require("./HttpTrustedNameDataSource");(0,e.describe)("HttpSolanaTrustedNameDataSource",()=>{let a,s;const r="vitalik.sol",n="deadbeef",l=(t="prod")=>({metadataServiceDomain:{url:"https://nft.api.ledger.com"},cal:{mode:t}}),d=(t="prod")=>new u.HttpSolanaTrustedNameDataSource(l(t),s),i=(t,m="ff00")=>({descriptorType:"name",descriptorVersion:"2",signedDescriptor:{data:m,signatures:t},keyId:"cal_trusted_name",keyUsage:"trusted_name"});(0,e.beforeEach)(()=>{e.vi.clearAllMocks(),s={get:e.vi.fn()},a=d()}),(0,e.it)("calls the names endpoint with network, sources and challenge (no types)",async()=>{s.get.mockResolvedValue(i({prod:"aabb"})),await a.getTrustedName({address:r,network:String(o.SolanaTransactionScanChainId.MAINNET),challenge:n,sources:["crypto_asset_list"]}),(0,e.expect)(s.get).toHaveBeenCalledWith(`https://nft.api.ledger.com/v2/names/solana/${o.SolanaTransactionScanChainId.MAINNET}/reverse/${r}`,{params:{sources:"crypto_asset_list",challenge:n}})}),(0,e.it)("appends the prod signature TLV and decodes into a Uint8Array",async()=>{s.get.mockResolvedValue(i({prod:"aabb",test:"cc"}));const t=await a.getTrustedName({address:r,network:String(o.SolanaTransactionScanChainId.MAINNET),challenge:n,sources:["crypto_asset_list"]});(0,e.expect)(t).toEqual((0,c.Right)({address:r,descriptor:new Uint8Array([255,0,21,2,170,187]),keyId:"cal_trusted_name",keyUsage:"trusted_name"}))}),(0,e.it)("selects the test signature when cal.mode is test",async()=>{a=d("test"),s.get.mockResolvedValue(i({prod:"aabb",test:"cc"}));const t=await a.getTrustedName({address:r,network:String(o.SolanaTransactionScanChainId.MAINNET),challenge:n,sources:["crypto_asset_list"]});(0,e.expect)(t).toEqual((0,c.Right)({address:r,descriptor:new Uint8Array([255,0,21,1,204]),keyId:"cal_trusted_name",keyUsage:"trusted_name"}))}),(0,e.it)("returns Left when the signature for the active mode is missing",async()=>{a=d("prod"),s.get.mockResolvedValue(i({test:"cc"}));const t=await a.getTrustedName({address:r,network:String(o.SolanaTransactionScanChainId.MAINNET),challenge:n,sources:["crypto_asset_list"]});(0,e.expect)(t.isLeft()).toBe(!0),(0,e.expect)(t.extract().message).toMatch(new RegExp(String.raw`\[ContextModule\] HttpSolanaTrustedNameDataSource: missing prod signature for ${r}`))}),(0,e.it)("returns Left on malformed response (hex-string signedDescriptor)",async()=>{s.get.mockResolvedValue({signedDescriptor:"01020304",keyId:"k",keyUsage:"u"});const t=await a.getTrustedName({address:r,network:String(o.SolanaTransactionScanChainId.MAINNET),challenge:n,sources:[]});(0,e.expect)(t.isLeft()).toBe(!0),(0,e.expect)(t.extract().message).toMatch(new RegExp(String.raw`\[ContextModule\] HttpSolanaTrustedNameDataSource: malformed response for ${r}:`))}),(0,e.it)("returns Left when HTTP client throws",async()=>{s.get.mockRejectedValue(new Error("net"));const t=await a.getTrustedName({address:r,network:String(o.SolanaTransactionScanChainId.MAINNET),challenge:n,sources:[]});(0,e.expect)(t).toEqual((0,c.Left)(new Error("[ContextModule] HttpSolanaTrustedNameDataSource: Failed to fetch trusted name: net")))})});
|
|
2
|
+
//# sourceMappingURL=HttpTrustedNameDataSource.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.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\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { SolanaTransactionScanChainId } from \"@/modules/solana/model/SolanaTransactionScanChainId\";\n\nimport { HttpSolanaTrustedNameDataSource } from \"./HttpTrustedNameDataSource\";\nimport { type SolanaTrustedNameDataSource } from \"./TrustedNameDataSource\";\n\ndescribe(\"HttpSolanaTrustedNameDataSource\", () => {\n let datasource: SolanaTrustedNameDataSource;\n let httpMock: { get: ReturnType<typeof vi.fn> };\n const address = \"vitalik.sol\";\n const challenge = \"deadbeef\";\n\n const makeConfig = (mode: \"prod\" | \"test\" = \"prod\") =>\n ({\n metadataServiceDomain: { url: \"https://nft.api.ledger.com\" },\n cal: { mode },\n }) as ContextModuleServiceConfig;\n\n const makeDatasource = (mode: \"prod\" | \"test\" = \"prod\") =>\n new HttpSolanaTrustedNameDataSource(\n makeConfig(mode),\n httpMock as unknown as DmkNetworkClient,\n );\n\n const objectResponse = (\n signatures: { prod?: string; test?: string },\n data = \"ff00\",\n ) => ({\n descriptorType: \"name\",\n descriptorVersion: \"2\",\n signedDescriptor: { data, signatures },\n keyId: \"cal_trusted_name\",\n keyUsage: \"trusted_name\",\n });\n\n beforeEach(() => {\n vi.clearAllMocks();\n httpMock = { get: vi.fn() };\n datasource = makeDatasource();\n });\n\n it(\"calls the names endpoint with network, sources and challenge (no types)\", async () => {\n httpMock.get.mockResolvedValue(objectResponse({ prod: \"aabb\" }));\n\n await datasource.getTrustedName({\n address,\n network: String(SolanaTransactionScanChainId.MAINNET),\n challenge,\n sources: [\"crypto_asset_list\"],\n });\n\n expect(httpMock.get).toHaveBeenCalledWith(\n `https://nft.api.ledger.com/v2/names/solana/${SolanaTransactionScanChainId.MAINNET}/reverse/${address}`,\n {\n params: {\n sources: \"crypto_asset_list\",\n challenge,\n },\n },\n );\n });\n\n it(\"appends the prod signature TLV and decodes into a Uint8Array\", async () => {\n httpMock.get.mockResolvedValue(\n objectResponse({ prod: \"aabb\", test: \"cc\" }),\n );\n\n const result = await datasource.getTrustedName({\n address,\n network: String(SolanaTransactionScanChainId.MAINNET),\n challenge,\n sources: [\"crypto_asset_list\"],\n });\n\n // data(ff00) + SIGNATURE_TAG(15) + len(02) + sig(aabb)\n expect(result).toEqual(\n Right({\n address,\n descriptor: new Uint8Array([0xff, 0x00, 0x15, 0x02, 0xaa, 0xbb]),\n keyId: \"cal_trusted_name\",\n keyUsage: \"trusted_name\",\n }),\n );\n });\n\n it(\"selects the test signature when cal.mode is test\", async () => {\n datasource = makeDatasource(\"test\");\n httpMock.get.mockResolvedValue(\n objectResponse({ prod: \"aabb\", test: \"cc\" }),\n );\n\n const result = await datasource.getTrustedName({\n address,\n network: String(SolanaTransactionScanChainId.MAINNET),\n challenge,\n sources: [\"crypto_asset_list\"],\n });\n\n // data(ff00) + SIGNATURE_TAG(15) + len(01) + sig(cc)\n expect(result).toEqual(\n Right({\n address,\n descriptor: new Uint8Array([0xff, 0x00, 0x15, 0x01, 0xcc]),\n keyId: \"cal_trusted_name\",\n keyUsage: \"trusted_name\",\n }),\n );\n });\n\n it(\"returns Left when the signature for the active mode is missing\", async () => {\n datasource = makeDatasource(\"prod\");\n httpMock.get.mockResolvedValue(objectResponse({ test: \"cc\" }));\n\n const result = await datasource.getTrustedName({\n address,\n network: String(SolanaTransactionScanChainId.MAINNET),\n challenge,\n sources: [\"crypto_asset_list\"],\n });\n\n expect(result.isLeft()).toBe(true);\n expect((result.extract() as Error).message).toMatch(\n new RegExp(\n String.raw`\\[ContextModule\\] HttpSolanaTrustedNameDataSource: missing prod signature for ${address}`,\n ),\n );\n });\n\n it(\"returns Left on malformed response (hex-string signedDescriptor)\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"01020304\",\n keyId: \"k\",\n keyUsage: \"u\",\n } as any);\n\n const result = await datasource.getTrustedName({\n address,\n network: String(SolanaTransactionScanChainId.MAINNET),\n challenge,\n sources: [],\n });\n\n expect(result.isLeft()).toBe(true);\n expect((result.extract() as Error).message).toMatch(\n new RegExp(\n String.raw`\\[ContextModule\\] HttpSolanaTrustedNameDataSource: malformed response for ${address}:`,\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.getTrustedName({\n address,\n network: String(SolanaTransactionScanChainId.MAINNET),\n challenge,\n sources: [],\n });\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpSolanaTrustedNameDataSource: Failed to fetch trusted name: net\",\n ),\n ),\n );\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_purify_ts", "import_vitest", "import_SolanaTransactionScanChainId", "import_HttpTrustedNameDataSource", "datasource", "httpMock", "address", "challenge", "makeConfig", "mode", "makeDatasource", "objectResponse", "signatures", "data", "result"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var s=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var m=(r,e,n,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of i(e))!d.call(r,t)&&t!==n&&s(r,t,{get:()=>e[t],enumerable:!(a=o(e,t))||a.enumerable});return r};var g=r=>m(s({},"__esModule",{value:!0}),r);var u={};module.exports=g(u);
|
|
2
|
+
//# sourceMappingURL=TrustedNameDataSource.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/trusted-name/data/TrustedNameDataSource.ts"],
|
|
4
|
+
"sourcesContent": ["import { type Either } from \"purify-ts\";\n\nexport type GetSolanaTrustedNameParams = {\n address: string;\n network: string;\n challenge: string;\n sources: string[];\n};\n\nexport type SolanaTrustedNameResult = {\n address: string;\n // Raw signed TLV bytes decoded from the backend response.\n descriptor: Uint8Array;\n keyId: string;\n keyUsage: string;\n};\n\nexport interface SolanaTrustedNameDataSource {\n getTrustedName(\n params: GetSolanaTrustedNameParams,\n ): Promise<Either<Error, SolanaTrustedNameResult>>;\n}\n"],
|
|
5
|
+
"mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
|
|
6
|
+
"names": ["TrustedNameDataSource_exports", "__toCommonJS"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var r=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var N=(o,a)=>{for(var t in a)r(o,t,{get:a[t],enumerable:!0})},S=(o,a,t,n)=>{if(a&&typeof a=="object"||typeof a=="function")for(let e of p(a))!T.call(o,e)&&e!==t&&r(o,e,{get:()=>a[e],enumerable:!(n=l(a,e))||n.enumerable});return o};var c=o=>S(r({},"__esModule",{value:!0}),o);var i={};N(i,{solanaTrustedNameModuleFactory:()=>f});module.exports=c(i);var s=require("inversify"),u=require("../../../../modules/solana/trusted-name/data/HttpTrustedNameDataSource"),m=require("../../../../modules/solana/trusted-name/di/trustedNameTypes"),d=require("../../../../modules/solana/trusted-name/domain/TrustedNameContextLoader");const f=()=>new s.ContainerModule(({bind:o})=>{o(m.solanaTrustedNameTypes.SolanaTrustedNameDataSource).to(u.HttpSolanaTrustedNameDataSource),o(m.solanaTrustedNameTypes.SolanaTrustedNameContextLoader).to(d.SolanaTrustedNameContextLoader)});0&&(module.exports={solanaTrustedNameModuleFactory});
|
|
2
|
+
//# sourceMappingURL=trustedNameModuleFactory.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/trusted-name/di/trustedNameModuleFactory.ts"],
|
|
4
|
+
"sourcesContent": ["import { ContainerModule } from \"inversify\";\n\nimport { HttpSolanaTrustedNameDataSource } from \"@/modules/solana/trusted-name/data/HttpTrustedNameDataSource\";\nimport { solanaTrustedNameTypes } from \"@/modules/solana/trusted-name/di/trustedNameTypes\";\nimport { SolanaTrustedNameContextLoader } from \"@/modules/solana/trusted-name/domain/TrustedNameContextLoader\";\n\nexport const solanaTrustedNameModuleFactory = () =>\n new ContainerModule(({ bind }) => {\n bind(solanaTrustedNameTypes.SolanaTrustedNameDataSource).to(\n HttpSolanaTrustedNameDataSource,\n );\n bind(solanaTrustedNameTypes.SolanaTrustedNameContextLoader).to(\n SolanaTrustedNameContextLoader,\n );\n });\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oCAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAgC,qBAEhCC,EAAgD,wEAChDC,EAAuC,6DACvCC,EAA+C,yEAExC,MAAML,EAAiC,IAC5C,IAAI,kBAAgB,CAAC,CAAE,KAAAM,CAAK,IAAM,CAChCA,EAAK,yBAAuB,2BAA2B,EAAE,GACvD,iCACF,EACAA,EAAK,yBAAuB,8BAA8B,EAAE,GAC1D,gCACF,CACF,CAAC",
|
|
6
|
+
"names": ["trustedNameModuleFactory_exports", "__export", "solanaTrustedNameModuleFactory", "__toCommonJS", "import_inversify", "import_HttpTrustedNameDataSource", "import_trustedNameTypes", "import_TrustedNameContextLoader", "bind"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var r=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var l=(e,a)=>{for(var t in a)r(e,t,{get:a[t],enumerable:!0})},m=(e,a,t,n)=>{if(a&&typeof a=="object"||typeof a=="function")for(let o of S(a))!d.call(e,o)&&o!==t&&r(e,o,{get:()=>a[o],enumerable:!(n=s(a,o))||n.enumerable});return e};var u=e=>m(r({},"__esModule",{value:!0}),e);var N={};l(N,{solanaTrustedNameTypes:()=>T});module.exports=u(N);const T={SolanaTrustedNameDataSource:Symbol.for("SolanaTrustedNameDataSource"),SolanaTrustedNameContextLoader:Symbol.for("SolanaTrustedNameContextLoader")};0&&(module.exports={solanaTrustedNameTypes});
|
|
2
|
+
//# sourceMappingURL=trustedNameTypes.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/trusted-name/di/trustedNameTypes.ts"],
|
|
4
|
+
"sourcesContent": ["export const solanaTrustedNameTypes = {\n SolanaTrustedNameDataSource: Symbol.for(\"SolanaTrustedNameDataSource\"),\n SolanaTrustedNameContextLoader: Symbol.for(\"SolanaTrustedNameContextLoader\"),\n};\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,4BAAAE,IAAA,eAAAC,EAAAH,GAAO,MAAME,EAAyB,CACpC,4BAA6B,OAAO,IAAI,6BAA6B,EACrE,+BAAgC,OAAO,IAAI,gCAAgC,CAC7E",
|
|
6
|
+
"names": ["trustedNameTypes_exports", "__export", "solanaTrustedNameTypes", "__toCommonJS"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var l=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var I=Object.getOwnPropertyNames;var E=Object.prototype.hasOwnProperty;var v=(a,e)=>{for(var o in e)l(a,o,{get:e[o],enumerable:!0})},x=(a,e,o,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of I(e))!E.call(a,t)&&t!==o&&l(a,t,{get:()=>e[t],enumerable:!(r=u(e,t))||r.enumerable});return a};var L=a=>x(l({},"__esModule",{value:!0}),a),T=(a,e,o,r)=>{for(var t=r>1?void 0:r?u(e,o):e,i=a.length-1,g;i>=0;i--)(g=a[i])&&(t=(r?g(e,o,t):g(t))||t);return r&&t&&l(e,o,t),t},p=(a,e)=>(o,r)=>e(o,r,a);var k={};v(k,{SolanaTrustedNameContextLoader:()=>d});module.exports=L(k);var s=require("inversify"),n=require("purify-ts"),f=require("../../../../config/di/configTypes"),C=require("../../../../modules/multichain/pki/di/pkiTypes"),c=require("../../../../modules/solana/model/SolanaTransactionScanChainId"),N=require("../../../../modules/solana/trusted-name/di/trustedNameTypes"),m=require("../../../../shared/model/ClearSignContext"),y=require("../../../../shared/utils/challengeBoundLoader"),h=require("../../../../shared/utils/deviceModelIdCodec");const M=[m.ClearSignContextType.SOLANA_TRUSTED_NAME],D={"solana-mainnet":c.SolanaTransactionScanChainId.MAINNET,"solana-devnet":c.SolanaTransactionScanChainId.DEVNET,"solana-testnet":c.SolanaTransactionScanChainId.TESTNET},S=c.SolanaTransactionScanChainId.MAINNET,A=n.Codec.interface({address:n.string,challenge:n.string,sources:(0,n.array)(n.string)}),R=n.Codec.interface({deviceModelId:h.deviceModelIdCodec,network:(0,n.optional)(n.string),requests:(0,n.array)(A)});let d=class{constructor(e,o,r){this.dataSource=e;this.certificateLoader=o;this.logger=r("SolanaTrustedNameContextLoader")}logger;canHandle(e,o){return M.every(r=>o.includes(r))?R.decode(e).caseOf({Left:()=>!1,Right:({requests:r})=>r.length>0&&r.every(t=>t.address.length>0&&t.challenge.length>0)}):!1}async load(e){const o=e.network?D[e.network]??S:S,r=String(o);return(0,y.loadChallengeBoundContexts)({requests:e.requests,deviceModelId:e.deviceModelId,certificateLoader:this.certificateLoader,logger:this.logger,label:"TRUSTED_NAME",fetch:t=>this.dataSource.getTrustedName({address:t.address,challenge:t.challenge,sources:t.sources,network:r}),toContext:(t,i)=>({type:m.ClearSignContextType.SOLANA_TRUSTED_NAME,payload:t.descriptor,certificate:i}),describe:t=>({address:t.address})})}};d=T([(0,s.injectable)(),p(0,(0,s.inject)(N.solanaTrustedNameTypes.SolanaTrustedNameDataSource)),p(1,(0,s.inject)(C.pkiTypes.PkiCertificateLoader)),p(2,(0,s.inject)(f.configTypes.ContextModuleLoggerFactory))],d);0&&(module.exports={SolanaTrustedNameContextLoader});
|
|
2
|
+
//# sourceMappingURL=TrustedNameContextLoader.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/trusted-name/domain/TrustedNameContextLoader.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 { pkiTypes } from \"@/modules/multichain/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { SolanaTransactionScanChainId } from \"@/modules/solana/model/SolanaTransactionScanChainId\";\nimport { type SolanaTrustedNameDataSource } from \"@/modules/solana/trusted-name/data/TrustedNameDataSource\";\nimport { solanaTrustedNameTypes } from \"@/modules/solana/trusted-name/di/trustedNameTypes\";\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\";\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.SOLANA_TRUSTED_NAME,\n];\n\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\nconst NETWORK_DEFAULT = SolanaTransactionScanChainId.MAINNET;\n\n/**\n * One trusted-name request, resolved to a Uint8Array TLV descriptor. The\n * caller must obtain a fresh challenge immediately before each fetch.\n */\nexport type SolanaTrustedNameRequest = {\n address: string;\n challenge: string;\n sources: string[];\n};\n\nexport type SolanaTrustedNameContextInput = {\n deviceModelId: DeviceModelId;\n network?: string; // \"mainnet\" | \"devnet\" | \"testnet\"; defaults to mainnet\n requests: SolanaTrustedNameRequest[];\n};\n\nconst trustedNameRequestCodec = Codec.interface({\n address: string,\n challenge: string,\n sources: array(string),\n});\n\nconst solanaTrustedNameInputCodec = Codec.interface({\n deviceModelId: deviceModelIdCodec,\n network: optional(string),\n requests: array(trustedNameRequestCodec),\n});\n\n@injectable()\nexport class SolanaTrustedNameContextLoader\n implements ContextLoader<SolanaTrustedNameContextInput>\n{\n private readonly logger: LoggerPublisherService;\n\n constructor(\n @inject(solanaTrustedNameTypes.SolanaTrustedNameDataSource)\n private readonly dataSource: SolanaTrustedNameDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this.logger = loggerFactory(\"SolanaTrustedNameContextLoader\");\n }\n\n public canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is SolanaTrustedNameContextInput {\n if (!SUPPORTED_TYPES.every((t) => expectedTypes.includes(t))) return false;\n return solanaTrustedNameInputCodec.decode(input).caseOf({\n Left: () => false,\n Right: ({ requests }) =>\n requests.length > 0 &&\n requests.every((r) => r.address.length > 0 && r.challenge.length > 0),\n });\n }\n\n public async load(\n input: SolanaTrustedNameContextInput,\n ): Promise<ClearSignContext[]> {\n const chainId = input.network\n ? (CHAIN_ID_BY_NETWORK[input.network] ?? NETWORK_DEFAULT)\n : NETWORK_DEFAULT;\n const network = String(chainId);\n\n return loadChallengeBoundContexts({\n requests: input.requests,\n deviceModelId: input.deviceModelId,\n certificateLoader: this.certificateLoader,\n logger: this.logger,\n label: \"TRUSTED_NAME\",\n fetch: (request) =>\n this.dataSource.getTrustedName({\n address: request.address,\n challenge: request.challenge,\n sources: request.sources,\n network,\n }),\n toContext: (value, certificate) => ({\n type: ClearSignContextType.SOLANA_TRUSTED_NAME,\n payload: value.descriptor,\n certificate,\n }),\n describe: (request) => ({ address: request.address }),\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oCAAAE,IAAA,eAAAC,EAAAH,GAIA,IAAAI,EAAmC,qBACnCC,EAA+C,qBAE/CC,EAA4B,mCAC5BC,EAAyB,gDAEzBC,EAA6C,+DAE7CC,EAAuC,6DAEvCC,EAGO,2CACPC,EAA2C,+CAC3CC,EAAmC,6CAEnC,MAAMC,EAA0C,CAC9C,uBAAqB,mBACvB,EAEMC,EAAoE,CACxE,iBAAkB,+BAA6B,QAC/C,gBAAiB,+BAA6B,OAC9C,iBAAkB,+BAA6B,OACjD,EAEMC,EAAkB,+BAA6B,QAkB/CC,EAA0B,QAAM,UAAU,CAC9C,QAAS,SACT,UAAW,SACX,WAAS,SAAM,QAAM,CACvB,CAAC,EAEKC,EAA8B,QAAM,UAAU,CAClD,cAAe,qBACf,WAAS,YAAS,QAAM,EACxB,YAAU,SAAMD,CAAuB,CACzC,CAAC,EAGM,IAAME,EAAN,KAEP,CAGE,YAEmBC,EAEAC,EAEjBC,EACA,CALiB,gBAAAF,EAEA,uBAAAC,EAIjB,KAAK,OAASC,EAAc,gCAAgC,CAC9D,CAXiB,OAaV,UACLC,EACAC,EACwC,CACxC,OAAKV,EAAgB,MAAOW,GAAMD,EAAc,SAASC,CAAC,CAAC,EACpDP,EAA4B,OAAOK,CAAK,EAAE,OAAO,CACtD,KAAM,IAAM,GACZ,MAAO,CAAC,CAAE,SAAAG,CAAS,IACjBA,EAAS,OAAS,GAClBA,EAAS,MAAOC,GAAMA,EAAE,QAAQ,OAAS,GAAKA,EAAE,UAAU,OAAS,CAAC,CACxE,CAAC,EANoE,EAOvE,CAEA,MAAa,KACXJ,EAC6B,CAC7B,MAAMK,EAAUL,EAAM,QACjBR,EAAoBQ,EAAM,OAAO,GAAKP,EACvCA,EACEa,EAAU,OAAOD,CAAO,EAE9B,SAAO,8BAA2B,CAChC,SAAUL,EAAM,SAChB,cAAeA,EAAM,cACrB,kBAAmB,KAAK,kBACxB,OAAQ,KAAK,OACb,MAAO,eACP,MAAQO,GACN,KAAK,WAAW,eAAe,CAC7B,QAASA,EAAQ,QACjB,UAAWA,EAAQ,UACnB,QAASA,EAAQ,QACjB,QAAAD,CACF,CAAC,EACH,UAAW,CAACE,EAAOC,KAAiB,CAClC,KAAM,uBAAqB,oBAC3B,QAASD,EAAM,WACf,YAAAC,CACF,GACA,SAAWF,IAAa,CAAE,QAASA,EAAQ,OAAQ,EACrD,CAAC,CACH,CACF,EA1DaX,EAANc,EAAA,IADN,cAAW,EAOPC,EAAA,eAAO,yBAAuB,2BAA2B,GAEzDA,EAAA,eAAO,WAAS,oBAAoB,GAEpCA,EAAA,eAAO,cAAY,0BAA0B,IAVrCf",
|
|
6
|
+
"names": ["TrustedNameContextLoader_exports", "__export", "SolanaTrustedNameContextLoader", "__toCommonJS", "import_inversify", "import_purify_ts", "import_configTypes", "import_pkiTypes", "import_SolanaTransactionScanChainId", "import_trustedNameTypes", "import_ClearSignContext", "import_challengeBoundLoader", "import_deviceModelIdCodec", "SUPPORTED_TYPES", "CHAIN_ID_BY_NETWORK", "NETWORK_DEFAULT", "trustedNameRequestCodec", "solanaTrustedNameInputCodec", "SolanaTrustedNameContextLoader", "dataSource", "certificateLoader", "loggerFactory", "input", "expectedTypes", "t", "requests", "r", "chainId", "network", "request", "value", "certificate", "__decorateClass", "__decorateParam"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var c=require("@ledgerhq/device-management-kit"),o=require("purify-ts"),e=require("vitest"),m=require("../../../../modules/solana/model/SolanaTransactionScanChainId"),r=require("../../../../shared/model/ClearSignContext"),y=require("./TrustedNameContextLoader");const A=()=>({debug:e.vi.fn(),info:e.vi.fn(),warn:e.vi.fn(),error:e.vi.fn(),subscribers:[]}),l={keyUsageNumber:4,payload:new Uint8Array([7])},t="Addr11111111111111111111111111111111111111",u="Addr22222222222222222222222222222222222222";(0,e.describe)("SolanaTrustedNameContextLoader",()=>{let d,i;(0,e.beforeEach)(()=>{e.vi.restoreAllMocks(),d={getTrustedName:e.vi.fn()},i={loadCertificate:e.vi.fn().mockResolvedValue(l)}});const n=()=>new y.SolanaTrustedNameContextLoader(d,i,A);(0,e.describe)("canHandle",()=>{(0,e.it)("returns true when SOLANA_TRUSTED_NAME is requested with valid requests",()=>{(0,e.expect)(n().canHandle({deviceModelId:c.DeviceModelId.NANO_X,requests:[{address:t,challenge:"c",sources:["sns"]}]},[r.ClearSignContextType.SOLANA_TRUSTED_NAME])).toBe(!0)}),(0,e.it)("returns false when SOLANA_TRUSTED_NAME is not requested",()=>{(0,e.expect)(n().canHandle({requests:[{address:t,challenge:"c",sources:["sns"]}]},[r.ClearSignContextType.SOLANA_TOKEN])).toBe(!1)}),(0,e.it)("returns false on malformed input",()=>{const a=n(),s=[r.ClearSignContextType.SOLANA_TRUSTED_NAME];(0,e.expect)(a.canHandle({requests:[]},s)).toBe(!1),(0,e.expect)(a.canHandle({requests:[{address:"",challenge:"c",sources:[]}]},s)).toBe(!1),(0,e.expect)(a.canHandle({requests:[{address:t,challenge:"",sources:[]}]},s)).toBe(!1)})}),(0,e.describe)("load",()=>{(0,e.it)("emits one SOLANA_TRUSTED_NAME per request with Uint8Array payload",async()=>{e.vi.spyOn(d,"getTrustedName").mockImplementation(async({address:s})=>(0,o.Right)({address:s,descriptor:new Uint8Array([s===t?170:187]),keyId:"name_key",keyUsage:"trusted_name"}));const a=await n().load({deviceModelId:c.DeviceModelId.NANO_X,requests:[{address:t,challenge:"c1",sources:["sns"]},{address:u,challenge:"c2",sources:["cal"]}]});(0,e.expect)(a).toHaveLength(2),(0,e.expect)(a[0]).toMatchObject({type:r.ClearSignContextType.SOLANA_TRUSTED_NAME,payload:new Uint8Array([170]),certificate:l}),(0,e.expect)(a[1]).toMatchObject({type:r.ClearSignContextType.SOLANA_TRUSTED_NAME,payload:new Uint8Array([187])})}),(0,e.it)("emits an ERROR per failing request and keeps the others",async()=>{e.vi.spyOn(d,"getTrustedName").mockImplementation(async({address:s})=>s===t?(0,o.Right)({address:s,descriptor:new Uint8Array([170]),keyId:"k",keyUsage:"u"}):(0,o.Left)(new Error("upstream-404")));const a=await n().load({deviceModelId:c.DeviceModelId.NANO_X,requests:[{address:t,challenge:"c1",sources:[]},{address:u,challenge:"c2",sources:[]}]});(0,e.expect)(a[0]?.type).toBe(r.ClearSignContextType.SOLANA_TRUSTED_NAME),(0,e.expect)(a[1]?.type).toBe(r.ClearSignContextType.ERROR)}),(0,e.it)("forwards default chain id 900 when input.network is omitted",async()=>{const a=e.vi.spyOn(d,"getTrustedName").mockResolvedValue((0,o.Right)({address:t,descriptor:new Uint8Array([1]),keyId:"k",keyUsage:"u"}));await n().load({deviceModelId:c.DeviceModelId.NANO_X,requests:[{address:t,challenge:"c",sources:[]}]}),(0,e.expect)(a).toHaveBeenCalledWith(e.expect.objectContaining({network:String(m.SolanaTransactionScanChainId.MAINNET)}))}),(0,e.it)("maps a cluster name to its numeric chain id",async()=>{const a=e.vi.spyOn(d,"getTrustedName").mockResolvedValue((0,o.Right)({address:t,descriptor:new Uint8Array([1]),keyId:"k",keyUsage:"u"}));await n().load({deviceModelId:c.DeviceModelId.NANO_X,network:"solana-devnet",requests:[{address:t,challenge:"c",sources:[]}]}),(0,e.expect)(a).toHaveBeenCalledWith(e.expect.objectContaining({network:"901"}))})})});
|
|
2
|
+
//# sourceMappingURL=TrustedNameContextLoader.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/trusted-name/domain/TrustedNameContextLoader.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 PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { SolanaTransactionScanChainId } from \"@/modules/solana/model/SolanaTransactionScanChainId\";\nimport { type SolanaTrustedNameDataSource } from \"@/modules/solana/trusted-name/data/TrustedNameDataSource\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { SolanaTrustedNameContextLoader } from \"./TrustedNameContextLoader\";\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: 4, payload: new Uint8Array([7]) };\nconst ADDR_A = \"Addr11111111111111111111111111111111111111\";\nconst ADDR_B = \"Addr22222222222222222222222222222222222222\";\n\ndescribe(\"SolanaTrustedNameContextLoader\", () => {\n let dataSource: SolanaTrustedNameDataSource;\n let certificateLoader: PkiCertificateLoader;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n dataSource = {\n getTrustedName: vi.fn(),\n };\n certificateLoader = {\n loadCertificate: vi.fn().mockResolvedValue(mockCertificate),\n };\n });\n\n const makeLoader = () =>\n new SolanaTrustedNameContextLoader(\n dataSource,\n certificateLoader,\n mockLoggerFactory,\n );\n\n describe(\"canHandle\", () => {\n it(\"returns true when SOLANA_TRUSTED_NAME is requested with valid requests\", () => {\n expect(\n makeLoader().canHandle(\n {\n deviceModelId: DeviceModelId.NANO_X,\n requests: [\n {\n address: ADDR_A,\n challenge: \"c\",\n sources: [\"sns\"],\n },\n ],\n },\n [ClearSignContextType.SOLANA_TRUSTED_NAME],\n ),\n ).toBe(true);\n });\n\n it(\"returns false when SOLANA_TRUSTED_NAME is not requested\", () => {\n expect(\n makeLoader().canHandle(\n {\n requests: [\n {\n address: ADDR_A,\n challenge: \"c\",\n sources: [\"sns\"],\n },\n ],\n } as any,\n [ClearSignContextType.SOLANA_TOKEN],\n ),\n ).toBe(false);\n });\n\n it(\"returns false on malformed input\", () => {\n const loader = makeLoader();\n const types = [ClearSignContextType.SOLANA_TRUSTED_NAME];\n expect(loader.canHandle({ requests: [] } as any, types)).toBe(false);\n expect(\n loader.canHandle(\n {\n requests: [{ address: \"\", challenge: \"c\", sources: [] }],\n } as any,\n types,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n {\n requests: [{ address: ADDR_A, challenge: \"\", sources: [] }],\n } as any,\n types,\n ),\n ).toBe(false);\n });\n });\n\n describe(\"load\", () => {\n it(\"emits one SOLANA_TRUSTED_NAME per request with Uint8Array payload\", async () => {\n vi.spyOn(dataSource, \"getTrustedName\").mockImplementation(\n async ({ address }) =>\n Right({\n address,\n descriptor: new Uint8Array([address === ADDR_A ? 0xaa : 0xbb]),\n keyId: \"name_key\",\n keyUsage: \"trusted_name\",\n }),\n );\n\n const result = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n requests: [\n {\n address: ADDR_A,\n challenge: \"c1\",\n sources: [\"sns\"],\n },\n {\n address: ADDR_B,\n challenge: \"c2\",\n sources: [\"cal\"],\n },\n ],\n });\n\n expect(result).toHaveLength(2);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.SOLANA_TRUSTED_NAME,\n payload: new Uint8Array([0xaa]),\n certificate: mockCertificate,\n });\n expect(result[1]).toMatchObject({\n type: ClearSignContextType.SOLANA_TRUSTED_NAME,\n payload: new Uint8Array([0xbb]),\n });\n });\n\n it(\"emits an ERROR per failing request and keeps the others\", async () => {\n vi.spyOn(dataSource, \"getTrustedName\").mockImplementation(\n async ({ address }) => {\n if (address === ADDR_A) {\n return Right({\n address,\n descriptor: new Uint8Array([0xaa]),\n keyId: \"k\",\n keyUsage: \"u\",\n });\n }\n return Left(new Error(\"upstream-404\"));\n },\n );\n\n const out = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n requests: [\n { address: ADDR_A, challenge: \"c1\", sources: [] },\n { address: ADDR_B, challenge: \"c2\", sources: [] },\n ],\n });\n\n expect(out[0]?.type).toBe(ClearSignContextType.SOLANA_TRUSTED_NAME);\n expect(out[1]?.type).toBe(ClearSignContextType.ERROR);\n });\n\n it(\"forwards default chain id 900 when input.network is omitted\", async () => {\n const spy = vi.spyOn(dataSource, \"getTrustedName\").mockResolvedValue(\n Right({\n address: ADDR_A,\n descriptor: new Uint8Array([1]),\n keyId: \"k\",\n keyUsage: \"u\",\n }),\n );\n\n await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n requests: [{ address: ADDR_A, challenge: \"c\", sources: [] }],\n });\n\n expect(spy).toHaveBeenCalledWith(\n expect.objectContaining({\n network: String(SolanaTransactionScanChainId.MAINNET),\n }),\n );\n });\n\n it(\"maps a cluster name to its numeric chain id\", async () => {\n const spy = vi.spyOn(dataSource, \"getTrustedName\").mockResolvedValue(\n Right({\n address: ADDR_A,\n descriptor: new Uint8Array([1]),\n keyId: \"k\",\n keyUsage: \"u\",\n }),\n );\n\n await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n network: \"solana-devnet\",\n requests: [{ address: ADDR_A, challenge: \"c\", sources: [] }],\n });\n\n expect(spy).toHaveBeenCalledWith(\n expect.objectContaining({ network: \"901\" }),\n );\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_device_management_kit", "import_purify_ts", "import_vitest", "import_SolanaTransactionScanChainId", "import_ClearSignContext", "import_TrustedNameContextLoader", "mockLoggerFactory", "mockCertificate", "ADDR_A", "ADDR_B", "dataSource", "certificateLoader", "makeLoader", "loader", "types", "address", "result", "out", "spy"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var o=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var O=(r,E)=>{for(var a in E)o(r,a,{get:E[a],enumerable:!0})},A=(r,E,a,t)=>{if(E&&typeof E=="object"||typeof E=="function")for(let s of _(E))!u.call(r,s)&&s!==a&&o(r,s,{get:()=>E[s],enumerable:!(t=c(E,s))||t.enumerable});return r};var n=r=>A(o({},"__esModule",{value:!0}),r);var T={};O(T,{ClearSignContextType:()=>N});module.exports=n(T);var N=(e=>(e.ERROR="error",e.CONCORDIUM_ACCOUNT_OWNERSHIP="concordiumAccountOwnership",e.ETHEREUM_TOKEN="ethereumToken",e.ETHEREUM_NFT="ethereumNft",e.ETHEREUM_TRUSTED_NAME="ethereumTrustedName",e.ETHEREUM_PLUGIN="ethereumPlugin",e.ETHEREUM_EXTERNAL_PLUGIN="ethereumExternalPlugin",e.ETHEREUM_TRANSACTION_INFO="ethereumTransactionInfo",e.ETHEREUM_PROXY_INFO="ethereumProxyInfo",e.ETHEREUM_ENUM="ethereumEnum",e.ETHEREUM_TRANSACTION_FIELD_DESCRIPTION="ethereumTransactionFieldDescription",e.ETHEREUM_TRANSACTION_CHECK="ethereumTransactionCheck",e.ETHEREUM_DYNAMIC_NETWORK="ethereumDynamicNetwork",e.ETHEREUM_DYNAMIC_NETWORK_ICON="ethereumDynamicNetworkIcon",e.ETHEREUM_SAFE="ethereumSafe",e.ETHEREUM_SIGNER="ethereumSigner",e.ETHEREUM_GATED_SIGNING="ethereumGatedSigning",e.SOLANA_TOKEN="solanaToken",e.SOLANA_LIFI="solanaLifi",e.SOLANA_TRUSTED_NAME="solanaTrustedName",e.SOLANA_BASIC_TRUSTED_NAME="solanaBasicTrustedName",e.SOLANA_TRANSACTION_CHECK="solanaTransactionCheck",e.SOLANA_INSTRUCTION_INFO="solanaInstructionInfo",e.SOLANA_ENUM_VARIANT="solanaEnumVariant",e.SOLANA_TOKEN_INFO="solanaTokenInfo",e.SOLANA_TOKEN_ACCOUNT_STATE="solanaTokenAccountState",e.SOLANA_ALT_RESOLUTION="solanaAltResolution",e))(N||{});0&&(module.exports={ClearSignContextType});
|
|
2
2
|
//# sourceMappingURL=ClearSignContext.js.map
|