Skip to content

Commit 5a1d328

Browse files
authored
Merge branch 'develop' into staging
2 parents 4ae8124 + 962ae86 commit 5a1d328

File tree

13 files changed

+86
-108
lines changed

13 files changed

+86
-108
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ buildscript {
8484
minifyRelease = true
8585
beaconVersion = "3.2.4"
8686

87-
sharedFeaturesVersion = "0.0.24"
87+
sharedFeaturesVersion = "0.0.26_snapshot1"
8888

8989
coilDep = "io.coil-kt:coil:$coilVersion"
9090
coilSvg = "io.coil-kt:coil-svg:$coilVersion"

common/src/main/java/jp/co/soramitsu/common/di/modules/CommonModule.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import jp.co.soramitsu.common.validation.ValidationExecutor
4040
import jp.co.soramitsu.common.vibration.DeviceVibrator
4141
import jp.co.soramitsu.core.extrinsic.ExtrinsicBuilderFactory
4242
import jp.co.soramitsu.core.extrinsic.ExtrinsicService
43-
import jp.co.soramitsu.core.extrinsic.KeyPairProvider
43+
import jp.co.soramitsu.core.extrinsic.keypair_provider.KeypairProvider
4444
import jp.co.soramitsu.core.rpc.RpcCalls
4545
import jp.co.soramitsu.shared_utils.encrypt.Signer
4646
import jp.co.soramitsu.shared_utils.icon.IconGenerator
@@ -74,12 +74,12 @@ class CommonModule {
7474
@Provides
7575
fun provideExtrinsicService(
7676
rpcCalls: RpcCalls,
77-
keyPairProvider: KeyPairProvider,
77+
keypairProvider: KeypairProvider,
7878
extrinsicBuilderFactory: ExtrinsicBuilderFactory
7979
): ExtrinsicService {
8080
return ExtrinsicService(
8181
rpcCalls = rpcCalls,
82-
keyPairProvider = keyPairProvider,
82+
keypairProvider = keypairProvider,
8383
extrinsicBuilderFactory = extrinsicBuilderFactory
8484
)
8585
}

feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/data/repository/KeyPairRepository.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import jp.co.soramitsu.account.api.domain.model.cryptoType
66
import jp.co.soramitsu.common.data.secrets.v2.SecretStoreV2
77
import jp.co.soramitsu.common.data.secrets.v2.getChainAccountKeypair
88
import jp.co.soramitsu.common.data.secrets.v2.getMetaAccountKeypair
9-
import jp.co.soramitsu.core.extrinsic.KeyPairProvider
9+
import jp.co.soramitsu.core.extrinsic.keypair_provider.KeypairProvider
1010
import jp.co.soramitsu.core.models.CryptoType
1111
import jp.co.soramitsu.core.models.IChain
1212
import jp.co.soramitsu.shared_utils.encrypt.keypair.Keypair
@@ -15,7 +15,7 @@ import jp.co.soramitsu.shared_utils.extensions.toHexString
1515
class KeyPairRepository(
1616
private val secretStoreV2: SecretStoreV2,
1717
private val accountRepository: AccountRepository
18-
) : KeyPairProvider {
18+
) : KeypairProvider {
1919

2020
override suspend fun getCryptoTypeFor(chain: IChain, accountId: ByteArray): CryptoType {
2121
val metaAccount = accountRepository.findMetaAccount(accountId)

feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/di/AccountFeatureModule.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ import jp.co.soramitsu.common.interfaces.FileProvider
4141
import jp.co.soramitsu.common.resources.ClipboardManager
4242
import jp.co.soramitsu.common.resources.LanguagesHolder
4343
import jp.co.soramitsu.common.resources.ResourceManager
44-
import jp.co.soramitsu.core.extrinsic.KeyPairProvider
44+
import jp.co.soramitsu.core.extrinsic.keypair_provider.KeypairProvider
4545
import jp.co.soramitsu.coredb.dao.AccountDao
4646
import jp.co.soramitsu.coredb.dao.AssetDao
4747
import jp.co.soramitsu.coredb.dao.MetaAccountDao
@@ -96,7 +96,7 @@ class AccountFeatureModule {
9696
fun provideKeyPairRepository(
9797
secretStoreV2: SecretStoreV2,
9898
accountRepository: AccountRepository
99-
): KeyPairProvider {
99+
): KeypairProvider {
100100
return KeyPairRepository(secretStoreV2, accountRepository)
101101
}
102102

feature-wallet-api/src/main/java/jp/co/soramitsu/wallet/impl/domain/interfaces/WalletInteractor.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@ interface WalletInteractor {
3232

3333
fun assetsFlow(): Flow<List<AssetWithStatus>>
3434

35-
fun xcmAssetsFlow(originChainId: ChainId?): Flow<List<AssetWithStatus>>
36-
3735
suspend fun syncAssetsRates(): Result<Unit>
3836

3937
fun assetFlow(chainId: ChainId, chainAssetId: String): Flow<Asset>

feature-wallet-impl/src/main/java/jp/co/soramitsu/wallet/impl/di/WalletFeatureModule.kt

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ import jp.co.soramitsu.wallet.impl.presentation.balance.assetActions.buy.BuyMixi
8484
import jp.co.soramitsu.wallet.impl.presentation.balance.assetActions.buy.BuyMixinProvider
8585
import jp.co.soramitsu.wallet.impl.presentation.send.SendSharedState
8686
import jp.co.soramitsu.wallet.impl.presentation.transaction.filter.HistoryFiltersProvider
87+
import jp.co.soramitsu.xcm_impl.XcmService
8788
import jp.co.soramitsu.xcm_impl.domain.XcmEntitiesFetcher
8889
import jp.co.soramitsu.xnetworking.networkclient.SoramitsuNetworkClient
8990
import jp.co.soramitsu.xnetworking.sorawallet.mainconfig.SoraRemoteConfigBuilder
@@ -233,22 +234,31 @@ class WalletFeatureModule {
233234
)
234235

235236
@Provides
236-
@Singleton
237237
fun provideXcmInteractor(
238238
walletInteractor: WalletInteractor,
239239
chainRegistry: ChainRegistry,
240240
currentAccountAddress: CurrentAccountAddressUseCase,
241241
xcmEntitiesFetcher: XcmEntitiesFetcher,
242242
accountInteractor: AccountInteractor,
243-
runtimeFilesCache: RuntimeFilesCache
244-
) = XcmInteractor(
245-
walletInteractor,
246-
chainRegistry,
247-
currentAccountAddress,
248-
xcmEntitiesFetcher,
249-
accountInteractor,
250-
runtimeFilesCache
251-
)
243+
runtimeFilesCache: RuntimeFilesCache,
244+
xcmService: XcmService
245+
): XcmInteractor {
246+
return XcmInteractor(
247+
walletInteractor,
248+
chainRegistry,
249+
currentAccountAddress,
250+
xcmEntitiesFetcher,
251+
accountInteractor,
252+
runtimeFilesCache,
253+
xcmService
254+
)
255+
}
256+
257+
@Provides
258+
@Singleton
259+
fun provideXcmService(): XcmService {
260+
return XcmService()
261+
}
252262

253263
@Provides
254264
fun provideExistentialDepositUseCase(

feature-wallet-impl/src/main/java/jp/co/soramitsu/wallet/impl/domain/WalletInteractorImpl.kt

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package jp.co.soramitsu.wallet.impl.domain
22

3-
import java.math.BigDecimal
4-
import java.math.BigInteger
53
import jp.co.soramitsu.account.api.domain.interfaces.AccountRepository
64
import jp.co.soramitsu.account.api.domain.model.MetaAccount
75
import jp.co.soramitsu.account.api.domain.model.accountId
@@ -14,7 +12,6 @@ import jp.co.soramitsu.common.domain.SelectedFiat
1412
import jp.co.soramitsu.common.interfaces.FileProvider
1513
import jp.co.soramitsu.common.mixin.api.UpdatesMixin
1614
import jp.co.soramitsu.common.mixin.api.UpdatesProviderUi
17-
import jp.co.soramitsu.common.utils.combineToPair
1815
import jp.co.soramitsu.common.utils.orZero
1916
import jp.co.soramitsu.core.models.ChainId
2017
import jp.co.soramitsu.core.models.isValidAddress
@@ -48,10 +45,11 @@ import kotlinx.coroutines.flow.filter
4845
import kotlinx.coroutines.flow.first
4946
import kotlinx.coroutines.flow.flatMapLatest
5047
import kotlinx.coroutines.flow.flatMapMerge
51-
import kotlinx.coroutines.flow.flow
5248
import kotlinx.coroutines.flow.map
5349
import kotlinx.coroutines.flow.withIndex
5450
import kotlinx.coroutines.withContext
51+
import java.math.BigDecimal
52+
import java.math.BigInteger
5553
import jp.co.soramitsu.core.models.Asset as CoreAsset
5654

5755
private const val QR_PREFIX_SUBSTRATE = "substrate"
@@ -115,26 +113,6 @@ class WalletInteractorImpl(
115113
}
116114
}
117115

118-
override fun xcmAssetsFlow(originChainId: ChainId?): Flow<List<AssetWithStatus>> {
119-
return combineToPair(assetsFlow(), getAvailableXcmAssetSymbolsFlow(originChainId))
120-
.map { (assets, availableXcmAssetSymbols) ->
121-
assets.filter {
122-
val assetSymbol = it.asset.token.configuration.symbol.uppercase()
123-
assetSymbol in availableXcmAssetSymbols
124-
}
125-
}
126-
}
127-
128-
private fun getAvailableXcmAssetSymbolsFlow(originChainId: ChainId?): Flow<List<String>> {
129-
return flow {
130-
val availableXcmAssetSymbols = xcmEntitiesFetcher.getAvailableAssets(
131-
originalChainId = originChainId,
132-
destinationChainId = null
133-
).map { it.uppercase() }
134-
emit(availableXcmAssetSymbols)
135-
}
136-
}
137-
138116
override fun observeAssets(): Flow<List<AssetWithStatus>> {
139117
return accountRepository.selectedMetaAccountFlow()
140118
.flatMapLatest {

feature-wallet-impl/src/main/java/jp/co/soramitsu/wallet/impl/domain/XcmInteractor.kt

Lines changed: 38 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,25 @@
11
package jp.co.soramitsu.wallet.impl.domain
22

33
import jp.co.soramitsu.account.api.domain.interfaces.AccountInteractor
4+
import jp.co.soramitsu.common.data.secrets.v1.Keypair
45
import jp.co.soramitsu.common.data.secrets.v2.KeyPairSchema
56
import jp.co.soramitsu.common.data.secrets.v2.MetaAccountSecrets
67
import jp.co.soramitsu.common.utils.combineToPair
8+
import jp.co.soramitsu.core.extrinsic.keypair_provider.SingleKeypairProvider
79
import jp.co.soramitsu.core.models.Asset
810
import jp.co.soramitsu.core.models.ChainId
11+
import jp.co.soramitsu.core.models.ChainIdWithMetadata
912
import jp.co.soramitsu.runtime.ext.accountIdOf
1013
import jp.co.soramitsu.runtime.ext.fakeAddress
1114
import jp.co.soramitsu.runtime.multiNetwork.ChainRegistry
1215
import jp.co.soramitsu.runtime.multiNetwork.runtime.RuntimeFilesCache
13-
import jp.co.soramitsu.shared_utils.encrypt.keypair.BaseKeypair
1416
import jp.co.soramitsu.wallet.impl.domain.interfaces.WalletInteractor
1517
import jp.co.soramitsu.wallet.impl.domain.model.AssetWithStatus
1618
import jp.co.soramitsu.wallet.impl.domain.model.CrossChainTransfer
1719
import jp.co.soramitsu.wallet.impl.domain.model.planksFromAmount
18-
import jp.co.soramitsu.xcm_impl.FromChainData
1920
import jp.co.soramitsu.xcm_impl.XcmService
2021
import jp.co.soramitsu.xcm_impl.domain.XcmEntitiesFetcher
2122
import kotlinx.coroutines.flow.Flow
22-
import kotlinx.coroutines.flow.MutableStateFlow
23-
import kotlinx.coroutines.flow.filterNotNull
24-
import kotlinx.coroutines.flow.first
2523
import kotlinx.coroutines.flow.flow
2624
import kotlinx.coroutines.flow.map
2725
import java.math.BigDecimal
@@ -34,36 +32,39 @@ class XcmInteractor(
3432
private val currentAccountAddress: CurrentAccountAddressUseCase,
3533
private val xcmEntitiesFetcher: XcmEntitiesFetcher,
3634
private val accountInteractor: AccountInteractor,
37-
private val runtimeFilesCache: RuntimeFilesCache
35+
private val runtimeFilesCache: RuntimeFilesCache,
36+
private val xcmService: XcmService
3837
) {
3938

40-
private val xcmService: MutableStateFlow<XcmService?> = MutableStateFlow(null)
41-
private val nonNullXcmService = xcmService.filterNotNull()
42-
43-
suspend fun initXcmService(originChainId: ChainId, destinationChainId: ChainId) {
44-
xcmService.value = null
45-
val fromChainData = buildFromChainData(originChainId)
46-
val destinationChainMetadata = runtimeFilesCache.getChainMetadata(destinationChainId)
47-
this.xcmService.value = XcmService.create(fromChainData, destinationChainId, destinationChainMetadata)
48-
}
49-
50-
private suspend fun buildFromChainData(originChainId: ChainId): FromChainData {
39+
suspend fun prepareDataForChains(originChainId: ChainId, destinationChainId: ChainId) {
5140
val metaAccount = accountInteractor.selectedMetaAccount()
5241
val secrets = accountInteractor.getMetaAccountSecrets(metaAccount.id)?.get(MetaAccountSecrets.SubstrateKeypair)
5342
requireNotNull(secrets)
5443
val private = secrets[KeyPairSchema.PrivateKey]
5544
val public = secrets[KeyPairSchema.PublicKey]
45+
val nonce = secrets[KeyPairSchema.Nonce]
5646

57-
return FromChainData(
58-
chain = originChainId,
59-
cryptoType = metaAccount.substrateCryptoType,
60-
chainMetadata = runtimeFilesCache.getChainMetadata(originChainId),
61-
keypair = BaseKeypair(private, public)
47+
xcmService.updateKeypairProvider(
48+
chainId = originChainId,
49+
keypairProvider = SingleKeypairProvider(
50+
keypair = Keypair(public, private, nonce),
51+
cryptoType = metaAccount.substrateCryptoType
52+
)
53+
)
54+
xcmService.addPreloadedMetadata(
55+
fromChainMetadata = ChainIdWithMetadata(
56+
chainId = originChainId,
57+
metadata = runtimeFilesCache.getChainMetadata(originChainId)
58+
),
59+
toChainMetadata = ChainIdWithMetadata(
60+
chainId = destinationChainId,
61+
metadata = runtimeFilesCache.getChainMetadata(destinationChainId)
62+
)
6263
)
6364
}
6465

65-
fun xcmAssetsFlow(originChainId: ChainId?): Flow<List<AssetWithStatus>> {
66-
return combineToPair(walletInteractor.assetsFlow(), getAvailableXcmAssetSymbolsFlow(originChainId))
66+
fun getAvailableAssetsFlow(originChainId: ChainId?): Flow<List<AssetWithStatus>> {
67+
return combineToPair(walletInteractor.assetsFlow(), getAvailableAssetSymbolsFlow(originChainId))
6768
.map { (assets, availableXcmAssetSymbols) ->
6869
assets.filter {
6970
val assetSymbol = it.asset.token.configuration.symbol.uppercase()
@@ -72,7 +73,7 @@ class XcmInteractor(
7273
}
7374
}
7475

75-
private fun getAvailableXcmAssetSymbolsFlow(originChainId: ChainId?): Flow<List<String>> {
76+
private fun getAvailableAssetSymbolsFlow(originChainId: ChainId?): Flow<List<String>> {
7677
return flow {
7778
val availableXcmAssetSymbols = xcmEntitiesFetcher.getAvailableAssets(
7879
originalChainId = originChainId,
@@ -82,17 +83,12 @@ class XcmInteractor(
8283
}
8384
}
8485

85-
suspend fun performCrossChainTransfer(
86-
transfer: CrossChainTransfer,
87-
fee: BigDecimal,
88-
tipInPlanks: BigInteger?
89-
): Result<String> {
86+
suspend fun performCrossChainTransfer(transfer: CrossChainTransfer): Result<String> {
9087
return runCatching {
9188
val originChain = chainRegistry.getChain(transfer.originChainId)
9289
val destinationChain = chainRegistry.getChain(transfer.destinationChainId)
9390
val selfAddress = currentAccountAddress(originChain.id) ?: throw IllegalStateException("No self address")
94-
val service = nonNullXcmService.first()
95-
service.transfer(
91+
xcmService.transfer(
9692
fromChain = originChain,
9793
toChain = destinationChain,
9894
asset = transfer.chainAsset,
@@ -103,41 +99,37 @@ class XcmInteractor(
10399
}
104100
}
105101

106-
suspend fun getXcmDestFee(
102+
suspend fun getDestinationFee(
107103
destinationChainId: ChainId,
108104
tokenSymbol: String
109105
): BigDecimal? {
110-
val r = runCatching {
111-
val service = nonNullXcmService.first()
112-
service.getXcmDestFee(
106+
return runCatching {
107+
xcmService.getXcmDestFee(
113108
toChainId = destinationChainId,
114109
tokenSymbol = tokenSymbol
115110
)
116-
}
117-
return r.getOrNull()
111+
}.getOrNull()
118112
}
119113

120-
suspend fun getXcmOrigFee(
114+
suspend fun getOriginFee(
121115
originNetworkId: ChainId,
122116
destinationNetworkId: ChainId,
123117
asset: CoreAsset,
124118
amount: BigDecimal
125119
): BigDecimal? {
126-
val r = runCatching {
120+
return runCatching {
127121
val chain = chainRegistry.getChain(originNetworkId)
128-
val service = nonNullXcmService.first()
129-
service.getXcmOrigFee(
122+
xcmService.getXcmOrigFee(
130123
fromChainId = originNetworkId,
131124
toChainId = destinationNetworkId,
132125
asset = asset,
133126
address = chain.fakeAddress(),
134-
amount = asset.getPlanksFromAmountForXcmOrigFee(amount)
127+
amount = asset.getPlanksFromAmountForOriginFee(amount)
135128
)
136-
}
137-
return r.getOrNull()
129+
}.getOrNull()
138130
}
139131

140-
private fun Asset.getPlanksFromAmountForXcmOrigFee(amount: BigDecimal): BigInteger {
132+
private fun Asset.getPlanksFromAmountForOriginFee(amount: BigDecimal): BigInteger {
141133
val rawAmountInPlanks = planksFromAmount(amount)
142134
if (rawAmountInPlanks == BigInteger.ZERO) {
143135
return BigInteger.ONE

feature-wallet-impl/src/main/java/jp/co/soramitsu/wallet/impl/presentation/balance/assetselector/AssetSelectViewModel.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import jp.co.soramitsu.common.utils.formatCrypto
88
import jp.co.soramitsu.common.utils.mapList
99
import jp.co.soramitsu.common.utils.orZero
1010
import jp.co.soramitsu.wallet.impl.data.mappers.mapAssetToAssetModel
11+
import jp.co.soramitsu.wallet.impl.domain.XcmInteractor
1112
import jp.co.soramitsu.wallet.impl.domain.interfaces.WalletInteractor
1213
import jp.co.soramitsu.wallet.impl.presentation.WalletRouter
1314
import jp.co.soramitsu.wallet.impl.presentation.model.AssetModel
@@ -25,6 +26,7 @@ import jp.co.soramitsu.wallet.api.presentation.WalletRouter as WalletRouterApi
2526
class AssetSelectViewModel @Inject constructor(
2627
private val walletRouter: WalletRouter,
2728
walletInteractor: WalletInteractor,
29+
xcmInteractor: XcmInteractor,
2830
savedStateHandle: SavedStateHandle,
2931
private val sharedSendState: SendSharedState
3032
) : BaseViewModel(), AssetSelectContentInterface {
@@ -40,9 +42,7 @@ class AssetSelectViewModel @Inject constructor(
4042

4143
private val assetModelsFlow: Flow<List<AssetModel>> =
4244
if (isFilterXcmAssets) {
43-
walletInteractor.xcmAssetsFlow(
44-
originChainId = filterChainId
45-
)
45+
xcmInteractor.getAvailableAssetsFlow(originChainId = filterChainId)
4646
} else {
4747
walletInteractor.assetsFlow()
4848
}

0 commit comments

Comments
 (0)