@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,2 @@
|
|
|
1
|
+
import{describe as s,expect as t,it as a}from"vitest";import{toAccountResets as d,toDisplayFields as c,toInstructionInfoPayload as i,toProgramEnumVariants as p,toValueFlowPorts as u}from"./InstructionInfoMapper";const o="11111111111111111111111111111111";function n(e={}){return{discriminator_hex:"00000000",instruction_name:"createAccount",descriptor:{data:"0001sys_data",signatures:{prod:"prodsig",test:"testsig"}},...e}}s("InstructionInfoMapper",()=>{s("toValueFlowPorts",()=>{a("returns an empty list for undefined input",()=>{t(u()).toEqual([])}),a("picks only the decoded fields, dropping the signed-TLV descriptor",()=>{t(u([{descriptor:"vfp1",account_indices:[0,1],optional_account_strategy:"OMITTED",token_value:{kind:"NATIVE"}}])).toEqual([{account_indices:[0,1],optional_account_strategy:"OMITTED",token_value:{kind:"NATIVE"}}])}),a("leaves the absent optional strategy as undefined",()=>{t(u([{descriptor:"vfp1",account_indices:[0],token_value:{kind:"NATIVE"}}])).toEqual([{account_indices:[0],optional_account_strategy:void 0,token_value:{kind:"NATIVE"}}])})}),s("toAccountResets",()=>{a("returns an empty list for undefined input",()=>{t(d()).toEqual([])}),a("maps the decoded fields, dropping the signed-TLV descriptor",()=>{t(d([{descriptor:"ar1",account_index:2,require_pre_balance_zero:!0}])).toEqual([{account_index:2,require_pre_balance_zero:!0}])}),a("drops entries missing account_index instead of defaulting to slot 0",()=>{t(d([{descriptor:"ar0",account_index:0},{descriptor:"arBad"},{descriptor:"ar1",account_index:1}])).toEqual([{account_index:0,require_pre_balance_zero:void 0},{account_index:1,require_pre_balance_zero:void 0}])})}),s("toDisplayFields",()=>{a("returns an empty list for undefined input",()=>{t(c()).toEqual([])}),a("picks name and param, dropping the signed-TLV descriptor",()=>{t(c([{descriptor:"df1",name:"New Account",param:{type:"ACCOUNT",value:{source:"ACCOUNT_PATH",account_index:1}}}])).toEqual([{name:"New Account",param:{type:"ACCOUNT",value:{source:"ACCOUNT_PATH",account_index:1}}}])}),a("falls back to an empty-type param when param is absent",()=>{t(c([{descriptor:"df1"}])).toEqual([{name:void 0,param:{type:""}}])})}),s("toInstructionInfoPayload",()=>{a("surfaces CAL's decoded JSON (type pool, mint assoc, ports, resets, fields) and ordered substructures",()=>{const e=n({idl_descriptor:{root_type:3,type_pool:[{index:0,kind:"STRUCT",refs:[1]},{index:1,kind:"U64"}]},mint_association:{account_index:1,mint_index:3},display_fields:[{descriptor:"df1",name:"New Account",param:{type:"ACCOUNT",value:{source:"ACCOUNT_PATH",account_index:1}}}],value_flow_ports:[{descriptor:"vfp1",account_indices:[0],token_value:{kind:"NATIVE"}}],hide_rules:[{descriptor:"hr1"}],account_resets:[{descriptor:"ar1",account_index:1,require_pre_balance_zero:!0}]}),r=i(o,"00000000",e,"prod").unsafeCoerce();t(r).toMatchObject({programId:o,discriminator:"00000000",instructionInfo:{data:"0001sys_data",signature:"prodsig"},idlDescriptor:{rootType:3,typePool:[{index:0,kind:"STRUCT",refs:[1]},{index:1,kind:"U64"}]},mintAssociations:[{account_index:1,mint_index:3}],valueFlowPorts:[{account_indices:[0],optional_account_strategy:void 0,token_value:{kind:"NATIVE"}}],accountResets:[{account_index:1,require_pre_balance_zero:!0}],displayFields:[{name:"New Account",param:{type:"ACCOUNT",value:{source:"ACCOUNT_PATH",account_index:1}}}]}),t(r.substructures).toEqual([{kind:0,data:"df1"},{kind:1,data:"vfp1"},{kind:2,data:"hr1"},{kind:3,data:"ar1"}])}),a("defaults idlDescriptor when CAL omits it",()=>{const e=i(o,"00000000",n(),"prod").unsafeCoerce();t(e.idlDescriptor).toEqual({typePool:[],rootType:0}),t(e.mintAssociations).toEqual([])}),a("bundles CAL enum_variants into the payload with the mode signature",()=>{const e=n({enum_variants:{swap:{46:{variant_name:"raydiumCP",descriptor:{data:"01_raydium_tlv",signatures:{prod:"prodsig_v46",test:"testsig_v46"}}}}}}),r=i(o,"00000000",e,"prod").unsafeCoerce();t(r.enumVariants).toEqual([{enumId:"swap",variantIndex:46,descriptor:{data:"01_raydium_tlv",signature:"prodsig_v46"}}])}),a("skips enum_variants keyed by a non-u16 index instead of leaking NaN",()=>{const e=n({enum_variants:{swap:{46:{variant_name:"raydiumCP",descriptor:{data:"01_raydium_tlv",signatures:{prod:"prodsig_v46",test:"testsig_v46"}}},"7abc":{variant_name:"junk",descriptor:{data:"junk_tlv",signatures:{prod:"x",test:"x"}}},7e4:{variant_name:"overflow",descriptor:{data:"overflow_tlv",signatures:{prod:"x",test:"x"}}}}}}),r=i(o,"00000000",e,"prod").unsafeCoerce();t(r.enumVariants).toEqual([{enumId:"swap",variantIndex:46,descriptor:{data:"01_raydium_tlv",signature:"prodsig_v46"}}])}),a("selects the signature for the configured mode",()=>{const e=i(o,"00000000",n(),"test").unsafeCoerce();t(e.instructionInfo.signature).toBe("testsig")}),a("returns Left when the configured mode signature is missing",()=>{const e=n();delete e.descriptor.signatures.test;const r=i(o,"00000000",e,"test");t(r.isLeft()).toBe(!0),t(r.swap().unsafeCoerce().message).toMatch(/missing 'test' signature/)})}),s("toProgramEnumVariants",()=>{a("flattens enum variants across all descriptors, dropping malformed keys",()=>{const e={"00000000":n({enum_variants:{swap:{46:{variant_name:"raydiumCP",descriptor:{data:"01_raydium_tlv",signatures:{prod:"prodsig_v46",test:"testsig_v46"}}},bad:{variant_name:"junk",descriptor:{data:"junk_tlv",signatures:{prod:"x",test:"x"}}}}}}),"00000001":n({enum_variants:{route:{12:{variant_name:"orca",descriptor:{data:"02_orca_tlv",signatures:{prod:"prodsig_v12",test:"testsig_v12"}}}}}})};t(p(e,"prod")).toEqual([{enumId:"swap",variantIndex:46,descriptor:{data:"01_raydium_tlv",signature:"prodsig_v46"}},{enumId:"route",variantIndex:12,descriptor:{data:"02_orca_tlv",signature:"prodsig_v12"}}])}),a("leaves the signature empty when CAL has none for the configured mode",()=>{const e=n({enum_variants:{swap:{46:{variant_name:"raydiumCP",descriptor:{data:"01_raydium_tlv",signatures:{prod:"prodsig_v46"}}}}}});t(p({"00000000":e},"test")).toEqual([{enumId:"swap",variantIndex:46,descriptor:{data:"01_raydium_tlv",signature:""}}])})})});
|
|
2
|
+
//# sourceMappingURL=InstructionInfoMapper.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/instruction-info/data/InstructionInfoMapper.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { describe, expect, it } from \"vitest\";\n\nimport { type CalInstructionDescriptorDto } from \"./InstructionInfoDto\";\nimport {\n toAccountResets,\n toDisplayFields,\n toInstructionInfoPayload,\n toProgramEnumVariants,\n toValueFlowPorts,\n} from \"./InstructionInfoMapper\";\n\nconst PROGRAM = \"11111111111111111111111111111111\";\n\nfunction makeDescriptor(\n overrides: Partial<CalInstructionDescriptorDto> = {},\n): CalInstructionDescriptorDto {\n return {\n discriminator_hex: \"00000000\",\n instruction_name: \"createAccount\",\n descriptor: {\n data: \"0001sys_data\",\n signatures: { prod: \"prodsig\", test: \"testsig\" },\n },\n ...overrides,\n };\n}\n\ndescribe(\"InstructionInfoMapper\", () => {\n describe(\"toValueFlowPorts\", () => {\n it(\"returns an empty list for undefined input\", () => {\n expect(toValueFlowPorts()).toEqual([]);\n });\n\n it(\"picks only the decoded fields, dropping the signed-TLV descriptor\", () => {\n expect(\n toValueFlowPorts([\n {\n descriptor: \"vfp1\",\n account_indices: [0, 1],\n optional_account_strategy: \"OMITTED\",\n token_value: { kind: \"NATIVE\" },\n },\n ]),\n ).toEqual([\n {\n account_indices: [0, 1],\n optional_account_strategy: \"OMITTED\",\n token_value: { kind: \"NATIVE\" },\n },\n ]);\n });\n\n it(\"leaves the absent optional strategy as undefined\", () => {\n expect(\n toValueFlowPorts([\n {\n descriptor: \"vfp1\",\n account_indices: [0],\n token_value: { kind: \"NATIVE\" },\n },\n ]),\n ).toEqual([\n {\n account_indices: [0],\n optional_account_strategy: undefined,\n token_value: { kind: \"NATIVE\" },\n },\n ]);\n });\n });\n\n describe(\"toAccountResets\", () => {\n it(\"returns an empty list for undefined input\", () => {\n expect(toAccountResets()).toEqual([]);\n });\n\n it(\"maps the decoded fields, dropping the signed-TLV descriptor\", () => {\n expect(\n toAccountResets([\n {\n descriptor: \"ar1\",\n account_index: 2,\n require_pre_balance_zero: true,\n },\n ]),\n ).toEqual([{ account_index: 2, require_pre_balance_zero: true }]);\n });\n\n it(\"drops entries missing account_index instead of defaulting to slot 0\", () => {\n expect(\n toAccountResets([\n { descriptor: \"ar0\", account_index: 0 },\n { descriptor: \"arBad\" },\n { descriptor: \"ar1\", account_index: 1 },\n ]),\n ).toEqual([\n { account_index: 0, require_pre_balance_zero: undefined },\n { account_index: 1, require_pre_balance_zero: undefined },\n ]);\n });\n });\n\n describe(\"toDisplayFields\", () => {\n it(\"returns an empty list for undefined input\", () => {\n expect(toDisplayFields()).toEqual([]);\n });\n\n it(\"picks name and param, dropping the signed-TLV descriptor\", () => {\n expect(\n toDisplayFields([\n {\n descriptor: \"df1\",\n name: \"New Account\",\n param: {\n type: \"ACCOUNT\",\n value: { source: \"ACCOUNT_PATH\", account_index: 1 },\n },\n },\n ]),\n ).toEqual([\n {\n name: \"New Account\",\n param: {\n type: \"ACCOUNT\",\n value: { source: \"ACCOUNT_PATH\", account_index: 1 },\n },\n },\n ]);\n });\n\n it(\"falls back to an empty-type param when param is absent\", () => {\n expect(toDisplayFields([{ descriptor: \"df1\" }])).toEqual([\n { name: undefined, param: { type: \"\" } },\n ]);\n });\n });\n\n describe(\"toInstructionInfoPayload\", () => {\n it(\"surfaces CAL's decoded JSON (type pool, mint assoc, ports, resets, fields) and ordered substructures\", () => {\n const dto = makeDescriptor({\n idl_descriptor: {\n root_type: 3,\n type_pool: [\n { index: 0, kind: \"STRUCT\", refs: [1] },\n { index: 1, kind: \"U64\" },\n ],\n },\n mint_association: { account_index: 1, mint_index: 3 },\n display_fields: [\n {\n descriptor: \"df1\",\n name: \"New Account\",\n param: {\n type: \"ACCOUNT\",\n value: { source: \"ACCOUNT_PATH\", account_index: 1 },\n },\n },\n ],\n value_flow_ports: [\n {\n descriptor: \"vfp1\",\n account_indices: [0],\n token_value: { kind: \"NATIVE\" },\n },\n ],\n hide_rules: [{ descriptor: \"hr1\" }],\n account_resets: [\n {\n descriptor: \"ar1\",\n account_index: 1,\n require_pre_balance_zero: true,\n },\n ],\n });\n\n const payload = toInstructionInfoPayload(\n PROGRAM,\n \"00000000\",\n dto,\n \"prod\",\n ).unsafeCoerce();\n\n expect(payload).toMatchObject({\n programId: PROGRAM,\n discriminator: \"00000000\",\n instructionInfo: { data: \"0001sys_data\", signature: \"prodsig\" },\n idlDescriptor: {\n rootType: 3,\n typePool: [\n { index: 0, kind: \"STRUCT\", refs: [1] },\n { index: 1, kind: \"U64\" },\n ],\n },\n mintAssociations: [{ account_index: 1, mint_index: 3 }],\n valueFlowPorts: [\n {\n account_indices: [0],\n optional_account_strategy: undefined,\n token_value: { kind: \"NATIVE\" },\n },\n ],\n accountResets: [{ account_index: 1, require_pre_balance_zero: true }],\n displayFields: [\n {\n name: \"New Account\",\n param: {\n type: \"ACCOUNT\",\n value: { source: \"ACCOUNT_PATH\", account_index: 1 },\n },\n },\n ],\n });\n // Substructures carry the signed TLVs for the device, in order.\n expect(payload.substructures).toEqual([\n { kind: 0x00, data: \"df1\" },\n { kind: 0x01, data: \"vfp1\" },\n { kind: 0x02, data: \"hr1\" },\n { kind: 0x03, data: \"ar1\" },\n ]);\n });\n\n it(\"defaults idlDescriptor when CAL omits it\", () => {\n const payload = toInstructionInfoPayload(\n PROGRAM,\n \"00000000\",\n makeDescriptor(),\n \"prod\",\n ).unsafeCoerce();\n expect(payload.idlDescriptor).toEqual({ typePool: [], rootType: 0 });\n expect(payload.mintAssociations).toEqual([]);\n });\n\n it(\"bundles CAL enum_variants into the payload with the mode signature\", () => {\n const dto = makeDescriptor({\n enum_variants: {\n swap: {\n \"46\": {\n variant_name: \"raydiumCP\",\n descriptor: {\n data: \"01_raydium_tlv\",\n signatures: { prod: \"prodsig_v46\", test: \"testsig_v46\" },\n },\n },\n },\n },\n });\n const payload = toInstructionInfoPayload(\n PROGRAM,\n \"00000000\",\n dto,\n \"prod\",\n ).unsafeCoerce();\n expect(payload.enumVariants).toEqual([\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n },\n ]);\n });\n\n it(\"skips enum_variants keyed by a non-u16 index instead of leaking NaN\", () => {\n const dto = makeDescriptor({\n enum_variants: {\n swap: {\n \"46\": {\n variant_name: \"raydiumCP\",\n descriptor: {\n data: \"01_raydium_tlv\",\n signatures: { prod: \"prodsig_v46\", test: \"testsig_v46\" },\n },\n },\n \"7abc\": {\n variant_name: \"junk\",\n descriptor: {\n data: \"junk_tlv\",\n signatures: { prod: \"x\", test: \"x\" },\n },\n },\n \"70000\": {\n variant_name: \"overflow\",\n descriptor: {\n data: \"overflow_tlv\",\n signatures: { prod: \"x\", test: \"x\" },\n },\n },\n },\n },\n });\n const payload = toInstructionInfoPayload(\n PROGRAM,\n \"00000000\",\n dto,\n \"prod\",\n ).unsafeCoerce();\n expect(payload.enumVariants).toEqual([\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n },\n ]);\n });\n\n it(\"selects the signature for the configured mode\", () => {\n const payload = toInstructionInfoPayload(\n PROGRAM,\n \"00000000\",\n makeDescriptor(),\n \"test\",\n ).unsafeCoerce();\n expect(payload.instructionInfo.signature).toBe(\"testsig\");\n });\n\n it(\"returns Left when the configured mode signature is missing\", () => {\n const dto = makeDescriptor();\n delete (dto.descriptor.signatures as { test?: string }).test;\n const result = toInstructionInfoPayload(PROGRAM, \"00000000\", dto, \"test\");\n expect(result.isLeft()).toBe(true);\n expect(result.swap().unsafeCoerce().message).toMatch(\n /missing 'test' signature/,\n );\n });\n });\n\n describe(\"toProgramEnumVariants\", () => {\n it(\"flattens enum variants across all descriptors, dropping malformed keys\", () => {\n const descriptors: Record<string, CalInstructionDescriptorDto> = {\n \"00000000\": makeDescriptor({\n enum_variants: {\n swap: {\n \"46\": {\n variant_name: \"raydiumCP\",\n descriptor: {\n data: \"01_raydium_tlv\",\n signatures: { prod: \"prodsig_v46\", test: \"testsig_v46\" },\n },\n },\n bad: {\n variant_name: \"junk\",\n descriptor: {\n data: \"junk_tlv\",\n signatures: { prod: \"x\", test: \"x\" },\n },\n },\n },\n },\n }),\n \"00000001\": makeDescriptor({\n enum_variants: {\n route: {\n \"12\": {\n variant_name: \"orca\",\n descriptor: {\n data: \"02_orca_tlv\",\n signatures: { prod: \"prodsig_v12\", test: \"testsig_v12\" },\n },\n },\n },\n },\n }),\n };\n expect(toProgramEnumVariants(descriptors, \"prod\")).toEqual([\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n },\n {\n enumId: \"route\",\n variantIndex: 12,\n descriptor: { data: \"02_orca_tlv\", signature: \"prodsig_v12\" },\n },\n ]);\n });\n\n it(\"leaves the signature empty when CAL has none for the configured mode\", () => {\n const dto = makeDescriptor({\n enum_variants: {\n swap: {\n \"46\": {\n variant_name: \"raydiumCP\",\n descriptor: {\n data: \"01_raydium_tlv\",\n signatures: { prod: \"prodsig_v46\" },\n },\n },\n },\n },\n });\n expect(toProgramEnumVariants({ \"00000000\": dto }, \"test\")).toEqual([\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"\" },\n },\n ]);\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["describe", "expect", "it", "toAccountResets", "toDisplayFields", "toInstructionInfoPayload", "toProgramEnumVariants", "toValueFlowPorts", "PROGRAM", "makeDescriptor", "overrides", "dto", "payload", "result", "descriptors"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{ContainerModule as n}from"inversify";import{HttpInstructionInfoDataSource as r}from"../../../../modules/solana/instruction-info/data/HttpInstructionInfoDataSource";import{instructionInfoTypes as t}from"../../../../modules/solana/instruction-info/di/instructionInfoTypes";import{InstructionInfoContextLoader as e}from"../../../../modules/solana/instruction-info/domain/InstructionInfoContextLoader";const I=()=>new n(({bind:o})=>{o(t.InstructionInfoDataSource).to(r),o(t.InstructionInfoContextLoader).to(e)});export{I as instructionInfoModuleFactory};
|
|
2
|
+
//# sourceMappingURL=instructionInfoModuleFactory.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/instruction-info/di/instructionInfoModuleFactory.ts"],
|
|
4
|
+
"sourcesContent": ["import { ContainerModule } from \"inversify\";\n\nimport { HttpInstructionInfoDataSource } from \"@/modules/solana/instruction-info/data/HttpInstructionInfoDataSource\";\nimport { instructionInfoTypes } from \"@/modules/solana/instruction-info/di/instructionInfoTypes\";\nimport { InstructionInfoContextLoader } from \"@/modules/solana/instruction-info/domain/InstructionInfoContextLoader\";\n\nexport const instructionInfoModuleFactory = () =>\n new ContainerModule(({ bind }) => {\n bind(instructionInfoTypes.InstructionInfoDataSource).to(\n HttpInstructionInfoDataSource,\n );\n bind(instructionInfoTypes.InstructionInfoContextLoader).to(\n InstructionInfoContextLoader,\n );\n });\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,mBAAAA,MAAuB,YAEhC,OAAS,iCAAAC,MAAqC,uEAC9C,OAAS,wBAAAC,MAA4B,4DACrC,OAAS,gCAAAC,MAAoC,wEAEtC,MAAMC,EAA+B,IAC1C,IAAIJ,EAAgB,CAAC,CAAE,KAAAK,CAAK,IAAM,CAChCA,EAAKH,EAAqB,yBAAyB,EAAE,GACnDD,CACF,EACAI,EAAKH,EAAqB,4BAA4B,EAAE,GACtDC,CACF,CACF,CAAC",
|
|
6
|
+
"names": ["ContainerModule", "HttpInstructionInfoDataSource", "instructionInfoTypes", "InstructionInfoContextLoader", "instructionInfoModuleFactory", "bind"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/instruction-info/di/instructionInfoTypes.ts"],
|
|
4
|
+
"sourcesContent": ["export const instructionInfoTypes = {\n InstructionInfoDataSource: Symbol.for(\"InstructionInfoDataSource\"),\n InstructionInfoContextLoader: Symbol.for(\"InstructionInfoContextLoader\"),\n};\n"],
|
|
5
|
+
"mappings": "AAAO,MAAMA,EAAuB,CAClC,0BAA2B,OAAO,IAAI,2BAA2B,EACjE,6BAA8B,OAAO,IAAI,8BAA8B,CACzE",
|
|
6
|
+
"names": ["instructionInfoTypes"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var T=Object.defineProperty;var L=Object.getOwnPropertyDescriptor;var y=(s,e,o,t)=>{for(var r=t>1?void 0:t?L(e,o):e,i=s.length-1,a;i>=0;i--)(a=s[i])&&(r=(t?a(e,o,r):a(r))||r);return t&&r&&T(e,o,r),r},u=(s,e)=>(o,t)=>e(o,t,s);import{inject as p,injectable as N}from"inversify";import{array as P,Codec as S,optional as h,string as m}from"purify-ts";import{configTypes as w}from"../../../../config/di/configTypes";import{pkiTypes as k}from"../../../../modules/multichain/pki/di/pkiTypes";import{KeyId as D}from"../../../../modules/multichain/pki/model/KeyId";import{KeyUsage as b}from"../../../../modules/multichain/pki/model/KeyUsage";import{instructionInfoTypes as E}from"../../../../modules/solana/instruction-info/di/instructionInfoTypes";import{ClearSignContextType as c}from"../../../../shared/model/ClearSignContext";import{loadCertificateResult as U}from"../../../../shared/utils/certificateResult";import{deviceModelIdCodec as F}from"../../../../shared/utils/deviceModelIdCodec";const M=[c.SOLANA_INSTRUCTION_INFO],_="solana-mainnet",A=S.interface({programId:m,discriminator:h(m)}),K=S.interface({deviceModelId:F,instructions:P(A),network:h(m)});let f=class{constructor(e,o,t){this.dataSource=e;this.certificateLoader=o;this.logger=t("InstructionInfoContextLoader")}logger;canHandle(e,o){return M.every(t=>o.includes(t))?K.decode(e).caseOf({Left:()=>!1,Right:({instructions:t})=>t.length>0&&t.every(r=>r.programId.length>0)}):!1}async load(e){const o=e.network||_,t=Array.from(new Set(e.instructions.map(n=>n.programId)));this.logger.debug("[load] Fetching instruction descriptors",{data:{network:o,programCount:t.length,instructionCount:e.instructions.length}});const r=U(this.certificateLoader,{keyId:D.CalCalldataKey,keyUsage:b.Calldata,targetDevice:e.deviceModelId}),i=Promise.all(t.map(async n=>({programId:n,either:await this.dataSource.getInstructionInfo({programId:n,network:o})}))),[a,R]=await Promise.all([r,i]);if(!a.ok||!a.value){const n=a.ok?new Error("[ContextModule] InstructionInfoContextLoader: certificate is missing"):a.error;return this.logger.warn("[load] INSTRUCTION_INFO certificate unavailable",{data:{error:n.message}}),t.map(()=>({type:c.ERROR,error:n}))}const v=a.value,l=[];for(const{programId:n,either:x}of R)x.caseOf({Left:d=>{this.logger.warn("[load] Failed to fetch instruction descriptors for program",{data:{programId:n,error:d.message}}),l.push({type:c.ERROR,error:d})},Right:d=>{const I=this.collectWantedDiscriminators(n,e.instructions);for(const[C,O]of Object.entries(d.descriptors))I!==null&&!I.has(C)||l.push(O.caseOf({Left:g=>(this.logger.warn("[load] INSTRUCTION_INFO descriptor error",{data:{programId:n,discriminator:C,error:g.message}}),{type:c.ERROR,error:g}),Right:g=>({type:c.SOLANA_INSTRUCTION_INFO,payload:g,certificate:v})}))}});return this.logger.debug("[load] Emitted contexts",{data:{count:l.length}}),l}collectWantedDiscriminators(e,o){const t=new Set;let r=!1;for(const i of o)i.programId===e&&(i.discriminator===void 0?r=!0:t.add(i.discriminator));return r?null:t}};f=y([N(),u(0,p(E.InstructionInfoDataSource)),u(1,p(k.PkiCertificateLoader)),u(2,p(w.ContextModuleLoggerFactory))],f);export{f as InstructionInfoContextLoader};
|
|
2
|
+
//# sourceMappingURL=InstructionInfoContextLoader.js.map
|
package/lib/esm/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.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 { KeyId } from \"@/modules/multichain/pki/model/KeyId\";\nimport { KeyUsage } from \"@/modules/multichain/pki/model/KeyUsage\";\nimport { type InstructionInfoDataSource } from \"@/modules/solana/instruction-info/data/InstructionInfoDataSource\";\nimport { instructionInfoTypes } from \"@/modules/solana/instruction-info/di/instructionInfoTypes\";\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_INSTRUCTION_INFO,\n];\n\nconst NETWORK_DEFAULT = \"solana-mainnet\";\n\n/**\n * Per-instruction reference the caller provides for the TX it wants to\n * clear-sign. Discriminator is optional: when omitted, the loader emits\n * every descriptor CAL returns for that `programId`. When present, the\n * loader filters down to descriptors whose `discriminator` matches.\n */\nexport type SolanaInstructionRef = {\n programId: string;\n discriminator?: string;\n};\n\nexport type SolanaInstructionInfoContextInput = {\n deviceModelId: DeviceModelId;\n instructions: SolanaInstructionRef[];\n network?: string;\n};\n\nconst instructionRefCodec = Codec.interface({\n programId: string,\n discriminator: optional(string),\n});\n\nconst solanaInstructionInfoInputCodec = Codec.interface({\n deviceModelId: deviceModelIdCodec,\n instructions: array(instructionRefCodec),\n network: optional(string),\n});\n\n/**\n * Emits SOLANA_INSTRUCTION_INFO contexts for the requested instructions.\n * Enum-variant emission lives in the sibling {@link EnumVariantContextLoader}.\n */\n@injectable()\nexport class InstructionInfoContextLoader\n implements ContextLoader<SolanaInstructionInfoContextInput>\n{\n private readonly logger: LoggerPublisherService;\n\n constructor(\n @inject(instructionInfoTypes.InstructionInfoDataSource)\n private readonly dataSource: InstructionInfoDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this.logger = loggerFactory(\"InstructionInfoContextLoader\");\n }\n\n public canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is SolanaInstructionInfoContextInput {\n if (!SUPPORTED_TYPES.every((t) => expectedTypes.includes(t))) {\n return false;\n }\n return solanaInstructionInfoInputCodec.decode(input).caseOf({\n Left: () => false,\n Right: ({ instructions }) =>\n instructions.length > 0 &&\n instructions.every((ix) => ix.programId.length > 0),\n });\n }\n\n public async load(\n input: SolanaInstructionInfoContextInput,\n ): Promise<ClearSignContext[]> {\n const network = input.network || NETWORK_DEFAULT;\n const distinctProgramIds = Array.from(\n new Set(input.instructions.map((ix) => ix.programId)),\n );\n\n this.logger.debug(\"[load] Fetching instruction descriptors\", {\n data: {\n network,\n programCount: distinctProgramIds.length,\n instructionCount: input.instructions.length,\n },\n });\n\n // Run cert load in parallel with CAL fetches \u2014 neither depends on the\n // other. The tagged-Result wrapper lets us preserve the data fetches\n // if cert fails so we can surface a per-program ERROR rather than\n // silently dropping them.\n const certPromise = loadCertificateResult(this.certificateLoader, {\n keyId: KeyId.CalCalldataKey,\n keyUsage: KeyUsage.Calldata,\n targetDevice: input.deviceModelId,\n });\n\n // One CAL call per program, fanned out in parallel.\n const dataPromise = Promise.all(\n distinctProgramIds.map(async (programId) => ({\n programId,\n either: await this.dataSource.getInstructionInfo({\n programId,\n network,\n }),\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] InstructionInfoContextLoader: certificate is missing\",\n )\n : certResult.error;\n this.logger.warn(\"[load] INSTRUCTION_INFO certificate unavailable\", {\n data: { error: error.message },\n });\n return distinctProgramIds.map(() => ({\n type: ClearSignContextType.ERROR,\n error,\n }));\n }\n const certificate = certResult.value;\n\n const contexts: ClearSignContext[] = [];\n\n for (const { programId, either } of results) {\n either.caseOf<void>({\n Left: (err) => {\n this.logger.warn(\n \"[load] Failed to fetch instruction descriptors for program\",\n { data: { programId, error: err.message } },\n );\n contexts.push({\n type: ClearSignContextType.ERROR,\n error: err,\n });\n },\n Right: (value) => {\n const wantedDiscriminators = this.collectWantedDiscriminators(\n programId,\n input.instructions,\n );\n\n for (const [discriminator, result] of Object.entries(\n value.descriptors,\n )) {\n if (\n wantedDiscriminators !== null &&\n !wantedDiscriminators.has(discriminator)\n ) {\n continue;\n }\n contexts.push(\n result.caseOf<ClearSignContext>({\n Left: (error) => {\n this.logger.warn(\"[load] INSTRUCTION_INFO descriptor error\", {\n data: { programId, discriminator, error: error.message },\n });\n return { type: ClearSignContextType.ERROR, error };\n },\n Right: (payload) => ({\n type: ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n payload,\n certificate,\n }),\n }),\n );\n }\n },\n });\n }\n\n this.logger.debug(\"[load] Emitted contexts\", {\n data: { count: contexts.length },\n });\n\n return contexts;\n }\n\n /**\n * Returns the set of discriminators the caller has explicitly asked\n * about for this `programId`, or `null` when the caller wants every\n * descriptor CAL has for the program.\n */\n private collectWantedDiscriminators(\n programId: string,\n instructions: SolanaInstructionRef[],\n ): Set<string> | null {\n const set = new Set<string>();\n let hasUnconstrained = false;\n for (const ix of instructions) {\n if (ix.programId !== programId) continue;\n if (ix.discriminator === undefined) {\n hasUnconstrained = true;\n } else {\n set.add(ix.discriminator);\n }\n }\n return hasUnconstrained ? null : set;\n }\n}\n"],
|
|
5
|
+
"mappings": "iOAIA,OAAS,UAAAA,EAAQ,cAAAC,MAAkB,YACnC,OAAS,SAAAC,EAAO,SAAAC,EAAO,YAAAC,EAAU,UAAAC,MAAc,YAE/C,OAAS,eAAAC,MAAmB,0BAC5B,OAAS,YAAAC,MAAgB,uCAEzB,OAAS,SAAAC,MAAa,uCACtB,OAAS,YAAAC,MAAgB,0CAEzB,OAAS,wBAAAC,MAA4B,4DAErC,OAEE,wBAAAC,MACK,kCACP,OAAS,yBAAAC,MAA6B,mCACtC,OAAS,sBAAAC,MAA0B,oCAEnC,MAAMC,EAA0C,CAC9CC,EAAqB,uBACvB,EAEMC,EAAkB,iBAmBlBC,EAAsBC,EAAM,UAAU,CAC1C,UAAWC,EACX,cAAeC,EAASD,CAAM,CAChC,CAAC,EAEKE,EAAkCH,EAAM,UAAU,CACtD,cAAeI,EACf,aAAcC,EAAMN,CAAmB,EACvC,QAASG,EAASD,CAAM,CAC1B,CAAC,EAOM,IAAMK,EAAN,KAEP,CAGE,YAEmBC,EAEAC,EAEjBC,EACA,CALiB,gBAAAF,EAEA,uBAAAC,EAIjB,KAAK,OAASC,EAAc,8BAA8B,CAC5D,CAXiB,OAaV,UACLC,EACAC,EAC4C,CAC5C,OAAKf,EAAgB,MAAO,GAAMe,EAAc,SAAS,CAAC,CAAC,EAGpDR,EAAgC,OAAOO,CAAK,EAAE,OAAO,CAC1D,KAAM,IAAM,GACZ,MAAO,CAAC,CAAE,aAAAE,CAAa,IACrBA,EAAa,OAAS,GACtBA,EAAa,MAAOC,GAAOA,EAAG,UAAU,OAAS,CAAC,CACtD,CAAC,EAPQ,EAQX,CAEA,MAAa,KACXH,EAC6B,CAC7B,MAAMI,EAAUJ,EAAM,SAAWZ,EAC3BiB,EAAqB,MAAM,KAC/B,IAAI,IAAIL,EAAM,aAAa,IAAKG,GAAOA,EAAG,SAAS,CAAC,CACtD,EAEA,KAAK,OAAO,MAAM,0CAA2C,CAC3D,KAAM,CACJ,QAAAC,EACA,aAAcC,EAAmB,OACjC,iBAAkBL,EAAM,aAAa,MACvC,CACF,CAAC,EAMD,MAAMM,EAAcC,EAAsB,KAAK,kBAAmB,CAChE,MAAOC,EAAM,eACb,SAAUC,EAAS,SACnB,aAAcT,EAAM,aACtB,CAAC,EAGKU,EAAc,QAAQ,IAC1BL,EAAmB,IAAI,MAAOM,IAAe,CAC3C,UAAAA,EACA,OAAQ,MAAM,KAAK,WAAW,mBAAmB,CAC/C,UAAAA,EACA,QAAAP,CACF,CAAC,CACH,EAAE,CACJ,EAEM,CAACQ,EAAYC,CAAO,EAAI,MAAM,QAAQ,IAAI,CAACP,EAAaI,CAAW,CAAC,EAE1E,GAAI,CAACE,EAAW,IAAM,CAACA,EAAW,MAAO,CACvC,MAAME,EAAQF,EAAW,GACrB,IAAI,MACF,sEACF,EACAA,EAAW,MACf,YAAK,OAAO,KAAK,kDAAmD,CAClE,KAAM,CAAE,MAAOE,EAAM,OAAQ,CAC/B,CAAC,EACMT,EAAmB,IAAI,KAAO,CACnC,KAAMlB,EAAqB,MAC3B,MAAA2B,CACF,EAAE,CACJ,CACA,MAAMC,EAAcH,EAAW,MAEzBI,EAA+B,CAAC,EAEtC,SAAW,CAAE,UAAAL,EAAW,OAAAM,CAAO,IAAKJ,EAClCI,EAAO,OAAa,CAClB,KAAOC,GAAQ,CACb,KAAK,OAAO,KACV,6DACA,CAAE,KAAM,CAAE,UAAAP,EAAW,MAAOO,EAAI,OAAQ,CAAE,CAC5C,EACAF,EAAS,KAAK,CACZ,KAAM7B,EAAqB,MAC3B,MAAO+B,CACT,CAAC,CACH,EACA,MAAQC,GAAU,CAChB,MAAMC,EAAuB,KAAK,4BAChCT,EACAX,EAAM,YACR,EAEA,SAAW,CAACqB,EAAeC,CAAM,IAAK,OAAO,QAC3CH,EAAM,WACR,EAEIC,IAAyB,MACzB,CAACA,EAAqB,IAAIC,CAAa,GAIzCL,EAAS,KACPM,EAAO,OAAyB,CAC9B,KAAOR,IACL,KAAK,OAAO,KAAK,2CAA4C,CAC3D,KAAM,CAAE,UAAAH,EAAW,cAAAU,EAAe,MAAOP,EAAM,OAAQ,CACzD,CAAC,EACM,CAAE,KAAM3B,EAAqB,MAAO,MAAA2B,CAAM,GAEnD,MAAQS,IAAa,CACnB,KAAMpC,EAAqB,wBAC3B,QAAAoC,EACA,YAAAR,CACF,EACF,CAAC,CACH,CAEJ,CACF,CAAC,EAGH,YAAK,OAAO,MAAM,0BAA2B,CAC3C,KAAM,CAAE,MAAOC,EAAS,MAAO,CACjC,CAAC,EAEMA,CACT,CAOQ,4BACNL,EACAT,EACoB,CACpB,MAAMsB,EAAM,IAAI,IAChB,IAAIC,EAAmB,GACvB,UAAWtB,KAAMD,EACXC,EAAG,YAAcQ,IACjBR,EAAG,gBAAkB,OACvBsB,EAAmB,GAEnBD,EAAI,IAAIrB,EAAG,aAAa,GAG5B,OAAOsB,EAAmB,KAAOD,CACnC,CACF,EAnKa5B,EAAN8B,EAAA,CADNC,EAAW,EAOPC,EAAA,EAAAC,EAAOC,EAAqB,yBAAyB,GAErDF,EAAA,EAAAC,EAAOE,EAAS,oBAAoB,GAEpCH,EAAA,EAAAC,EAAOG,EAAY,0BAA0B,IAVrCpC",
|
|
6
|
+
"names": ["inject", "injectable", "array", "Codec", "optional", "string", "configTypes", "pkiTypes", "KeyId", "KeyUsage", "instructionInfoTypes", "ClearSignContextType", "loadCertificateResult", "deviceModelIdCodec", "SUPPORTED_TYPES", "ClearSignContextType", "NETWORK_DEFAULT", "instructionRefCodec", "Codec", "string", "optional", "solanaInstructionInfoInputCodec", "deviceModelIdCodec", "array", "InstructionInfoContextLoader", "dataSource", "certificateLoader", "loggerFactory", "input", "expectedTypes", "instructions", "ix", "network", "distinctProgramIds", "certPromise", "loadCertificateResult", "KeyId", "KeyUsage", "dataPromise", "programId", "certResult", "results", "error", "certificate", "contexts", "either", "err", "value", "wantedDiscriminators", "discriminator", "result", "payload", "set", "hasUnconstrained", "__decorateClass", "injectable", "__decorateParam", "inject", "instructionInfoTypes", "pkiTypes", "configTypes"]
|
|
7
|
+
}
|
package/lib/esm/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{DeviceModelId as u}from"@ledgerhq/device-management-kit";import{Left as g,Right as d}from"purify-ts";import{beforeEach as v,describe as O,expect as e,it as I,vi as s}from"vitest";import{ClearSignContextType as i}from"../../../../shared/model/ClearSignContext";import{InstructionInfoContextLoader as S}from"./InstructionInfoContextLoader";const w=()=>({debug:s.fn(),info:s.fn(),warn:s.fn(),error:s.fn(),subscribers:[]}),_={keyUsageNumber:8,payload:new Uint8Array([66])},a="11111111111111111111111111111111",m="JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4";function y(){return{programId:a,discriminator:"00000000",instructionInfo:{data:"0001sys_data",signature:"prodsig_sys"},substructures:[{kind:0,data:"df1"},{kind:0,data:"df2"},{kind:1,data:"vfp1"}],enumVariants:[],idlDescriptor:{typePool:[],rootType:0},mintAssociations:[],valueFlowPorts:[],accountResets:[],displayFields:[]}}function f(){return{programId:a,descriptors:{"00000000":d(y())},enumVariants:[]}}function A(){return{programId:m,discriminator:"e517cb977ae3ad2a",instructionInfo:{data:"0001jup_data",signature:"prodsig_jup"},substructures:[],enumVariants:[],idlDescriptor:{typePool:[],rootType:0},mintAssociations:[],valueFlowPorts:[],accountResets:[],displayFields:[]}}function k(){return{programId:m,descriptors:{e517cb977ae3ad2a:d(A())},enumVariants:[]}}function R(c=[]){return{programId:m,descriptors:{e517cb977ae3ad2a:d({...A(),enumVariants:c})},enumVariants:c}}O("InstructionInfoContextLoader",()=>{let c,N;v(()=>{s.restoreAllMocks(),c={getInstructionInfo:s.fn()},N={loadCertificate:s.fn().mockResolvedValue(_)}});const l=()=>new S(c,N,w);O("canHandle",()=>{I("returns true when SOLANA_INSTRUCTION_INFO is requested and instructions are present",()=>{e(l().canHandle({deviceModelId:u.NANO_X,instructions:[{programId:a}]},[i.SOLANA_INSTRUCTION_INFO])).toBe(!0)}),I("returns false when SOLANA_INSTRUCTION_INFO is not requested",()=>{e(l().canHandle({deviceModelId:u.NANO_X,instructions:[{programId:a}]},[i.SOLANA_TOKEN])).toBe(!1)}),I("returns false on missing / empty / malformed instructions",()=>{const o=l(),t=[i.SOLANA_INSTRUCTION_INFO];e(o.canHandle({},t)).toBe(!1),e(o.canHandle({instructions:[]},t)).toBe(!1),e(o.canHandle({instructions:[{programId:""}]},t)).toBe(!1),e(o.canHandle(null,t)).toBe(!1),e(o.canHandle("string",t)).toBe(!1)})}),O("load",()=>{I("fans out one CAL call per distinct programId in parallel",async()=>{const o=l(),t=s.spyOn(c,"getInstructionInfo").mockImplementation(async({programId:r})=>r===a?d(f()):r===m?d(k()):g(new Error("unknown program"))),n=await o.load({deviceModelId:u.NANO_X,instructions:[{programId:a,discriminator:"00000000"},{programId:a,discriminator:"00000000"},{programId:m,discriminator:"e517cb977ae3ad2a"}],network:"solana-mainnet"});e(t).toHaveBeenCalledTimes(2),e(t).toHaveBeenCalledWith({programId:a,network:"solana-mainnet"}),e(t).toHaveBeenCalledWith({programId:m,network:"solana-mainnet"}),e(n.every(r=>r.type===i.SOLANA_INSTRUCTION_INFO||r.type===i.ERROR)).toBe(!0),e(n.filter(r=>r.type===i.SOLANA_INSTRUCTION_INFO)).toHaveLength(2)}),I("emits one SOLANA_INSTRUCTION_INFO per matching (programId, discriminator), passing the decoded payload through with the certificate",async()=>{const o=l();s.spyOn(c,"getInstructionInfo").mockResolvedValue(d(f()));const n=(await o.load({deviceModelId:u.NANO_X,instructions:[{programId:a,discriminator:"00000000"}]})).find(r=>r.type===i.SOLANA_INSTRUCTION_INFO);e(n).toBeDefined(),e(n).toMatchObject({type:i.SOLANA_INSTRUCTION_INFO,certificate:_}),e(n.payload).toEqual(y())}),I("does NOT emit SOLANA_ENUM_VARIANT contexts (those come from EnumVariantContextLoader)",async()=>{const o=l(),t=R([{enumId:"swap",variantIndex:46,descriptor:{data:"01_raydium_tlv",signature:"prodsig_v46"}}]);s.spyOn(c,"getInstructionInfo").mockResolvedValue(d(t));const n=await o.load({deviceModelId:u.NANO_X,instructions:[{programId:m,discriminator:"e517cb977ae3ad2a"}]});e(n.filter(r=>r.type===i.SOLANA_ENUM_VARIANT)).toHaveLength(0)}),I("bundles CAL enum_variants into the SOLANA_INSTRUCTION_INFO payload (host decode cache)",async()=>{const o=l(),t=[{enumId:"swap",variantIndex:46,descriptor:{data:"01_raydium_tlv",signature:"prodsig_v46"}}];s.spyOn(c,"getInstructionInfo").mockResolvedValue(d(R(t)));const r=(await o.load({deviceModelId:u.NANO_X,instructions:[{programId:m,discriminator:"e517cb977ae3ad2a"}]})).find(p=>p.type===i.SOLANA_INSTRUCTION_INFO);e(r.payload.enumVariants).toEqual(t)}),I("forwards exactly the enumVariants the data source decoded \u2014 no NaN indices",async()=>{const o=l(),t={enumId:"swap",variantIndex:46,descriptor:{data:"01_raydium_tlv",signature:"prodsig_v46"}};s.spyOn(c,"getInstructionInfo").mockResolvedValue(d(R([t])));const r=(await o.load({deviceModelId:u.NANO_X,instructions:[{programId:m,discriminator:"e517cb977ae3ad2a"}]})).find(p=>p.type===i.SOLANA_INSTRUCTION_INFO);e(r.payload.enumVariants).toEqual([t])}),I("filters descriptors by requested discriminator",async()=>{const o=l(),t={programId:a,descriptors:{"00000000":d(y()),"00000001":d({...y(),discriminator:"00000001",instructionInfo:{data:"0001other",signature:"p"}})},enumVariants:[]};s.spyOn(c,"getInstructionInfo").mockResolvedValue(d(t));const r=(await o.load({deviceModelId:u.NANO_X,instructions:[{programId:a,discriminator:"00000000"}]})).filter(p=>p.type===i.SOLANA_INSTRUCTION_INFO);e(r).toHaveLength(1),e(r[0].payload.discriminator).toBe("00000000")}),I("emits an ERROR context for a descriptor the data source could not decode",async()=>{const o=l(),t={programId:a,descriptors:{"00000000":g(new Error("missing 'test' signature"))},enumVariants:[]};s.spyOn(c,"getInstructionInfo").mockResolvedValue(d(t));const n=await o.load({deviceModelId:u.NANO_X,instructions:[{programId:a,discriminator:"00000000"}]});e(n).toHaveLength(1),e(n[0]?.type).toBe(i.ERROR),e(n[0].error.message).toMatch(/missing 'test' signature/)}),I("emits one ERROR context when CAL fails for a program but keeps processing the others",async()=>{const o=l();s.spyOn(c,"getInstructionInfo").mockImplementation(async({programId:p})=>p===a?d(f()):g(new Error("upstream-500")));const t=await o.load({deviceModelId:u.NANO_X,instructions:[{programId:a,discriminator:"00000000"},{programId:m,discriminator:"e517cb977ae3ad2a"}]}),n=t.filter(p=>p.type===i.ERROR),r=t.filter(p=>p.type===i.SOLANA_INSTRUCTION_INFO);e(n).toHaveLength(1),e(r).toHaveLength(1)}),I("degrades every program to ERROR when certificate loading fails",async()=>{s.spyOn(N,"loadCertificate").mockRejectedValue(new Error("pki-down")),s.spyOn(c,"getInstructionInfo").mockResolvedValue(d(f()));const t=await l().load({deviceModelId:u.NANO_X,instructions:[{programId:a},{programId:m}]});e(t).toHaveLength(2),e(t.every(n=>n.type===i.ERROR)).toBe(!0)}),I("degrades every program to ERROR when the certificate resolves undefined",async()=>{s.spyOn(N,"loadCertificate").mockResolvedValue(void 0),s.spyOn(c,"getInstructionInfo").mockResolvedValue(d(f()));const t=await l().load({deviceModelId:u.NANO_X,instructions:[{programId:a},{programId:m}]});e(t).toHaveLength(2),e(t.every(n=>n.type===i.ERROR)).toBe(!0),e(t[0].error.message).toMatch(/certificate is missing/)}),I("falls back to default network when input.network is omitted or empty string",async()=>{const o=l(),t=s.spyOn(c,"getInstructionInfo").mockResolvedValue(d(f()));await o.load({deviceModelId:u.NANO_X,instructions:[{programId:a}]}),e(t).toHaveBeenLastCalledWith({programId:a,network:"solana-mainnet"}),await o.load({deviceModelId:u.NANO_X,instructions:[{programId:a}],network:""}),e(t).toHaveBeenLastCalledWith({programId:a,network:"solana-mainnet"})})})});
|
|
2
|
+
//# sourceMappingURL=InstructionInfoContextLoader.test.js.map
|
package/lib/esm/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.ts"],
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\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 {\n type InstructionInfoDataSource,\n type InstructionInfoResult,\n} from \"@/modules/solana/instruction-info/data/InstructionInfoDataSource\";\nimport {\n type SolanaInstructionEnumVariant,\n type SolanaInstructionInfoPayload,\n} from \"@/modules/solana/model/SolanaPayloads\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { InstructionInfoContextLoader } from \"./InstructionInfoContextLoader\";\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 SYSTEM_PROGRAM = \"11111111111111111111111111111111\";\nconst JUPITER_PROGRAM = \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\";\n\n// The data source hands the loader fully-decoded core payloads.\nfunction makeSystemPayload(): SolanaInstructionInfoPayload {\n return {\n programId: SYSTEM_PROGRAM,\n discriminator: \"00000000\",\n instructionInfo: { data: \"0001sys_data\", signature: \"prodsig_sys\" },\n substructures: [\n { kind: 0x00, data: \"df1\" },\n { kind: 0x00, data: \"df2\" },\n { kind: 0x01, data: \"vfp1\" },\n ],\n enumVariants: [],\n idlDescriptor: { typePool: [], rootType: 0 },\n mintAssociations: [],\n valueFlowPorts: [],\n accountResets: [],\n displayFields: [],\n };\n}\n\nfunction makeSystemResult(): InstructionInfoResult {\n return {\n programId: SYSTEM_PROGRAM,\n descriptors: { \"00000000\": Right(makeSystemPayload()) },\n enumVariants: [],\n };\n}\n\nfunction makeJupiterPayload(): SolanaInstructionInfoPayload {\n return {\n programId: JUPITER_PROGRAM,\n discriminator: \"e517cb977ae3ad2a\",\n instructionInfo: { data: \"0001jup_data\", signature: \"prodsig_jup\" },\n substructures: [],\n enumVariants: [],\n idlDescriptor: { typePool: [], rootType: 0 },\n mintAssociations: [],\n valueFlowPorts: [],\n accountResets: [],\n displayFields: [],\n };\n}\n\nfunction makeJupiterResult(): InstructionInfoResult {\n return {\n programId: JUPITER_PROGRAM,\n descriptors: { e517cb977ae3ad2a: Right(makeJupiterPayload()) },\n enumVariants: [],\n };\n}\n\nfunction makeJupiterRouteResult(\n enumVariants: SolanaInstructionEnumVariant[] = [],\n): InstructionInfoResult {\n return {\n programId: JUPITER_PROGRAM,\n descriptors: {\n e517cb977ae3ad2a: Right({ ...makeJupiterPayload(), enumVariants }),\n },\n enumVariants,\n };\n}\n\ndescribe(\"InstructionInfoContextLoader\", () => {\n let dataSource: InstructionInfoDataSource;\n let certificateLoader: PkiCertificateLoader;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n dataSource = {\n getInstructionInfo: vi.fn(),\n };\n certificateLoader = {\n loadCertificate: vi.fn().mockResolvedValue(mockCertificate),\n };\n });\n\n const makeLoader = () =>\n new InstructionInfoContextLoader(\n dataSource,\n certificateLoader,\n mockLoggerFactory,\n );\n\n describe(\"canHandle\", () => {\n it(\"returns true when SOLANA_INSTRUCTION_INFO is requested and instructions are present\", () => {\n expect(\n makeLoader().canHandle(\n {\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [{ programId: SYSTEM_PROGRAM }],\n },\n [ClearSignContextType.SOLANA_INSTRUCTION_INFO],\n ),\n ).toBe(true);\n });\n\n it(\"returns false when SOLANA_INSTRUCTION_INFO is not requested\", () => {\n expect(\n makeLoader().canHandle(\n {\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [{ programId: SYSTEM_PROGRAM }],\n },\n [ClearSignContextType.SOLANA_TOKEN],\n ),\n ).toBe(false);\n });\n\n it(\"returns false on missing / empty / malformed instructions\", () => {\n const loader = makeLoader();\n const types = [ClearSignContextType.SOLANA_INSTRUCTION_INFO];\n expect(loader.canHandle({} as any, types)).toBe(false);\n expect(loader.canHandle({ instructions: [] } as any, types)).toBe(false);\n expect(\n loader.canHandle({ instructions: [{ programId: \"\" }] } as any, types),\n ).toBe(false);\n expect(loader.canHandle(null, types)).toBe(false);\n expect(loader.canHandle(\"string\", types)).toBe(false);\n });\n });\n\n describe(\"load\", () => {\n it(\"fans out one CAL call per distinct programId in parallel\", async () => {\n const loader = makeLoader();\n const spy = vi\n .spyOn(dataSource, \"getInstructionInfo\")\n .mockImplementation(async ({ programId }) => {\n if (programId === SYSTEM_PROGRAM) return Right(makeSystemResult());\n if (programId === JUPITER_PROGRAM) return Right(makeJupiterResult());\n return Left(new Error(\"unknown program\"));\n });\n\n const result = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" },\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" }, // dup\n { programId: JUPITER_PROGRAM, discriminator: \"e517cb977ae3ad2a\" },\n ],\n network: \"solana-mainnet\",\n });\n\n expect(spy).toHaveBeenCalledTimes(2);\n expect(spy).toHaveBeenCalledWith({\n programId: SYSTEM_PROGRAM,\n network: \"solana-mainnet\",\n });\n expect(spy).toHaveBeenCalledWith({\n programId: JUPITER_PROGRAM,\n network: \"solana-mainnet\",\n });\n\n expect(\n result.every(\n (c) =>\n c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO ||\n c.type === ClearSignContextType.ERROR,\n ),\n ).toBe(true);\n expect(\n result.filter(\n (c) => c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n ),\n ).toHaveLength(2);\n });\n\n it(\"emits one SOLANA_INSTRUCTION_INFO per matching (programId, discriminator), passing the decoded payload through with the certificate\", async () => {\n const loader = makeLoader();\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(makeSystemResult()),\n );\n\n const result = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" },\n ],\n });\n\n const infoCtx = result.find(\n (c) => c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n );\n expect(infoCtx).toBeDefined();\n expect(infoCtx).toMatchObject({\n type: ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n certificate: mockCertificate,\n });\n // The loader does not transform \u2014 it forwards the data source's payload.\n expect((infoCtx as any).payload).toEqual(makeSystemPayload());\n });\n\n it(\"does NOT emit SOLANA_ENUM_VARIANT contexts (those come from EnumVariantContextLoader)\", async () => {\n const loader = makeLoader();\n // Pass a pre-decoded variant to confirm the loader never emits SOLANA_ENUM_VARIANT.\n const jupiter = makeJupiterRouteResult([\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n },\n ]);\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(jupiter),\n );\n\n const result = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: JUPITER_PROGRAM, discriminator: \"e517cb977ae3ad2a\" },\n ],\n });\n\n expect(\n result.filter(\n (c) => c.type === ClearSignContextType.SOLANA_ENUM_VARIANT,\n ),\n ).toHaveLength(0);\n });\n\n it(\"bundles CAL enum_variants into the SOLANA_INSTRUCTION_INFO payload (host decode cache)\", async () => {\n const loader = makeLoader();\n const expectedVariants: SolanaInstructionEnumVariant[] = [\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n },\n ];\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(makeJupiterRouteResult(expectedVariants)),\n );\n\n const result = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: JUPITER_PROGRAM, discriminator: \"e517cb977ae3ad2a\" },\n ],\n });\n\n const infoCtx = result.find(\n (c) => c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n );\n\n expect((infoCtx as any).payload.enumVariants).toEqual(expectedVariants);\n });\n\n it(\"forwards exactly the enumVariants the data source decoded \u2014 no NaN indices\", async () => {\n const loader = makeLoader();\n // The data source is responsible for filtering malformed variant keys;\n // the loader forwards whatever pre-decoded variants it receives as-is.\n const validVariant: SolanaInstructionEnumVariant = {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n };\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(makeJupiterRouteResult([validVariant])),\n );\n\n const result = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: JUPITER_PROGRAM, discriminator: \"e517cb977ae3ad2a\" },\n ],\n });\n\n const infoCtx = result.find(\n (c) => c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n );\n\n expect((infoCtx as any).payload.enumVariants).toEqual([validVariant]);\n });\n\n it(\"filters descriptors by requested discriminator\", async () => {\n const loader = makeLoader();\n const result: InstructionInfoResult = {\n programId: SYSTEM_PROGRAM,\n descriptors: {\n \"00000000\": Right(makeSystemPayload()),\n \"00000001\": Right({\n ...makeSystemPayload(),\n discriminator: \"00000001\",\n instructionInfo: { data: \"0001other\", signature: \"p\" },\n }),\n },\n enumVariants: [],\n };\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(result),\n );\n\n const out = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" },\n ],\n });\n\n const infos = out.filter(\n (c) => c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n );\n expect(infos).toHaveLength(1);\n expect((infos[0] as any).payload.discriminator).toBe(\"00000000\");\n });\n\n it(\"emits an ERROR context for a descriptor the data source could not decode\", async () => {\n const loader = makeLoader();\n const result: InstructionInfoResult = {\n programId: SYSTEM_PROGRAM,\n descriptors: {\n \"00000000\": Left(new Error(\"missing 'test' signature\")),\n },\n enumVariants: [],\n };\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(result),\n );\n\n const out = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" },\n ],\n });\n\n expect(out).toHaveLength(1);\n expect(out[0]?.type).toBe(ClearSignContextType.ERROR);\n expect((out[0] as any).error.message).toMatch(/missing 'test' signature/);\n });\n\n it(\"emits one ERROR context when CAL fails for a program but keeps processing the others\", async () => {\n const loader = makeLoader();\n vi.spyOn(dataSource, \"getInstructionInfo\").mockImplementation(\n async ({ programId }) => {\n if (programId === SYSTEM_PROGRAM) return Right(makeSystemResult());\n return Left(new Error(\"upstream-500\"));\n },\n );\n\n const out = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" },\n { programId: JUPITER_PROGRAM, discriminator: \"e517cb977ae3ad2a\" },\n ],\n });\n\n const errors = out.filter((c) => c.type === ClearSignContextType.ERROR);\n const infos = out.filter(\n (c) => c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n );\n expect(errors).toHaveLength(1);\n expect(infos).toHaveLength(1);\n });\n\n it(\"degrades every program to ERROR when certificate loading fails\", async () => {\n vi.spyOn(certificateLoader, \"loadCertificate\").mockRejectedValue(\n new Error(\"pki-down\"),\n );\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(makeSystemResult()),\n );\n const loader = makeLoader();\n\n const out = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM },\n { programId: JUPITER_PROGRAM },\n ],\n });\n\n expect(out).toHaveLength(2);\n expect(out.every((c) => c.type === ClearSignContextType.ERROR)).toBe(\n true,\n );\n });\n\n it(\"degrades every program to ERROR when the certificate resolves undefined\", async () => {\n vi.spyOn(certificateLoader, \"loadCertificate\").mockResolvedValue(\n undefined,\n );\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(makeSystemResult()),\n );\n const loader = makeLoader();\n\n const out = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM },\n { programId: JUPITER_PROGRAM },\n ],\n });\n\n expect(out).toHaveLength(2);\n expect(out.every((c) => c.type === ClearSignContextType.ERROR)).toBe(\n true,\n );\n expect((out[0] as any).error.message).toMatch(/certificate is missing/);\n });\n\n it(\"falls back to default network when input.network is omitted or empty string\", async () => {\n const loader = makeLoader();\n const spy = vi\n .spyOn(dataSource, \"getInstructionInfo\")\n .mockResolvedValue(Right(makeSystemResult()));\n\n await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [{ programId: SYSTEM_PROGRAM }],\n });\n expect(spy).toHaveBeenLastCalledWith({\n programId: SYSTEM_PROGRAM,\n network: \"solana-mainnet\",\n });\n\n await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [{ programId: SYSTEM_PROGRAM }],\n network: \"\",\n });\n expect(spy).toHaveBeenLastCalledWith({\n programId: SYSTEM_PROGRAM,\n network: \"solana-mainnet\",\n });\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["DeviceModelId", "Left", "Right", "beforeEach", "describe", "expect", "it", "vi", "ClearSignContextType", "InstructionInfoContextLoader", "mockLoggerFactory", "mockCertificate", "SYSTEM_PROGRAM", "JUPITER_PROGRAM", "makeSystemPayload", "makeSystemResult", "makeJupiterPayload", "makeJupiterResult", "makeJupiterRouteResult", "enumVariants", "dataSource", "certificateLoader", "makeLoader", "loader", "types", "spy", "programId", "result", "c", "infoCtx", "jupiter", "expectedVariants", "validVariant", "infos", "out", "errors"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Left as i,Right as d}from"purify-ts";import{beforeEach as p,describe as u,expect as a,it as n,vi as s}from"vitest";import{HttpLifiDataSource as m}from"./HttpLifiDataSource";const f=()=>({debug:s.fn(),info:s.fn(),warn:s.fn(),error:s.fn(),subscribers:[]});u("HttpLifiDataSource",()=>{let r,t;const e="tpl-123",c={cal:{url:"https://
|
|
1
|
+
import{Left as i,Right as d}from"purify-ts";import{beforeEach as p,describe as u,expect as a,it as n,vi as s}from"vitest";import{HttpLifiDataSource as m}from"./HttpLifiDataSource";const f=()=>({debug:s.fn(),info:s.fn(),warn:s.fn(),error:s.fn(),subscribers:[]});u("HttpLifiDataSource",()=>{let r,t;const e="tpl-123",c={cal:{url:"https://global.api.prd.ledger.com/cal/v1",mode:"prod",branch:"main"}};p(()=>{s.clearAllMocks(),t={get:s.fn()},r=new m(c,f,t)}),n("should call the network client with the expected URL and params",async()=>{t.get.mockResolvedValue([]),await r.getTransactionDescriptorsPayload({templateId:e}),a(t.get).toHaveBeenCalledTimes(1),a(t.get).toHaveBeenCalledWith("https://global.api.prd.ledger.com/cal/v1/swap_templates",{params:{template_id:e,output:"id,chain_id,instructions,descriptors"}})}),n("should return Right(data[0]) when the network client responds with a non-empty array",async()=>{const o={descriptors:{swap:{programId:"SwapProgram",accounts:[],data:"abcd"}}};t.get.mockResolvedValue([o]);const l=await r.getTransactionDescriptorsPayload({templateId:e});a(l).toEqual(d(o))}),n("should return an error when data is undefined",async()=>{t.get.mockResolvedValue(null);const o=await r.getTransactionDescriptorsPayload({templateId:e});a(o).toEqual(i(new Error(`[ContextModule] HttpLifiDataSource: no transaction descriptors for id ${e}`)))}),n("should return an error when data array is empty",async()=>{t.get.mockResolvedValue([]);const o=await r.getTransactionDescriptorsPayload({templateId:e});a(o).toEqual(i(new Error(`[ContextModule] HttpLifiDataSource: no transaction descriptors for id ${e}`)))}),n("should return an error when first element is falsy",async()=>{t.get.mockResolvedValue([null]);const o=await r.getTransactionDescriptorsPayload({templateId:e});a(o).toEqual(i(new Error(`[ContextModule] HttpLifiDataSource: no transaction descriptors for id ${e}`)))}),n("should return an error when the network client throws",async()=>{t.get.mockRejectedValue(new Error("network"));const o=await r.getTransactionDescriptorsPayload({templateId:e});a(o).toEqual(i(new Error("[ContextModule] HttpLifiDataSource: Failed to fetch transaction descriptors")))})});
|
|
2
2
|
//# sourceMappingURL=HttpLifiDataSource.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../src/modules/solana/lifi/data/HttpLifiDataSource.test.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\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 { HttpLifiDataSource } from \"./HttpLifiDataSource\";\nimport {\n type GetTransactionDescriptorsResponse,\n type LifiDataSource,\n} from \"./LifiDataSource\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\ndescribe(\"HttpLifiDataSource\", () => {\n let datasource: LifiDataSource;\n let httpMock: { get: ReturnType<typeof vi.fn> };\n const templateId = \"tpl-123\";\n const config: ContextModuleServiceConfig = {\n cal: {\n url: \"https://
|
|
5
|
-
"mappings": "AAGA,OAAS,QAAAA,EAAM,SAAAC,MAAa,YAC5B,OAAS,cAAAC,EAAY,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,EAAI,MAAAC,MAAU,SAIrD,OAAS,sBAAAC,MAA0B,uBAMnC,MAAMC,EAAoB,KAAO,CAC/B,MAAOF,EAAG,GAAG,EACb,KAAMA,EAAG,GAAG,EACZ,KAAMA,EAAG,GAAG,EACZ,MAAOA,EAAG,GAAG,EACb,YAAa,CAAC,CAChB,GAEAH,EAAS,qBAAsB,IAAM,CACnC,IAAIM,EACAC,EACJ,MAAMC,EAAa,UACbC,EAAqC,CACzC,IAAK,CACH,IAAK,
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\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 { HttpLifiDataSource } from \"./HttpLifiDataSource\";\nimport {\n type GetTransactionDescriptorsResponse,\n type LifiDataSource,\n} from \"./LifiDataSource\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\ndescribe(\"HttpLifiDataSource\", () => {\n let datasource: LifiDataSource;\n let httpMock: { get: ReturnType<typeof vi.fn> };\n const templateId = \"tpl-123\";\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 HttpLifiDataSource(\n config,\n mockLoggerFactory,\n httpMock as unknown as DmkNetworkClient,\n );\n });\n\n it(\"should call the network client with the expected URL and params\", async () => {\n // given\n httpMock.get.mockResolvedValue([]);\n\n // when\n await datasource.getTransactionDescriptorsPayload({ templateId });\n\n // then\n expect(httpMock.get).toHaveBeenCalledTimes(1);\n expect(httpMock.get).toHaveBeenCalledWith(\n \"https://global.api.prd.ledger.com/cal/v1/swap_templates\",\n {\n params: {\n template_id: templateId,\n output: \"id,chain_id,instructions,descriptors\",\n },\n },\n );\n });\n\n it(\"should return Right(data[0]) when the network client responds with a non-empty array\", async () => {\n // given\n const response0: GetTransactionDescriptorsResponse = {\n descriptors: {\n swap: { programId: \"SwapProgram\", accounts: [], data: \"abcd\" } as any,\n },\n } as any;\n\n httpMock.get.mockResolvedValue([response0]);\n\n // when\n const result = await datasource.getTransactionDescriptorsPayload({\n templateId,\n });\n\n // then\n expect(result).toEqual(Right(response0));\n });\n\n it(\"should return an error when data is undefined\", async () => {\n // given\n httpMock.get.mockResolvedValue(null);\n\n // when\n const result = await datasource.getTransactionDescriptorsPayload({\n templateId,\n });\n\n // then\n expect(result).toEqual(\n Left(\n new Error(\n `[ContextModule] HttpLifiDataSource: no transaction descriptors for id ${templateId}`,\n ),\n ),\n );\n });\n\n it(\"should return an error when data array is empty\", async () => {\n // given\n httpMock.get.mockResolvedValue([]);\n\n // when\n const result = await datasource.getTransactionDescriptorsPayload({\n templateId,\n });\n\n // then\n expect(result).toEqual(\n Left(\n new Error(\n `[ContextModule] HttpLifiDataSource: no transaction descriptors for id ${templateId}`,\n ),\n ),\n );\n });\n\n it(\"should return an error when first element is falsy\", async () => {\n // given\n httpMock.get.mockResolvedValue([null]);\n\n // when\n const result = await datasource.getTransactionDescriptorsPayload({\n templateId,\n });\n\n // then\n expect(result).toEqual(\n Left(\n new Error(\n `[ContextModule] HttpLifiDataSource: no transaction descriptors for id ${templateId}`,\n ),\n ),\n );\n });\n\n it(\"should return an error when the network client throws\", async () => {\n // given\n httpMock.get.mockRejectedValue(new Error(\"network\"));\n\n // when\n const result = await datasource.getTransactionDescriptorsPayload({\n templateId,\n });\n\n // then\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpLifiDataSource: Failed to fetch transaction descriptors\",\n ),\n ),\n );\n });\n});\n"],
|
|
5
|
+
"mappings": "AAGA,OAAS,QAAAA,EAAM,SAAAC,MAAa,YAC5B,OAAS,cAAAC,EAAY,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,EAAI,MAAAC,MAAU,SAIrD,OAAS,sBAAAC,MAA0B,uBAMnC,MAAMC,EAAoB,KAAO,CAC/B,MAAOF,EAAG,GAAG,EACb,KAAMA,EAAG,GAAG,EACZ,KAAMA,EAAG,GAAG,EACZ,MAAOA,EAAG,GAAG,EACb,YAAa,CAAC,CAChB,GAEAH,EAAS,qBAAsB,IAAM,CACnC,IAAIM,EACAC,EACJ,MAAMC,EAAa,UACbC,EAAqC,CACzC,IAAK,CACH,IAAK,2CACL,KAAM,OACN,OAAQ,MACV,CACF,EAEAV,EAAW,IAAM,CACfI,EAAG,cAAc,EACjBI,EAAW,CAAE,IAAKJ,EAAG,GAAG,CAAE,EAC1BG,EAAa,IAAIF,EACfK,EACAJ,EACAE,CACF,CACF,CAAC,EAEDL,EAAG,kEAAmE,SAAY,CAEhFK,EAAS,IAAI,kBAAkB,CAAC,CAAC,EAGjC,MAAMD,EAAW,iCAAiC,CAAE,WAAAE,CAAW,CAAC,EAGhEP,EAAOM,EAAS,GAAG,EAAE,sBAAsB,CAAC,EAC5CN,EAAOM,EAAS,GAAG,EAAE,qBACnB,0DACA,CACE,OAAQ,CACN,YAAaC,EACb,OAAQ,sCACV,CACF,CACF,CACF,CAAC,EAEDN,EAAG,uFAAwF,SAAY,CAErG,MAAMQ,EAA+C,CACnD,YAAa,CACX,KAAM,CAAE,UAAW,cAAe,SAAU,CAAC,EAAG,KAAM,MAAO,CAC/D,CACF,EAEAH,EAAS,IAAI,kBAAkB,CAACG,CAAS,CAAC,EAG1C,MAAMC,EAAS,MAAML,EAAW,iCAAiC,CAC/D,WAAAE,CACF,CAAC,EAGDP,EAAOU,CAAM,EAAE,QAAQb,EAAMY,CAAS,CAAC,CACzC,CAAC,EAEDR,EAAG,gDAAiD,SAAY,CAE9DK,EAAS,IAAI,kBAAkB,IAAI,EAGnC,MAAMI,EAAS,MAAML,EAAW,iCAAiC,CAC/D,WAAAE,CACF,CAAC,EAGDP,EAAOU,CAAM,EAAE,QACbd,EACE,IAAI,MACF,yEAAyEW,CAAU,EACrF,CACF,CACF,CACF,CAAC,EAEDN,EAAG,kDAAmD,SAAY,CAEhEK,EAAS,IAAI,kBAAkB,CAAC,CAAC,EAGjC,MAAMI,EAAS,MAAML,EAAW,iCAAiC,CAC/D,WAAAE,CACF,CAAC,EAGDP,EAAOU,CAAM,EAAE,QACbd,EACE,IAAI,MACF,yEAAyEW,CAAU,EACrF,CACF,CACF,CACF,CAAC,EAEDN,EAAG,qDAAsD,SAAY,CAEnEK,EAAS,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAGrC,MAAMI,EAAS,MAAML,EAAW,iCAAiC,CAC/D,WAAAE,CACF,CAAC,EAGDP,EAAOU,CAAM,EAAE,QACbd,EACE,IAAI,MACF,yEAAyEW,CAAU,EACrF,CACF,CACF,CACF,CAAC,EAEDN,EAAG,wDAAyD,SAAY,CAEtEK,EAAS,IAAI,kBAAkB,IAAI,MAAM,SAAS,CAAC,EAGnD,MAAMI,EAAS,MAAML,EAAW,iCAAiC,CAC/D,WAAAE,CACF,CAAC,EAGDP,EAAOU,CAAM,EAAE,QACbd,EACE,IAAI,MACF,6EACF,CACF,CACF,CACF,CAAC,CACH,CAAC",
|
|
6
6
|
"names": ["Left", "Right", "beforeEach", "describe", "expect", "it", "vi", "HttpLifiDataSource", "mockLoggerFactory", "datasource", "httpMock", "templateId", "config", "response0", "result"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Left as L,Right as
|
|
1
|
+
import{Left as L,Right as _}from"purify-ts";import{beforeEach as x,describe as m,expect as e,it as n,vi as c}from"vitest";import{ClearSignContextType as d}from"../../../../shared/model/ClearSignContext";import{LifiContextLoader as T}from"./LifiContextLoader";const h=()=>({debug:c.fn(),info:c.fn(),warn:c.fn(),error:c.fn(),subscribers:[]}),y={keyUsageNumber:13,payload:new Uint8Array([1,2])},N={cal:{url:"https://global.api.prd.ledger.com/cal/v1",mode:"test",branch:"main"}};m("LifiContextLoader",()=>{let p,u;const i=(r,a="deadbeef")=>({data:r,descriptorType:"swap_template",descriptorVersion:"v1",signatures:{test:a,prod:`prod_${a}`}}),g=(r,a="deadbeef")=>({data:r,descriptorType:"swap_template",descriptorVersion:"v1",signature:a}),k=[{program_id:"SomeProgram",discriminator_hex:"1",descriptor:i("abc123")},{program_id:"AnotherProgram",descriptor:i("def456")}],b={"SomeProgram:1":g("abc123"),"AnotherProgram:":g("def456")},l={id:"tpl-1",chain_id:101,instructions:[{program_id:"SomeProgram",discriminator:1,discriminator_hex:"1"},{program_id:"AnotherProgram"}],descriptors:k};x(()=>{c.restoreAllMocks(),p={getTransactionDescriptorsPayload:c.fn()},u={loadCertificate:c.fn().mockResolvedValue(y)}});const s=()=>new T(p,N,u,h);m("canHandle",()=>{n("returns true when templateId is provided and SOLANA_LIFI is in expectedTypes",()=>{const r=s();e(r.canHandle({templateId:"tpl-123",deviceModelId:"nanoS"},[d.SOLANA_LIFI])).toBe(!0)}),n("returns false when SOLANA_LIFI is not in expectedTypes",()=>{const r=s();e(r.canHandle({templateId:"tpl-123"},[d.SOLANA_TOKEN])).toBe(!1)}),n("returns false when templateId is missing or falsy",()=>{const r=s();e(r.canHandle({templateId:""},[d.SOLANA_LIFI])).toBe(!1),e(r.canHandle({templateId:void 0},[d.SOLANA_LIFI])).toBe(!1),e(r.canHandle({},[d.SOLANA_LIFI])).toBe(!1)})}),m("load",()=>{n("returns an array with an error when datasource returns Left(error)",async()=>{const r=s(),a=new Error("boom");c.spyOn(p,"getTransactionDescriptorsPayload").mockResolvedValue(L(a));const o={templateId:"tpl-err",deviceModelId:"nanoS"},t=await r.load(o);e(p.getTransactionDescriptorsPayload).toHaveBeenCalledWith({templateId:"tpl-err"}),e(t).toEqual([{type:d.ERROR,error:a}])}),n("returns SOLANA_LIFI array with plucked descriptors and certificate when datasource returns Right(value)",async()=>{const r=s();c.spyOn(p,"getTransactionDescriptorsPayload").mockResolvedValue(_(l));const a={templateId:"tpl-ok",deviceModelId:"nanoS"},o=await r.load(a);e(p.getTransactionDescriptorsPayload).toHaveBeenCalledWith({templateId:"tpl-ok"}),e(u.loadCertificate).toHaveBeenCalledWith({keyId:"swap_template_key",keyUsage:"swap_template",targetDevice:"nanoS"}),e(o).toEqual([{type:d.SOLANA_LIFI,payload:{descriptors:b,instructions:[{program_id:"SomeProgram",discriminator_hex:"1"},{program_id:"AnotherProgram"}]},certificate:y}])})}),m("pluckTransactionData (private)",()=>{n("returns a map keyed by `${program_id}:${discriminator_hex ?? '0'}`",()=>{const r=s(),o=r.pluckTransactionData.bind(r)(l);e(o).toEqual(b)})}),m("extractInstructionsMeta (private)",()=>{n("returns instruction metadata from the API response",()=>{const r=s(),o=r.extractInstructionsMeta.bind(r)(l);e(o).toEqual([{program_id:"SomeProgram",discriminator_hex:"1"},{program_id:"AnotherProgram"}])}),n("returns empty array when instructions are missing",()=>{const r=s(),o=r.extractInstructionsMeta.bind(r)({...l,instructions:void 0});e(o).toEqual([])})}),m("pluckTransactionData mode resolution (private)",()=>{n("resolves signature using config.cal.mode",()=>{const r=s(),o=r.pluckTransactionData.bind(r)(l);e(o["SomeProgram:1"]?.signature).toBe("deadbeef")})}),m("real CAL payload (LiFi template 4c694669)",()=>{const r={id:"4c694669",chain_id:101,instructions:[{program_id:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",discriminator:1,discriminator_hex:"1"},{program_id:"11111111111111111111111111111111",discriminator:2,discriminator_hex:"2"},{program_id:"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4",discriminator:0x2aade37a97cb1800,discriminator_hex:"2aade37a97cb17e0"},{program_id:"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4",discriminator:9339575302786589e3,discriminator_hex:"819cd641339b2148"},{program_id:"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"},{program_id:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",discriminator:1,discriminator_hex:"1"},{program_id:"3i5JeuZuUxeKtVysUnwQNGerJP2bSMX9fTFfS4Nxe3Br"},{program_id:"ComputeBudget111111111111111111111111111111",discriminator:2,discriminator_hex:"2"},{program_id:"ComputeBudget111111111111111111111111111111",discriminator:3,discriminator_hex:"3"},{program_id:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",discriminator:3,discriminator_hex:"3"},{program_id:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",discriminator:17,discriminator_hex:"11"},{program_id:"BrdgN2RPzEMWF96ZbnnJaUtQDQx7VRXYaHHbYCBvceWB"}],descriptors:[{program_id:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",discriminator_hex:"1",descriptor:i("atoken_1","sig_atoken")},{program_id:"11111111111111111111111111111111",discriminator_hex:"2",descriptor:i("system_2","sig_system")},{program_id:"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4",discriminator_hex:"2aade37a97cb17e0",descriptor:i("jup_route","sig_jup_route")},{program_id:"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4",discriminator_hex:"819cd641339b2148",descriptor:i("jup_shared","sig_jup_shared")},{program_id:"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr",descriptor:i("memo","sig_memo")},{program_id:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",discriminator_hex:"1",descriptor:i("atoken_1","sig_atoken")},{program_id:"3i5JeuZuUxeKtVysUnwQNGerJP2bSMX9fTFfS4Nxe3Br",descriptor:i("3i5jeu","sig_3i5jeu")},{program_id:"ComputeBudget111111111111111111111111111111",discriminator_hex:"2",descriptor:i("cb_2","sig_cb2")},{program_id:"ComputeBudget111111111111111111111111111111",discriminator_hex:"3",descriptor:i("cb_3","sig_cb3")},{program_id:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",discriminator_hex:"3",descriptor:i("tokenkeg_3","sig_tk3")},{program_id:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",discriminator_hex:"11",descriptor:i("tokenkeg_11","sig_tk11")},{program_id:"BrdgN2RPzEMWF96ZbnnJaUtQDQx7VRXYaHHbYCBvceWB",descriptor:i("brdg","sig_brdg")}]};n("produces 11 unique descriptor keys (ATokenGP:1 appears twice but deduplicates)",()=>{const a=s(),t=a.pluckTransactionData.bind(a)(r),f=Object.keys(t);e(f).toHaveLength(11)}),n("creates distinct keys for same program_id with different discriminators",()=>{const a=s(),t=a.pluckTransactionData.bind(a)(r);e(t["JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4:2aade37a97cb17e0"]?.data).toBe("jup_route"),e(t["JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4:819cd641339b2148"]?.data).toBe("jup_shared"),e(t["ComputeBudget111111111111111111111111111111:2"]?.data).toBe("cb_2"),e(t["ComputeBudget111111111111111111111111111111:3"]?.data).toBe("cb_3"),e(t["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA:3"]?.data).toBe("tokenkeg_3"),e(t["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA:11"]?.data).toBe("tokenkeg_11")}),n("uses :0 suffix for programs without a discriminator",()=>{const a=s(),t=a.pluckTransactionData.bind(a)(r);e(t["MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr:"]?.data).toBe("memo"),e(t["3i5JeuZuUxeKtVysUnwQNGerJP2bSMX9fTFfS4Nxe3Br:"]?.data).toBe("3i5jeu"),e(t["BrdgN2RPzEMWF96ZbnnJaUtQDQx7VRXYaHHbYCBvceWB:"]?.data).toBe("brdg")}),n("extracts 12 instruction metadata entries preserving order and discriminators",()=>{const a=s(),t=a.extractInstructionsMeta.bind(a)(r);e(t).toHaveLength(12),e(t[0]).toEqual({program_id:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",discriminator_hex:"1"}),e(t[2]).toEqual({program_id:"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4",discriminator_hex:"2aade37a97cb17e0"}),e(t[3]).toEqual({program_id:"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4",discriminator_hex:"819cd641339b2148"}),e(t[4]).toEqual({program_id:"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"}),e(t[11]).toEqual({program_id:"BrdgN2RPzEMWF96ZbnnJaUtQDQx7VRXYaHHbYCBvceWB"})}),n("load returns full payload with descriptors and instructions from real API response",async()=>{const a=s();c.spyOn(p,"getTransactionDescriptorsPayload").mockResolvedValue(_(r));const o={templateId:"4c694669",deviceModelId:"nanoS"},t=await a.load(o);e(t).toHaveLength(1),e(t[0]).toMatchObject({type:d.SOLANA_LIFI,payload:{descriptors:e.objectContaining({"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4:2aade37a97cb17e0":e.objectContaining({data:"jup_route"}),"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4:819cd641339b2148":e.objectContaining({data:"jup_shared"})}),instructions:e.arrayContaining([e.objectContaining({program_id:"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4",discriminator_hex:"2aade37a97cb17e0"}),e.objectContaining({program_id:"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4",discriminator_hex:"819cd641339b2148"})])}}),e(Object.keys(t[0].payload.descriptors)).toHaveLength(11),e(t[0].payload.instructions).toHaveLength(12)})})});
|
|
2
2
|
//# sourceMappingURL=LifiContextLoader.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../src/modules/solana/lifi/domain/LifiContextLoader.test.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport {\n type GetTransactionDescriptorsResponse,\n type LifiDataSource,\n} from \"@/modules/solana/lifi/data/LifiDataSource\";\nimport {\n type SolanaTransactionDescriptorList,\n type SolanaTransactionDescriptorRaw,\n} from \"@/modules/solana/model/SolanaContextTypes\";\nimport { type SolanaTransactionDescriptor } from \"@/modules/solana/model/SolanaPayloads\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { LifiContextLoader } from \"./LifiContextLoader\";\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([0x01, 0x02]),\n};\n\nconst mockConfig = {\n cal: {\n url: \"https://crypto-assets-service.api.ledger.com\",\n mode: \"test\",\n branch: \"main\",\n },\n} as ContextModuleServiceConfig;\n\ndescribe(\"LifiContextLoader\", () => {\n let mockDataSource: LifiDataSource;\n let mockCertificateLoader: PkiCertificateLoader;\n\n const makeRawDescriptor = (\n data: string,\n sig = \"deadbeef\",\n ): SolanaTransactionDescriptorRaw => ({\n data,\n descriptorType: \"swap_template\",\n descriptorVersion: \"v1\",\n signatures: { test: sig, prod: `prod_${sig}` },\n });\n\n const makeResolvedDescriptor = (\n data: string,\n sig = \"deadbeef\",\n ): SolanaTransactionDescriptor => ({\n data,\n descriptorType: \"swap_template\",\n descriptorVersion: \"v1\",\n signature: sig,\n });\n\n const responseDescriptorsArray: GetTransactionDescriptorsResponse[\"descriptors\"] =\n [\n {\n program_id: \"SomeProgram\",\n discriminator_hex: \"1\",\n descriptor: makeRawDescriptor(\"abc123\"),\n },\n {\n program_id: \"AnotherProgram\",\n // discriminator_hex intentionally omitted -> defaults to \"\"\n descriptor: makeRawDescriptor(\"def456\"),\n },\n ];\n\n const expectedPlucked: SolanaTransactionDescriptorList = {\n \"SomeProgram:1\": makeResolvedDescriptor(\"abc123\"),\n \"AnotherProgram:\": makeResolvedDescriptor(\"def456\"),\n };\n\n const responseInstructionsArray: GetTransactionDescriptorsResponse[\"instructions\"] =\n [\n {\n program_id: \"SomeProgram\",\n discriminator: 1,\n discriminator_hex: \"1\",\n },\n {\n program_id: \"AnotherProgram\",\n // discriminator_hex intentionally omitted\n },\n ];\n\n const txDescriptorsResponse: GetTransactionDescriptorsResponse = {\n id: \"tpl-1\",\n chain_id: 101,\n instructions: responseInstructionsArray,\n descriptors: responseDescriptorsArray,\n };\n\n beforeEach(() => {\n vi.restoreAllMocks();\n mockDataSource = {\n getTransactionDescriptorsPayload: vi.fn(),\n } as unknown as LifiDataSource;\n mockCertificateLoader = {\n loadCertificate: vi.fn().mockResolvedValue(mockCertificate),\n } as unknown as PkiCertificateLoader;\n });\n\n const makeLoader = () =>\n new LifiContextLoader(\n mockDataSource,\n mockConfig,\n mockCertificateLoader,\n mockLoggerFactory,\n );\n\n describe(\"canHandle\", () => {\n it(\"returns true when templateId is provided and SOLANA_LIFI is in expectedTypes\", () => {\n const loader = makeLoader();\n\n expect(\n loader.canHandle(\n {\n templateId: \"tpl-123\",\n deviceModelId: \"nanoS\" as any,\n },\n [ClearSignContextType.SOLANA_LIFI],\n ),\n ).toBe(true);\n });\n\n it(\"returns false when SOLANA_LIFI is not in expectedTypes\", () => {\n const loader = makeLoader();\n\n expect(\n loader.canHandle({ templateId: \"tpl-123\" } as any, [\n ClearSignContextType.SOLANA_TOKEN,\n ]),\n ).toBe(false);\n });\n\n it(\"returns false when templateId is missing or falsy\", () => {\n const loader = makeLoader();\n\n expect(\n loader.canHandle({ templateId: \"\" } as any, [\n ClearSignContextType.SOLANA_LIFI,\n ]),\n ).toBe(false);\n expect(\n loader.canHandle({ templateId: undefined } as any, [\n ClearSignContextType.SOLANA_LIFI,\n ]),\n ).toBe(false);\n expect(\n loader.canHandle({} as any, [ClearSignContextType.SOLANA_LIFI]),\n ).toBe(false);\n });\n });\n\n describe(\"load\", () => {\n it(\"returns an array with an error when datasource returns Left(error)\", async () => {\n const loader = makeLoader();\n const error = new Error(\"boom\");\n\n vi.spyOn(\n mockDataSource,\n \"getTransactionDescriptorsPayload\",\n ).mockResolvedValue(Left(error));\n\n const input = { templateId: \"tpl-err\", deviceModelId: \"nanoS\" as any };\n const result = await loader.load(input);\n\n expect(\n mockDataSource.getTransactionDescriptorsPayload,\n ).toHaveBeenCalledWith({\n templateId: \"tpl-err\",\n });\n\n expect(result).toEqual([\n {\n type: ClearSignContextType.ERROR,\n error,\n },\n ]);\n });\n\n it(\"returns SOLANA_LIFI array with plucked descriptors and certificate when datasource returns Right(value)\", async () => {\n const loader = makeLoader();\n\n vi.spyOn(\n mockDataSource,\n \"getTransactionDescriptorsPayload\",\n ).mockResolvedValue(Right(txDescriptorsResponse));\n\n const input = { templateId: \"tpl-ok\", deviceModelId: \"nanoS\" as any };\n const result = await loader.load(input);\n\n expect(\n mockDataSource.getTransactionDescriptorsPayload,\n ).toHaveBeenCalledWith({\n templateId: \"tpl-ok\",\n });\n\n expect(mockCertificateLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: \"swap_template_key\",\n keyUsage: \"swap_template\",\n targetDevice: \"nanoS\",\n });\n\n expect(result).toEqual([\n {\n type: ClearSignContextType.SOLANA_LIFI,\n payload: {\n descriptors: expectedPlucked,\n instructions: [\n { program_id: \"SomeProgram\", discriminator_hex: \"1\" },\n { program_id: \"AnotherProgram\" },\n ],\n },\n certificate: mockCertificate,\n },\n ]);\n });\n });\n\n describe(\"pluckTransactionData (private)\", () => {\n it(\"returns a map keyed by `${program_id}:${discriminator_hex ?? '0'}`\", () => {\n const loader = makeLoader();\n const pluck = (loader as any).pluckTransactionData.bind(loader);\n\n const result: SolanaTransactionDescriptorList = pluck(\n txDescriptorsResponse,\n );\n\n expect(result).toEqual(expectedPlucked);\n });\n });\n\n describe(\"extractInstructionsMeta (private)\", () => {\n it(\"returns instruction metadata from the API response\", () => {\n const loader = makeLoader();\n const extract = (loader as any).extractInstructionsMeta.bind(loader);\n\n const result = extract(txDescriptorsResponse);\n\n expect(result).toEqual([\n { program_id: \"SomeProgram\", discriminator_hex: \"1\" },\n { program_id: \"AnotherProgram\" },\n ]);\n });\n\n it(\"returns empty array when instructions are missing\", () => {\n const loader = makeLoader();\n const extract = (loader as any).extractInstructionsMeta.bind(loader);\n\n const result = extract({\n ...txDescriptorsResponse,\n instructions: undefined,\n });\n\n expect(result).toEqual([]);\n });\n });\n\n describe(\"pluckTransactionData mode resolution (private)\", () => {\n it(\"resolves signature using config.cal.mode\", () => {\n const loader = makeLoader();\n const pluck = (loader as any).pluckTransactionData.bind(loader);\n\n const result: SolanaTransactionDescriptorList = pluck(\n txDescriptorsResponse,\n );\n\n expect(result[\"SomeProgram:1\"]?.signature).toBe(\"deadbeef\");\n });\n });\n\n describe(\"real CAL payload (LiFi template 4c694669)\", () => {\n const realApiResponse: GetTransactionDescriptorsResponse = {\n id: \"4c694669\",\n chain_id: 101,\n instructions: [\n {\n program_id: \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n discriminator: 1,\n discriminator_hex: \"1\",\n },\n {\n program_id: \"11111111111111111111111111111111\",\n discriminator: 2,\n discriminator_hex: \"2\",\n },\n {\n program_id: \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\",\n discriminator: 3.0753642362361016e18,\n discriminator_hex: \"2aade37a97cb17e0\",\n },\n {\n program_id: \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\",\n discriminator: 9.339575302786589e18,\n discriminator_hex: \"819cd641339b2148\",\n },\n { program_id: \"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\" },\n {\n program_id: \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n discriminator: 1,\n discriminator_hex: \"1\",\n },\n { program_id: \"3i5JeuZuUxeKtVysUnwQNGerJP2bSMX9fTFfS4Nxe3Br\" },\n {\n program_id: \"ComputeBudget111111111111111111111111111111\",\n discriminator: 2,\n discriminator_hex: \"2\",\n },\n {\n program_id: \"ComputeBudget111111111111111111111111111111\",\n discriminator: 3,\n discriminator_hex: \"3\",\n },\n {\n program_id: \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n discriminator: 3,\n discriminator_hex: \"3\",\n },\n {\n program_id: \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n discriminator: 17,\n discriminator_hex: \"11\",\n },\n { program_id: \"BrdgN2RPzEMWF96ZbnnJaUtQDQx7VRXYaHHbYCBvceWB\" },\n ],\n descriptors: [\n {\n program_id: \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n discriminator_hex: \"1\",\n descriptor: makeRawDescriptor(\"atoken_1\", \"sig_atoken\"),\n },\n {\n program_id: \"11111111111111111111111111111111\",\n discriminator_hex: \"2\",\n descriptor: makeRawDescriptor(\"system_2\", \"sig_system\"),\n },\n {\n program_id: \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\",\n discriminator_hex: \"2aade37a97cb17e0\",\n descriptor: makeRawDescriptor(\"jup_route\", \"sig_jup_route\"),\n },\n {\n program_id: \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\",\n discriminator_hex: \"819cd641339b2148\",\n descriptor: makeRawDescriptor(\"jup_shared\", \"sig_jup_shared\"),\n },\n {\n program_id: \"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\",\n descriptor: makeRawDescriptor(\"memo\", \"sig_memo\"),\n },\n {\n program_id: \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n discriminator_hex: \"1\",\n descriptor: makeRawDescriptor(\"atoken_1\", \"sig_atoken\"),\n },\n {\n program_id: \"3i5JeuZuUxeKtVysUnwQNGerJP2bSMX9fTFfS4Nxe3Br\",\n descriptor: makeRawDescriptor(\"3i5jeu\", \"sig_3i5jeu\"),\n },\n {\n program_id: \"ComputeBudget111111111111111111111111111111\",\n discriminator_hex: \"2\",\n descriptor: makeRawDescriptor(\"cb_2\", \"sig_cb2\"),\n },\n {\n program_id: \"ComputeBudget111111111111111111111111111111\",\n discriminator_hex: \"3\",\n descriptor: makeRawDescriptor(\"cb_3\", \"sig_cb3\"),\n },\n {\n program_id: \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n discriminator_hex: \"3\",\n descriptor: makeRawDescriptor(\"tokenkeg_3\", \"sig_tk3\"),\n },\n {\n program_id: \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n discriminator_hex: \"11\",\n descriptor: makeRawDescriptor(\"tokenkeg_11\", \"sig_tk11\"),\n },\n {\n program_id: \"BrdgN2RPzEMWF96ZbnnJaUtQDQx7VRXYaHHbYCBvceWB\",\n descriptor: makeRawDescriptor(\"brdg\", \"sig_brdg\"),\n },\n ],\n };\n\n it(\"produces 11 unique descriptor keys (ATokenGP:1 appears twice but deduplicates)\", () => {\n const loader = makeLoader();\n const pluck = (loader as any).pluckTransactionData.bind(loader);\n\n const result: SolanaTransactionDescriptorList = pluck(realApiResponse);\n const keys = Object.keys(result);\n\n // 12 descriptors but ATokenGP:1 appears twice -> 11 unique keys\n expect(keys).toHaveLength(11);\n });\n\n it(\"creates distinct keys for same program_id with different discriminators\", () => {\n const loader = makeLoader();\n const pluck = (loader as any).pluckTransactionData.bind(loader);\n\n const result: SolanaTransactionDescriptorList = pluck(realApiResponse);\n\n // JUP6 has two different discriminators -> two distinct entries\n expect(\n result[\"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4:2aade37a97cb17e0\"]\n ?.data,\n ).toBe(\"jup_route\");\n expect(\n result[\"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4:819cd641339b2148\"]\n ?.data,\n ).toBe(\"jup_shared\");\n\n // ComputeBudget has discriminator 2 and 3\n expect(\n result[\"ComputeBudget111111111111111111111111111111:2\"]?.data,\n ).toBe(\"cb_2\");\n expect(\n result[\"ComputeBudget111111111111111111111111111111:3\"]?.data,\n ).toBe(\"cb_3\");\n\n // TokenkegQ has discriminator 3 and 11\n expect(\n result[\"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA:3\"]?.data,\n ).toBe(\"tokenkeg_3\");\n expect(\n result[\"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA:11\"]?.data,\n ).toBe(\"tokenkeg_11\");\n });\n\n it(\"uses :0 suffix for programs without a discriminator\", () => {\n const loader = makeLoader();\n const pluck = (loader as any).pluckTransactionData.bind(loader);\n\n const result: SolanaTransactionDescriptorList = pluck(realApiResponse);\n\n expect(result[\"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr:\"]?.data).toBe(\n \"memo\",\n );\n expect(\n result[\"3i5JeuZuUxeKtVysUnwQNGerJP2bSMX9fTFfS4Nxe3Br:\"]?.data,\n ).toBe(\"3i5jeu\");\n expect(\n result[\"BrdgN2RPzEMWF96ZbnnJaUtQDQx7VRXYaHHbYCBvceWB:\"]?.data,\n ).toBe(\"brdg\");\n });\n\n it(\"extracts 12 instruction metadata entries preserving order and discriminators\", () => {\n const loader = makeLoader();\n const extract = (loader as any).extractInstructionsMeta.bind(loader);\n\n const result = extract(realApiResponse);\n\n expect(result).toHaveLength(12);\n\n // First: ATokenGP with discriminator\n expect(result[0]).toEqual({\n program_id: \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n discriminator_hex: \"1\",\n });\n // JUP6 route (8-byte discriminator)\n expect(result[2]).toEqual({\n program_id: \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\",\n discriminator_hex: \"2aade37a97cb17e0\",\n });\n // JUP6 shared (8-byte discriminator)\n expect(result[3]).toEqual({\n program_id: \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\",\n discriminator_hex: \"819cd641339b2148\",\n });\n // Memo: no discriminator\n expect(result[4]).toEqual({\n program_id: \"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\",\n });\n // BrdgN2: no discriminator (last entry)\n expect(result[11]).toEqual({\n program_id: \"BrdgN2RPzEMWF96ZbnnJaUtQDQx7VRXYaHHbYCBvceWB\",\n });\n });\n\n it(\"load returns full payload with descriptors and instructions from real API response\", async () => {\n const loader = makeLoader();\n\n vi.spyOn(\n mockDataSource,\n \"getTransactionDescriptorsPayload\",\n ).mockResolvedValue(Right(realApiResponse));\n\n const input = { templateId: \"4c694669\", deviceModelId: \"nanoS\" as any };\n const result = await loader.load(input);\n\n expect(result).toHaveLength(1);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.SOLANA_LIFI,\n payload: {\n descriptors: expect.objectContaining({\n \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4:2aade37a97cb17e0\":\n expect.objectContaining({ data: \"jup_route\" }),\n \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4:819cd641339b2148\":\n expect.objectContaining({ data: \"jup_shared\" }),\n }),\n instructions: expect.arrayContaining([\n expect.objectContaining({\n program_id: \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\",\n discriminator_hex: \"2aade37a97cb17e0\",\n }),\n expect.objectContaining({\n program_id: \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\",\n discriminator_hex: \"819cd641339b2148\",\n }),\n ]),\n },\n });\n\n expect(Object.keys((result[0] as any).payload.descriptors)).toHaveLength(\n 11,\n );\n expect((result[0] as any).payload.instructions).toHaveLength(12);\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "AAIA,OAAS,QAAAA,EAAM,SAAAC,MAAa,YAC5B,OAAS,cAAAC,EAAY,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,EAAI,MAAAC,MAAU,SAarD,OAAS,wBAAAC,MAA4B,kCAErC,OAAS,qBAAAC,MAAyB,sBAElC,MAAMC,EAAoB,KAAO,CAC/B,MAAOH,EAAG,GAAG,EACb,KAAMA,EAAG,GAAG,EACZ,KAAMA,EAAG,GAAG,EACZ,MAAOA,EAAG,GAAG,EACb,YAAa,CAAC,CAChB,GAEMI,EAAkB,CACtB,eAAgB,GAChB,QAAS,IAAI,WAAW,CAAC,EAAM,CAAI,CAAC,CACtC,EAEMC,EAAa,CACjB,IAAK,CACH,IAAK
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport {\n type GetTransactionDescriptorsResponse,\n type LifiDataSource,\n} from \"@/modules/solana/lifi/data/LifiDataSource\";\nimport {\n type SolanaTransactionDescriptorList,\n type SolanaTransactionDescriptorRaw,\n} from \"@/modules/solana/model/SolanaContextTypes\";\nimport { type SolanaTransactionDescriptor } from \"@/modules/solana/model/SolanaPayloads\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { LifiContextLoader } from \"./LifiContextLoader\";\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([0x01, 0x02]),\n};\n\nconst mockConfig = {\n cal: {\n url: \"https://global.api.prd.ledger.com/cal/v1\",\n mode: \"test\",\n branch: \"main\",\n },\n} as ContextModuleServiceConfig;\n\ndescribe(\"LifiContextLoader\", () => {\n let mockDataSource: LifiDataSource;\n let mockCertificateLoader: PkiCertificateLoader;\n\n const makeRawDescriptor = (\n data: string,\n sig = \"deadbeef\",\n ): SolanaTransactionDescriptorRaw => ({\n data,\n descriptorType: \"swap_template\",\n descriptorVersion: \"v1\",\n signatures: { test: sig, prod: `prod_${sig}` },\n });\n\n const makeResolvedDescriptor = (\n data: string,\n sig = \"deadbeef\",\n ): SolanaTransactionDescriptor => ({\n data,\n descriptorType: \"swap_template\",\n descriptorVersion: \"v1\",\n signature: sig,\n });\n\n const responseDescriptorsArray: GetTransactionDescriptorsResponse[\"descriptors\"] =\n [\n {\n program_id: \"SomeProgram\",\n discriminator_hex: \"1\",\n descriptor: makeRawDescriptor(\"abc123\"),\n },\n {\n program_id: \"AnotherProgram\",\n // discriminator_hex intentionally omitted -> defaults to \"\"\n descriptor: makeRawDescriptor(\"def456\"),\n },\n ];\n\n const expectedPlucked: SolanaTransactionDescriptorList = {\n \"SomeProgram:1\": makeResolvedDescriptor(\"abc123\"),\n \"AnotherProgram:\": makeResolvedDescriptor(\"def456\"),\n };\n\n const responseInstructionsArray: GetTransactionDescriptorsResponse[\"instructions\"] =\n [\n {\n program_id: \"SomeProgram\",\n discriminator: 1,\n discriminator_hex: \"1\",\n },\n {\n program_id: \"AnotherProgram\",\n // discriminator_hex intentionally omitted\n },\n ];\n\n const txDescriptorsResponse: GetTransactionDescriptorsResponse = {\n id: \"tpl-1\",\n chain_id: 101,\n instructions: responseInstructionsArray,\n descriptors: responseDescriptorsArray,\n };\n\n beforeEach(() => {\n vi.restoreAllMocks();\n mockDataSource = {\n getTransactionDescriptorsPayload: vi.fn(),\n } as unknown as LifiDataSource;\n mockCertificateLoader = {\n loadCertificate: vi.fn().mockResolvedValue(mockCertificate),\n } as unknown as PkiCertificateLoader;\n });\n\n const makeLoader = () =>\n new LifiContextLoader(\n mockDataSource,\n mockConfig,\n mockCertificateLoader,\n mockLoggerFactory,\n );\n\n describe(\"canHandle\", () => {\n it(\"returns true when templateId is provided and SOLANA_LIFI is in expectedTypes\", () => {\n const loader = makeLoader();\n\n expect(\n loader.canHandle(\n {\n templateId: \"tpl-123\",\n deviceModelId: \"nanoS\" as any,\n },\n [ClearSignContextType.SOLANA_LIFI],\n ),\n ).toBe(true);\n });\n\n it(\"returns false when SOLANA_LIFI is not in expectedTypes\", () => {\n const loader = makeLoader();\n\n expect(\n loader.canHandle({ templateId: \"tpl-123\" } as any, [\n ClearSignContextType.SOLANA_TOKEN,\n ]),\n ).toBe(false);\n });\n\n it(\"returns false when templateId is missing or falsy\", () => {\n const loader = makeLoader();\n\n expect(\n loader.canHandle({ templateId: \"\" } as any, [\n ClearSignContextType.SOLANA_LIFI,\n ]),\n ).toBe(false);\n expect(\n loader.canHandle({ templateId: undefined } as any, [\n ClearSignContextType.SOLANA_LIFI,\n ]),\n ).toBe(false);\n expect(\n loader.canHandle({} as any, [ClearSignContextType.SOLANA_LIFI]),\n ).toBe(false);\n });\n });\n\n describe(\"load\", () => {\n it(\"returns an array with an error when datasource returns Left(error)\", async () => {\n const loader = makeLoader();\n const error = new Error(\"boom\");\n\n vi.spyOn(\n mockDataSource,\n \"getTransactionDescriptorsPayload\",\n ).mockResolvedValue(Left(error));\n\n const input = { templateId: \"tpl-err\", deviceModelId: \"nanoS\" as any };\n const result = await loader.load(input);\n\n expect(\n mockDataSource.getTransactionDescriptorsPayload,\n ).toHaveBeenCalledWith({\n templateId: \"tpl-err\",\n });\n\n expect(result).toEqual([\n {\n type: ClearSignContextType.ERROR,\n error,\n },\n ]);\n });\n\n it(\"returns SOLANA_LIFI array with plucked descriptors and certificate when datasource returns Right(value)\", async () => {\n const loader = makeLoader();\n\n vi.spyOn(\n mockDataSource,\n \"getTransactionDescriptorsPayload\",\n ).mockResolvedValue(Right(txDescriptorsResponse));\n\n const input = { templateId: \"tpl-ok\", deviceModelId: \"nanoS\" as any };\n const result = await loader.load(input);\n\n expect(\n mockDataSource.getTransactionDescriptorsPayload,\n ).toHaveBeenCalledWith({\n templateId: \"tpl-ok\",\n });\n\n expect(mockCertificateLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: \"swap_template_key\",\n keyUsage: \"swap_template\",\n targetDevice: \"nanoS\",\n });\n\n expect(result).toEqual([\n {\n type: ClearSignContextType.SOLANA_LIFI,\n payload: {\n descriptors: expectedPlucked,\n instructions: [\n { program_id: \"SomeProgram\", discriminator_hex: \"1\" },\n { program_id: \"AnotherProgram\" },\n ],\n },\n certificate: mockCertificate,\n },\n ]);\n });\n });\n\n describe(\"pluckTransactionData (private)\", () => {\n it(\"returns a map keyed by `${program_id}:${discriminator_hex ?? '0'}`\", () => {\n const loader = makeLoader();\n const pluck = (loader as any).pluckTransactionData.bind(loader);\n\n const result: SolanaTransactionDescriptorList = pluck(\n txDescriptorsResponse,\n );\n\n expect(result).toEqual(expectedPlucked);\n });\n });\n\n describe(\"extractInstructionsMeta (private)\", () => {\n it(\"returns instruction metadata from the API response\", () => {\n const loader = makeLoader();\n const extract = (loader as any).extractInstructionsMeta.bind(loader);\n\n const result = extract(txDescriptorsResponse);\n\n expect(result).toEqual([\n { program_id: \"SomeProgram\", discriminator_hex: \"1\" },\n { program_id: \"AnotherProgram\" },\n ]);\n });\n\n it(\"returns empty array when instructions are missing\", () => {\n const loader = makeLoader();\n const extract = (loader as any).extractInstructionsMeta.bind(loader);\n\n const result = extract({\n ...txDescriptorsResponse,\n instructions: undefined,\n });\n\n expect(result).toEqual([]);\n });\n });\n\n describe(\"pluckTransactionData mode resolution (private)\", () => {\n it(\"resolves signature using config.cal.mode\", () => {\n const loader = makeLoader();\n const pluck = (loader as any).pluckTransactionData.bind(loader);\n\n const result: SolanaTransactionDescriptorList = pluck(\n txDescriptorsResponse,\n );\n\n expect(result[\"SomeProgram:1\"]?.signature).toBe(\"deadbeef\");\n });\n });\n\n describe(\"real CAL payload (LiFi template 4c694669)\", () => {\n const realApiResponse: GetTransactionDescriptorsResponse = {\n id: \"4c694669\",\n chain_id: 101,\n instructions: [\n {\n program_id: \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n discriminator: 1,\n discriminator_hex: \"1\",\n },\n {\n program_id: \"11111111111111111111111111111111\",\n discriminator: 2,\n discriminator_hex: \"2\",\n },\n {\n program_id: \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\",\n discriminator: 3.0753642362361016e18,\n discriminator_hex: \"2aade37a97cb17e0\",\n },\n {\n program_id: \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\",\n discriminator: 9.339575302786589e18,\n discriminator_hex: \"819cd641339b2148\",\n },\n { program_id: \"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\" },\n {\n program_id: \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n discriminator: 1,\n discriminator_hex: \"1\",\n },\n { program_id: \"3i5JeuZuUxeKtVysUnwQNGerJP2bSMX9fTFfS4Nxe3Br\" },\n {\n program_id: \"ComputeBudget111111111111111111111111111111\",\n discriminator: 2,\n discriminator_hex: \"2\",\n },\n {\n program_id: \"ComputeBudget111111111111111111111111111111\",\n discriminator: 3,\n discriminator_hex: \"3\",\n },\n {\n program_id: \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n discriminator: 3,\n discriminator_hex: \"3\",\n },\n {\n program_id: \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n discriminator: 17,\n discriminator_hex: \"11\",\n },\n { program_id: \"BrdgN2RPzEMWF96ZbnnJaUtQDQx7VRXYaHHbYCBvceWB\" },\n ],\n descriptors: [\n {\n program_id: \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n discriminator_hex: \"1\",\n descriptor: makeRawDescriptor(\"atoken_1\", \"sig_atoken\"),\n },\n {\n program_id: \"11111111111111111111111111111111\",\n discriminator_hex: \"2\",\n descriptor: makeRawDescriptor(\"system_2\", \"sig_system\"),\n },\n {\n program_id: \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\",\n discriminator_hex: \"2aade37a97cb17e0\",\n descriptor: makeRawDescriptor(\"jup_route\", \"sig_jup_route\"),\n },\n {\n program_id: \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\",\n discriminator_hex: \"819cd641339b2148\",\n descriptor: makeRawDescriptor(\"jup_shared\", \"sig_jup_shared\"),\n },\n {\n program_id: \"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\",\n descriptor: makeRawDescriptor(\"memo\", \"sig_memo\"),\n },\n {\n program_id: \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n discriminator_hex: \"1\",\n descriptor: makeRawDescriptor(\"atoken_1\", \"sig_atoken\"),\n },\n {\n program_id: \"3i5JeuZuUxeKtVysUnwQNGerJP2bSMX9fTFfS4Nxe3Br\",\n descriptor: makeRawDescriptor(\"3i5jeu\", \"sig_3i5jeu\"),\n },\n {\n program_id: \"ComputeBudget111111111111111111111111111111\",\n discriminator_hex: \"2\",\n descriptor: makeRawDescriptor(\"cb_2\", \"sig_cb2\"),\n },\n {\n program_id: \"ComputeBudget111111111111111111111111111111\",\n discriminator_hex: \"3\",\n descriptor: makeRawDescriptor(\"cb_3\", \"sig_cb3\"),\n },\n {\n program_id: \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n discriminator_hex: \"3\",\n descriptor: makeRawDescriptor(\"tokenkeg_3\", \"sig_tk3\"),\n },\n {\n program_id: \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n discriminator_hex: \"11\",\n descriptor: makeRawDescriptor(\"tokenkeg_11\", \"sig_tk11\"),\n },\n {\n program_id: \"BrdgN2RPzEMWF96ZbnnJaUtQDQx7VRXYaHHbYCBvceWB\",\n descriptor: makeRawDescriptor(\"brdg\", \"sig_brdg\"),\n },\n ],\n };\n\n it(\"produces 11 unique descriptor keys (ATokenGP:1 appears twice but deduplicates)\", () => {\n const loader = makeLoader();\n const pluck = (loader as any).pluckTransactionData.bind(loader);\n\n const result: SolanaTransactionDescriptorList = pluck(realApiResponse);\n const keys = Object.keys(result);\n\n // 12 descriptors but ATokenGP:1 appears twice -> 11 unique keys\n expect(keys).toHaveLength(11);\n });\n\n it(\"creates distinct keys for same program_id with different discriminators\", () => {\n const loader = makeLoader();\n const pluck = (loader as any).pluckTransactionData.bind(loader);\n\n const result: SolanaTransactionDescriptorList = pluck(realApiResponse);\n\n // JUP6 has two different discriminators -> two distinct entries\n expect(\n result[\"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4:2aade37a97cb17e0\"]\n ?.data,\n ).toBe(\"jup_route\");\n expect(\n result[\"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4:819cd641339b2148\"]\n ?.data,\n ).toBe(\"jup_shared\");\n\n // ComputeBudget has discriminator 2 and 3\n expect(\n result[\"ComputeBudget111111111111111111111111111111:2\"]?.data,\n ).toBe(\"cb_2\");\n expect(\n result[\"ComputeBudget111111111111111111111111111111:3\"]?.data,\n ).toBe(\"cb_3\");\n\n // TokenkegQ has discriminator 3 and 11\n expect(\n result[\"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA:3\"]?.data,\n ).toBe(\"tokenkeg_3\");\n expect(\n result[\"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA:11\"]?.data,\n ).toBe(\"tokenkeg_11\");\n });\n\n it(\"uses :0 suffix for programs without a discriminator\", () => {\n const loader = makeLoader();\n const pluck = (loader as any).pluckTransactionData.bind(loader);\n\n const result: SolanaTransactionDescriptorList = pluck(realApiResponse);\n\n expect(result[\"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr:\"]?.data).toBe(\n \"memo\",\n );\n expect(\n result[\"3i5JeuZuUxeKtVysUnwQNGerJP2bSMX9fTFfS4Nxe3Br:\"]?.data,\n ).toBe(\"3i5jeu\");\n expect(\n result[\"BrdgN2RPzEMWF96ZbnnJaUtQDQx7VRXYaHHbYCBvceWB:\"]?.data,\n ).toBe(\"brdg\");\n });\n\n it(\"extracts 12 instruction metadata entries preserving order and discriminators\", () => {\n const loader = makeLoader();\n const extract = (loader as any).extractInstructionsMeta.bind(loader);\n\n const result = extract(realApiResponse);\n\n expect(result).toHaveLength(12);\n\n // First: ATokenGP with discriminator\n expect(result[0]).toEqual({\n program_id: \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n discriminator_hex: \"1\",\n });\n // JUP6 route (8-byte discriminator)\n expect(result[2]).toEqual({\n program_id: \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\",\n discriminator_hex: \"2aade37a97cb17e0\",\n });\n // JUP6 shared (8-byte discriminator)\n expect(result[3]).toEqual({\n program_id: \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\",\n discriminator_hex: \"819cd641339b2148\",\n });\n // Memo: no discriminator\n expect(result[4]).toEqual({\n program_id: \"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\",\n });\n // BrdgN2: no discriminator (last entry)\n expect(result[11]).toEqual({\n program_id: \"BrdgN2RPzEMWF96ZbnnJaUtQDQx7VRXYaHHbYCBvceWB\",\n });\n });\n\n it(\"load returns full payload with descriptors and instructions from real API response\", async () => {\n const loader = makeLoader();\n\n vi.spyOn(\n mockDataSource,\n \"getTransactionDescriptorsPayload\",\n ).mockResolvedValue(Right(realApiResponse));\n\n const input = { templateId: \"4c694669\", deviceModelId: \"nanoS\" as any };\n const result = await loader.load(input);\n\n expect(result).toHaveLength(1);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.SOLANA_LIFI,\n payload: {\n descriptors: expect.objectContaining({\n \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4:2aade37a97cb17e0\":\n expect.objectContaining({ data: \"jup_route\" }),\n \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4:819cd641339b2148\":\n expect.objectContaining({ data: \"jup_shared\" }),\n }),\n instructions: expect.arrayContaining([\n expect.objectContaining({\n program_id: \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\",\n discriminator_hex: \"2aade37a97cb17e0\",\n }),\n expect.objectContaining({\n program_id: \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\",\n discriminator_hex: \"819cd641339b2148\",\n }),\n ]),\n },\n });\n\n expect(Object.keys((result[0] as any).payload.descriptors)).toHaveLength(\n 11,\n );\n expect((result[0] as any).payload.instructions).toHaveLength(12);\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["Left", "Right", "beforeEach", "describe", "expect", "it", "vi", "ClearSignContextType", "LifiContextLoader", "mockLoggerFactory", "mockCertificate", "mockConfig", "mockDataSource", "mockCertificateLoader", "makeRawDescriptor", "data", "sig", "makeResolvedDescriptor", "responseDescriptorsArray", "expectedPlucked", "txDescriptorsResponse", "makeLoader", "loader", "error", "input", "result", "realApiResponse", "keys"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ClearSignContextType as a}from"../../../shared/model/ClearSignContext";const
|
|
1
|
+
import{ClearSignContextType as a}from"../../../shared/model/ClearSignContext";import{SolanaInstructionSubstructureKind as r}from"../../../modules/solana/model/SolanaPayloads";const e={TOKEN:a.SOLANA_TOKEN,LIFI:a.SOLANA_LIFI,TRUSTED_NAME:a.SOLANA_TRUSTED_NAME,BASIC_TRUSTED_NAME:a.SOLANA_BASIC_TRUSTED_NAME,TRANSACTION_CHECK:a.SOLANA_TRANSACTION_CHECK,INSTRUCTION_INFO:a.SOLANA_INSTRUCTION_INFO,ENUM_VARIANT:a.SOLANA_ENUM_VARIANT,TOKEN_INFO:a.SOLANA_TOKEN_INFO,TOKEN_ACCOUNT_STATE:a.SOLANA_TOKEN_ACCOUNT_STATE,ALT_RESOLUTION:a.SOLANA_ALT_RESOLUTION},o=new Set(Object.values(e));function S(t){return o.has(t.type)}export{o as SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES,e as SolanaContextType,r as SolanaInstructionSubstructureKind,S as isSolanaContextSuccess};
|
|
2
2
|
//# sourceMappingURL=SolanaClearSignContext.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/modules/solana/model/SolanaClearSignContext.ts"],
|
|
4
|
-
"sourcesContent": ["import { type PkiCertificate } from \"@/modules/multichain/pki/model/PkiCertificate\";\nimport {\n type SolanaLifiPayload,\n type SolanaTokenData,\n type SolanaTransactionCheckPayload,\n} from \"@/modules/solana/model/SolanaPayloads\";\nimport {\n type ClearSignContext,\n type ClearSignContextSuccess,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\n\n// Re-export Solana payload types so consumers can import from this file\nexport type {\n SolanaLifiInstructionMeta,\n SolanaLifiPayload,\n SolanaTokenData,\n SolanaTransactionCheckPayload,\n SolanaTransactionDescriptor,\n} from \"@/modules/solana/model/SolanaPayloads\";\n\n/**\n * Solana-specific payload overrides \u2014 contributed to the shared\n * ClearSignContextSuccessPayloads map at the integration boundary.\n */\nexport type SolanaPayloadOverrides = {\n [ClearSignContextType.SOLANA_TOKEN]: {\n payload: SolanaTokenData;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_LIFI]: {\n payload: SolanaLifiPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TRUSTED_NAME]: {\n payload: Uint8Array;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK]: {\n payload: SolanaTransactionCheckPayload;\n certificate?: PkiCertificate;\n };\n};\n\nexport const SolanaContextType = {\n TOKEN: ClearSignContextType.SOLANA_TOKEN,\n LIFI: ClearSignContextType.SOLANA_LIFI,\n TRUSTED_NAME: ClearSignContextType.SOLANA_TRUSTED_NAME,\n TRANSACTION_CHECK: ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n} as const;\n\n/**\n * Union of all Solana-relevant success context types.\n */\nexport type SolanaClearSignContextSuccessType =\n (typeof SolanaContextType)[keyof typeof SolanaContextType];\n\n/**\n * A ClearSignContextSuccess narrowed to only Solana-relevant types.\n */\nexport type SolanaClearSignContextSuccess =\n ClearSignContextSuccess<SolanaClearSignContextSuccessType>;\n\n/**\n * Set of all Solana-relevant success ClearSignContextType values.\n * Used by the type guard below to filter out non-Solana contexts at runtime.\n */\nexport const SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES =\n new Set<ClearSignContextType>(Object.values(SolanaContextType));\n\n/**\n * Type guard that narrows a ClearSignContextSuccess to a\n * SolanaClearSignContextSuccess, filtering out non-Solana types.\n */\nexport function isSolanaContextSuccess(\n ctx: ClearSignContext,\n): ctx is SolanaClearSignContextSuccess {\n return SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES.has(ctx.type);\n}\n"],
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["ClearSignContextType", "SolanaContextType", "SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES", "isSolanaContextSuccess", "ctx"]
|
|
4
|
+
"sourcesContent": ["import { type PkiCertificate } from \"@/modules/multichain/pki/model/PkiCertificate\";\nimport {\n type SolanaAltResolutionPayload,\n type SolanaEnumVariantPayload,\n type SolanaInstructionInfoPayload,\n type SolanaLifiPayload,\n type SolanaTokenAccountStatePayload,\n type SolanaTokenData,\n type SolanaTokenInfoPayload,\n type SolanaTransactionCheckPayload,\n} from \"@/modules/solana/model/SolanaPayloads\";\nimport {\n type ClearSignContext,\n type ClearSignContextSuccess,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\n\n// Re-export Solana payload types so consumers can import from this file\nexport type {\n SolanaAltResolutionPayload,\n SolanaCalAccountReset,\n SolanaCalDisplayField,\n SolanaCalMintAssociation,\n SolanaCalTokenValue,\n SolanaCalTypePoolEntry,\n SolanaCalValue,\n SolanaCalValueFlowPort,\n SolanaEnumVariantPayload,\n SolanaInstructionEnumVariant,\n SolanaInstructionInfoPayload,\n SolanaInstructionSubstructure,\n SolanaLifiInstructionMeta,\n SolanaLifiPayload,\n SolanaSignedDescriptor,\n SolanaTokenAccountStatePayload,\n SolanaTokenData,\n SolanaTokenInfoPayload,\n SolanaTransactionCheckPayload,\n SolanaTransactionDescriptor,\n} from \"@/modules/solana/model/SolanaPayloads\";\nexport { SolanaInstructionSubstructureKind } from \"@/modules/solana/model/SolanaPayloads\";\n\n/**\n * Solana-specific payload overrides \u2014 contributed to the shared\n * ClearSignContextSuccessPayloads map at the integration boundary.\n */\nexport type SolanaPayloadOverrides = {\n [ClearSignContextType.SOLANA_TOKEN]: {\n payload: SolanaTokenData;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_LIFI]: {\n payload: SolanaLifiPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TRUSTED_NAME]: {\n payload: Uint8Array;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME]: {\n payload: Uint8Array;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK]: {\n payload: SolanaTransactionCheckPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_INSTRUCTION_INFO]: {\n payload: SolanaInstructionInfoPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_ENUM_VARIANT]: {\n payload: SolanaEnumVariantPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TOKEN_INFO]: {\n payload: SolanaTokenInfoPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE]: {\n payload: SolanaTokenAccountStatePayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_ALT_RESOLUTION]: {\n payload: SolanaAltResolutionPayload;\n certificate?: PkiCertificate;\n };\n};\n\nexport const SolanaContextType = {\n TOKEN: ClearSignContextType.SOLANA_TOKEN,\n LIFI: ClearSignContextType.SOLANA_LIFI,\n TRUSTED_NAME: ClearSignContextType.SOLANA_TRUSTED_NAME,\n BASIC_TRUSTED_NAME: ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME,\n TRANSACTION_CHECK: ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n INSTRUCTION_INFO: ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n ENUM_VARIANT: ClearSignContextType.SOLANA_ENUM_VARIANT,\n TOKEN_INFO: ClearSignContextType.SOLANA_TOKEN_INFO,\n TOKEN_ACCOUNT_STATE: ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE,\n ALT_RESOLUTION: ClearSignContextType.SOLANA_ALT_RESOLUTION,\n} as const;\n\n/**\n * Union of all Solana-relevant success context types.\n */\nexport type SolanaClearSignContextSuccessType =\n (typeof SolanaContextType)[keyof typeof SolanaContextType];\n\n/**\n * A ClearSignContextSuccess narrowed to only Solana-relevant types.\n */\nexport type SolanaClearSignContextSuccess =\n ClearSignContextSuccess<SolanaClearSignContextSuccessType>;\n\n/**\n * Set of all Solana-relevant success ClearSignContextType values.\n * Used by the type guard below to filter out non-Solana contexts at runtime.\n */\nexport const SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES =\n new Set<ClearSignContextType>(Object.values(SolanaContextType));\n\n/**\n * Type guard that narrows a ClearSignContextSuccess to a\n * SolanaClearSignContextSuccess, filtering out non-Solana types.\n */\nexport function isSolanaContextSuccess(\n ctx: ClearSignContext,\n): ctx is SolanaClearSignContextSuccess {\n return SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES.has(ctx.type);\n}\n"],
|
|
5
|
+
"mappings": "AAWA,OAGE,wBAAAA,MACK,kCAyBP,OAAS,qCAAAC,MAAyC,wCAiD3C,MAAMC,EAAoB,CAC/B,MAAOF,EAAqB,aAC5B,KAAMA,EAAqB,YAC3B,aAAcA,EAAqB,oBACnC,mBAAoBA,EAAqB,0BACzC,kBAAmBA,EAAqB,yBACxC,iBAAkBA,EAAqB,wBACvC,aAAcA,EAAqB,oBACnC,WAAYA,EAAqB,kBACjC,oBAAqBA,EAAqB,2BAC1C,eAAgBA,EAAqB,qBACvC,EAkBaG,EACX,IAAI,IAA0B,OAAO,OAAOD,CAAiB,CAAC,EAMzD,SAASE,EACdC,EACsC,CACtC,OAAOF,EAAwC,IAAIE,EAAI,IAAI,CAC7D",
|
|
6
|
+
"names": ["ClearSignContextType", "SolanaInstructionSubstructureKind", "SolanaContextType", "SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES", "isSolanaContextSuccess", "ctx"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": [],
|
|
4
|
-
"sourcesContent": [],
|
|
5
|
-
"mappings": "",
|
|
6
|
-
"names": []
|
|
3
|
+
"sources": ["../../../../../../src/modules/solana/model/SolanaPayloads.ts"],
|
|
4
|
+
"sourcesContent": ["// Solana payload types \u2014 used both by Solana loaders and (type-only)\n// referenced by the shared ClearSignContext union for typed-payload variants.\n\nexport type SolanaTokenData = {\n solanaTokenDescriptor: {\n data: string;\n signature: string;\n };\n};\n\nexport type SolanaTransactionDescriptor = {\n data: string;\n descriptorType: string;\n descriptorVersion: string;\n signature: string;\n};\n\nexport type SolanaLifiInstructionMeta = {\n program_id: string;\n discriminator_hex?: string;\n};\n\nexport type SolanaLifiPayload = {\n descriptors: Record<string, SolanaTransactionDescriptor>;\n instructions: SolanaLifiInstructionMeta[];\n};\n\nexport type SolanaTransactionCheckPayload = {\n descriptor: string;\n};\n\n// --- Generic clear-signing payloads ---\n\n// CAL static descriptor payloads. `data` is the signed TLV (hex string);\n// `signature` is the resolved signature for the configured CAL signature\n// kind (`prod` | `test`).\n\nexport type SolanaSignedDescriptor = {\n data: string;\n signature: string;\n};\n\n/**\n * One enum-variant descriptor bundled with an instruction descriptor by CAL.\n * The signed TLV (`descriptor.data`) feeds the host-side type-pool decode\n * cache, `enumId`/`variantIndex` identify which variant it describes (and let\n * the host stream the selected variant's signed descriptor to the device).\n */\nexport type SolanaInstructionEnumVariant = {\n enumId: string;\n variantIndex: number;\n descriptor: SolanaSignedDescriptor;\n};\n\n/**\n * Payload for ClearSignContextType.SOLANA_INSTRUCTION_INFO.\n *\n * `instructionInfo` + `substructures` are the signed TLVs streamed to the\n * device, and `enumVariants` are the signed enum-variant descriptors CAL\n * bundles for the program's enums (used to build the host decode cache). The\n * remaining fields are CAL's decoded JSON consumed host-side by the\n * requirement builder.\n */\nexport type SolanaInstructionInfoPayload = {\n programId: string;\n discriminator: string;\n instructionInfo: SolanaSignedDescriptor;\n substructures: SolanaInstructionSubstructure[];\n enumVariants: SolanaInstructionEnumVariant[];\n idlDescriptor: {\n typePool: SolanaCalTypePoolEntry[];\n rootType: number;\n };\n mintAssociations: SolanaCalMintAssociation[];\n valueFlowPorts: SolanaCalValueFlowPort[];\n accountResets: SolanaCalAccountReset[];\n displayFields: SolanaCalDisplayField[];\n};\n\nexport enum SolanaInstructionSubstructureKind {\n DISPLAY_FIELD = 0x00,\n VALUE_FLOW_PORT = 0x01,\n HIDE_RULE = 0x02,\n ACCOUNT_RESET = 0x03,\n}\n\nexport type SolanaInstructionSubstructure = {\n kind: SolanaInstructionSubstructureKind;\n // TLV payload (hex string) for the substructure.\n data: string;\n};\n\n// --- Decoded CAL JSON (snake_case mirrors the CAL response) ---\n\nexport type SolanaCalValue = {\n source: string;\n /** ACCOUNT_PATH: index into the instruction's accounts. */\n account_index?: number;\n /** CONSTANT: hex-encoded bytes. */\n data?: string;\n /** ARGUMENT_PATH: decoded steps. */\n path?: { steps: number[] };\n};\n\nexport type SolanaCalTokenValue = {\n kind: string;\n value?: SolanaCalValue;\n account_index?: number;\n};\n\nexport type SolanaCalValueFlowPort = {\n /** Ordered candidate list of account indices (length 1 for a single-account port). */\n account_indices: number[];\n optional_account_strategy?: string;\n token_value: SolanaCalTokenValue;\n};\n\nexport type SolanaCalAccountReset = {\n account_index: number;\n require_pre_balance_zero?: boolean;\n};\n\nexport type SolanaCalDisplayField = {\n name?: string;\n param: { type: string; value?: SolanaCalValue; token?: SolanaCalValue };\n};\n\nexport type SolanaCalTypePoolEntry = {\n index: number;\n kind: string;\n refs?: number[];\n size?: number;\n encoding?: number;\n len_kind?: string;\n flag_kind?: string;\n sentinel?: string;\n disc_kind?: string;\n total_variants?: number;\n enum_id?: string;\n};\n\nexport type SolanaCalMintAssociation = {\n account_index: number;\n mint_index: number;\n};\n\n/**\n * Payload for ClearSignContextType.SOLANA_ENUM_VARIANT: one signed\n * ENUM_VARIANT descriptor for a `(programId, enumId, variantIndex)` triple.\n */\nexport type SolanaEnumVariantPayload = {\n programId: string;\n enumId: string;\n variantIndex: number;\n descriptor: SolanaSignedDescriptor;\n};\n\n/**\n * Payload for ClearSignContextType.SOLANA_TOKEN_INFO, keyed by mint pubkey.\n * Distinct from the legacy SOLANA_TOKEN context.\n */\nexport type SolanaTokenInfoPayload = {\n mint: string;\n descriptor: SolanaSignedDescriptor;\n};\n\n// --- Dynamic descriptor payloads (challenge-bound) ---\n//\n// Each payload carries the raw signed TLV bytes decoded from the backend's\n// hex `signedDescriptor`.\n\nexport type SolanaTokenAccountStatePayload = {\n descriptor: Uint8Array;\n};\n\nexport type SolanaAltResolutionPayload = {\n descriptor: Uint8Array;\n};\n\n// SOLANA_TRUSTED_NAME (generic flow, with 2-byte length prefix) is emitted by\n// SolanaTrustedNameContextLoader. SOLANA_BASIC_TRUSTED_NAME (basic flow, raw\n// bytes) is emitted by OwnerInfoContextLoader. Both carry `payload: Uint8Array`.\n"],
|
|
5
|
+
"mappings": "AA+EO,IAAKA,OACVA,IAAA,cAAgB,GAAhB,gBACAA,IAAA,gBAAkB,GAAlB,kBACAA,IAAA,UAAY,GAAZ,YACAA,IAAA,cAAgB,GAAhB,gBAJUA,OAAA",
|
|
6
|
+
"names": ["SolanaInstructionSubstructureKind"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var N=(E=>(E[E.MAINNET=
|
|
1
|
+
var N=(E=>(E[E.MAINNET=900]="MAINNET",E[E.DEVNET=901]="DEVNET",E[E.TESTNET=902]="TESTNET",E))(N||{});export{N as SolanaTransactionScanChainId};
|
|
2
2
|
//# sourceMappingURL=SolanaTransactionScanChainId.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/modules/solana/model/SolanaTransactionScanChainId.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n *
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["/**\n * Transaction-check scan chain identifiers for Solana clusters.\n * Mirrors the backend contract for the `chain` field on Solana scan requests:\n * the extended network ids (900/901/902) introduced in the latest spec.\n */\nexport enum SolanaTransactionScanChainId {\n MAINNET = 900,\n DEVNET = 901,\n TESTNET = 902,\n}\n"],
|
|
5
|
+
"mappings": "AAKO,IAAKA,OACVA,IAAA,QAAU,KAAV,UACAA,IAAA,OAAS,KAAT,SACAA,IAAA,QAAU,KAAV,UAHUA,OAAA",
|
|
6
6
|
"names": ["SolanaTransactionScanChainId"]
|
|
7
7
|
}
|