Updated on 2026-08-14

This commit is contained in:
Tangem 2024-09-27 08:21:44 +03:00
parent deb6d570b0
commit 098681020d
5 changed files with 7 additions and 269 deletions

View file

@ -1,138 +0,0 @@
[
{
"fw":"1.24r",
"challenge":"00000000000000000000000000000001",
"sha-256":[
{"block":0,"count":1,"digest":"9B091DF443FE951D27AA8843517096DC421433F5603EBC566B11891F867E3D18"},
{"block":1,"count":1,"digest":"B4F723EE79075C8C00FA17D037BF10528BB0C7CF421539EE15F4A397204C87AF"},
{"block":2,"count":1,"digest":"1258585B438B6BC8F41FC22AFF383C86690E984E84E96AA752C9A54954DF731A"},
{"block":3,"count":1,"digest":"14082C75D6AA533A06E9B764642F97B5783FED91BD1173EFADC3CF57D8769AAE"},
{"block":4,"count":1,"digest":"A8F6CB02D56933361127072BB0D89999020CE196AE9718E9CF019DCCC9437E85"},
{"block":5,"count":1,"digest":"491604BA2A2F6EE03A2B4812958F0356D745678FB0ABABF0109A9E8F59099D9D"},
{"block":6,"count":1,"digest":"B2F057FF8B83343BC40058CA459F3C63B9670ABCD059730BE70223AEBDC88D77"},
{"block":7,"count":1,"digest":"73F4391010345E27745A1AFEC93C02B2CA460D9EAB437605F82A18281DF17DCE"},
{"block":8,"count":1,"digest":"74588EBB6704DD3DB9ECDFE6B85EC2872BD6A1F7C73E080E57697D3FF8DDD470"},
{"block":9,"count":1,"digest":"3B382C35ADBBF206B0A6B216EE95AF2321EE34148E93BBFECCF275AB13ED08A2"},
{"block":11500,"count":1,"digest":"21DDEC9788E3EA04663297AD0208F2714F139434E3540EBB7C96150EE1D320C9"},
{"block":11501,"count":1,"digest":"C545C5D092D1EBC4BA266C139CE0F2A399E4D23E74EB4EBD0E53019AB58CB486"},
{"block":0,"count":0,"digest":"C689C50352E9F6E41BF2E6EC852D8466814A51018F40BE32BAADEE9C2A9E6B6D"}
],
"crc-16":[
{"block":0,"count":1,"digest":"1BFC"},
{"block":1,"count":1,"digest":"D58D"},
{"block":2,"count":1,"digest":"7E3E"},
{"block":3,"count":1,"digest":"14EA"},
{"block":4,"count":1,"digest":"014F"},
{"block":5,"count":1,"digest":"5FF0"},
{"block":6,"count":1,"digest":"7D3A"},
{"block":7,"count":1,"digest":"702C"},
{"block":8,"count":1,"digest":"CC22"},
{"block":9,"count":1,"digest":"392C"},
{"block":11500,"count":1,"digest":"5FCB"},
{"block":11501,"count":1,"digest":"FF77"},
{"block":0,"count":0,"digest":"D07B"}
]
},
{
"fw":"1.24d SDK",
"challenge":"00000000000000000000000000000001",
"sha-256":[
{"block":0,"count":1,"digest":"6B360B47FFB16641EF9CC778746FE6B1010AB60C69281CE431A46ECC29A72304"},
{"block":1,"count":1,"digest":"648F50D44E9A31CB4C2682EAD7B8E2E570E5F252035849CD9B08BD4F9106B432"},
{"block":2,"count":1,"digest":"BAA31588F599E2DBC8AC06CFBF4E710B9B0E3FEA0201AE67E5A9E605DB50D1ED"},
{"block":3,"count":1,"digest":"48CFA13758F0B8018A97831C11BB1668A39CC76B141C90038551D950F83A43BA"},
{"block":4,"count":1,"digest":"8932B8E9D93A28EEEAC8FD3477F38A8A384AC895B06E09B8396A7806C3DCFC09"},
{"block":5,"count":1,"digest":"A3E7F2911AB380B366E47EB9E7DCC0C3D8667EEE3CF355FCCD5B113918873EFC"},
{"block":6,"count":1,"digest":"32CFCDC12C3AAA6C8FE4935C76B795A81206141AE7C7AB941A4B5F74EB02D844"},
{"block":7,"count":1,"digest":"1BA7B6ED5F28A0744E177843F2A960CB757B27FF6052C17F9E57B266AEC4F564"},
{"block":8,"count":1,"digest":"7C1A2C88529DA038C3A124CC049B9A5CD73089C2CD9C66B15DF91020E981B94B"},
{"block":9,"count":1,"digest":"5F14E10CBE14230EEF9B8896C84998197E56738952A1ECF22202801B9AE64340"},
{"block":10,"count":1,"digest":"8FF4F496E7C68A654E574F13517EFA4F2058FDFC9E949421DA5ACC855C876F63"},
{"block":11491,"count":1,"digest":"E45CFEA35B1C4C217A55B78B0D78C841978F1008C3C1917D228EECB0324A0942"},
{"block":0,"count":0,"digest":"F4199A74F2D4BAF2E282A670989A50B9186665D8EC453D1CED02F4E4019E1C0F"}
],
"crc-16":[
{"block":0,"count":1,"digest":"22C3"},
{"block":1,"count":1,"digest":"ECB2"},
{"block":2,"count":1,"digest":"4701"},
{"block":3,"count":1,"digest":"2DD5"},
{"block":4,"count":1,"digest":"3870"},
{"block":5,"count":1,"digest":"66CF"},
{"block":6,"count":1,"digest":"4405"},
{"block":7,"count":1,"digest":"4913"},
{"block":8,"count":1,"digest":"F51D"},
{"block":9,"count":1,"digest":"0013"},
{"block":10,"count":1,"digest":"5E68"},
{"block":11491,"count":1,"digest":"4078"},
{"block":0,"count":0,"digest":"75C3"}
]
},
{
"fw":"1.28r",
"challenge":"00000000000000000000000000000001",
"sha-256":[
{"block":0,"count":1,"digest":"A52D552A4CCA2979122300C7C8686031FBB216C187971C739305D493284DD262"},
{"block":1,"count":1,"digest":"AF8D5DDC8FD0BA9B58707BC66940A50298AAB6FFE74D243874BAA25CCD53C7C3"},
{"block":2,"count":1,"digest":"03612CB50531C2A2B7825B6A72C14528522A926A781391E8FE17027943543387"},
{"block":3,"count":1,"digest":"88A984179C97654B7833824DF43A13133BC6E627C17C9A65BEEDFB671CD78D2A"},
{"block":4,"count":1,"digest":"A3DB1DD3F876ED972287FEC903C2112F6B99A09BCF686E2B65A6E19EA9CD9ECB"},
{"block":5,"count":1,"digest":"CA7685FCD6BE9D8310BBD58AA7DED1390925BADA47B6611DB010625CA6BA7542"},
{"block":6,"count":1,"digest":"192E10BF1D4AA426676918AAC7312FF4914A4781A2E6372986356AC26917078B"},
{"block":7,"count":1,"digest":"00B657206A8120DE159F3C16B4F036B7D2D292603067FCB6B33E3753421D9D15"},
{"block":8,"count":1,"digest":"2F875EE18AD37A3A4666810E7E0942F7370CAD365C510B7952280EC43BE12ADE"},
{"block":9,"count":1,"digest":"1CFAF013B43CAF9F6627DAC871335B09279375A9DE8644AEB2FBBA105C73C05A"},
{"block":10,"count":1,"digest":"AD33E62400EFE078EB9256C3A6F9B9299A4B56F4A7E63E78C9BC34F7DCA2FE10"},
{"block":11497,"count":1,"digest":"FBB56C858CF485012A08343B73C46CDA7423500D52FBE5E4F28326F2515C7150"},
{"block":0,"count":0,"digest":"7582258B2AF9FDCD83BCDEA05FA0310216F7CFF4FB27C699461397EF4D189567"}
],
"crc-16":[
{"block":0,"count":1,"digest":"B42D"},
{"block":1,"count":1,"digest":"7A5C"},
{"block":2,"count":1,"digest":"D1EF"},
{"block":3,"count":1,"digest":"BB3B"},
{"block":4,"count":1,"digest":"AE9E"},
{"block":5,"count":1,"digest":"F021"},
{"block":6,"count":1,"digest":"D2EB"},
{"block":7,"count":1,"digest":"DFFD"},
{"block":8,"count":1,"digest":"63F3"},
{"block":9,"count":1,"digest":"96FD"},
{"block":10,"count":1,"digest":"C886"},
{"block":11497,"count":1,"digest":"E4B0"},
{"block":0,"count":0,"digest":"0143"}
]
},
{
"fw":"1.28d SDK",
"challenge":"00000000000000000000000000000001",
"sha-256":[
{"block":0,"count":1,"digest":"2F9DB9B70A20E28A97A6A58919E71ABF757BA73E693D9DC9CEEE1B0BCA8DAB8E"},
{"block":1,"count":1,"digest":"6B6F75ECF7E9CB76E570C290E7BEEAEF44E4B24C46BA4AA115D5BBAE3209869F"},
{"block":2,"count":1,"digest":"4D584DDC73B940C7E508456BF0C52BC6BE018CD448A5886B54BEBF1D26D31AD5"},
{"block":3,"count":1,"digest":"A9D5929A34793F5BCC623234AE34DEE246A95ED34D75D51508B9DC2694F28CD6"},
{"block":4,"count":1,"digest":"094D5F3E03262B6D07E58F795E17FFF2D83D39ABCF86B3B04A856A37BB076AD0"},
{"block":5,"count":1,"digest":"40F5586223406B2BD790629AB5D8D1AB97B6EA9151B69BF4D55C4A1EF5E2A1BB"},
{"block":6,"count":1,"digest":"B56C71A3E6DFE98B1666825825844372EEE5811EEA743A40760FA7AE2D66CADD"},
{"block":7,"count":1,"digest":"4331EB4B7415883536DDBA03D75F0408BE1F23F3DEE4459227755C12CBF98A8D"},
{"block":8,"count":1,"digest":"7383EDD57D266591760CD74E50073D28973CB2DAFD1410E45030B33588768DEE"},
{"block":9,"count":1,"digest":"893F5CF5E368E82CABE7F48D5DAA54AFAFA740B28496F303E845E680B7C1436C"},
{"block":10,"count":1,"digest":"8DEEB29CD6C764FB7AB53A056BC3C860DBD8E121AB7C1E6E4DF3C273A503C405"},
{"block":11497,"count":1,"digest":"6F6166E13672B12BD947CDFEC3158064A14C5A259AD0B3550738E30E90BC20C5"},
{"block":0,"count":0,"digest":"E475661F4D0948ACBDF104EAD718260A73FB99448691F0EB68AED85D189B6F3C"}
],
"crc-16":[
{"block":0,"count":1,"digest":"3506"},
{"block":1,"count":1,"digest":"FB77"},
{"block":2,"count":1,"digest":"50C4"},
{"block":3,"count":1,"digest":"3A10"},
{"block":4,"count":1,"digest":"2FB5"},
{"block":5,"count":1,"digest":"710A"},
{"block":6,"count":1,"digest":"53C0"},
{"block":7,"count":1,"digest":"5ED6"},
{"block":8,"count":1,"digest":"E2D8"},
{"block":9,"count":1,"digest":"17D6"},
{"block":10,"count":1,"digest":"49AD"},
{"block":11497,"count":1,"digest":"659B"},
{"block":0,"count":0,"digest":"1893"}
]
}
]

File diff suppressed because one or more lines are too long

View file

@ -1,17 +1,13 @@
package com.tangem.blockchainsdk
import com.tangem.blockchain.common.Blockchain
import com.tangem.blockchain.common.BlockchainSdkConfig
import com.tangem.blockchain.common.WalletManagerFactory
import com.tangem.blockchain.common.network.providers.ProviderType
import com.tangem.blockchainsdk.converters.BlockchainProviderTypesConverter
import com.tangem.blockchainsdk.converters.BlockchainSDKConfigConverter
import com.tangem.blockchainsdk.loader.BlockchainProvidersResponseLoader
import com.tangem.blockchainsdk.store.RuntimeStore
import com.tangem.datasource.asset.loader.AssetLoader
import com.tangem.datasource.config.models.ConfigValueModel
import com.tangem.datasource.config.ConfigManager
import com.tangem.datasource.config.models.ProviderModel
import com.tangem.libs.blockchain_sdk.BuildConfig
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.coroutineScope
@ -25,18 +21,16 @@ internal typealias BlockchainProviderTypes = Map<Blockchain, List<ProviderType>>
/**
* Implementation of Blockchain SDK components factory
*
* @property assetLoader asset loader
* @property blockchainProvidersResponseLoader blockchain providers response loader
* @property configStore blockchain sdk config store
* @property configManager config manager
* @property blockchainProviderTypesStore blockchain provider types store
* @property walletManagerFactoryCreator wallet manager factory creator
*
[REDACTED_AUTHOR]
*/
internal class DefaultBlockchainSDKFactory(
private val assetLoader: AssetLoader,
private val blockchainProvidersResponseLoader: BlockchainProvidersResponseLoader,
private val configStore: RuntimeStore<BlockchainSdkConfig>,
private val configManager: ConfigManager,
private val blockchainProviderTypesStore: RuntimeStore<BlockchainProviderTypes>,
private val walletManagerFactoryCreator: WalletManagerFactoryCreator,
dispatchers: CoroutineDispatcherProvider,
@ -52,7 +46,6 @@ internal class DefaultBlockchainSDKFactory(
override suspend fun init() {
coroutineScope {
updateBlockchainSDKConfig()
updateBlockchainProviderTypes()
}
}
@ -61,7 +54,7 @@ internal class DefaultBlockchainSDKFactory(
private fun createWalletManagerFactory(): Flow<WalletManagerFactory?> {
return combine(
flow = configStore.get(),
flow = configManager.getConfig().map { it.blockchainSdkConfig },
flow2 = blockchainProviderTypesStore.get(),
// flow3 = subscribe on feature toggles changes, TODO: [REDACTED_JIRA]
transform = walletManagerFactoryCreator::create,
@ -69,23 +62,6 @@ internal class DefaultBlockchainSDKFactory(
.stateIn(scope = mainScope, started = SharingStarted.Eagerly, initialValue = null)
}
private fun CoroutineScope.updateBlockchainSDKConfig() {
launch {
val config = assetLoader.load<ConfigValueModel>(fileName = CONFIG_FILE_NAME)
if (config == null) {
Timber.e("Error loading BlockchainSDKConfig")
return@launch
}
Timber.i("Update BlockchainSDKConfig")
configStore.store(
value = BlockchainSDKConfigConverter.convert(value = config),
)
}
}
private fun CoroutineScope.updateBlockchainProviderTypes() {
launch {
val response = blockchainProvidersResponseLoader.load()
@ -102,8 +78,4 @@ internal class DefaultBlockchainSDKFactory(
)
}
}
private companion object {
const val CONFIG_FILE_NAME = "tangem-app-config/config_${BuildConfig.ENVIRONMENT}"
}
}

View file

@ -1,93 +0,0 @@
package com.tangem.blockchainsdk.converters
import com.tangem.blockchain.common.*
import com.tangem.datasource.config.models.ConfigValueModel
import com.tangem.utils.converter.Converter
/**
* Converts [ConfigValueModel] to [BlockchainSdkConfig]
*
[REDACTED_AUTHOR]
*/
internal object BlockchainSDKConfigConverter : Converter<ConfigValueModel, BlockchainSdkConfig> {
override fun convert(value: ConfigValueModel): BlockchainSdkConfig {
return BlockchainSdkConfig(
blockchairCredentials = BlockchairCredentials(
apiKey = value.blockchairApiKeys,
authToken = value.blockchairAuthorizationToken,
),
blockcypherTokens = value.blockcypherTokens,
quickNodeSolanaCredentials = QuickNodeCredentials(
apiKey = value.quiknodeApiKey,
subdomain = value.quiknodeSubdomain,
),
quickNodeBscCredentials = QuickNodeCredentials(
apiKey = value.bscQuiknodeApiKey,
subdomain = value.bscQuiknodeSubdomain,
),
infuraProjectId = value.infuraProjectId,
tronGridApiKey = value.tronGridApiKey,
nowNodeCredentials = NowNodeCredentials(value.nowNodesApiKey),
getBlockCredentials = createGetBlockCredentials(value),
kaspaSecondaryApiUrl = value.kaspaSecondaryApiUrl,
tonCenterCredentials = TonCenterCredentials(
mainnetApiKey = value.tonCenterKeys.mainnet,
testnetApiKey = value.tonCenterKeys.testnet,
),
chiaFireAcademyApiKey = value.chiaFireAcademyApiKey,
chiaTangemApiKey = value.chiaTangemApiKey,
hederaArkhiaApiKey = value.hederaArkhiaKey,
polygonScanApiKey = value.polygonScanApiKey,
bittensorDwellirApiKey = value.bittensorDwellirApiKey,
bittensorOnfinalityApiKey = value.bittensorOnfinalityKey,
koinosProApiKey = value.koinosProApiKey,
)
}
private fun createGetBlockCredentials(configValues: ConfigValueModel): GetBlockCredentials? {
return configValues.getBlockAccessTokens?.let { accessTokens ->
GetBlockCredentials(
xrp = GetBlockAccessToken(jsonRpc = accessTokens.xrp?.jsonRPC),
cardano = GetBlockAccessToken(rosetta = accessTokens.cardano?.rosetta),
avalanche = GetBlockAccessToken(jsonRpc = accessTokens.avalanche?.jsonRPC),
eth = GetBlockAccessToken(jsonRpc = accessTokens.eth?.jsonRPC),
etc = GetBlockAccessToken(jsonRpc = accessTokens.etc?.jsonRPC),
fantom = GetBlockAccessToken(jsonRpc = accessTokens.fantom?.jsonRPC),
rsk = GetBlockAccessToken(jsonRpc = accessTokens.rsk?.jsonRPC),
bsc = GetBlockAccessToken(jsonRpc = accessTokens.bsc?.jsonRPC),
polygon = GetBlockAccessToken(jsonRpc = accessTokens.polygon?.jsonRPC),
gnosis = GetBlockAccessToken(jsonRpc = accessTokens.gnosis?.jsonRPC),
cronos = GetBlockAccessToken(jsonRpc = accessTokens.cronos?.jsonRPC),
solana = GetBlockAccessToken(jsonRpc = accessTokens.solana?.jsonRPC),
ton = GetBlockAccessToken(jsonRpc = accessTokens.ton?.jsonRPC),
tron = GetBlockAccessToken(rest = accessTokens.tron?.rest),
cosmos = GetBlockAccessToken(rest = accessTokens.cosmos?.rest),
near = GetBlockAccessToken(jsonRpc = accessTokens.near?.jsonRPC),
aptos = GetBlockAccessToken(rest = accessTokens.aptos?.rest),
dogecoin = GetBlockAccessToken(
jsonRpc = accessTokens.dogecoin?.jsonRPC,
blockBookRest = accessTokens.dogecoin?.blockBookRest,
),
litecoin = GetBlockAccessToken(
jsonRpc = accessTokens.litecoin?.jsonRPC,
blockBookRest = accessTokens.litecoin?.blockBookRest,
),
dash = GetBlockAccessToken(
jsonRpc = accessTokens.dash?.jsonRPC,
blockBookRest = accessTokens.dash?.blockBookRest,
),
bitcoin = GetBlockAccessToken(
jsonRpc = accessTokens.bitcoin?.jsonRPC,
blockBookRest = accessTokens.bitcoin?.blockBookRest,
),
algorand = GetBlockAccessToken(rest = accessTokens.algorand?.rest),
zkSyncEra = GetBlockAccessToken(jsonRpc = accessTokens.zksync?.jsonRPC),
polygonZkEvm = GetBlockAccessToken(jsonRpc = accessTokens.polygonZkevm?.jsonRPC),
base = GetBlockAccessToken(jsonRpc = accessTokens.base?.jsonRPC),
blast = GetBlockAccessToken(jsonRpc = accessTokens.blast?.jsonRPC),
filecoin = GetBlockAccessToken(jsonRpc = accessTokens.filecoin?.jsonRPC),
)
}
}
}

View file

@ -1,6 +1,5 @@
package com.tangem.blockchainsdk.di
import com.tangem.blockchain.common.BlockchainSdkConfig
import com.tangem.blockchain.common.logging.BlockchainSDKLogger
import com.tangem.blockchainsdk.BlockchainSDKFactory
import com.tangem.blockchainsdk.DefaultBlockchainSDKFactory
@ -13,7 +12,7 @@ import com.tangem.blockchainsdk.store.DefaultRuntimeStore
import com.tangem.core.featuretoggle.manager.FeatureTogglesManager
import com.tangem.datasource.api.common.AuthProvider
import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.datasource.asset.loader.AssetLoader
import com.tangem.datasource.config.ConfigManager
import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import dagger.Module
@ -29,15 +28,14 @@ internal object BlockchainSDKFactoryModule {
@Provides
@Singleton
fun provideBlockchainSDKFactory(
assetLoader: AssetLoader,
blockchainProvidersResponseLoader: BlockchainProvidersResponseLoader,
configManager: ConfigManager,
walletManagerFactoryCreator: WalletManagerFactoryCreator,
dispatchers: CoroutineDispatcherProvider,
): BlockchainSDKFactory {
return DefaultBlockchainSDKFactory(
assetLoader = assetLoader,
blockchainProvidersResponseLoader = blockchainProvidersResponseLoader,
configStore = DefaultRuntimeStore(defaultValue = BlockchainSdkConfig()),
configManager = configManager,
blockchainProviderTypesStore = DefaultRuntimeStore(defaultValue = emptyMap()),
walletManagerFactoryCreator = walletManagerFactoryCreator,
dispatchers = dispatchers,