Updated on 2026-08-14
This commit is contained in:
parent
c8c4f67018
commit
dfaf4e4e77
16 changed files with 511 additions and 108 deletions
|
|
@ -1,9 +0,0 @@
|
|||
package com.tangem.domain.walletconnect.respond
|
||||
|
||||
import arrow.core.Either
|
||||
import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest
|
||||
|
||||
interface WcRespondService {
|
||||
suspend fun respond(request: WcSdkSessionRequest, response: String): Either<Throwable, Unit>
|
||||
suspend fun rejectRequest(request: WcSdkSessionRequest, message: String = ""): Either<Throwable, Unit>
|
||||
}
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
package com.tangem.domain.walletconnect.usecase
|
||||
|
||||
import arrow.core.Either
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
interface WcSimpleSignUseCase<SignModel, MiddleAction> : WcUseCase {
|
||||
|
||||
fun signFlow(initModel: SignModel): Flow<State<SignModel>>
|
||||
|
||||
fun action(action: MiddleAction)
|
||||
|
||||
fun cancel()
|
||||
fun sign(toSign: SignModel)
|
||||
|
||||
sealed interface State<SignModel> {
|
||||
val model: SignModel
|
||||
|
||||
data class PreSign<SignModel>(override val model: SignModel) : State<SignModel>
|
||||
data class Signing<SignModel>(override val model: SignModel) : State<SignModel>
|
||||
data class Result<SignModel>(
|
||||
val result: Either<Throwable, Unit>,
|
||||
override val model: SignModel,
|
||||
) : State<SignModel>
|
||||
}
|
||||
}
|
||||
|
|
@ -1,3 +1,11 @@
|
|||
package com.tangem.domain.walletconnect.usecase
|
||||
|
||||
interface WcUseCase
|
||||
import com.tangem.domain.walletconnect.model.WcSession
|
||||
import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest
|
||||
|
||||
interface WcUseCase
|
||||
|
||||
interface WcMethodUseCase : WcUseCase {
|
||||
val session: WcSession
|
||||
val rawSdkRequest: WcSdkSessionRequest
|
||||
}
|
||||
|
|
@ -1,72 +0,0 @@
|
|||
package com.tangem.domain.walletconnect.usecase.ethereum
|
||||
|
||||
import arrow.core.Either
|
||||
import com.tangem.domain.walletconnect.model.WcRequest
|
||||
import com.tangem.domain.walletconnect.respond.WcRespondService
|
||||
import com.tangem.domain.walletconnect.usecase.WcUseCase
|
||||
import kotlinx.coroutines.channels.Channel
|
||||
import kotlinx.coroutines.flow.*
|
||||
|
||||
class EthPersonalSignUseCase(
|
||||
private val wcRequest: WcRequest<WcEthMethod.SignMessage>,
|
||||
private val respondService: WcRespondService,
|
||||
) : WcUseCase {
|
||||
|
||||
private val onCallTerminalAction = Channel<TerminalAction>()
|
||||
|
||||
fun signFlow(): Flow<State> = flow {
|
||||
val model = SignModel(wcRequest.method.raw)
|
||||
emit(State.PreSign(model))
|
||||
|
||||
when (val action = onCallTerminalAction.receiveAsFlow().first()) {
|
||||
TerminalAction.Cancel -> {
|
||||
val result = respondService.rejectRequest(wcRequest.rawSdkRequest)
|
||||
emit(State.Result(result, model))
|
||||
}
|
||||
is TerminalAction.Sign -> {
|
||||
emit(State.Signing(action.toSign))
|
||||
val signed = signAndPrepareForSend()
|
||||
val result =
|
||||
if (signed != null) {
|
||||
respondService.respond(wcRequest.rawSdkRequest, signed)
|
||||
} else {
|
||||
respondService.rejectRequest(wcRequest.rawSdkRequest)
|
||||
}
|
||||
emit(State.Result(result, model))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Suppress("FunctionOnlyReturningConstant") // todo(wc) remove later
|
||||
private suspend fun signAndPrepareForSend(): String? {
|
||||
return null // todo(wc)
|
||||
}
|
||||
|
||||
fun sign(toSign: SignModel) {
|
||||
onCallTerminalAction.trySend(TerminalAction.Sign(toSign))
|
||||
}
|
||||
|
||||
fun cancel() {
|
||||
onCallTerminalAction.trySend(TerminalAction.Cancel)
|
||||
}
|
||||
|
||||
sealed interface TerminalAction {
|
||||
data class Sign(val toSign: SignModel) : TerminalAction
|
||||
data object Cancel : TerminalAction
|
||||
}
|
||||
|
||||
sealed interface State {
|
||||
val model: SignModel
|
||||
|
||||
data class PreSign(override val model: SignModel) : State
|
||||
data class Signing(override val model: SignModel) : State
|
||||
data class Result(
|
||||
val result: Either<Throwable, Unit>,
|
||||
override val model: SignModel,
|
||||
) : State
|
||||
}
|
||||
|
||||
data class SignModel(
|
||||
val raw: List<String>,
|
||||
)
|
||||
}
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
package com.tangem.domain.walletconnect.usecase.sign
|
||||
|
||||
import arrow.core.Either
|
||||
|
||||
data class WcSignState<SignModel>(
|
||||
val signModel: SignModel,
|
||||
val domainStep: WcSignStep,
|
||||
)
|
||||
|
||||
sealed interface WcSignStep {
|
||||
data object PreSign : WcSignStep
|
||||
data object Signing : WcSignStep
|
||||
data class Result(val result: Either<Throwable, Unit>) : WcSignStep
|
||||
}
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
package com.tangem.domain.walletconnect.usecase.sign
|
||||
|
||||
import com.tangem.domain.walletconnect.usecase.WcMethodUseCase
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
interface WcSignUseCase : WcMethodUseCase {
|
||||
|
||||
interface FinalAction {
|
||||
fun cancel()
|
||||
fun sign()
|
||||
}
|
||||
|
||||
interface SimpleRun<SignModel> {
|
||||
operator fun invoke(): Flow<WcSignState<SignModel>>
|
||||
}
|
||||
|
||||
interface ArgsRun<SignModel, Args> {
|
||||
operator fun invoke(args: Args): Flow<WcSignState<SignModel>>
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue