Skip to content

Commit 83fe3ec

Browse files
authored
Submit transactions through proxy (#254)
* Submit delegation/baker transactions via wallet-proxy * Add deprecation notice to the grpc client getter
1 parent 93289b3 commit 83fe3ec

File tree

11 files changed

+69
-89
lines changed

11 files changed

+69
-89
lines changed

app/src/main/java/com/concordium/wallet/core/AppCore.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ class AppCore(val app: App) {
121121
return proxyBackendConfig.backend
122122
}
123123

124+
@Deprecated("It's better to use ProxyBackend, as it is backed by a reliable node")
124125
fun getGrpcClient(): ClientV2 {
125126
return grpcBackendConfig.client
126127
}

app/src/main/java/com/concordium/wallet/data/backend/ProxyBackend.kt

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import com.concordium.wallet.data.cryptolib.CreateTransferOutput
44
import com.concordium.wallet.data.model.AccountBalance
55
import com.concordium.wallet.data.model.AccountKeyData
66
import com.concordium.wallet.data.model.AccountNonce
7-
import com.concordium.wallet.data.model.AccountSubmissionStatus
87
import com.concordium.wallet.data.model.AccountTransactions
98
import com.concordium.wallet.data.model.BakerPoolStatus
109
import com.concordium.wallet.data.model.CIS2Tokens
@@ -17,8 +16,9 @@ import com.concordium.wallet.data.model.IdentityContainer
1716
import com.concordium.wallet.data.model.IdentityProvider
1817
import com.concordium.wallet.data.model.PassiveDelegation
1918
import com.concordium.wallet.data.model.SubmissionData
19+
import com.concordium.wallet.data.model.SubmissionStatusResponse
2020
import com.concordium.wallet.data.model.TransactionCost
21-
import com.concordium.wallet.data.model.TransferSubmissionStatus
21+
import okhttp3.RequestBody
2222
import retrofit2.Call
2323
import retrofit2.Response
2424
import retrofit2.http.Body
@@ -29,6 +29,12 @@ import retrofit2.http.Query
2929

3030
interface ProxyBackend {
3131

32+
/**
33+
* Submits a transaction serialized as Block item (version, signature, header, payload).
34+
*/
35+
@PUT("v0/submitRawTransaction")
36+
suspend fun submitRawTransaction(@Body transactionBytesBody: RequestBody): SubmissionData
37+
3238
@PUT("v0/submitCredential")
3339
fun submitCredential(@Body credential: CredentialWrapper): Call<SubmissionData>
3440

@@ -38,23 +44,17 @@ interface ProxyBackend {
3844
@GET("v0/bakerPool/{poolId}")
3945
suspend fun bakerPoolSuspended(@Path("poolId") poolId: String): Response<BakerPoolStatus>
4046

41-
@GET("v0/submissionStatus/{submissionId}")
42-
fun accountSubmissionStatus(@Path("submissionId") submissionId: String): Call<AccountSubmissionStatus>
43-
44-
@GET("v0/submissionStatus/{submissionId}")
45-
suspend fun accountSubmissionStatusSuspended(@Path("submissionId") submissionId: String): AccountSubmissionStatus
46-
4747
@GET("v0/accNonce/{accountAddress}")
4848
fun accountNonce(@Path("accountAddress") accountAddress: String): Call<AccountNonce>
4949

5050
@PUT("v0/submitTransfer")
5151
fun submitTransfer(@Body transfer: CreateTransferOutput): Call<SubmissionData>
5252

5353
@GET("v0/submissionStatus/{submissionId}")
54-
fun transferSubmissionStatus(@Path("submissionId") submissionId: String): Call<TransferSubmissionStatus>
54+
fun submissionStatus(@Path("submissionId") submissionId: String): Call<SubmissionStatusResponse>
5555

5656
@GET("v0/submissionStatus/{submissionId}")
57-
suspend fun transferSubmissionStatusSuspended(@Path("submissionId") submissionId: String): TransferSubmissionStatus
57+
suspend fun submissionStatusSuspended(@Path("submissionId") submissionId: String): SubmissionStatusResponse
5858

5959
@GET("v0/transactionCost")
6060
fun transferCost(

app/src/main/java/com/concordium/wallet/data/backend/repository/ProxyRepository.kt

Lines changed: 32 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package com.concordium.wallet.data.backend.repository
22

3+
import com.concordium.sdk.transactions.Transaction
34
import com.concordium.wallet.App
45
import com.concordium.wallet.core.backend.BackendCallback
56
import com.concordium.wallet.core.backend.BackendRequest
67
import com.concordium.wallet.data.cryptolib.CreateTransferOutput
78
import com.concordium.wallet.data.model.AccountBalance
89
import com.concordium.wallet.data.model.AccountKeyData
910
import com.concordium.wallet.data.model.AccountNonce
10-
import com.concordium.wallet.data.model.AccountSubmissionStatus
1111
import com.concordium.wallet.data.model.AccountTransactions
1212
import com.concordium.wallet.data.model.BakerPoolStatus
1313
import com.concordium.wallet.data.model.CIS2Tokens
@@ -17,9 +17,13 @@ import com.concordium.wallet.data.model.ChainParameters
1717
import com.concordium.wallet.data.model.CredentialWrapper
1818
import com.concordium.wallet.data.model.GlobalParamsWrapper
1919
import com.concordium.wallet.data.model.SubmissionData
20+
import com.concordium.wallet.data.model.SubmissionStatusResponse
2021
import com.concordium.wallet.data.model.TransactionCost
21-
import com.concordium.wallet.data.model.TransferSubmissionStatus
2222
import com.concordium.wallet.util.Log
23+
import okhttp3.MediaType
24+
import okhttp3.MediaType.Companion.toMediaType
25+
import okhttp3.RequestBody
26+
import okhttp3.RequestBody.Companion.toRequestBody
2327
import java.math.BigInteger
2428

2529
class ProxyRepository {
@@ -46,6 +50,23 @@ class ProxyRepository {
4650
const val CIS_2_TOKEN_METADATA_MAX_TOKEN_IDS = 20
4751
}
4852

53+
/**
54+
* Submits [transaction] crafted by the Java SDK
55+
* through a reliable node behind the wallet-proxy.
56+
*
57+
* @see getSubmissionStatus
58+
*/
59+
suspend fun submitSdkTransaction(
60+
transaction: Transaction,
61+
): SubmissionData =
62+
backend.submitRawTransaction(
63+
transactionBytesBody = transaction
64+
.bytes
65+
.toRequestBody(
66+
contentType = "application/octet-stream".toMediaType(),
67+
),
68+
)
69+
4970
fun submitCredential(
5071
credentialWrapper: CredentialWrapper,
5172
success: (SubmissionData) -> Unit,
@@ -70,33 +91,6 @@ class ProxyRepository {
7091
)
7192
}
7293

73-
suspend fun getAccountSubmissionStatusSuspended(submissionId: String) =
74-
backend.accountSubmissionStatusSuspended(submissionId)
75-
76-
fun getAccountSubmissionStatus(
77-
submissionId: String,
78-
success: (AccountSubmissionStatus) -> Unit,
79-
failure: ((Throwable) -> Unit)?,
80-
): BackendRequest<AccountSubmissionStatus> {
81-
val call = backend.accountSubmissionStatus(submissionId)
82-
call.enqueue(object : BackendCallback<AccountSubmissionStatus>() {
83-
84-
override fun onResponseData(response: AccountSubmissionStatus) {
85-
success(response)
86-
}
87-
88-
override fun onFailure(t: Throwable) {
89-
failure?.invoke(t)
90-
}
91-
})
92-
93-
return BackendRequest<AccountSubmissionStatus>(
94-
call = call,
95-
success = success,
96-
failure = failure
97-
)
98-
}
99-
10094
fun getAccountNonce(
10195
accountAddress: String,
10296
success: (AccountNonce) -> Unit,
@@ -147,18 +141,18 @@ class ProxyRepository {
147141
)
148142
}
149143

150-
suspend fun getTransferSubmissionStatusSuspended(submissionId: String) =
151-
backend.transferSubmissionStatusSuspended(submissionId)
144+
suspend fun getSubmissionStatus(submissionId: String) =
145+
backend.submissionStatusSuspended(submissionId)
152146

153-
fun getTransferSubmissionStatus(
147+
fun getSubmissionStatus(
154148
submissionId: String,
155-
success: (TransferSubmissionStatus) -> Unit,
149+
success: (SubmissionStatusResponse) -> Unit,
156150
failure: ((Throwable) -> Unit)?,
157-
): BackendRequest<TransferSubmissionStatus> {
158-
val call = backend.transferSubmissionStatus(submissionId)
159-
call.enqueue(object : BackendCallback<TransferSubmissionStatus>() {
151+
): BackendRequest<SubmissionStatusResponse> {
152+
val call = backend.submissionStatus(submissionId)
153+
call.enqueue(object : BackendCallback<SubmissionStatusResponse>() {
160154

161-
override fun onResponseData(response: TransferSubmissionStatus) {
155+
override fun onResponseData(response: SubmissionStatusResponse) {
162156
success(response)
163157
}
164158

@@ -167,7 +161,7 @@ class ProxyRepository {
167161
}
168162
})
169163

170-
return BackendRequest<TransferSubmissionStatus>(
164+
return BackendRequest(
171165
call = call,
172166
success = success,
173167
failure = failure

app/src/main/java/com/concordium/wallet/data/model/AccountSubmissionStatus.kt

Lines changed: 0 additions & 5 deletions
This file was deleted.

app/src/main/java/com/concordium/wallet/data/model/TransferSubmissionStatus.kt renamed to app/src/main/java/com/concordium/wallet/data/model/SubmissionStatusResponse.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package com.concordium.wallet.data.model
22

33
import java.math.BigInteger
44

5-
data class TransferSubmissionStatus(
5+
data class SubmissionStatusResponse(
66
val status: TransactionStatus,
77
val outcome: TransactionOutcome?,
88
val amount: BigInteger?,
@@ -14,4 +14,4 @@ data class TransferSubmissionStatus(
1414
val rejectReason: String?,
1515
val encryptedAmount: String?,
1616
val aggregatedIndex: Int?
17-
)
17+
)

app/src/main/java/com/concordium/wallet/ui/account/accountdetails/AccountReleaseScheduleViewModel.kt

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@ import androidx.lifecycle.AndroidViewModel
55
import androidx.lifecycle.LiveData
66
import androidx.lifecycle.MutableLiveData
77
import androidx.lifecycle.viewModelScope
8-
import com.concordium.wallet.App
98
import com.concordium.wallet.core.arch.Event
10-
import com.concordium.wallet.data.backend.repository.ProxyRepository
119
import com.concordium.wallet.data.model.Schedule
1210
import com.concordium.wallet.data.room.Account
1311
import kotlinx.coroutines.Dispatchers
@@ -18,10 +16,6 @@ class AccountReleaseScheduleViewModel(application: Application) : AndroidViewMod
1816
lateinit var account: Account
1917
var isShielded: Boolean = false
2018

21-
private val proxyRepository = ProxyRepository()
22-
23-
private val gson = App.appCore.gson
24-
2519
// Transaction state
2620
private val _waitingLiveData = MutableLiveData<Boolean>()
2721
val waitingLiveData: LiveData<Boolean>
@@ -39,9 +33,6 @@ class AccountReleaseScheduleViewModel(application: Application) : AndroidViewMod
3933
val scheduledReleasesLiveData: LiveData<List<Schedule>>
4034
get() = _scheduledReleasesLiveData
4135

42-
init {
43-
}
44-
4536
fun initialize(account: Account, isShielded: Boolean) {
4637
this.account = account
4738
this.isShielded = isShielded

app/src/main/java/com/concordium/wallet/ui/account/common/NewAccountViewModel.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ import com.concordium.wallet.data.backend.repository.ProxyRepository
1919
import com.concordium.wallet.data.cryptolib.CreateCredentialInputV1
2020
import com.concordium.wallet.data.cryptolib.CreateCredentialOutput
2121
import com.concordium.wallet.data.cryptolib.StorageAccountData
22-
import com.concordium.wallet.data.model.AccountSubmissionStatus
2322
import com.concordium.wallet.data.model.CredentialWrapper
2423
import com.concordium.wallet.data.model.EncryptedData
2524
import com.concordium.wallet.data.model.GlobalParams
2625
import com.concordium.wallet.data.model.GlobalParamsWrapper
2726
import com.concordium.wallet.data.model.SubmissionData
27+
import com.concordium.wallet.data.model.SubmissionStatusResponse
2828
import com.concordium.wallet.data.model.TransactionStatus
2929
import com.concordium.wallet.data.room.Account
3030
import com.concordium.wallet.data.room.Identity
@@ -50,7 +50,7 @@ open class NewAccountViewModel(application: Application) :
5050

5151
private var globalParamsRequest: BackendRequest<GlobalParamsWrapper>? = null
5252
private var submitCredentialRequest: BackendRequest<SubmissionData>? = null
53-
private var accountSubmissionStatusRequest: BackendRequest<AccountSubmissionStatus>? = null
53+
private var accountSubmissionStatusRequest: BackendRequest<SubmissionStatusResponse>? = null
5454
private var firstAccount: Boolean = false
5555

5656
private var tempData = TempData()

app/src/main/java/com/concordium/wallet/ui/account/common/accountupdater/AccountUpdater.kt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,11 @@ import com.concordium.wallet.data.backend.repository.ProxyRepository
1515
import com.concordium.wallet.data.cryptolib.DecryptAmountInput
1616
import com.concordium.wallet.data.model.AccountBalance
1717
import com.concordium.wallet.data.model.AccountEncryptedAmount
18-
import com.concordium.wallet.data.model.AccountSubmissionStatus
1918
import com.concordium.wallet.data.model.ShieldedAccountEncryptionStatus
19+
import com.concordium.wallet.data.model.SubmissionStatusResponse
2020
import com.concordium.wallet.data.model.TransactionOutcome
2121
import com.concordium.wallet.data.model.TransactionStatus
2222
import com.concordium.wallet.data.model.TransactionType
23-
import com.concordium.wallet.data.model.TransferSubmissionStatus
2423
import com.concordium.wallet.data.room.Account
2524
import com.concordium.wallet.data.room.EncryptedAmount
2625
import com.concordium.wallet.data.room.Recipient
@@ -46,12 +45,12 @@ import java.math.BigInteger
4645

4746
class AccountUpdater(val application: Application, private val viewModelScope: CoroutineScope) {
4847
data class AccountSubmissionStatusRequestData(
49-
val deferred: Deferred<AccountSubmissionStatus>,
48+
val deferred: Deferred<SubmissionStatusResponse>,
5049
val account: Account
5150
)
5251

5352
data class TransferSubmissionStatusRequestData(
54-
val deferred: Deferred<TransferSubmissionStatus>,
53+
val deferred: Deferred<SubmissionStatusResponse>,
5554
val transfer: Transfer
5655
)
5756

@@ -198,7 +197,7 @@ class AccountUpdater(val application: Application, private val viewModelScope: C
198197
)
199198
) {
200199
val deferred = async {
201-
proxyRepository.getAccountSubmissionStatusSuspended(account.submissionId)
200+
proxyRepository.getSubmissionStatus(account.submissionId)
202201
}
203202
val requestData = AccountSubmissionStatusRequestData(
204203
deferred,
@@ -270,7 +269,7 @@ class AccountUpdater(val application: Application, private val viewModelScope: C
270269
|| transfer.transactionStatus == TransactionStatus.UNKNOWN
271270
) {
272271
val deferred = async {
273-
proxyRepository.getTransferSubmissionStatusSuspended(transfer.submissionId)
272+
proxyRepository.getSubmissionStatus(transfer.submissionId)
274273
}
275274
val requestData = TransferSubmissionStatusRequestData(
276275
deferred,

app/src/main/java/com/concordium/wallet/ui/bakerdelegation/common/DelegationBakerViewModel.kt

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import com.concordium.sdk.transactions.ConfigureBakerTransaction
2323
import com.concordium.sdk.transactions.ConfigureDelegationPayload
2424
import com.concordium.sdk.transactions.ConfigureDelegationTransaction
2525
import com.concordium.sdk.transactions.Expiry
26-
import com.concordium.sdk.transactions.Hash
2726
import com.concordium.sdk.transactions.SignerEntry
2827
import com.concordium.sdk.transactions.TransactionFactory
2928
import com.concordium.sdk.transactions.TransactionSigner
@@ -707,9 +706,9 @@ class DelegationBakerViewModel(application: Application) : AndroidViewModel(appl
707706
) = withContext(Dispatchers.IO) {
708707

709708
val submissionId: String = try {
710-
App.appCore.getGrpcClient()
711-
.sendTransaction(transaction)
712-
.asHex()
709+
proxyRepository
710+
.submitSdkTransaction(transaction)
711+
.submissionId
713712
} catch (e: Exception) {
714713
Log.e("Error submitting transaction", e)
715714
withContext(Dispatchers.Main) {
@@ -723,11 +722,10 @@ class DelegationBakerViewModel(application: Application) : AndroidViewModel(appl
723722

724723
bakerDelegationData.submissionId = submissionId
725724

726-
try {
727-
// If the status is received,
728-
// the transaction has been at least accepted as valid.
729-
App.appCore.getGrpcClient()
730-
.getBlockItemStatus(Hash.from(submissionId))
725+
val submissionStatus =try {
726+
proxyRepository
727+
.getSubmissionStatus(submissionId)
728+
.status
731729
} catch (e: Exception) {
732730
Log.e("Error checking submission status", e)
733731
withContext(Dispatchers.Main) {
@@ -740,12 +738,14 @@ class DelegationBakerViewModel(application: Application) : AndroidViewModel(appl
740738
// Do not disable waiting state yet
741739
finishTransferCreation(
742740
submissionId = submissionId,
741+
submissionStatus = submissionStatus,
743742
localTransactionType = localTransactionType,
744743
)
745744
}
746745

747746
private suspend fun finishTransferCreation(
748747
submissionId: String,
748+
submissionStatus: TransactionStatus,
749749
localTransactionType: TransactionType,
750750
) = withContext(Dispatchers.Main) {
751751
val createdAt = Date().time
@@ -772,7 +772,7 @@ class DelegationBakerViewModel(application: Application) : AndroidViewModel(appl
772772
"",
773773
createdAt,
774774
submissionId,
775-
TransactionStatus.UNKNOWN,
775+
submissionStatus,
776776
TransactionOutcome.UNKNOWN,
777777
localTransactionType,
778778
//but amount is negative so it is listed as incoming positive

0 commit comments

Comments
 (0)