Updated on 2026-08-14
This commit is contained in:
parent
fbace5ed35
commit
da066d2ba4
14 changed files with 130 additions and 155 deletions
|
|
@ -1,25 +0,0 @@
|
|||
package com.tangem.data.walletconnect.network.ethereum
|
||||
|
||||
import com.tangem.data.walletconnect.sign.WcMethodUseCaseContext
|
||||
import com.tangem.domain.walletconnect.model.WcEthTransactionParams
|
||||
import com.tangem.domain.walletconnect.usecase.method.WcEthTransaction
|
||||
import com.tangem.utils.converter.Converter
|
||||
|
||||
internal class EthTransactionParamsConverter(
|
||||
private val context: WcMethodUseCaseContext,
|
||||
) : Converter<WcEthTransactionParams, WcEthTransaction?> {
|
||||
|
||||
override fun convert(value: WcEthTransactionParams): WcEthTransaction? {
|
||||
val dAppFee = WcEthTxHelper.getDAppFee(context.network, value)
|
||||
val transactionData = WcEthTxHelper.createTransactionData(
|
||||
dAppFee = dAppFee,
|
||||
network = context.network,
|
||||
txParams = value,
|
||||
)
|
||||
transactionData ?: return null
|
||||
return WcEthTransaction(
|
||||
dAppFee = dAppFee,
|
||||
transactionData = transactionData,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -1,24 +1,26 @@
|
|||
package com.tangem.data.walletconnect.network.ethereum
|
||||
|
||||
import arrow.core.left
|
||||
import com.tangem.blockchain.common.TransactionData
|
||||
import com.tangem.blockchain.common.transaction.Fee
|
||||
import com.tangem.blockchain.extensions.formatHex
|
||||
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
||||
import com.tangem.data.walletconnect.utils.BlockAidVerificationDelegate
|
||||
import com.tangem.data.walletconnect.respond.WcRespondService
|
||||
import com.tangem.data.walletconnect.sign.BaseWcSignUseCase
|
||||
import com.tangem.data.walletconnect.sign.SignCollector
|
||||
import com.tangem.data.walletconnect.sign.SignStateConverter.toResult
|
||||
import com.tangem.data.walletconnect.sign.WcMethodUseCaseContext
|
||||
import com.tangem.data.walletconnect.utils.BlockAidVerificationDelegate
|
||||
import com.tangem.domain.transaction.usecase.SendTransactionUseCase
|
||||
import com.tangem.domain.walletconnect.model.WcEthMethod
|
||||
import com.tangem.domain.walletconnect.usecase.method.WcEthTransaction
|
||||
import com.tangem.domain.walletconnect.usecase.method.WcEthTransactionUseCase
|
||||
import com.tangem.domain.walletconnect.usecase.method.WcMutableFee
|
||||
import com.tangem.domain.walletconnect.usecase.method.WcSignState
|
||||
import com.tangem.domain.walletconnect.usecase.method.WcTransactionUseCase
|
||||
import dagger.assisted.Assisted
|
||||
import dagger.assisted.AssistedFactory
|
||||
import dagger.assisted.AssistedInject
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.FlowCollector
|
||||
import kotlinx.coroutines.flow.emitAll
|
||||
import kotlinx.coroutines.flow.flow
|
||||
|
||||
|
|
@ -29,8 +31,9 @@ internal class WcEthSendTransactionUseCase @AssistedInject constructor(
|
|||
override val analytics: AnalyticsEventHandler,
|
||||
private val sendTransaction: SendTransactionUseCase,
|
||||
blockAidDelegate: BlockAidVerificationDelegate,
|
||||
) : BaseWcSignUseCase<Fee, WcEthTransaction>(),
|
||||
WcEthTransactionUseCase {
|
||||
) : BaseWcSignUseCase<Fee, TransactionData>(),
|
||||
WcTransactionUseCase,
|
||||
WcMutableFee {
|
||||
|
||||
override val securityStatus = blockAidDelegate.getSecurityStatus(
|
||||
network = network,
|
||||
|
|
@ -40,10 +43,8 @@ internal class WcEthSendTransactionUseCase @AssistedInject constructor(
|
|||
accountAddress = context.accountAddress,
|
||||
)
|
||||
|
||||
private val converter = EthTransactionParamsConverter(context)
|
||||
|
||||
override suspend fun SignCollector<WcEthTransaction>.onSign(state: WcSignState<WcEthTransaction>) {
|
||||
val hash = sendTransaction(state.signModel.transactionData, wallet, network)
|
||||
override suspend fun SignCollector<TransactionData>.onSign(state: WcSignState<TransactionData>) {
|
||||
val hash = sendTransaction(state.signModel, wallet, network)
|
||||
.onLeft { error ->
|
||||
val sendError = IllegalArgumentException(error.toString()) // todo(wc) use domain error
|
||||
emit(state.toResult(sendError.left()))
|
||||
|
|
@ -53,13 +54,31 @@ internal class WcEthSendTransactionUseCase @AssistedInject constructor(
|
|||
emit(state.toResult(respondResult))
|
||||
}
|
||||
|
||||
override suspend fun FlowCollector<TransactionData>.onMiddleAction(signModel: TransactionData, fee: Fee) {
|
||||
val uncompiled = signModel.requireUncompiled()
|
||||
val newState = uncompiled.copy(fee = fee)
|
||||
emit(newState)
|
||||
}
|
||||
|
||||
override suspend fun dAppFee(): Fee.Ethereum.Legacy? {
|
||||
val dAppFee = WcEthTxHelper.getDAppFee(
|
||||
network = context.network,
|
||||
txParams = method.transaction,
|
||||
)
|
||||
return dAppFee
|
||||
}
|
||||
|
||||
override fun updateFee(fee: Fee) {
|
||||
middleAction(fee)
|
||||
}
|
||||
|
||||
override fun invoke(): Flow<WcSignState<WcEthTransaction>> = flow {
|
||||
val ethTransaction = converter.convert(method.transaction) ?: return@flow
|
||||
emitAll(delegate.invoke(ethTransaction))
|
||||
override fun invoke(): Flow<WcSignState<TransactionData>> = flow {
|
||||
val transactionData = WcEthTxHelper.createTransactionData(
|
||||
dAppFee = dAppFee(),
|
||||
network = context.network,
|
||||
txParams = method.transaction,
|
||||
) ?: return@flow
|
||||
emitAll(delegate.invoke(transactionData))
|
||||
}
|
||||
|
||||
@AssistedFactory
|
||||
|
|
|
|||
|
|
@ -1,21 +1,22 @@
|
|||
package com.tangem.data.walletconnect.network.ethereum
|
||||
|
||||
import arrow.core.left
|
||||
import com.tangem.blockchain.common.TransactionData
|
||||
import com.tangem.blockchain.common.transaction.Fee
|
||||
import com.tangem.blockchain.extensions.formatHex
|
||||
import com.tangem.common.extensions.toHexString
|
||||
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
||||
import com.tangem.data.walletconnect.utils.BlockAidVerificationDelegate
|
||||
import com.tangem.data.walletconnect.respond.WcRespondService
|
||||
import com.tangem.data.walletconnect.sign.BaseWcSignUseCase
|
||||
import com.tangem.data.walletconnect.sign.SignCollector
|
||||
import com.tangem.data.walletconnect.sign.SignStateConverter.toResult
|
||||
import com.tangem.data.walletconnect.sign.WcMethodUseCaseContext
|
||||
import com.tangem.data.walletconnect.utils.BlockAidVerificationDelegate
|
||||
import com.tangem.domain.transaction.usecase.PrepareForSendUseCase
|
||||
import com.tangem.domain.walletconnect.model.WcEthMethod
|
||||
import com.tangem.domain.walletconnect.usecase.method.WcEthTransaction
|
||||
import com.tangem.domain.walletconnect.usecase.method.WcEthTransactionUseCase
|
||||
import com.tangem.domain.walletconnect.usecase.method.WcMutableFee
|
||||
import com.tangem.domain.walletconnect.usecase.method.WcSignState
|
||||
import com.tangem.domain.walletconnect.usecase.method.WcTransactionUseCase
|
||||
import dagger.assisted.Assisted
|
||||
import dagger.assisted.AssistedFactory
|
||||
import dagger.assisted.AssistedInject
|
||||
|
|
@ -31,8 +32,9 @@ internal class WcEthSignTransactionUseCase @AssistedInject constructor(
|
|||
@Assisted override val context: WcMethodUseCaseContext,
|
||||
@Assisted override val method: WcEthMethod.SignTransaction,
|
||||
blockAidDelegate: BlockAidVerificationDelegate,
|
||||
) : BaseWcSignUseCase<Fee, WcEthTransaction>(),
|
||||
WcEthTransactionUseCase {
|
||||
) : BaseWcSignUseCase<Fee, TransactionData>(),
|
||||
WcTransactionUseCase,
|
||||
WcMutableFee {
|
||||
|
||||
override val securityStatus = blockAidDelegate.getSecurityStatus(
|
||||
network = network,
|
||||
|
|
@ -42,10 +44,8 @@ internal class WcEthSignTransactionUseCase @AssistedInject constructor(
|
|||
accountAddress = context.accountAddress,
|
||||
)
|
||||
|
||||
private val converter = EthTransactionParamsConverter(context)
|
||||
|
||||
override suspend fun SignCollector<WcEthTransaction>.onSign(state: WcSignState<WcEthTransaction>) {
|
||||
val hash = prepareForSend(state.signModel.transactionData, wallet, network)
|
||||
override suspend fun SignCollector<TransactionData>.onSign(state: WcSignState<TransactionData>) {
|
||||
val hash = prepareForSend(state.signModel, wallet, network)
|
||||
.map { it.toHexString().formatHex() }
|
||||
.onLeft { error ->
|
||||
emit(state.toResult(error.left()))
|
||||
|
|
@ -56,9 +56,9 @@ internal class WcEthSignTransactionUseCase @AssistedInject constructor(
|
|||
emit(state.toResult(respondResult))
|
||||
}
|
||||
|
||||
override suspend fun FlowCollector<WcEthTransaction>.onMiddleAction(signModel: WcEthTransaction, fee: Fee) {
|
||||
val newState = signModel
|
||||
.copy(transactionData = signModel.transactionData.copy(fee = fee))
|
||||
override suspend fun FlowCollector<TransactionData>.onMiddleAction(signModel: TransactionData, fee: Fee) {
|
||||
val uncompiled = signModel.requireUncompiled()
|
||||
val newState = uncompiled.copy(fee = fee)
|
||||
emit(newState)
|
||||
}
|
||||
|
||||
|
|
@ -66,9 +66,21 @@ internal class WcEthSignTransactionUseCase @AssistedInject constructor(
|
|||
middleAction(fee)
|
||||
}
|
||||
|
||||
override fun invoke(): Flow<WcSignState<WcEthTransaction>> = flow {
|
||||
val ethTransaction = converter.convert(method.transaction) ?: return@flow
|
||||
emitAll(delegate.invoke(ethTransaction))
|
||||
override fun invoke(): Flow<WcSignState<TransactionData>> = flow {
|
||||
val transactionData = WcEthTxHelper.createTransactionData(
|
||||
dAppFee = dAppFee(),
|
||||
network = context.network,
|
||||
txParams = method.transaction,
|
||||
) ?: return@flow
|
||||
emitAll(delegate.invoke(transactionData))
|
||||
}
|
||||
|
||||
override suspend fun dAppFee(): Fee.Ethereum.Legacy? {
|
||||
val dAppFee = WcEthTxHelper.getDAppFee(
|
||||
network = context.network,
|
||||
txParams = method.transaction,
|
||||
)
|
||||
return dAppFee
|
||||
}
|
||||
|
||||
@AssistedFactory
|
||||
|
|
|
|||
|
|
@ -119,8 +119,8 @@ internal class WcSolanaNetwork(
|
|||
|
||||
internal class Factories @Inject constructor(
|
||||
val messageSign: WcSolanaMessageSignUseCase.Factory,
|
||||
val signTransaction: DefaultWcSolanaSignTransactionUseCase.Factory,
|
||||
val signAllTransaction: DefaultWcSolanaSignAllTransactionUseCase.Factory,
|
||||
val signTransaction: WcSolanaSignTransactionUseCase.Factory,
|
||||
val signAllTransaction: WcSolanaSignAllTransactionUseCase.Factory,
|
||||
)
|
||||
|
||||
companion object {
|
||||
|
|
|
|||
|
|
@ -12,8 +12,8 @@ import com.tangem.data.walletconnect.sign.WcMethodUseCaseContext
|
|||
import com.tangem.data.walletconnect.utils.BlockAidVerificationDelegate
|
||||
import com.tangem.domain.transaction.usecase.PrepareForSendUseCase
|
||||
import com.tangem.domain.walletconnect.model.WcSolanaMethod
|
||||
import com.tangem.domain.walletconnect.usecase.method.WcListTransactionUseCase
|
||||
import com.tangem.domain.walletconnect.usecase.method.WcSignState
|
||||
import com.tangem.domain.walletconnect.usecase.solana.WcSolanaSignAllTransactionUseCase
|
||||
import dagger.assisted.Assisted
|
||||
import dagger.assisted.AssistedFactory
|
||||
import dagger.assisted.AssistedInject
|
||||
|
|
@ -22,15 +22,15 @@ import okio.ByteString.Companion.decodeBase64
|
|||
import org.json.JSONArray
|
||||
import org.json.JSONObject
|
||||
|
||||
internal class DefaultWcSolanaSignAllTransactionUseCase @AssistedInject constructor(
|
||||
internal class WcSolanaSignAllTransactionUseCase @AssistedInject constructor(
|
||||
override val respondService: WcRespondService,
|
||||
override val analytics: AnalyticsEventHandler,
|
||||
private val prepareForSend: PrepareForSendUseCase,
|
||||
@Assisted override val context: WcMethodUseCaseContext,
|
||||
@Assisted override val method: WcSolanaMethod.SignAllTransaction,
|
||||
blockAidDelegate: BlockAidVerificationDelegate,
|
||||
) : BaseWcSignUseCase<Nothing, List<TransactionData.Compiled>>(),
|
||||
WcSolanaSignAllTransactionUseCase {
|
||||
) : BaseWcSignUseCase<Nothing, List<TransactionData>>(),
|
||||
WcListTransactionUseCase {
|
||||
|
||||
override val securityStatus = blockAidDelegate.getSecurityStatus(
|
||||
network = network,
|
||||
|
|
@ -40,9 +40,7 @@ internal class DefaultWcSolanaSignAllTransactionUseCase @AssistedInject construc
|
|||
accountAddress = context.accountAddress,
|
||||
)
|
||||
|
||||
override suspend fun SignCollector<List<TransactionData.Compiled>>.onSign(
|
||||
state: WcSignState<List<TransactionData.Compiled>>,
|
||||
) {
|
||||
override suspend fun SignCollector<List<TransactionData>>.onSign(state: WcSignState<List<TransactionData>>) {
|
||||
val hash = prepareForSend.invoke(transactionData = state.signModel, userWallet = wallet, network = network)
|
||||
.onLeft { error ->
|
||||
emit(state.toResult(error.left()))
|
||||
|
|
@ -54,7 +52,7 @@ internal class DefaultWcSolanaSignAllTransactionUseCase @AssistedInject construc
|
|||
emit(state.toResult(respondResult))
|
||||
}
|
||||
|
||||
override fun invoke(): Flow<WcSignState<List<TransactionData.Compiled>>> {
|
||||
override fun invoke(): Flow<WcSignState<List<TransactionData>>> {
|
||||
val transactionData = method.transaction
|
||||
.map { it.decodeBase64()?.toByteArray() ?: ByteArray(0) }
|
||||
.map { TransactionData.Compiled(value = TransactionData.Compiled.Data.Bytes(it)) }
|
||||
|
|
@ -85,6 +83,6 @@ internal class DefaultWcSolanaSignAllTransactionUseCase @AssistedInject construc
|
|||
fun create(
|
||||
context: WcMethodUseCaseContext,
|
||||
method: WcSolanaMethod.SignAllTransaction,
|
||||
): DefaultWcSolanaSignAllTransactionUseCase
|
||||
): WcSolanaSignAllTransactionUseCase
|
||||
}
|
||||
}
|
||||
|
|
@ -13,22 +13,22 @@ import com.tangem.data.walletconnect.utils.BlockAidVerificationDelegate
|
|||
import com.tangem.domain.transaction.usecase.PrepareForSendUseCase
|
||||
import com.tangem.domain.walletconnect.model.WcSolanaMethod
|
||||
import com.tangem.domain.walletconnect.usecase.method.WcSignState
|
||||
import com.tangem.domain.walletconnect.usecase.solana.WcSolanaSignTransactionUseCase
|
||||
import com.tangem.domain.walletconnect.usecase.method.WcTransactionUseCase
|
||||
import dagger.assisted.Assisted
|
||||
import dagger.assisted.AssistedFactory
|
||||
import dagger.assisted.AssistedInject
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import okio.ByteString.Companion.decodeBase64
|
||||
|
||||
internal class DefaultWcSolanaSignTransactionUseCase @AssistedInject constructor(
|
||||
internal class WcSolanaSignTransactionUseCase @AssistedInject constructor(
|
||||
override val respondService: WcRespondService,
|
||||
override val analytics: AnalyticsEventHandler,
|
||||
private val prepareForSend: PrepareForSendUseCase,
|
||||
@Assisted override val context: WcMethodUseCaseContext,
|
||||
@Assisted override val method: WcSolanaMethod.SignTransaction,
|
||||
blockAidDelegate: BlockAidVerificationDelegate,
|
||||
) : BaseWcSignUseCase<Nothing, TransactionData.Compiled>(),
|
||||
WcSolanaSignTransactionUseCase {
|
||||
) : BaseWcSignUseCase<Nothing, TransactionData>(),
|
||||
WcTransactionUseCase {
|
||||
|
||||
override val securityStatus = blockAidDelegate.getSecurityStatus(
|
||||
network = network,
|
||||
|
|
@ -38,7 +38,7 @@ internal class DefaultWcSolanaSignTransactionUseCase @AssistedInject constructor
|
|||
accountAddress = context.accountAddress,
|
||||
)
|
||||
|
||||
override suspend fun SignCollector<TransactionData.Compiled>.onSign(state: WcSignState<TransactionData.Compiled>) {
|
||||
override suspend fun SignCollector<TransactionData>.onSign(state: WcSignState<TransactionData>) {
|
||||
val hash = prepareForSend.invoke(transactionData = state.signModel, userWallet = wallet, network = network)
|
||||
.onLeft { error ->
|
||||
emit(state.toResult(error.left()))
|
||||
|
|
@ -50,7 +50,7 @@ internal class DefaultWcSolanaSignTransactionUseCase @AssistedInject constructor
|
|||
emit(state.toResult(respondResult))
|
||||
}
|
||||
|
||||
override fun invoke(): Flow<WcSignState<TransactionData.Compiled>> {
|
||||
override fun invoke(): Flow<WcSignState<TransactionData>> {
|
||||
val data = method.transaction.decodeBase64()?.toByteArray() ?: ByteArray(0)
|
||||
|
||||
val transactionData = TransactionData.Compiled(
|
||||
|
|
@ -64,6 +64,6 @@ internal class DefaultWcSolanaSignTransactionUseCase @AssistedInject constructor
|
|||
fun create(
|
||||
context: WcMethodUseCaseContext,
|
||||
method: WcSolanaMethod.SignTransaction,
|
||||
): DefaultWcSolanaSignTransactionUseCase
|
||||
): WcSolanaSignTransactionUseCase
|
||||
}
|
||||
}
|
||||
|
|
@ -13,7 +13,7 @@ import kotlinx.coroutines.flow.FlowCollector
|
|||
|
||||
internal abstract class BaseWcSignUseCase<MiddleAction, SignModel> :
|
||||
WcMethodUseCase,
|
||||
WcSignUseCase,
|
||||
WcSignUseCase<SignModel>,
|
||||
FinalActionCollector<SignModel>,
|
||||
MiddleActionCollector<MiddleAction, SignModel> {
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue