@ledgerhq/context-module 1.15.0 → 1.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -0
- package/lib/cjs/package.json +1 -2
- package/lib/cjs/src/ContextModule.js +1 -1
- package/lib/cjs/src/ContextModule.js.map +1 -1
- package/lib/cjs/src/ContextModuleBuilder.js +1 -1
- package/lib/cjs/src/ContextModuleBuilder.js.map +3 -3
- package/lib/cjs/src/ContextModuleBuilder.test.js +1 -1
- package/lib/cjs/src/ContextModuleBuilder.test.js.map +3 -3
- package/lib/cjs/src/DefaultContextModule.js +1 -1
- package/lib/cjs/src/DefaultContextModule.js.map +3 -3
- package/lib/cjs/src/DefaultContextModule.test.js +1 -1
- package/lib/cjs/src/DefaultContextModule.test.js.map +2 -2
- package/lib/cjs/src/account-ownership/data/AccountOwnershipDataSource.js +2 -0
- package/lib/cjs/src/account-ownership/data/AccountOwnershipDataSource.js.map +7 -0
- package/lib/cjs/src/account-ownership/data/AccountOwnershipError.js +2 -0
- package/lib/cjs/src/account-ownership/data/AccountOwnershipError.js.map +7 -0
- package/lib/cjs/src/account-ownership/data/HttpAccountOwnershipDataSource.js +2 -0
- package/lib/cjs/src/account-ownership/data/HttpAccountOwnershipDataSource.js.map +7 -0
- package/lib/cjs/src/account-ownership/data/HttpAccountOwnershipDataSource.test.js +2 -0
- package/lib/cjs/src/account-ownership/data/HttpAccountOwnershipDataSource.test.js.map +7 -0
- package/lib/cjs/src/account-ownership/data/dto/AccountOwnershipDto.js +2 -0
- package/lib/cjs/src/account-ownership/data/dto/AccountOwnershipDto.js.map +7 -0
- package/lib/cjs/src/account-ownership/di/accountOwnershipModuleFactory.js +2 -0
- package/lib/cjs/src/account-ownership/di/accountOwnershipModuleFactory.js.map +7 -0
- package/lib/cjs/src/account-ownership/di/accountOwnershipTypes.js +2 -0
- package/lib/cjs/src/account-ownership/di/accountOwnershipTypes.js.map +7 -0
- package/lib/cjs/src/account-ownership/domain/AccountOwnershipContextLoader.js +2 -0
- package/lib/cjs/src/account-ownership/domain/AccountOwnershipContextLoader.js.map +7 -0
- package/lib/cjs/src/account-ownership/domain/AccountOwnershipContextLoader.test.js +2 -0
- package/lib/cjs/src/account-ownership/domain/AccountOwnershipContextLoader.test.js.map +7 -0
- package/lib/cjs/src/calldata/data/HttpCalldataDescriptorDataSource.js +1 -1
- package/lib/cjs/src/calldata/data/HttpCalldataDescriptorDataSource.js.map +3 -3
- package/lib/cjs/src/calldata/data/HttpCalldataDescriptorDataSource.test.js +1 -1
- package/lib/cjs/src/calldata/data/HttpCalldataDescriptorDataSource.test.js.map +3 -3
- package/lib/cjs/src/calldata/di/calldataModuleFactory.js +1 -1
- package/lib/cjs/src/calldata/di/calldataModuleFactory.js.map +3 -3
- package/lib/cjs/src/config/di/configModuleFactory.js +1 -1
- package/lib/cjs/src/config/di/configModuleFactory.js.map +2 -2
- package/lib/cjs/src/config/model/ContextModuleConfig.js +1 -1
- package/lib/cjs/src/config/model/ContextModuleConfig.js.map +1 -1
- package/lib/cjs/src/di.js +1 -1
- package/lib/cjs/src/di.js.map +3 -3
- package/lib/cjs/src/dynamic-network/data/HttpDynamicNetworkDataSource.js +1 -1
- package/lib/cjs/src/dynamic-network/data/HttpDynamicNetworkDataSource.js.map +3 -3
- package/lib/cjs/src/dynamic-network/data/HttpDynamicNetworkDataSource.test.js +1 -1
- package/lib/cjs/src/dynamic-network/data/HttpDynamicNetworkDataSource.test.js.map +3 -3
- package/lib/cjs/src/dynamic-network/domain/DynamicNetworkContextLoader.js +1 -1
- package/lib/cjs/src/dynamic-network/domain/DynamicNetworkContextLoader.js.map +1 -1
- package/lib/cjs/src/dynamic-network/domain/DynamicNetworkContextLoader.test.js.map +1 -1
- package/lib/cjs/src/external-plugin/data/HttpExternalPluginDataSource.js +1 -1
- package/lib/cjs/src/external-plugin/data/HttpExternalPluginDataSource.js.map +3 -3
- package/lib/cjs/src/external-plugin/data/HttpExternalPluginDataSource.test.js +1 -1
- package/lib/cjs/src/external-plugin/data/HttpExternalPluginDataSource.test.js.map +3 -3
- package/lib/cjs/src/gated-signing/data/HttpGatedDescriptorDataSource.js +1 -1
- package/lib/cjs/src/gated-signing/data/HttpGatedDescriptorDataSource.js.map +3 -3
- package/lib/cjs/src/gated-signing/data/HttpGatedDescriptorDataSource.test.js +1 -1
- package/lib/cjs/src/gated-signing/data/HttpGatedDescriptorDataSource.test.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/network/di/networkModuleFactory.js +2 -0
- package/lib/cjs/src/network/di/networkModuleFactory.js.map +7 -0
- package/lib/cjs/src/network/di/networkTypes.js +2 -0
- package/lib/cjs/src/network/di/networkTypes.js.map +7 -0
- package/lib/cjs/src/nft/data/HttpNftDataSource.js +1 -1
- package/lib/cjs/src/nft/data/HttpNftDataSource.js.map +3 -3
- package/lib/cjs/src/nft/data/HttpNftDataSource.test.js +1 -1
- package/lib/cjs/src/nft/data/HttpNftDataSource.test.js.map +3 -3
- package/lib/cjs/src/pki/data/HttpPkiCertificateDataSource.js +1 -1
- package/lib/cjs/src/pki/data/HttpPkiCertificateDataSource.js.map +3 -3
- package/lib/cjs/src/pki/data/HttpPkiCertificateDataSource.test.js +1 -1
- package/lib/cjs/src/pki/data/HttpPkiCertificateDataSource.test.js.map +3 -3
- package/lib/cjs/src/proxy/data/HttpProxyDataSource.js +1 -1
- package/lib/cjs/src/proxy/data/HttpProxyDataSource.js.map +3 -3
- package/lib/cjs/src/proxy/data/HttpProxyDataSource.test.js +1 -1
- package/lib/cjs/src/proxy/data/HttpProxyDataSource.test.js.map +3 -3
- package/lib/cjs/src/proxy/data/HttpSafeProxyDataSource.js +1 -1
- package/lib/cjs/src/proxy/data/HttpSafeProxyDataSource.js.map +3 -3
- package/lib/cjs/src/proxy/data/HttpSafeProxyDataSource.test.js +1 -1
- package/lib/cjs/src/proxy/data/HttpSafeProxyDataSource.test.js.map +3 -3
- package/lib/cjs/src/proxy/di/proxyModuleFactory.js +1 -1
- package/lib/cjs/src/proxy/di/proxyModuleFactory.js.map +3 -3
- package/lib/cjs/src/proxy/di/proxyModuleFactory.test.js +1 -1
- package/lib/cjs/src/proxy/di/proxyModuleFactory.test.js.map +3 -3
- package/lib/cjs/src/reporter/data/BlindSigningReporterDatasource.js +2 -0
- package/lib/cjs/src/reporter/data/BlindSigningReporterDatasource.js.map +7 -0
- package/lib/cjs/src/reporter/data/HttpBlindSigningReporterDatasource.js +2 -0
- package/lib/cjs/src/reporter/data/HttpBlindSigningReporterDatasource.js.map +7 -0
- package/lib/cjs/src/reporter/data/HttpBlindSigningReporterDatasource.test.js +2 -0
- package/lib/cjs/src/reporter/data/HttpBlindSigningReporterDatasource.test.js.map +7 -0
- package/lib/cjs/src/reporter/data/dto/BlindSigningEventDto.js +2 -0
- package/lib/cjs/src/reporter/data/dto/BlindSigningEventDto.js.map +7 -0
- package/lib/cjs/src/reporter/di/reporterModuleFactory.js +2 -0
- package/lib/cjs/src/reporter/di/reporterModuleFactory.js.map +7 -0
- package/lib/cjs/src/reporter/di/reporterTypes.js +2 -0
- package/lib/cjs/src/reporter/di/reporterTypes.js.map +7 -0
- package/lib/cjs/src/reporter/domain/BlindSigningReporter.js +2 -0
- package/lib/cjs/src/reporter/domain/BlindSigningReporter.js.map +7 -0
- package/lib/cjs/src/reporter/domain/DefaultBlindSigningReporter.js +2 -0
- package/lib/cjs/src/reporter/domain/DefaultBlindSigningReporter.js.map +7 -0
- package/lib/cjs/src/reporter/domain/DefaultBlindSigningReporter.test.js +2 -0
- package/lib/cjs/src/reporter/domain/DefaultBlindSigningReporter.test.js.map +7 -0
- package/lib/cjs/src/reporter/model/BlindSigningEvent.js +2 -0
- package/lib/cjs/src/reporter/model/BlindSigningEvent.js.map +7 -0
- package/lib/cjs/src/reporter/model/BlindSigningModelId.js +2 -0
- package/lib/cjs/src/reporter/model/BlindSigningModelId.js.map +7 -0
- package/lib/cjs/src/safe/data/HttpSafeAccountDataSource.js +1 -1
- package/lib/cjs/src/safe/data/HttpSafeAccountDataSource.js.map +3 -3
- package/lib/cjs/src/safe/data/HttpSafeAccountDataSource.test.js +1 -1
- package/lib/cjs/src/safe/data/HttpSafeAccountDataSource.test.js.map +3 -3
- 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/solana/data/HttpSolanaOwnerInfoDataSource.js +1 -1
- package/lib/cjs/src/solana/data/HttpSolanaOwnerInfoDataSource.js.map +3 -3
- package/lib/cjs/src/solana/data/HttpSolanaOwnerInfoDataSource.test.js +1 -1
- package/lib/cjs/src/solana/data/HttpSolanaOwnerInfoDataSource.test.js.map +3 -3
- package/lib/cjs/src/solana/domain/DefaultSolanaContextLoader.test.js +1 -1
- package/lib/cjs/src/solana/domain/DefaultSolanaContextLoader.test.js.map +1 -1
- package/lib/cjs/src/solanaLifi/data/HttpSolanaLifiDataSource.js +1 -1
- package/lib/cjs/src/solanaLifi/data/HttpSolanaLifiDataSource.js.map +3 -3
- package/lib/cjs/src/solanaLifi/data/HttpSolanaLifiDataSource.test.js +1 -1
- package/lib/cjs/src/solanaLifi/data/HttpSolanaLifiDataSource.test.js.map +3 -3
- package/lib/cjs/src/solanaLifi/domain/SolanaLifiContextLoader.js.map +1 -1
- package/lib/cjs/src/solanaLifi/domain/SolanaLifiContextLoader.test.js.map +1 -1
- package/lib/cjs/src/solanaToken/data/HttpSolanaTokenDataSource.js +1 -1
- package/lib/cjs/src/solanaToken/data/HttpSolanaTokenDataSource.js.map +3 -3
- package/lib/cjs/src/solanaToken/data/HttpSolanaTokenDataSource.test.js +6 -6
- package/lib/cjs/src/solanaToken/data/HttpSolanaTokenDataSource.test.js.map +3 -3
- package/lib/cjs/src/solanaToken/domain/SolanaTokenContextLoader.js +1 -1
- package/lib/cjs/src/solanaToken/domain/SolanaTokenContextLoader.js.map +2 -2
- package/lib/cjs/src/solanaToken/domain/SolanaTokenContextLoader.test.js +1 -1
- package/lib/cjs/src/solanaToken/domain/SolanaTokenContextLoader.test.js.map +1 -1
- package/lib/cjs/src/token/data/HttpTokenDataSource.js +1 -1
- package/lib/cjs/src/token/data/HttpTokenDataSource.js.map +3 -3
- package/lib/cjs/src/token/data/HttpTokenDataSource.test.js +1 -1
- package/lib/cjs/src/token/data/HttpTokenDataSource.test.js.map +3 -3
- package/lib/cjs/src/transaction-check/data/HttpTransactionCheckDataSource.js +1 -1
- package/lib/cjs/src/transaction-check/data/HttpTransactionCheckDataSource.js.map +3 -3
- package/lib/cjs/src/transaction-check/data/HttpTransactionCheckDataSource.test.js +1 -1
- package/lib/cjs/src/transaction-check/data/HttpTransactionCheckDataSource.test.js.map +3 -3
- package/lib/cjs/src/transaction-check/data/HttpTypedDataCheckDataSource.js +1 -1
- package/lib/cjs/src/transaction-check/data/HttpTypedDataCheckDataSource.js.map +3 -3
- package/lib/cjs/src/transaction-check/data/HttpTypedDataCheckDataSource.test.js +1 -1
- package/lib/cjs/src/transaction-check/data/HttpTypedDataCheckDataSource.test.js.map +3 -3
- package/lib/cjs/src/trusted-name/data/HttpTrustedNameDataSource.js +1 -1
- package/lib/cjs/src/trusted-name/data/HttpTrustedNameDataSource.js.map +3 -3
- package/lib/cjs/src/trusted-name/data/HttpTrustedNameDataSource.test.js +1 -1
- package/lib/cjs/src/trusted-name/data/HttpTrustedNameDataSource.test.js.map +3 -3
- package/lib/cjs/src/trusted-name/di/trustedNameModuleFactory.js +1 -1
- package/lib/cjs/src/trusted-name/di/trustedNameModuleFactory.js.map +3 -3
- package/lib/cjs/src/typed-data/data/HttpTypedDataDataSource.js +1 -1
- package/lib/cjs/src/typed-data/data/HttpTypedDataDataSource.js.map +3 -3
- package/lib/cjs/src/typed-data/data/HttpTypedDataDataSource.test.js +1 -1
- package/lib/cjs/src/typed-data/data/HttpTypedDataDataSource.test.js.map +3 -3
- package/lib/esm/package.json +1 -2
- package/lib/esm/src/ContextModuleBuilder.js +1 -1
- package/lib/esm/src/ContextModuleBuilder.js.map +3 -3
- package/lib/esm/src/ContextModuleBuilder.test.js +1 -1
- package/lib/esm/src/ContextModuleBuilder.test.js.map +3 -3
- package/lib/esm/src/DefaultContextModule.js +1 -1
- package/lib/esm/src/DefaultContextModule.js.map +3 -3
- package/lib/esm/src/DefaultContextModule.test.js +1 -1
- package/lib/esm/src/DefaultContextModule.test.js.map +2 -2
- package/lib/esm/src/account-ownership/data/AccountOwnershipDataSource.js +1 -0
- package/lib/esm/src/account-ownership/data/AccountOwnershipDataSource.js.map +7 -0
- package/lib/esm/src/account-ownership/data/AccountOwnershipError.js +2 -0
- package/lib/esm/src/account-ownership/data/AccountOwnershipError.js.map +7 -0
- package/lib/esm/src/account-ownership/data/HttpAccountOwnershipDataSource.js +2 -0
- package/lib/esm/src/account-ownership/data/HttpAccountOwnershipDataSource.js.map +7 -0
- package/lib/esm/src/account-ownership/data/HttpAccountOwnershipDataSource.test.js +2 -0
- package/lib/esm/src/account-ownership/data/HttpAccountOwnershipDataSource.test.js.map +7 -0
- package/lib/esm/src/account-ownership/data/dto/AccountOwnershipDto.js +1 -0
- package/lib/esm/src/account-ownership/data/dto/AccountOwnershipDto.js.map +7 -0
- package/lib/esm/src/account-ownership/di/accountOwnershipModuleFactory.js +2 -0
- package/lib/esm/src/account-ownership/di/accountOwnershipModuleFactory.js.map +7 -0
- package/lib/esm/src/account-ownership/di/accountOwnershipTypes.js +2 -0
- package/lib/esm/src/account-ownership/di/accountOwnershipTypes.js.map +7 -0
- package/lib/esm/src/account-ownership/domain/AccountOwnershipContextLoader.js +2 -0
- package/lib/esm/src/account-ownership/domain/AccountOwnershipContextLoader.js.map +7 -0
- package/lib/esm/src/account-ownership/domain/AccountOwnershipContextLoader.test.js +2 -0
- package/lib/esm/src/account-ownership/domain/AccountOwnershipContextLoader.test.js.map +7 -0
- package/lib/esm/src/calldata/data/HttpCalldataDescriptorDataSource.js +1 -1
- package/lib/esm/src/calldata/data/HttpCalldataDescriptorDataSource.js.map +3 -3
- package/lib/esm/src/calldata/data/HttpCalldataDescriptorDataSource.test.js +1 -1
- package/lib/esm/src/calldata/data/HttpCalldataDescriptorDataSource.test.js.map +3 -3
- package/lib/esm/src/calldata/di/calldataModuleFactory.js +1 -1
- package/lib/esm/src/calldata/di/calldataModuleFactory.js.map +3 -3
- package/lib/esm/src/config/di/configModuleFactory.js +1 -1
- package/lib/esm/src/config/di/configModuleFactory.js.map +2 -2
- package/lib/esm/src/di.js +1 -1
- package/lib/esm/src/di.js.map +3 -3
- package/lib/esm/src/dynamic-network/data/HttpDynamicNetworkDataSource.js +1 -1
- package/lib/esm/src/dynamic-network/data/HttpDynamicNetworkDataSource.js.map +3 -3
- package/lib/esm/src/dynamic-network/data/HttpDynamicNetworkDataSource.test.js +1 -1
- package/lib/esm/src/dynamic-network/data/HttpDynamicNetworkDataSource.test.js.map +3 -3
- package/lib/esm/src/dynamic-network/domain/DynamicNetworkContextLoader.js +1 -1
- package/lib/esm/src/dynamic-network/domain/DynamicNetworkContextLoader.js.map +1 -1
- package/lib/esm/src/dynamic-network/domain/DynamicNetworkContextLoader.test.js.map +1 -1
- package/lib/esm/src/external-plugin/data/HttpExternalPluginDataSource.js +1 -1
- package/lib/esm/src/external-plugin/data/HttpExternalPluginDataSource.js.map +3 -3
- package/lib/esm/src/external-plugin/data/HttpExternalPluginDataSource.test.js +1 -1
- package/lib/esm/src/external-plugin/data/HttpExternalPluginDataSource.test.js.map +3 -3
- package/lib/esm/src/gated-signing/data/HttpGatedDescriptorDataSource.js +1 -1
- package/lib/esm/src/gated-signing/data/HttpGatedDescriptorDataSource.js.map +3 -3
- package/lib/esm/src/gated-signing/data/HttpGatedDescriptorDataSource.test.js +1 -1
- package/lib/esm/src/gated-signing/data/HttpGatedDescriptorDataSource.test.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/network/di/networkModuleFactory.js +2 -0
- package/lib/esm/src/network/di/networkModuleFactory.js.map +7 -0
- package/lib/esm/src/network/di/networkTypes.js +2 -0
- package/lib/esm/src/network/di/networkTypes.js.map +7 -0
- package/lib/esm/src/nft/data/HttpNftDataSource.js +1 -1
- package/lib/esm/src/nft/data/HttpNftDataSource.js.map +3 -3
- package/lib/esm/src/nft/data/HttpNftDataSource.test.js +1 -1
- package/lib/esm/src/nft/data/HttpNftDataSource.test.js.map +3 -3
- package/lib/esm/src/pki/data/HttpPkiCertificateDataSource.js +1 -1
- package/lib/esm/src/pki/data/HttpPkiCertificateDataSource.js.map +3 -3
- package/lib/esm/src/pki/data/HttpPkiCertificateDataSource.test.js +1 -1
- package/lib/esm/src/pki/data/HttpPkiCertificateDataSource.test.js.map +3 -3
- package/lib/esm/src/proxy/data/HttpProxyDataSource.js +1 -1
- package/lib/esm/src/proxy/data/HttpProxyDataSource.js.map +3 -3
- package/lib/esm/src/proxy/data/HttpProxyDataSource.test.js +1 -1
- package/lib/esm/src/proxy/data/HttpProxyDataSource.test.js.map +3 -3
- package/lib/esm/src/proxy/data/HttpSafeProxyDataSource.js +1 -1
- package/lib/esm/src/proxy/data/HttpSafeProxyDataSource.js.map +3 -3
- package/lib/esm/src/proxy/data/HttpSafeProxyDataSource.test.js +1 -1
- package/lib/esm/src/proxy/data/HttpSafeProxyDataSource.test.js.map +3 -3
- package/lib/esm/src/proxy/di/proxyModuleFactory.js +1 -1
- package/lib/esm/src/proxy/di/proxyModuleFactory.js.map +3 -3
- package/lib/esm/src/proxy/di/proxyModuleFactory.test.js +1 -1
- package/lib/esm/src/proxy/di/proxyModuleFactory.test.js.map +3 -3
- package/lib/esm/src/reporter/data/BlindSigningReporterDatasource.js +1 -0
- package/lib/esm/src/reporter/data/BlindSigningReporterDatasource.js.map +7 -0
- package/lib/esm/src/reporter/data/HttpBlindSigningReporterDatasource.js +2 -0
- package/lib/esm/src/reporter/data/HttpBlindSigningReporterDatasource.js.map +7 -0
- package/lib/esm/src/reporter/data/HttpBlindSigningReporterDatasource.test.js +2 -0
- package/lib/esm/src/reporter/data/HttpBlindSigningReporterDatasource.test.js.map +7 -0
- package/lib/esm/src/reporter/data/dto/BlindSigningEventDto.js +1 -0
- package/lib/esm/src/reporter/data/dto/BlindSigningEventDto.js.map +7 -0
- package/lib/esm/src/reporter/di/reporterModuleFactory.js +2 -0
- package/lib/esm/src/reporter/di/reporterModuleFactory.js.map +7 -0
- package/lib/esm/src/reporter/di/reporterTypes.js +2 -0
- package/lib/esm/src/reporter/di/reporterTypes.js.map +7 -0
- package/lib/esm/src/reporter/domain/BlindSigningReporter.js +1 -0
- package/lib/esm/src/reporter/domain/BlindSigningReporter.js.map +7 -0
- package/lib/esm/src/reporter/domain/DefaultBlindSigningReporter.js +2 -0
- package/lib/esm/src/reporter/domain/DefaultBlindSigningReporter.js.map +7 -0
- package/lib/esm/src/reporter/domain/DefaultBlindSigningReporter.test.js +2 -0
- package/lib/esm/src/reporter/domain/DefaultBlindSigningReporter.test.js.map +7 -0
- package/lib/esm/src/reporter/model/BlindSigningEvent.js +2 -0
- package/lib/esm/src/reporter/model/BlindSigningEvent.js.map +7 -0
- package/lib/esm/src/reporter/model/BlindSigningModelId.js +2 -0
- package/lib/esm/src/reporter/model/BlindSigningModelId.js.map +7 -0
- package/lib/esm/src/safe/data/HttpSafeAccountDataSource.js +1 -1
- package/lib/esm/src/safe/data/HttpSafeAccountDataSource.js.map +3 -3
- package/lib/esm/src/safe/data/HttpSafeAccountDataSource.test.js +1 -1
- package/lib/esm/src/safe/data/HttpSafeAccountDataSource.test.js.map +3 -3
- 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/solana/data/HttpSolanaOwnerInfoDataSource.js +1 -1
- package/lib/esm/src/solana/data/HttpSolanaOwnerInfoDataSource.js.map +3 -3
- package/lib/esm/src/solana/data/HttpSolanaOwnerInfoDataSource.test.js +1 -1
- package/lib/esm/src/solana/data/HttpSolanaOwnerInfoDataSource.test.js.map +3 -3
- package/lib/esm/src/solana/domain/DefaultSolanaContextLoader.test.js +1 -1
- package/lib/esm/src/solana/domain/DefaultSolanaContextLoader.test.js.map +1 -1
- package/lib/esm/src/solanaLifi/data/HttpSolanaLifiDataSource.js +1 -1
- package/lib/esm/src/solanaLifi/data/HttpSolanaLifiDataSource.js.map +3 -3
- package/lib/esm/src/solanaLifi/data/HttpSolanaLifiDataSource.test.js +1 -1
- package/lib/esm/src/solanaLifi/data/HttpSolanaLifiDataSource.test.js.map +3 -3
- package/lib/esm/src/solanaLifi/domain/SolanaLifiContextLoader.js.map +1 -1
- package/lib/esm/src/solanaLifi/domain/SolanaLifiContextLoader.test.js +1 -1
- package/lib/esm/src/solanaLifi/domain/SolanaLifiContextLoader.test.js.map +1 -1
- package/lib/esm/src/solanaToken/data/HttpSolanaTokenDataSource.js +1 -1
- package/lib/esm/src/solanaToken/data/HttpSolanaTokenDataSource.js.map +3 -3
- package/lib/esm/src/solanaToken/data/HttpSolanaTokenDataSource.test.js +6 -6
- package/lib/esm/src/solanaToken/data/HttpSolanaTokenDataSource.test.js.map +3 -3
- package/lib/esm/src/solanaToken/domain/SolanaTokenContextLoader.js +1 -1
- package/lib/esm/src/solanaToken/domain/SolanaTokenContextLoader.js.map +2 -2
- package/lib/esm/src/solanaToken/domain/SolanaTokenContextLoader.test.js +1 -1
- package/lib/esm/src/solanaToken/domain/SolanaTokenContextLoader.test.js.map +1 -1
- package/lib/esm/src/token/data/HttpTokenDataSource.js +1 -1
- package/lib/esm/src/token/data/HttpTokenDataSource.js.map +3 -3
- package/lib/esm/src/token/data/HttpTokenDataSource.test.js +1 -1
- package/lib/esm/src/token/data/HttpTokenDataSource.test.js.map +3 -3
- package/lib/esm/src/transaction-check/data/HttpTransactionCheckDataSource.js +1 -1
- package/lib/esm/src/transaction-check/data/HttpTransactionCheckDataSource.js.map +3 -3
- package/lib/esm/src/transaction-check/data/HttpTransactionCheckDataSource.test.js +1 -1
- package/lib/esm/src/transaction-check/data/HttpTransactionCheckDataSource.test.js.map +3 -3
- package/lib/esm/src/transaction-check/data/HttpTypedDataCheckDataSource.js +1 -1
- package/lib/esm/src/transaction-check/data/HttpTypedDataCheckDataSource.js.map +3 -3
- package/lib/esm/src/transaction-check/data/HttpTypedDataCheckDataSource.test.js +1 -1
- package/lib/esm/src/transaction-check/data/HttpTypedDataCheckDataSource.test.js.map +3 -3
- package/lib/esm/src/trusted-name/data/HttpTrustedNameDataSource.js +1 -1
- package/lib/esm/src/trusted-name/data/HttpTrustedNameDataSource.js.map +3 -3
- package/lib/esm/src/trusted-name/data/HttpTrustedNameDataSource.test.js +1 -1
- package/lib/esm/src/trusted-name/data/HttpTrustedNameDataSource.test.js.map +3 -3
- package/lib/esm/src/trusted-name/di/trustedNameModuleFactory.js +1 -1
- package/lib/esm/src/trusted-name/di/trustedNameModuleFactory.js.map +3 -3
- package/lib/esm/src/typed-data/data/HttpTypedDataDataSource.js +1 -1
- package/lib/esm/src/typed-data/data/HttpTypedDataDataSource.js.map +3 -3
- package/lib/esm/src/typed-data/data/HttpTypedDataDataSource.test.js +1 -1
- package/lib/esm/src/typed-data/data/HttpTypedDataDataSource.test.js.map +3 -3
- package/lib/types/src/ContextModule.d.ts +2 -0
- package/lib/types/src/ContextModule.d.ts.map +1 -1
- package/lib/types/src/ContextModuleBuilder.d.ts +30 -3
- package/lib/types/src/ContextModuleBuilder.d.ts.map +1 -1
- package/lib/types/src/DefaultContextModule.d.ts +6 -2
- package/lib/types/src/DefaultContextModule.d.ts.map +1 -1
- package/lib/types/src/account-ownership/data/AccountOwnershipDataSource.d.ts +17 -0
- package/lib/types/src/account-ownership/data/AccountOwnershipDataSource.d.ts.map +1 -0
- package/lib/types/src/account-ownership/data/AccountOwnershipError.d.ts +17 -0
- package/lib/types/src/account-ownership/data/AccountOwnershipError.d.ts.map +1 -0
- package/lib/types/src/account-ownership/data/HttpAccountOwnershipDataSource.d.ts +30 -0
- package/lib/types/src/account-ownership/data/HttpAccountOwnershipDataSource.d.ts.map +1 -0
- package/lib/types/src/account-ownership/data/HttpAccountOwnershipDataSource.test.d.ts +2 -0
- package/lib/types/src/account-ownership/data/HttpAccountOwnershipDataSource.test.d.ts.map +1 -0
- package/lib/types/src/account-ownership/data/dto/AccountOwnershipDto.d.ts +6 -0
- package/lib/types/src/account-ownership/data/dto/AccountOwnershipDto.d.ts.map +1 -0
- package/lib/types/src/account-ownership/di/accountOwnershipModuleFactory.d.ts +3 -0
- package/lib/types/src/account-ownership/di/accountOwnershipModuleFactory.d.ts.map +1 -0
- package/lib/types/src/account-ownership/di/accountOwnershipTypes.d.ts +5 -0
- package/lib/types/src/account-ownership/di/accountOwnershipTypes.d.ts.map +1 -0
- package/lib/types/src/account-ownership/domain/AccountOwnershipContextLoader.d.ts +20 -0
- package/lib/types/src/account-ownership/domain/AccountOwnershipContextLoader.d.ts.map +1 -0
- package/lib/types/src/account-ownership/domain/AccountOwnershipContextLoader.test.d.ts +2 -0
- package/lib/types/src/account-ownership/domain/AccountOwnershipContextLoader.test.d.ts.map +1 -0
- package/lib/types/src/calldata/data/HttpCalldataDescriptorDataSource.d.ts +4 -2
- package/lib/types/src/calldata/data/HttpCalldataDescriptorDataSource.d.ts.map +1 -1
- package/lib/types/src/calldata/di/calldataModuleFactory.d.ts.map +1 -1
- package/lib/types/src/config/di/configModuleFactory.d.ts +2 -2
- package/lib/types/src/config/di/configModuleFactory.d.ts.map +1 -1
- package/lib/types/src/config/model/ContextModuleConfig.d.ts +14 -3
- package/lib/types/src/config/model/ContextModuleConfig.d.ts.map +1 -1
- package/lib/types/src/di.d.ts +2 -2
- package/lib/types/src/di.d.ts.map +1 -1
- package/lib/types/src/dynamic-network/data/HttpDynamicNetworkDataSource.d.ts +4 -2
- package/lib/types/src/dynamic-network/data/HttpDynamicNetworkDataSource.d.ts.map +1 -1
- package/lib/types/src/dynamic-network/domain/DynamicNetworkContextLoader.d.ts +2 -2
- package/lib/types/src/dynamic-network/domain/DynamicNetworkContextLoader.d.ts.map +1 -1
- package/lib/types/src/external-plugin/data/HttpExternalPluginDataSource.d.ts +4 -2
- package/lib/types/src/external-plugin/data/HttpExternalPluginDataSource.d.ts.map +1 -1
- package/lib/types/src/gated-signing/data/HttpGatedDescriptorDataSource.d.ts +4 -2
- package/lib/types/src/gated-signing/data/HttpGatedDescriptorDataSource.d.ts.map +1 -1
- package/lib/types/src/index.d.ts +11 -1
- package/lib/types/src/index.d.ts.map +1 -1
- package/lib/types/src/network/di/networkModuleFactory.d.ts +4 -0
- package/lib/types/src/network/di/networkModuleFactory.d.ts.map +1 -0
- package/lib/types/src/network/di/networkTypes.d.ts +4 -0
- package/lib/types/src/network/di/networkTypes.d.ts.map +1 -0
- package/lib/types/src/nft/data/HttpNftDataSource.d.ts +4 -2
- package/lib/types/src/nft/data/HttpNftDataSource.d.ts.map +1 -1
- package/lib/types/src/pki/data/HttpPkiCertificateDataSource.d.ts +5 -2
- package/lib/types/src/pki/data/HttpPkiCertificateDataSource.d.ts.map +1 -1
- package/lib/types/src/proxy/data/HttpProxyDataSource.d.ts +4 -2
- package/lib/types/src/proxy/data/HttpProxyDataSource.d.ts.map +1 -1
- package/lib/types/src/proxy/data/HttpSafeProxyDataSource.d.ts +4 -2
- package/lib/types/src/proxy/data/HttpSafeProxyDataSource.d.ts.map +1 -1
- package/lib/types/src/proxy/di/proxyModuleFactory.d.ts +2 -2
- package/lib/types/src/proxy/di/proxyModuleFactory.d.ts.map +1 -1
- package/lib/types/src/reporter/data/BlindSigningReporterDatasource.d.ts +29 -0
- package/lib/types/src/reporter/data/BlindSigningReporterDatasource.d.ts.map +1 -0
- package/lib/types/src/reporter/data/HttpBlindSigningReporterDatasource.d.ts +11 -0
- package/lib/types/src/reporter/data/HttpBlindSigningReporterDatasource.d.ts.map +1 -0
- package/lib/types/src/reporter/data/HttpBlindSigningReporterDatasource.test.d.ts +2 -0
- package/lib/types/src/reporter/data/HttpBlindSigningReporterDatasource.test.d.ts.map +1 -0
- package/lib/types/src/reporter/data/dto/BlindSigningEventDto.d.ts +26 -0
- package/lib/types/src/reporter/data/dto/BlindSigningEventDto.d.ts.map +1 -0
- package/lib/types/src/reporter/di/reporterModuleFactory.d.ts +3 -0
- package/lib/types/src/reporter/di/reporterModuleFactory.d.ts.map +1 -0
- package/lib/types/src/reporter/di/reporterTypes.d.ts +5 -0
- package/lib/types/src/reporter/di/reporterTypes.d.ts.map +1 -0
- package/lib/types/src/reporter/domain/BlindSigningReporter.d.ts +6 -0
- package/lib/types/src/reporter/domain/BlindSigningReporter.d.ts.map +1 -0
- package/lib/types/src/reporter/domain/DefaultBlindSigningReporter.d.ts +9 -0
- package/lib/types/src/reporter/domain/DefaultBlindSigningReporter.d.ts.map +1 -0
- package/lib/types/src/reporter/domain/DefaultBlindSigningReporter.test.d.ts +2 -0
- package/lib/types/src/reporter/domain/DefaultBlindSigningReporter.test.d.ts.map +1 -0
- package/lib/types/src/reporter/model/BlindSigningEvent.d.ts +21 -0
- package/lib/types/src/reporter/model/BlindSigningEvent.d.ts.map +1 -0
- package/lib/types/src/reporter/model/BlindSigningModelId.d.ts +12 -0
- package/lib/types/src/reporter/model/BlindSigningModelId.d.ts.map +1 -0
- package/lib/types/src/safe/data/HttpSafeAccountDataSource.d.ts +4 -2
- package/lib/types/src/safe/data/HttpSafeAccountDataSource.d.ts.map +1 -1
- package/lib/types/src/shared/model/ClearSignContext.d.ts +2 -1
- package/lib/types/src/shared/model/ClearSignContext.d.ts.map +1 -1
- package/lib/types/src/solana/data/HttpSolanaOwnerInfoDataSource.d.ts +4 -2
- package/lib/types/src/solana/data/HttpSolanaOwnerInfoDataSource.d.ts.map +1 -1
- package/lib/types/src/solanaLifi/data/HttpSolanaLifiDataSource.d.ts +4 -3
- package/lib/types/src/solanaLifi/data/HttpSolanaLifiDataSource.d.ts.map +1 -1
- package/lib/types/src/solanaLifi/domain/SolanaLifiContextLoader.d.ts +2 -2
- package/lib/types/src/solanaLifi/domain/SolanaLifiContextLoader.d.ts.map +1 -1
- package/lib/types/src/solanaToken/data/HttpSolanaTokenDataSource.d.ts +4 -2
- package/lib/types/src/solanaToken/data/HttpSolanaTokenDataSource.d.ts.map +1 -1
- package/lib/types/src/solanaToken/domain/SolanaTokenContextLoader.d.ts +2 -2
- package/lib/types/src/solanaToken/domain/SolanaTokenContextLoader.d.ts.map +1 -1
- package/lib/types/src/token/data/HttpTokenDataSource.d.ts +4 -2
- package/lib/types/src/token/data/HttpTokenDataSource.d.ts.map +1 -1
- package/lib/types/src/transaction-check/data/HttpTransactionCheckDataSource.d.ts +4 -2
- package/lib/types/src/transaction-check/data/HttpTransactionCheckDataSource.d.ts.map +1 -1
- package/lib/types/src/transaction-check/data/HttpTypedDataCheckDataSource.d.ts +4 -2
- package/lib/types/src/transaction-check/data/HttpTypedDataCheckDataSource.d.ts.map +1 -1
- package/lib/types/src/trusted-name/data/HttpTrustedNameDataSource.d.ts +4 -2
- package/lib/types/src/trusted-name/data/HttpTrustedNameDataSource.d.ts.map +1 -1
- package/lib/types/src/trusted-name/di/trustedNameModuleFactory.d.ts +2 -2
- package/lib/types/src/trusted-name/di/trustedNameModuleFactory.d.ts.map +1 -1
- package/lib/types/src/typed-data/data/HttpTypedDataDataSource.d.ts +4 -2
- package/lib/types/src/typed-data/data/HttpTypedDataDataSource.d.ts.map +1 -1
- package/lib/types/src/typed-data/data/HttpTypedDataDataSource.test.d.ts.map +1 -1
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +6 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/solanaLifi/data/HttpSolanaLifiDataSource.test.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["
|
|
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 { HttpSolanaLifiDataSource } from \"./HttpSolanaLifiDataSource\";\nimport {\n type GetTransactionDescriptorsResponse,\n type SolanaLifiDataSource,\n} from \"./SolanaLifiDataSource\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\ndescribe(\"HttpSolanaLifiDataSource\", () => {\n let datasource: SolanaLifiDataSource;\n let httpMock: { get: ReturnType<typeof vi.fn> };\n const templateId = \"tpl-123\";\n const config: ContextModuleServiceConfig = {\n cal: {\n url: \"https://crypto-assets-service.api.ledger.com/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 HttpSolanaLifiDataSource(\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://crypto-assets-service.api.ledger.com/v1/swap_templates\",\n {\n params: {\n template_id: templateId,\n output: \"id,chain_id,instructions,descriptors\",\n ref: \"ref=commit:866b6e7633a7a806fab7f9941bcc3df7ee640784\",\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] HttpSolanaLifiDataSource: 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] HttpSolanaLifiDataSource: 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] HttpSolanaLifiDataSource: 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] HttpSolanaLifiDataSource: Failed to fetch transaction descriptors\",\n ),\n ),\n );\n });\n});\n"],
|
|
5
|
+
"mappings": "aAGA,IAAAA,EAA4B,qBAC5BC,EAAqD,kBAIrDC,EAAyC,sCAMzC,MAAMC,EAAoB,KAAO,CAC/B,MAAO,KAAG,GAAG,EACb,KAAM,KAAG,GAAG,EACZ,KAAM,KAAG,GAAG,EACZ,MAAO,KAAG,GAAG,EACb,YAAa,CAAC,CAChB,MAEA,YAAS,2BAA4B,IAAM,CACzC,IAAIC,EACAC,EACJ,MAAMC,EAAa,UACbC,EAAqC,CACzC,IAAK,CACH,IAAK,kDACL,KAAM,OACN,OAAQ,MACV,CACF,KAEA,cAAW,IAAM,CACf,KAAG,cAAc,EACjBF,EAAW,CAAE,IAAK,KAAG,GAAG,CAAE,EAC1BD,EAAa,IAAI,2BACfG,EACAJ,EACAE,CACF,CACF,CAAC,KAED,MAAG,kEAAmE,SAAY,CAEhFA,EAAS,IAAI,kBAAkB,CAAC,CAAC,EAGjC,MAAMD,EAAW,iCAAiC,CAAE,WAAAE,CAAW,CAAC,KAGhE,UAAOD,EAAS,GAAG,EAAE,sBAAsB,CAAC,KAC5C,UAAOA,EAAS,GAAG,EAAE,qBACnB,iEACA,CACE,OAAQ,CACN,YAAaC,EACb,OAAQ,uCACR,IAAK,qDACP,CACF,CACF,CACF,CAAC,KAED,MAAG,uFAAwF,SAAY,CAErG,MAAME,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,KAGD,UAAOG,CAAM,EAAE,WAAQ,SAAMD,CAAS,CAAC,CACzC,CAAC,KAED,MAAG,gDAAiD,SAAY,CAE9DH,EAAS,IAAI,kBAAkB,IAAI,EAGnC,MAAMI,EAAS,MAAML,EAAW,iCAAiC,CAC/D,WAAAE,CACF,CAAC,KAGD,UAAOG,CAAM,EAAE,WACb,QACE,IAAI,MACF,+EAA+EH,CAAU,EAC3F,CACF,CACF,CACF,CAAC,KAED,MAAG,kDAAmD,SAAY,CAEhED,EAAS,IAAI,kBAAkB,CAAC,CAAC,EAGjC,MAAMI,EAAS,MAAML,EAAW,iCAAiC,CAC/D,WAAAE,CACF,CAAC,KAGD,UAAOG,CAAM,EAAE,WACb,QACE,IAAI,MACF,+EAA+EH,CAAU,EAC3F,CACF,CACF,CACF,CAAC,KAED,MAAG,qDAAsD,SAAY,CAEnED,EAAS,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAGrC,MAAMI,EAAS,MAAML,EAAW,iCAAiC,CAC/D,WAAAE,CACF,CAAC,KAGD,UAAOG,CAAM,EAAE,WACb,QACE,IAAI,MACF,+EAA+EH,CAAU,EAC3F,CACF,CACF,CACF,CAAC,KAED,MAAG,wDAAyD,SAAY,CAEtED,EAAS,IAAI,kBAAkB,IAAI,MAAM,SAAS,CAAC,EAGnD,MAAMI,EAAS,MAAML,EAAW,iCAAiC,CAC/D,WAAAE,CACF,CAAC,KAGD,UAAOG,CAAM,EAAE,WACb,QACE,IAAI,MACF,mFACF,CACF,CACF,CACF,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["import_purify_ts", "import_vitest", "import_HttpSolanaLifiDataSource", "mockLoggerFactory", "datasource", "httpMock", "templateId", "config", "response0", "result"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/solanaLifi/domain/SolanaLifiContextLoader.ts"],
|
|
4
|
-
"sourcesContent": ["import { LoggerPublisherService } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type
|
|
4
|
+
"sourcesContent": ["import { LoggerPublisherService } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { pkiTypes } from \"@/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { KeyId } from \"@/pki/model/KeyId\";\nimport { KeyUsage } from \"@/pki/model/KeyUsage\";\nimport { type PkiCertificate } from \"@/pki/model/PkiCertificate\";\nimport { ContextFieldLoader } from \"@/shared/domain/ContextFieldLoader\";\nimport {\n SolanaContextTypes,\n SolanaLifiContextResult,\n type SolanaLifiInstructionMeta,\n type SolanaLifiPayload,\n SolanaTransactionDescriptorList,\n} from \"@/shared/model/SolanaContextTypes\";\nimport { SolanaTransactionContext } from \"@/solana/domain/solanaContextTypes\";\nimport {\n GetTransactionDescriptorsResponse,\n type SolanaLifiDataSource,\n} from \"@/solanaLifi/data/SolanaLifiDataSource\";\nimport { lifiTypes } from \"@/solanaLifi/di/solanaLifiTypes\";\n\n@injectable()\nexport class SolanaLifiContextLoader\n implements\n ContextFieldLoader<\n SolanaTransactionContext,\n SolanaContextTypes,\n SolanaLifiContextResult\n >\n{\n private logger: LoggerPublisherService;\n\n constructor(\n @inject(lifiTypes.SolanaLifiDataSource)\n private readonly dataSource: SolanaLifiDataSource,\n @inject(configTypes.Config)\n private readonly config: ContextModuleServiceConfig,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly _certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this.logger = loggerFactory(\"SolanaLifiContextLoader\");\n }\n\n public canHandle(\n field: unknown,\n expectedType: SolanaContextTypes,\n ): field is SolanaTransactionContext {\n if (expectedType !== SolanaContextTypes.SOLANA_LIFI) {\n this.logger.debug(\"[canHandle] Skipping, expected type does not match\", {\n data: { expectedType, required: SolanaContextTypes.SOLANA_LIFI },\n });\n return false;\n }\n\n if (typeof field === \"object\" && field !== null && \"templateId\" in field) {\n const templateId = (field as { templateId: unknown }).templateId;\n const isValid = typeof templateId === \"string\" && templateId.length > 0;\n this.logger.debug(\"[canHandle] Field validation result\", {\n data: { templateId, isValid },\n });\n return isValid;\n }\n\n this.logger.debug(\"[canHandle] Field does not contain a valid templateId\", {\n data: { field },\n });\n return false;\n }\n\n public async loadField(\n solanaLifiContextInput: SolanaTransactionContext,\n ): Promise<SolanaLifiContextResult> {\n this.logger.debug(\"[loadField] Loading solana Lifi context\", {\n data: { input: solanaLifiContextInput },\n });\n const { templateId, deviceModelId } = solanaLifiContextInput;\n\n if (!templateId) {\n return {\n type: SolanaContextTypes.ERROR,\n error: new Error(\n \"[ContextModule] SolanaLifiContextLoader: templateId is missing\",\n ),\n };\n }\n\n const payload = await this.dataSource.getTransactionDescriptorsPayload({\n templateId,\n });\n\n const certificate: PkiCertificate | undefined =\n await this._certificateLoader.loadCertificate({\n keyId: KeyId.SwapTemplateKey,\n keyUsage: KeyUsage.SwapTemplate,\n targetDevice: deviceModelId,\n });\n\n return payload.caseOf({\n Left: (error): SolanaLifiContextResult => {\n this.logger.error(\"[loadField] Error loading solana Lifi context\", {\n data: { error },\n });\n\n return {\n type: SolanaContextTypes.ERROR,\n error,\n };\n },\n Right: (value): SolanaLifiContextResult => {\n const lifiPayload = this.buildPayload(value);\n this.logger.debug(\n \"[loadField] Successfully loaded solana Lifi context\",\n {\n data: {\n descriptors: lifiPayload.descriptors,\n instructionsCount: lifiPayload.instructions.length,\n certificate,\n },\n },\n );\n\n return {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: lifiPayload,\n certificate,\n };\n },\n });\n }\n\n private buildPayload(\n response: GetTransactionDescriptorsResponse,\n ): SolanaLifiPayload {\n return {\n descriptors: this.pluckTransactionData(response),\n instructions: this.extractInstructionsMeta(response),\n };\n }\n\n private pluckTransactionData(\n tokenData: GetTransactionDescriptorsResponse,\n ): SolanaTransactionDescriptorList {\n const signatureKind = this.config.cal.mode || \"prod\";\n const output: SolanaTransactionDescriptorList = {};\n const descriptors = tokenData.descriptors ?? [];\n\n this.logger.debug(\"[pluckTransactionData] Processing descriptors\", {\n data: { descriptorsCount: descriptors.length, signatureKind },\n });\n\n for (const item of descriptors) {\n const key = `${item.program_id}:${item.discriminator_hex ?? \"\"}`;\n output[key] = {\n data: item.descriptor.data,\n descriptorType: item.descriptor.descriptorType,\n descriptorVersion: item.descriptor.descriptorVersion,\n signature: item.descriptor.signatures[signatureKind] ?? \"\",\n };\n this.logger.debug(\"[pluckTransactionData] Mapped program descriptor\", {\n data: {\n programId: item.program_id,\n discriminatorHex: item.discriminator_hex ?? \"\",\n key,\n },\n });\n }\n\n this.logger.debug(\"[pluckTransactionData] Completed processing\", {\n data: { outputKeys: Object.keys(output) },\n });\n\n return output;\n }\n\n private extractInstructionsMeta(\n response: GetTransactionDescriptorsResponse,\n ): SolanaLifiInstructionMeta[] {\n const instructions = response.instructions ?? [];\n\n this.logger.debug(\n \"[extractInstructionsMeta] Extracting instructions metadata\",\n {\n data: { instructionsCount: instructions.length },\n },\n );\n\n const meta = instructions.map((ix) => ({\n program_id: ix.program_id,\n ...(ix.discriminator_hex !== undefined && {\n discriminator_hex: ix.discriminator_hex,\n }),\n }));\n\n this.logger.debug(\n \"[extractInstructionsMeta] Completed extracting instructions metadata\",\n {\n data: {\n meta: meta.map((m) => ({\n programId: m.program_id,\n discriminatorHex: m.discriminator_hex,\n })),\n },\n },\n );\n\n return meta;\n }\n}\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": ["SolanaLifiContextLoader_exports", "__export", "SolanaLifiContextLoader", "__toCommonJS", "import_inversify", "import_configTypes", "import_pkiTypes", "import_KeyId", "import_KeyUsage", "import_SolanaContextTypes", "import_solanaLifiTypes", "SolanaLifiContextLoader", "dataSource", "config", "_certificateLoader", "loggerFactory", "field", "expectedType", "templateId", "isValid", "solanaLifiContextInput", "deviceModelId", "payload", "certificate", "error", "value", "lifiPayload", "response", "tokenData", "signatureKind", "output", "descriptors", "item", "key", "instructions", "meta", "ix", "m", "__decorateClass", "__decorateParam"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/solanaLifi/domain/SolanaLifiContextLoader.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 ContextModuleConfig } from \"@/config/model/ContextModuleConfig\";\nimport { type PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport {\n SolanaContextTypes,\n type SolanaTransactionDescriptor,\n type SolanaTransactionDescriptorList,\n type SolanaTransactionDescriptorRaw,\n} from \"@/shared/model/SolanaContextTypes\";\nimport {\n type GetTransactionDescriptorsResponse,\n type SolanaLifiDataSource,\n} from \"@/solanaLifi/data/SolanaLifiDataSource\";\n\nimport { SolanaLifiContextLoader } from \"./SolanaLifiContextLoader\";\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 ContextModuleConfig;\n\ndescribe(\"SolanaLifiContextLoader\", () => {\n let mockDataSource: SolanaLifiDataSource;\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 SolanaLifiDataSource;\n mockCertificateLoader = {\n loadCertificate: vi.fn().mockResolvedValue(mockCertificate),\n } as unknown as PkiCertificateLoader;\n });\n\n const makeLoader = () =>\n new SolanaLifiContextLoader(\n mockDataSource,\n mockConfig,\n mockCertificateLoader,\n mockLoggerFactory,\n );\n\n describe(\"canHandle\", () => {\n it(\"returns true when templateId is provided\", () => {\n const loader = makeLoader();\n\n expect(\n loader.canHandle(\n {\n templateId: \"tpl-123\",\n deviceModelId: \"nanoS\" as any,\n },\n SolanaContextTypes.SOLANA_LIFI,\n ),\n ).toBe(true);\n });\n\n it(\"returns false when templateId is missing or falsy\", () => {\n const loader = makeLoader();\n\n expect(\n loader.canHandle(\n { templateId: \"\" } as any,\n SolanaContextTypes.SOLANA_LIFI,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n { templateId: undefined } as any,\n SolanaContextTypes.SOLANA_LIFI,\n ),\n ).toBe(false);\n expect(loader.canHandle({} as any, SolanaContextTypes.SOLANA_LIFI)).toBe(\n false,\n );\n });\n });\n\n describe(\"loadField\", () => {\n it(\"returns 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.loadField(input);\n\n expect(\n mockDataSource.getTransactionDescriptorsPayload,\n ).toHaveBeenCalledWith({\n templateId: \"tpl-err\",\n });\n\n expect(result).toEqual({\n type: SolanaContextTypes.ERROR,\n error,\n });\n });\n\n it(\"returns SOLANA_LIFI 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.loadField(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 type: SolanaContextTypes.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 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(\"loadField 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.loadField(input);\n\n expect(result).toMatchObject({\n type: SolanaContextTypes.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 as any).payload.descriptors)).toHaveLength(11);\n expect((result as any).payload.instructions).toHaveLength(12);\n });\n });\n});\n"],
|
|
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 \"@/pki/domain/PkiCertificateLoader\";\nimport {\n SolanaContextTypes,\n type SolanaTransactionDescriptor,\n type SolanaTransactionDescriptorList,\n type SolanaTransactionDescriptorRaw,\n} from \"@/shared/model/SolanaContextTypes\";\nimport {\n type GetTransactionDescriptorsResponse,\n type SolanaLifiDataSource,\n} from \"@/solanaLifi/data/SolanaLifiDataSource\";\n\nimport { SolanaLifiContextLoader } from \"./SolanaLifiContextLoader\";\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(\"SolanaLifiContextLoader\", () => {\n let mockDataSource: SolanaLifiDataSource;\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 SolanaLifiDataSource;\n mockCertificateLoader = {\n loadCertificate: vi.fn().mockResolvedValue(mockCertificate),\n } as unknown as PkiCertificateLoader;\n });\n\n const makeLoader = () =>\n new SolanaLifiContextLoader(\n mockDataSource,\n mockConfig,\n mockCertificateLoader,\n mockLoggerFactory,\n );\n\n describe(\"canHandle\", () => {\n it(\"returns true when templateId is provided\", () => {\n const loader = makeLoader();\n\n expect(\n loader.canHandle(\n {\n templateId: \"tpl-123\",\n deviceModelId: \"nanoS\" as any,\n },\n SolanaContextTypes.SOLANA_LIFI,\n ),\n ).toBe(true);\n });\n\n it(\"returns false when templateId is missing or falsy\", () => {\n const loader = makeLoader();\n\n expect(\n loader.canHandle(\n { templateId: \"\" } as any,\n SolanaContextTypes.SOLANA_LIFI,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n { templateId: undefined } as any,\n SolanaContextTypes.SOLANA_LIFI,\n ),\n ).toBe(false);\n expect(loader.canHandle({} as any, SolanaContextTypes.SOLANA_LIFI)).toBe(\n false,\n );\n });\n });\n\n describe(\"loadField\", () => {\n it(\"returns 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.loadField(input);\n\n expect(\n mockDataSource.getTransactionDescriptorsPayload,\n ).toHaveBeenCalledWith({\n templateId: \"tpl-err\",\n });\n\n expect(result).toEqual({\n type: SolanaContextTypes.ERROR,\n error,\n });\n });\n\n it(\"returns SOLANA_LIFI 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.loadField(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 type: SolanaContextTypes.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 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(\"loadField 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.loadField(input);\n\n expect(result).toMatchObject({\n type: SolanaContextTypes.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 as any).payload.descriptors)).toHaveLength(11);\n expect((result as any).payload.instructions).toHaveLength(12);\n });\n });\n});\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": ["import_purify_ts", "import_vitest", "import_SolanaContextTypes", "import_SolanaLifiContextLoader", "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
|
-
"use strict";var
|
|
1
|
+
"use strict";var c=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var _=(t,e)=>{for(var o in e)c(t,o,{get:e[o],enumerable:!0})},y=(t,e,o,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of g(e))!u.call(t,r)&&r!==o&&c(t,r,{get:()=>e[r],enumerable:!(n=f(e,r))||n.enumerable});return t};var w=t=>y(c({},"__esModule",{value:!0}),t),k=(t,e,o,n)=>{for(var r=n>1?void 0:n?f(e,o):e,m=t.length-1,p;m>=0;m--)(p=t[m])&&(r=(n?p(e,o,r):p(r))||r);return n&&r&&c(e,o,r),r},l=(t,e)=>(o,n)=>e(o,n,t);var C={};_(C,{HttpSolanaTokenDataSource:()=>a});module.exports=w(C);var i=require("inversify"),s=require("purify-ts"),d=require("../../config/di/configTypes"),h=require("../../network/di/networkTypes");let a=class{constructor(e,o){this.config=e;this.http=o}async getTokenInfosPayload({tokenInternalId:e}){try{const o=await this.http.get(`${this.config.cal.url}/tokens`,{params:{id:e,output:"id,name,network,network_family,network_type,exchange_app_config_serialized,live_signature,ticker,decimals,blockchain_name,chain_id,contract_address,descriptor,descriptor_exchange_app,units,symbol",ref:`branch:${this.config.cal.branch}`}});return!o||o.length===0||!o[0]?(0,s.Left)(new Error(`[ContextModule] HttpSolanaTokenDataSource: no token metadata for id ${e}`)):(0,s.Right)(o[0])}catch{return(0,s.Left)(new Error("[ContextModule] HttpSolanaTokenDataSource: Failed to fetch token informations"))}}};a=k([(0,i.injectable)(),l(0,(0,i.inject)(d.configTypes.Config)),l(1,(0,i.inject)(h.networkTypes.NetworkClient))],a);0&&(module.exports={HttpSolanaTokenDataSource});
|
|
2
2
|
//# sourceMappingURL=HttpSolanaTokenDataSource.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/solanaToken/data/HttpSolanaTokenDataSource.ts"],
|
|
4
|
-
"sourcesContent": ["import
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["HttpSolanaTokenDataSource_exports", "__export", "HttpSolanaTokenDataSource", "__toCommonJS", "
|
|
4
|
+
"sourcesContent": ["import { DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Either, Left, Right } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { networkTypes } from \"@/network/di/networkTypes\";\n\nimport {\n GetSolanaTokenInfosParams,\n SolanaTokenDataSource,\n TokenDataResponse,\n} from \"./SolanaTokenDataSource\";\n\n@injectable()\nexport class HttpSolanaTokenDataSource implements SolanaTokenDataSource {\n constructor(\n @inject(configTypes.Config)\n private readonly config: ContextModuleServiceConfig,\n @inject(networkTypes.NetworkClient)\n private readonly http: DmkNetworkClient,\n ) {}\n\n public async getTokenInfosPayload({\n tokenInternalId,\n }: GetSolanaTokenInfosParams): Promise<Either<Error, TokenDataResponse>> {\n try {\n const data = (await this.http.get(`${this.config.cal.url}/tokens`, {\n params: {\n id: tokenInternalId,\n output:\n \"id,name,network,network_family,network_type,exchange_app_config_serialized,live_signature,ticker,decimals,blockchain_name,chain_id,contract_address,descriptor,descriptor_exchange_app,units,symbol\",\n ref: `branch:${this.config.cal.branch}`,\n },\n })) as TokenDataResponse[];\n\n if (!data || data.length === 0 || !data[0]) {\n return Left(\n new Error(\n `[ContextModule] HttpSolanaTokenDataSource: no token metadata for id ${tokenInternalId}`,\n ),\n );\n }\n\n return Right(data[0]);\n } catch (_error) {\n return Left(\n new Error(\n \"[ContextModule] HttpSolanaTokenDataSource: Failed to fetch token informations\",\n ),\n );\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,+BAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAAmC,qBACnCC,EAAoC,qBAEpCC,EAA4B,mCAE5BC,EAA6B,qCAStB,IAAMC,EAAN,KAAiE,CACtE,YAEmBC,EAEAC,EACjB,CAHiB,YAAAD,EAEA,UAAAC,CAChB,CAEH,MAAa,qBAAqB,CAChC,gBAAAC,CACF,EAAyE,CACvE,GAAI,CACF,MAAMC,EAAQ,MAAM,KAAK,KAAK,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,UAAW,CACjE,OAAQ,CACN,GAAID,EACJ,OACE,sMACF,IAAK,UAAU,KAAK,OAAO,IAAI,MAAM,EACvC,CACF,CAAC,EAED,MAAI,CAACC,GAAQA,EAAK,SAAW,GAAK,CAACA,EAAK,CAAC,KAChC,QACL,IAAI,MACF,uEAAuED,CAAe,EACxF,CACF,KAGK,SAAMC,EAAK,CAAC,CAAC,CACtB,MAAiB,CACf,SAAO,QACL,IAAI,MACF,+EACF,CACF,CACF,CACF,CACF,EAtCaJ,EAANK,EAAA,IADN,cAAW,EAGPC,EAAA,eAAO,cAAY,MAAM,GAEzBA,EAAA,eAAO,eAAa,aAAa,IAJzBN",
|
|
6
|
+
"names": ["HttpSolanaTokenDataSource_exports", "__export", "HttpSolanaTokenDataSource", "__toCommonJS", "import_inversify", "import_purify_ts", "import_configTypes", "import_networkTypes", "HttpSolanaTokenDataSource", "config", "http", "tokenInternalId", "data", "__decorateClass", "__decorateParam"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
caseName |
|
|
3
|
-
${"data is undefined"} | ${
|
|
4
|
-
${"data array is empty"} | ${
|
|
5
|
-
${"first element is falsy"} | ${
|
|
6
|
-
`("Error cases",({caseName:o,
|
|
1
|
+
"use strict";var r=require("purify-ts"),e=require("vitest"),c=require("./HttpSolanaTokenDataSource");(0,e.describe)("HttpSolanaTokenDataSource",()=>{let n,t;const a="sol:usdc",s={cal:{url:"https://crypto-assets-service.api.ledger.com/v1",mode:"prod",branch:"main"}},i=o=>`[ContextModule] HttpSolanaTokenDataSource: no token metadata for id ${o}`;(0,e.beforeEach)(()=>{e.vi.clearAllMocks(),t={get:e.vi.fn()},n=new c.HttpSolanaTokenDataSource(s,t)}),(0,e.it)("should call http.get with the correct url and params",async()=>{t.get.mockResolvedValue([]),await n.getTokenInfosPayload({tokenInternalId:a}),(0,e.expect)(t.get).toHaveBeenCalledTimes(1),(0,e.expect)(t.get).toHaveBeenCalledWith(`${s.cal.url}/tokens`,{params:{id:a,output:"id,name,network,network_family,network_type,exchange_app_config_serialized,live_signature,ticker,decimals,blockchain_name,chain_id,contract_address,descriptor,descriptor_exchange_app,units,symbol",ref:`branch:${s.cal.branch}`}})}),(0,e.it)("should return Right(data[0]) when http.get responds with a non-empty array",async()=>{const o={descriptor:{data:"ABCD",signatures:{prod:"SIG-PROD",test:"SIG-TEST"}}};t.get.mockResolvedValue([o]);const l=await n.getTokenInfosPayload({tokenInternalId:a});(0,e.expect)(l).toEqual((0,r.Right)(o))}),e.describe.each`
|
|
2
|
+
caseName | responseBody
|
|
3
|
+
${"data is undefined"} | ${null}
|
|
4
|
+
${"data array is empty"} | ${[]}
|
|
5
|
+
${"first element is falsy"} | ${[null]}
|
|
6
|
+
`("Error cases",({caseName:o,responseBody:l})=>{(0,e.it)(`should return an error when ${o}`,async()=>{t.get.mockResolvedValue(l);const d=await n.getTokenInfosPayload({tokenInternalId:a});(0,e.expect)(d).toEqual((0,r.Left)(new Error(i(a))))})}),(0,e.it)("should return an error when http.get throws",async()=>{t.get.mockRejectedValue(new Error("network"));const o=await n.getTokenInfosPayload({tokenInternalId:a});(0,e.expect)(o).toEqual((0,r.Left)(new Error("[ContextModule] HttpSolanaTokenDataSource: Failed to fetch token informations")))})});
|
|
7
7
|
//# sourceMappingURL=HttpSolanaTokenDataSource.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/solanaToken/data/HttpSolanaTokenDataSource.test.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["
|
|
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 { HttpSolanaTokenDataSource } from \"./HttpSolanaTokenDataSource\";\nimport {\n type SolanaTokenDataSource,\n type TokenDataResponse,\n} from \"./SolanaTokenDataSource\";\n\ndescribe(\"HttpSolanaTokenDataSource\", () => {\n let datasource: SolanaTokenDataSource;\n let httpMock: { get: ReturnType<typeof vi.fn> };\n const tokenInternalId = \"sol:usdc\";\n const config: ContextModuleServiceConfig = {\n cal: {\n url: \"https://crypto-assets-service.api.ledger.com/v1\",\n mode: \"prod\",\n branch: \"main\",\n },\n } as ContextModuleServiceConfig;\n\n const errorMessage = (id: string) =>\n `[ContextModule] HttpSolanaTokenDataSource: no token metadata for id ${id}`;\n\n beforeEach(() => {\n vi.clearAllMocks();\n httpMock = { get: vi.fn() };\n datasource = new HttpSolanaTokenDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n });\n\n it(\"should call http.get with the correct url and params\", async () => {\n // given\n httpMock.get.mockResolvedValue([]);\n\n // when\n await datasource.getTokenInfosPayload({ tokenInternalId });\n\n // then\n expect(httpMock.get).toHaveBeenCalledTimes(1);\n expect(httpMock.get).toHaveBeenCalledWith(`${config.cal.url}/tokens`, {\n params: {\n id: tokenInternalId,\n output:\n \"id,name,network,network_family,network_type,exchange_app_config_serialized,live_signature,ticker,decimals,blockchain_name,chain_id,contract_address,descriptor,descriptor_exchange_app,units,symbol\",\n ref: `branch:${config.cal.branch}`,\n },\n });\n });\n\n it(\"should return Right(data[0]) when http.get responds with a non-empty array\", async () => {\n // given\n const response0: TokenDataResponse = {\n descriptor: {\n data: \"ABCD\",\n signatures: {\n prod: \"SIG-PROD\",\n test: \"SIG-TEST\",\n } as any,\n },\n } as any;\n\n httpMock.get.mockResolvedValue([response0]);\n\n // when\n const result = await datasource.getTokenInfosPayload({ tokenInternalId });\n\n // then\n expect(result).toEqual(Right(response0));\n });\n\n describe.each`\n caseName | responseBody\n ${\"data is undefined\"} | ${null}\n ${\"data array is empty\"} | ${[]}\n ${\"first element is falsy\"} | ${[null]}\n `(\"Error cases\", ({ caseName, responseBody }) => {\n it(`should return an error when ${caseName}`, async () => {\n // given\n httpMock.get.mockResolvedValue(responseBody);\n\n // when\n const result = await datasource.getTokenInfosPayload({ tokenInternalId });\n\n // then\n expect(result).toEqual(Left(new Error(errorMessage(tokenInternalId))));\n });\n });\n\n it(\"should return an error when http.get throws\", async () => {\n // given\n httpMock.get.mockRejectedValue(new Error(\"network\"));\n\n // when\n const result = await datasource.getTokenInfosPayload({ tokenInternalId });\n\n // then\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpSolanaTokenDataSource: Failed to fetch token informations\",\n ),\n ),\n );\n });\n});\n"],
|
|
5
|
+
"mappings": "aAGA,IAAAA,EAA4B,qBAC5BC,EAAqD,kBAIrDC,EAA0C,0CAM1C,YAAS,4BAA6B,IAAM,CAC1C,IAAIC,EACAC,EACJ,MAAMC,EAAkB,WAClBC,EAAqC,CACzC,IAAK,CACH,IAAK,kDACL,KAAM,OACN,OAAQ,MACV,CACF,EAEMC,EAAgBC,GACpB,uEAAuEA,CAAE,MAE3E,cAAW,IAAM,CACf,KAAG,cAAc,EACjBJ,EAAW,CAAE,IAAK,KAAG,GAAG,CAAE,EAC1BD,EAAa,IAAI,4BACfG,EACAF,CACF,CACF,CAAC,KAED,MAAG,uDAAwD,SAAY,CAErEA,EAAS,IAAI,kBAAkB,CAAC,CAAC,EAGjC,MAAMD,EAAW,qBAAqB,CAAE,gBAAAE,CAAgB,CAAC,KAGzD,UAAOD,EAAS,GAAG,EAAE,sBAAsB,CAAC,KAC5C,UAAOA,EAAS,GAAG,EAAE,qBAAqB,GAAGE,EAAO,IAAI,GAAG,UAAW,CACpE,OAAQ,CACN,GAAID,EACJ,OACE,sMACF,IAAK,UAAUC,EAAO,IAAI,MAAM,EAClC,CACF,CAAC,CACH,CAAC,KAED,MAAG,6EAA8E,SAAY,CAE3F,MAAMG,EAA+B,CACnC,WAAY,CACV,KAAM,OACN,WAAY,CACV,KAAM,WACN,KAAM,UACR,CACF,CACF,EAEAL,EAAS,IAAI,kBAAkB,CAACK,CAAS,CAAC,EAG1C,MAAMC,EAAS,MAAMP,EAAW,qBAAqB,CAAE,gBAAAE,CAAgB,CAAC,KAGxE,UAAOK,CAAM,EAAE,WAAQ,SAAMD,CAAS,CAAC,CACzC,CAAC,EAED,WAAS;AAAA;AAAA,MAEL,mBAAmB,WAAW,IAAI;AAAA,MAClC,qBAAqB,SAAS,CAAC,CAAC;AAAA,MAChC,wBAAwB,MAAM,CAAC,IAAI,CAAC;AAAA,IACtC,cAAe,CAAC,CAAE,SAAAE,EAAU,aAAAC,CAAa,IAAM,IAC/C,MAAG,+BAA+BD,CAAQ,GAAI,SAAY,CAExDP,EAAS,IAAI,kBAAkBQ,CAAY,EAG3C,MAAMF,EAAS,MAAMP,EAAW,qBAAqB,CAAE,gBAAAE,CAAgB,CAAC,KAGxE,UAAOK,CAAM,EAAE,WAAQ,QAAK,IAAI,MAAMH,EAAaF,CAAe,CAAC,CAAC,CAAC,CACvE,CAAC,CACH,CAAC,KAED,MAAG,8CAA+C,SAAY,CAE5DD,EAAS,IAAI,kBAAkB,IAAI,MAAM,SAAS,CAAC,EAGnD,MAAMM,EAAS,MAAMP,EAAW,qBAAqB,CAAE,gBAAAE,CAAgB,CAAC,KAGxE,UAAOK,CAAM,EAAE,WACb,QACE,IAAI,MACF,+EACF,CACF,CACF,CACF,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["import_purify_ts", "import_vitest", "import_HttpSolanaTokenDataSource", "datasource", "httpMock", "tokenInternalId", "config", "errorMessage", "id", "response0", "result", "caseName", "responseBody"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var p=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var
|
|
1
|
+
"use strict";var p=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var C=(n,e)=>{for(var t in e)p(n,t,{get:e[t],enumerable:!0})},x=(n,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of S(e))!T.call(n,o)&&o!==t&&p(n,o,{get:()=>e[o],enumerable:!(a=u(e,o))||a.enumerable});return n};var h=n=>x(p({},"__esModule",{value:!0}),n),k=(n,e,t,a)=>{for(var o=a>1?void 0:a?u(e,t):e,l=n.length-1,r;l>=0;l--)(r=n[l])&&(o=(a?r(e,t,o):r(o))||o);return a&&o&&p(e,t,o),o},s=(n,e)=>(t,a)=>e(t,a,n);var I={};C(I,{SolanaTokenContextLoader:()=>d});module.exports=h(I);var i=require("inversify"),g=require("../../config/di/configTypes"),f=require("../../pki/di/pkiTypes"),m=require("../../pki/model/KeyUsage"),c=require("../../shared/model/SolanaContextTypes"),y=require("../../solanaToken/di/solanaTokenTypes");let d=class{constructor(e,t,a,o){this.dataSource=e;this.config=t;this._certificateLoader=a;this.logger=o("SolanaTokenContextLoader")}logger;canHandle(e,t){if(t!==c.SolanaContextTypes.SOLANA_TOKEN||typeof e!="object"||e===null||!("tokenInternalId"in e))return!1;const a=e.tokenInternalId;return typeof a=="string"&&a.length>0}async loadField(e){this.logger.debug("[loadField] Loading solana token context",{data:{input:e}});const{tokenInternalId:t,deviceModelId:a}=e;if(!t)return{type:c.SolanaContextTypes.ERROR,error:new Error("[ContextModule] SolanaTokenContextLoader: tokenInternalId is missing")};const o=await this.dataSource.getTokenInfosPayload({tokenInternalId:t}),l=await this._certificateLoader.loadCertificate({keyId:"token_metadata_key",keyUsage:m.KeyUsage.CoinMeta,targetDevice:a});return o.caseOf({Left:r=>(this.logger.error("[loadField] Error loading solana token context",{data:{error:r}}),{type:c.SolanaContextTypes.ERROR,error:r}),Right:r=>(this.logger.debug("[loadField] Successfully loaded solana token context",{data:{payload:this.pluckTokenData(r),certificate:l}}),{type:c.SolanaContextTypes.SOLANA_TOKEN,payload:this.pluckTokenData(r),certificate:l})})}pluckTokenData(e){const t=this.config.cal.mode||"prod";return{solanaTokenDescriptor:{data:e.descriptor.data,signature:e.descriptor.signatures[t]}}}};d=k([(0,i.injectable)(),s(0,(0,i.inject)(y.solanaTokenTypes.SolanaTokenDataSource)),s(1,(0,i.inject)(g.configTypes.Config)),s(2,(0,i.inject)(f.pkiTypes.PkiCertificateLoader)),s(3,(0,i.inject)(g.configTypes.ContextModuleLoggerFactory))],d);0&&(module.exports={SolanaTokenContextLoader});
|
|
2
2
|
//# sourceMappingURL=SolanaTokenContextLoader.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/solanaToken/domain/SolanaTokenContextLoader.ts"],
|
|
4
|
-
"sourcesContent": ["import { LoggerPublisherService } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type
|
|
5
|
-
"mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,8BAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAAmC,qBAEnCC,EAA4B,mCAE5BC,EAAyB,6BAEzBC,EAAyB,gCAGzBC,EAIO,6CAMPC,EAAiC,6CAG1B,IAAMC,EAAN,KAOP,CAGE,YAEmBC,
|
|
4
|
+
"sourcesContent": ["import { LoggerPublisherService } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { pkiTypes } from \"@/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { KeyUsage } from \"@/pki/model/KeyUsage\";\nimport { PkiCertificate } from \"@/pki/model/PkiCertificate\";\nimport { ContextFieldLoader } from \"@/shared/domain/ContextFieldLoader\";\nimport {\n SolanaContextTypes,\n SolanaTokenContextResult,\n SolanaTokenData,\n} from \"@/shared/model/SolanaContextTypes\";\nimport { SolanaTransactionContext } from \"@/solana/domain/solanaContextTypes\";\nimport {\n type SolanaTokenDataSource,\n type TokenDataResponse,\n} from \"@/solanaToken/data/SolanaTokenDataSource\";\nimport { solanaTokenTypes } from \"@/solanaToken/di/solanaTokenTypes\";\n\n@injectable()\nexport class SolanaTokenContextLoader\n implements\n ContextFieldLoader<\n SolanaTransactionContext,\n SolanaContextTypes,\n SolanaTokenContextResult\n >\n{\n private logger: LoggerPublisherService;\n\n constructor(\n @inject(solanaTokenTypes.SolanaTokenDataSource)\n private readonly dataSource: SolanaTokenDataSource,\n @inject(configTypes.Config)\n private readonly config: ContextModuleServiceConfig,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly _certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this.logger = loggerFactory(\"SolanaTokenContextLoader\");\n }\n\n public canHandle(\n field: unknown,\n expectedType: SolanaContextTypes,\n ): field is SolanaTransactionContext {\n if (expectedType !== SolanaContextTypes.SOLANA_TOKEN) {\n return false;\n }\n\n if (\n typeof field !== \"object\" ||\n field === null ||\n !(\"tokenInternalId\" in field)\n ) {\n return false;\n }\n\n const tokenInternalId = (field as { tokenInternalId: unknown })\n .tokenInternalId;\n\n return typeof tokenInternalId === \"string\" && tokenInternalId.length > 0;\n }\n\n public async loadField(\n solanaTokenContextInput: SolanaTransactionContext,\n ): Promise<SolanaTokenContextResult> {\n this.logger.debug(\"[loadField] Loading solana token context\", {\n data: { input: solanaTokenContextInput },\n });\n const { tokenInternalId, deviceModelId } = solanaTokenContextInput;\n\n if (!tokenInternalId) {\n return {\n type: SolanaContextTypes.ERROR,\n error: new Error(\n \"[ContextModule] SolanaTokenContextLoader: tokenInternalId is missing\",\n ),\n };\n }\n\n const payload = await this.dataSource.getTokenInfosPayload({\n tokenInternalId,\n });\n\n const certificate: PkiCertificate | undefined =\n await this._certificateLoader.loadCertificate({\n keyId: \"token_metadata_key\",\n keyUsage: KeyUsage.CoinMeta,\n targetDevice: deviceModelId,\n });\n\n return payload.caseOf({\n Left: (error): SolanaTokenContextResult => {\n this.logger.error(\"[loadField] Error loading solana token context\", {\n data: { error },\n });\n\n return {\n type: SolanaContextTypes.ERROR,\n error,\n };\n },\n Right: (value): SolanaTokenContextResult => {\n this.logger.debug(\n \"[loadField] Successfully loaded solana token context\",\n {\n data: { payload: this.pluckTokenData(value), certificate },\n },\n );\n\n return {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: this.pluckTokenData(value),\n certificate,\n };\n },\n });\n }\n\n private pluckTokenData(tokenData: TokenDataResponse): SolanaTokenData {\n const signatureKind = this.config.cal.mode || \"prod\";\n return {\n solanaTokenDescriptor: {\n data: tokenData.descriptor.data,\n signature: tokenData.descriptor.signatures[signatureKind],\n },\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,8BAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAAmC,qBAEnCC,EAA4B,mCAE5BC,EAAyB,6BAEzBC,EAAyB,gCAGzBC,EAIO,6CAMPC,EAAiC,6CAG1B,IAAMC,EAAN,KAOP,CAGE,YAEmBC,EAEAC,EAEAC,EAEjBC,EACA,CAPiB,gBAAAH,EAEA,YAAAC,EAEA,wBAAAC,EAIjB,KAAK,OAASC,EAAc,0BAA0B,CACxD,CAbQ,OAeD,UACLC,EACAC,EACmC,CAKnC,GAJIA,IAAiB,qBAAmB,cAKtC,OAAOD,GAAU,UACjBA,IAAU,MACV,EAAE,oBAAqBA,GAEvB,MAAO,GAGT,MAAME,EAAmBF,EACtB,gBAEH,OAAO,OAAOE,GAAoB,UAAYA,EAAgB,OAAS,CACzE,CAEA,MAAa,UACXC,EACmC,CACnC,KAAK,OAAO,MAAM,2CAA4C,CAC5D,KAAM,CAAE,MAAOA,CAAwB,CACzC,CAAC,EACD,KAAM,CAAE,gBAAAD,EAAiB,cAAAE,CAAc,EAAID,EAE3C,GAAI,CAACD,EACH,MAAO,CACL,KAAM,qBAAmB,MACzB,MAAO,IAAI,MACT,sEACF,CACF,EAGF,MAAMG,EAAU,MAAM,KAAK,WAAW,qBAAqB,CACzD,gBAAAH,CACF,CAAC,EAEKI,EACJ,MAAM,KAAK,mBAAmB,gBAAgB,CAC5C,MAAO,qBACP,SAAU,WAAS,SACnB,aAAcF,CAChB,CAAC,EAEH,OAAOC,EAAQ,OAAO,CACpB,KAAOE,IACL,KAAK,OAAO,MAAM,iDAAkD,CAClE,KAAM,CAAE,MAAAA,CAAM,CAChB,CAAC,EAEM,CACL,KAAM,qBAAmB,MACzB,MAAAA,CACF,GAEF,MAAQC,IACN,KAAK,OAAO,MACV,uDACA,CACE,KAAM,CAAE,QAAS,KAAK,eAAeA,CAAK,EAAG,YAAAF,CAAY,CAC3D,CACF,EAEO,CACL,KAAM,qBAAmB,aACzB,QAAS,KAAK,eAAeE,CAAK,EAClC,YAAAF,CACF,EAEJ,CAAC,CACH,CAEQ,eAAeG,EAA+C,CACpE,MAAMC,EAAgB,KAAK,OAAO,IAAI,MAAQ,OAC9C,MAAO,CACL,sBAAuB,CACrB,KAAMD,EAAU,WAAW,KAC3B,UAAWA,EAAU,WAAW,WAAWC,CAAa,CAC1D,CACF,CACF,CACF,EA9Gaf,EAANgB,EAAA,IADN,cAAW,EAYPC,EAAA,eAAO,mBAAiB,qBAAqB,GAE7CA,EAAA,eAAO,cAAY,MAAM,GAEzBA,EAAA,eAAO,WAAS,oBAAoB,GAEpCA,EAAA,eAAO,cAAY,0BAA0B,IAjBrCjB",
|
|
6
6
|
"names": ["SolanaTokenContextLoader_exports", "__export", "SolanaTokenContextLoader", "__toCommonJS", "import_inversify", "import_configTypes", "import_pkiTypes", "import_KeyUsage", "import_SolanaContextTypes", "import_solanaTokenTypes", "SolanaTokenContextLoader", "dataSource", "config", "_certificateLoader", "loggerFactory", "field", "expectedType", "tokenInternalId", "solanaTokenContextInput", "deviceModelId", "payload", "certificate", "error", "value", "tokenData", "signatureKind", "__decorateClass", "__decorateParam"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var p=require("@ledgerhq/device-management-kit"),
|
|
1
|
+
"use strict";var p=require("@ledgerhq/device-management-kit"),i=require("purify-ts"),e=require("vitest"),u=require("../../pki/model/KeyUsage"),n=require("../../shared/model/SolanaContextTypes"),f=require("./SolanaTokenContextLoader");const y=()=>({debug:e.vi.fn(),info:e.vi.fn(),warn:e.vi.fn(),error:e.vi.fn(),subscribers:[]});(0,e.describe)("SolanaTokenContextLoader",()=>{let s,d;const l=new Uint8Array([240,202,204,26]),t={descriptor:{data:{symbol:"SOL",name:"Solana",decimals:9},signatures:{prod:"prod-sig",test:"test-sig"}}},c={tokenInternalId:"token-1",deviceModelId:p.DeviceModelId.FLEX};(0,e.beforeEach)(()=>{e.vi.restoreAllMocks(),s={getTokenInfosPayload:e.vi.fn()},d={loadCertificate:e.vi.fn()}});const r=a=>{const o={cal:{mode:a}};return new f.SolanaTokenContextLoader(s,o,d,y)};(0,e.describe)("canHandle",()=>{(0,e.it)("returns true when tokenInternalId is provided",()=>{const a=r("prod");(0,e.expect)(a.canHandle({tokenInternalId:"abc123"},n.SolanaContextTypes.SOLANA_TOKEN)).toBe(!0)}),(0,e.it)("returns false when tokenInternalId is missing or falsy",()=>{const a=r("prod");(0,e.expect)(a.canHandle({tokenInternalId:""},n.SolanaContextTypes.SOLANA_TOKEN)).toBe(!1),(0,e.expect)(a.canHandle({tokenInternalId:void 0},n.SolanaContextTypes.SOLANA_TOKEN)).toBe(!1),(0,e.expect)(a.canHandle({},n.SolanaContextTypes.SOLANA_TOKEN)).toBe(!1)})}),(0,e.describe)("loadField",()=>{(0,e.it)("returns an error when datasource returns Left(error) (certificate still retrieved)",async()=>{const a=r("prod"),o=new Error("datasource failed");e.vi.spyOn(s,"getTokenInfosPayload").mockResolvedValue((0,i.Left)(o)),e.vi.spyOn(d,"loadCertificate").mockResolvedValue({keyUsageNumber:0,payload:l});const k=await a.loadField(c);(0,e.expect)(s.getTokenInfosPayload).toHaveBeenCalledWith({tokenInternalId:"token-1"}),(0,e.expect)(d.loadCertificate).toHaveBeenCalledWith({keyId:"token_metadata_key",keyUsage:u.KeyUsage.CoinMeta,targetDevice:c.deviceModelId}),(0,e.expect)(k).toEqual({type:n.SolanaContextTypes.ERROR,error:o})}),(0,e.it)("returns SOLANA_TOKEN with prod signature by default (falsy mode) and includes certificate",async()=>{const a=r("");e.vi.spyOn(s,"getTokenInfosPayload").mockResolvedValue((0,i.Right)(t)),e.vi.spyOn(d,"loadCertificate").mockResolvedValue({keyUsageNumber:0,payload:l});const o=await a.loadField({...c,tokenInternalId:"token-2"});(0,e.expect)(o).toEqual({type:n.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:{data:t.descriptor.data,signature:"prod-sig"}},certificate:{keyUsageNumber:0,payload:l}})}),(0,e.it)("returns SOLANA_TOKEN with signature matching config.cal.mode",async()=>{const a=r("test");e.vi.spyOn(s,"getTokenInfosPayload").mockResolvedValue((0,i.Right)(t)),e.vi.spyOn(d,"loadCertificate").mockResolvedValue({keyUsageNumber:1,payload:l});const o=await a.loadField({...c,tokenInternalId:"token-3"});(0,e.expect)(o).toEqual({type:n.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:{data:t.descriptor.data,signature:"test-sig"}},certificate:{keyUsageNumber:1,payload:l}})}),(0,e.it)("works even if certificate loader returns undefined (certificate omitted)",async()=>{const a=r("prod");e.vi.spyOn(s,"getTokenInfosPayload").mockResolvedValue((0,i.Right)(t)),e.vi.spyOn(d,"loadCertificate").mockResolvedValue(void 0);const o=await a.loadField(c);(0,e.expect)(o).toEqual({type:n.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:{data:t.descriptor.data,signature:"prod-sig"}},certificate:void 0})})}),(0,e.describe)("pluckTokenData (private)",()=>{(0,e.it)("picks the signature for the configured mode",()=>{const a=r("test"),k=a.pluckTokenData.bind(a)(t);(0,e.expect)(k).toEqual({solanaTokenDescriptor:{data:t.descriptor.data,signature:"test-sig"}})}),(0,e.it)("falls back to 'prod' when config.cal.mode is falsy",()=>{const o=r(void 0).pluckTokenData(t);(0,e.expect)(o).toEqual({solanaTokenDescriptor:{data:t.descriptor.data,signature:"prod-sig"}})})})});
|
|
2
2
|
//# sourceMappingURL=SolanaTokenContextLoader.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/solanaToken/domain/SolanaTokenContextLoader.test.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport type { PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { KeyUsage } from \"@/pki/model/KeyUsage\";\nimport { SolanaContextTypes } from \"@/shared/model/SolanaContextTypes\";\nimport type { SolanaTransactionContext } from \"@/solana/domain/solanaContextTypes\";\nimport {\n type SolanaTokenDataSource,\n type TokenDataResponse,\n} from \"@/solanaToken/data/SolanaTokenDataSource\";\n\nimport { SolanaTokenContextLoader } from \"./SolanaTokenContextLoader\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\ndescribe(\"SolanaTokenContextLoader\", () => {\n let mockDataSource: SolanaTokenDataSource;\n let mockCertLoader: PkiCertificateLoader;\n\n const bytes = new Uint8Array([0xf0, 0xca, 0xcc, 0x1a]);\n\n const tokenDataResponse: TokenDataResponse = {\n descriptor: {\n // The loader just forwards this; exact shape isn't important for the test\n data: { symbol: \"SOL\", name: \"Solana\", decimals: 9 } as any,\n signatures: {\n prod: \"prod-sig\",\n test: \"test-sig\",\n } as any,\n },\n } as any;\n\n const baseCtx = {\n tokenInternalId: \"token-1\",\n deviceModelId: DeviceModelId.FLEX,\n };\n\n beforeEach(() => {\n vi.restoreAllMocks();\n\n mockDataSource = {\n getTokenInfosPayload: vi.fn(),\n } as unknown as SolanaTokenDataSource;\n\n mockCertLoader = {\n loadCertificate: vi.fn(),\n } as unknown as PkiCertificateLoader;\n });\n\n const makeLoader = (mode?: string) => {\n const config = { cal: { mode } } as unknown as ContextModuleServiceConfig;\n return new SolanaTokenContextLoader(\n mockDataSource,\n config,\n mockCertLoader,\n mockLoggerFactory,\n );\n };\n\n describe(\"canHandle\", () => {\n it(\"returns true when tokenInternalId is provided\", () => {\n const loader = makeLoader(\"prod\");\n\n expect(\n loader.canHandle(\n {\n tokenInternalId: \"abc123\",\n } as SolanaTransactionContext,\n SolanaContextTypes.SOLANA_TOKEN,\n ),\n ).toBe(true);\n });\n\n it(\"returns false when tokenInternalId is missing or falsy\", () => {\n const loader = makeLoader(\"prod\");\n\n expect(\n loader.canHandle(\n { tokenInternalId: \"\" } as any,\n SolanaContextTypes.SOLANA_TOKEN,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n { tokenInternalId: undefined } as any,\n SolanaContextTypes.SOLANA_TOKEN,\n ),\n ).toBe(false);\n expect(loader.canHandle({} as any, SolanaContextTypes.SOLANA_TOKEN)).toBe(\n false,\n );\n });\n });\n\n describe(\"loadField\", () => {\n it(\"returns an error when datasource returns Left(error) (certificate still retrieved)\", async () => {\n const loader = makeLoader(\"prod\");\n const error = new Error(\"datasource failed\");\n\n vi.spyOn(mockDataSource, \"getTokenInfosPayload\").mockResolvedValue(\n Left(error),\n );\n vi.spyOn(mockCertLoader, \"loadCertificate\").mockResolvedValue({\n keyUsageNumber: 0,\n payload: bytes,\n });\n\n const result = await loader.loadField(baseCtx);\n\n expect(mockDataSource.getTokenInfosPayload).toHaveBeenCalledWith({\n tokenInternalId: \"token-1\",\n });\n expect(mockCertLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: \"token_metadata_key\",\n keyUsage: KeyUsage.CoinMeta,\n targetDevice: baseCtx.deviceModelId,\n });\n expect(result).toEqual({\n type: SolanaContextTypes.ERROR,\n error,\n });\n });\n\n it(\"returns SOLANA_TOKEN with prod signature by default (falsy mode) and includes certificate\", async () => {\n const loader = makeLoader(\"\"); // falsy -> default 'prod'\n\n vi.spyOn(mockDataSource, \"getTokenInfosPayload\").mockResolvedValue(\n Right(tokenDataResponse),\n );\n vi.spyOn(mockCertLoader, \"loadCertificate\").mockResolvedValue({\n keyUsageNumber: 0,\n payload: bytes,\n });\n\n const result = await loader.loadField({\n ...baseCtx,\n tokenInternalId: \"token-2\",\n });\n\n expect(result).toEqual({\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: {\n solanaTokenDescriptor: {\n data: tokenDataResponse.descriptor.data,\n signature: \"prod-sig\",\n },\n },\n certificate: { keyUsageNumber: 0, payload: bytes },\n });\n });\n\n it(\"returns SOLANA_TOKEN with signature matching config.cal.mode\", async () => {\n const loader = makeLoader(\"test\");\n\n vi.spyOn(mockDataSource, \"getTokenInfosPayload\").mockResolvedValue(\n Right(tokenDataResponse),\n );\n vi.spyOn(mockCertLoader, \"loadCertificate\").mockResolvedValue({\n keyUsageNumber: 1,\n payload: bytes,\n });\n\n const result = await loader.loadField({\n ...baseCtx,\n tokenInternalId: \"token-3\",\n });\n\n expect(result).toEqual({\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: {\n solanaTokenDescriptor: {\n data: tokenDataResponse.descriptor.data,\n signature: \"test-sig\",\n },\n },\n certificate: { keyUsageNumber: 1, payload: bytes },\n });\n });\n\n it(\"works even if certificate loader returns undefined (certificate omitted)\", async () => {\n const loader = makeLoader(\"prod\");\n\n vi.spyOn(mockDataSource, \"getTokenInfosPayload\").mockResolvedValue(\n Right(tokenDataResponse),\n );\n vi.spyOn(mockCertLoader, \"loadCertificate\").mockResolvedValue(undefined);\n\n const result = await loader.loadField(baseCtx);\n\n expect(result).toEqual({\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: {\n solanaTokenDescriptor: {\n data: tokenDataResponse.descriptor.data,\n signature: \"prod-sig\",\n },\n },\n certificate: undefined,\n });\n });\n });\n\n describe(\"pluckTokenData (private)\", () => {\n it(\"picks the signature for the configured mode\", () => {\n const loader = makeLoader(\"test\");\n const pluck = (loader as any).pluckTokenData.bind(loader);\n\n const result = pluck(tokenDataResponse);\n\n expect(result).toEqual({\n solanaTokenDescriptor: {\n data: tokenDataResponse.descriptor.data,\n signature: \"test-sig\",\n },\n });\n });\n\n it(\"falls back to 'prod' when config.cal.mode is falsy\", () => {\n const loader = makeLoader(undefined as any);\n const result = (loader as any).pluckTokenData(tokenDataResponse);\n\n expect(result).toEqual({\n solanaTokenDescriptor: {\n data: tokenDataResponse.descriptor.data,\n signature: \"prod-sig\",\n },\n });\n });\n });\n});\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": ["import_device_management_kit", "import_purify_ts", "import_vitest", "import_KeyUsage", "import_SolanaContextTypes", "import_SolanaTokenContextLoader", "mockLoggerFactory", "mockDataSource", "mockCertLoader", "bytes", "tokenDataResponse", "baseCtx", "makeLoader", "mode", "config", "loader", "error", "result"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var f=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var h=Object.getOwnPropertyNames;var k=Object.prototype.hasOwnProperty;var C=(e,o)=>{for(var r in o)f(e,r,{get:o[r],enumerable:!0})},y=(e,o,r,n)=>{if(o&&typeof o=="object"||typeof o=="function")for(let t of h(o))!k.call(e,t)&&t!==r&&f(e,t,{get:()=>o[t],enumerable:!(n=p(o,t))||n.enumerable});return e};var T=e=>y(f({},"__esModule",{value:!0}),e),l=(e,o,r,n)=>{for(var t=n>1?void 0:n?p(o,r):o,i=e.length-1,d;i>=0;i--)(d=e[i])&&(t=(n?d(o,r,t):d(t))||t);return n&&t&&f(o,r,t),t},m=(e,o)=>(r,n)=>o(r,n,e);var w={};C(w,{HttpTokenDataSource:()=>a});module.exports=T(w);var s=require("inversify"),c=require("purify-ts"),g=require("../../config/di/configTypes"),u=require("../../network/di/networkTypes");let a=class{constructor(o,r){this.config=o;this.http=r}async getTokenInfosPayload({chainId:o,address:r}){try{const t=(await this.http.get(`${this.config.cal.url}/tokens`,{params:{contract_address:r,chain_id:o,output:"descriptor",ref:`branch:${this.config.cal.branch}`}}))?.[0];if(!t||!t.descriptor||!t.descriptor.data||!t.descriptor.signatures||typeof t.descriptor.signatures[this.config.cal.mode]!="string")return(0,c.Left)(new Error(`[ContextModule] HttpTokenDataSource: no token metadata for address ${r} on chain ${o}`));const i=(t.descriptor.data.length/2-20-4-4).toString(16).padStart(2,"0");return(0,c.Right)([i,t.descriptor.data,t.descriptor.signatures[this.config.cal.mode]].join(""))}catch{return(0,c.Left)(new Error("[ContextModule] HttpTokenDataSource: Failed to fetch token informations"))}}};a=l([(0,s.injectable)(),m(0,(0,s.inject)(g.configTypes.Config)),m(1,(0,s.inject)(u.networkTypes.NetworkClient))],a);0&&(module.exports={HttpTokenDataSource});
|
|
2
2
|
//# sourceMappingURL=HttpTokenDataSource.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/token/data/HttpTokenDataSource.ts"],
|
|
4
|
-
"sourcesContent": ["import
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["HttpTokenDataSource_exports", "__export", "HttpTokenDataSource", "__toCommonJS", "
|
|
4
|
+
"sourcesContent": ["import { DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Either, Left, Right } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport type { ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { networkTypes } from \"@/network/di/networkTypes\";\n\nimport { GetTokenInfosParams, TokenDataSource } from \"./TokenDataSource\";\nimport { TokenDto } from \"./TokenDto\";\n\n@injectable()\nexport class HttpTokenDataSource implements TokenDataSource {\n constructor(\n @inject(configTypes.Config)\n private readonly config: ContextModuleServiceConfig,\n @inject(networkTypes.NetworkClient)\n private readonly http: DmkNetworkClient,\n ) {}\n\n public async getTokenInfosPayload({\n chainId,\n address,\n }: GetTokenInfosParams): Promise<Either<Error, string>> {\n try {\n const data = (await this.http.get(`${this.config.cal.url}/tokens`, {\n params: {\n contract_address: address,\n chain_id: chainId,\n output: \"descriptor\",\n ref: `branch:${this.config.cal.branch}`,\n },\n })) as TokenDto[];\n const tokenInfos = data?.[0];\n\n if (\n !tokenInfos ||\n !tokenInfos.descriptor ||\n !tokenInfos.descriptor.data ||\n !tokenInfos.descriptor.signatures ||\n typeof tokenInfos.descriptor.signatures[this.config.cal.mode] !==\n \"string\"\n ) {\n return Left(\n new Error(\n `[ContextModule] HttpTokenDataSource: no token metadata for address ${address} on chain ${chainId}`,\n ),\n );\n }\n\n // According to documentation: https://github.com/LedgerHQ/app-ethereum/blob/develop/doc/ethapp.adoc#provide-erc-20-token-information\n // Signed descriptor is composed of:\n // ticker || address (20 bytes) || number of decimals (4 bytes) || chainId (4 bytes)\n const tickerLengthBuff = (\n tokenInfos.descriptor.data.length / 2 -\n 20 -\n 4 -\n 4\n )\n .toString(16)\n .padStart(2, \"0\");\n\n return Right(\n [\n tickerLengthBuff,\n tokenInfos.descriptor.data,\n tokenInfos.descriptor.signatures[this.config.cal.mode],\n ].join(\"\"),\n );\n } catch (_error) {\n return Left(\n new Error(\n \"[ContextModule] HttpTokenDataSource: Failed to fetch token informations\",\n ),\n );\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,yBAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAAmC,qBACnCC,EAAoC,qBAEpCC,EAA4B,mCAE5BC,EAA6B,qCAMtB,IAAMC,EAAN,KAAqD,CAC1D,YAEmBC,EAEAC,EACjB,CAHiB,YAAAD,EAEA,UAAAC,CAChB,CAEH,MAAa,qBAAqB,CAChC,QAAAC,EACA,QAAAC,CACF,EAAwD,CACtD,GAAI,CASF,MAAMC,GARQ,MAAM,KAAK,KAAK,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,UAAW,CACjE,OAAQ,CACN,iBAAkBD,EAClB,SAAUD,EACV,OAAQ,aACR,IAAK,UAAU,KAAK,OAAO,IAAI,MAAM,EACvC,CACF,CAAC,KACyB,CAAC,EAE3B,GACE,CAACE,GACD,CAACA,EAAW,YACZ,CAACA,EAAW,WAAW,MACvB,CAACA,EAAW,WAAW,YACvB,OAAOA,EAAW,WAAW,WAAW,KAAK,OAAO,IAAI,IAAI,GAC1D,SAEF,SAAO,QACL,IAAI,MACF,sEAAsED,CAAO,aAAaD,CAAO,EACnG,CACF,EAMF,MAAMG,GACJD,EAAW,WAAW,KAAK,OAAS,EACpC,GACA,EACA,GAEC,SAAS,EAAE,EACX,SAAS,EAAG,GAAG,EAElB,SAAO,SACL,CACEC,EACAD,EAAW,WAAW,KACtBA,EAAW,WAAW,WAAW,KAAK,OAAO,IAAI,IAAI,CACvD,EAAE,KAAK,EAAE,CACX,CACF,MAAiB,CACf,SAAO,QACL,IAAI,MACF,yEACF,CACF,CACF,CACF,CACF,EAjEaL,EAANO,EAAA,IADN,cAAW,EAGPC,EAAA,eAAO,cAAY,MAAM,GAEzBA,EAAA,eAAO,eAAa,aAAa,IAJzBR",
|
|
6
|
+
"names": ["HttpTokenDataSource_exports", "__export", "HttpTokenDataSource", "__toCommonJS", "import_inversify", "import_purify_ts", "import_configTypes", "import_networkTypes", "HttpTokenDataSource", "config", "http", "chainId", "address", "tokenInfos", "tickerLengthBuff", "__decorateClass", "__decorateParam"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var a=require("purify-ts"),r=require("../../token/data/HttpTokenDataSource");describe("HttpTokenDataSource",()=>{let o,t;beforeEach(()=>{vi.clearAllMocks();const e={cal:{url:"https://crypto-assets-service.api.ledger.com/v1",mode:"prod",branch:"main"}};t={get:vi.fn()},o=new r.HttpTokenDataSource(e,t)}),it("should call the expected CAL tokens URL with params",async()=>{t.get.mockResolvedValue([]),await o.getTokenInfosPayload({address:"0x00",chainId:1}),expect(t.get).toHaveBeenCalledWith("https://crypto-assets-service.api.ledger.com/v1/tokens",{params:{contract_address:"0x00",chain_id:1,output:"descriptor",ref:"branch:main"}})}),it("should return a string when response is correct",async()=>{const e={ticker:"USDC",descriptor:{data:"555344433c499c542cef5e3811e1192ce70d8cc03d5c33590000000600000089",signatures:{prod:"0123"}}};t.get.mockResolvedValue([e]);const n=await o.getTokenInfosPayload({address:"0x00",chainId:1});expect(n.extract()).toEqual("04555344433c499c542cef5e3811e1192ce70d8cc03d5c335900000006000000890123")}),it("should return a string when response is correct with a prefixed ticker",async()=>{const e={ticker:"tUSDC",descriptor:{data:"7474555344431c7d4b196cb0c7b01d743fbc6116a902379c72380000000600aa36a7",signatures:{prod:"0123"}}};t.get.mockResolvedValue([e]);const n=await o.getTokenInfosPayload({address:"0x00",chainId:1});expect(n.extract()).toEqual("067474555344431c7d4b196cb0c7b01d743fbc6116a902379c72380000000600aa36a70123")}),it("should return an error when data is empty",async()=>{t.get.mockResolvedValue(null);const e=await o.getTokenInfosPayload({address:"0x00",chainId:1});expect(e).toEqual((0,a.Left)(new Error("[ContextModule] HttpTokenDataSource: no token metadata for address 0x00 on chain 1")))}),it("should return undefined when no signature",async()=>{t.get.mockResolvedValue([{}]);const e=await o.getTokenInfosPayload({address:"0x00",chainId:1});expect(e).toEqual((0,a.Left)(new Error("[ContextModule] HttpTokenDataSource: no token metadata for address 0x00 on chain 1")))}),it("should return undefined when no decimals",async()=>{t.get.mockResolvedValue([{live_signature:"0x0",ticker:"USDC"}]);const e=await o.getTokenInfosPayload({address:"0x00",chainId:1});expect(e).toEqual((0,a.Left)(new Error("[ContextModule] HttpTokenDataSource: no token metadata for address 0x00 on chain 1")))}),it("should return an error when network client throws an error",async()=>{t.get.mockRejectedValue(new Error);const e=await o.getTokenInfosPayload({address:"0x00",chainId:1});expect(e).toEqual((0,a.Left)(new Error("[ContextModule] HttpTokenDataSource: Failed to fetch token informations")))})});
|
|
2
2
|
//# sourceMappingURL=HttpTokenDataSource.test.js.map
|