Skip to content

Commit fbe924c

Browse files
committed
Fix jettons
1 parent 4520c52 commit fbe924c

File tree

5 files changed

+34
-54
lines changed

5 files changed

+34
-54
lines changed

blockchain/src/main/kotlin/com/gemwallet/android/blockchain/clients/ton/TonBalanceClient.kt

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,6 @@ import com.gemwallet.android.ext.asset
55
import com.gemwallet.android.model.AssetBalance
66
import com.wallet.core.primitives.Asset
77
import com.wallet.core.primitives.Chain
8-
import kotlinx.coroutines.Dispatchers
9-
import kotlinx.coroutines.flow.asFlow
10-
import kotlinx.coroutines.flow.flowOn
11-
import kotlinx.coroutines.flow.mapNotNull
12-
import kotlinx.coroutines.flow.toList
138
import java.math.BigInteger
149

1510
class TonBalanceClient(
@@ -23,20 +18,12 @@ class TonBalanceClient(
2318
}
2419

2520
override suspend fun getTokenBalances(chain: Chain, address: String, tokens: List<Asset>): List<AssetBalance> {
26-
return tokens.asFlow()
27-
.mapNotNull {
28-
val tokenId = it.id.tokenId ?: return@mapNotNull null
29-
val jettonAddress = jettonAddress(rpcClient, tokenId, address) ?: return@mapNotNull null
30-
val isActive = rpcClient.addressState(jettonAddress).getOrNull()?.result == "active"
31-
32-
if (isActive) {
33-
AssetBalance.create(it, available = tokenBalance(jettonAddress).toString())
34-
} else {
35-
AssetBalance.create(it)
36-
}
37-
}
38-
.flowOn(Dispatchers.IO)
39-
.toList()
21+
val jettonWallets = rpcClient.getJettonWallets(address)
22+
return jettonWallets.jetton_wallets.mapNotNull { wallet ->
23+
val jettonTokenId = uniffi.gemstone.tonHexToBase64Address(wallet.jetton)
24+
val tokenAsset = tokens.firstOrNull { it.id.tokenId == jettonTokenId } ?: return@mapNotNull null
25+
AssetBalance.create(tokenAsset, available = wallet.balance)
26+
}
4027
}
4128

4229
override fun supported(chain: Chain): Boolean = this.chain == chain

blockchain/src/main/kotlin/com/gemwallet/android/blockchain/clients/ton/TonCalls.kt

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

blockchain/src/main/kotlin/com/gemwallet/android/blockchain/clients/ton/TonFeeCalculator.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@ class TonFeeCalculator(
1919

2020
suspend fun calculateToken(assetId: AssetId, destinationAddress: String, memo: String?): Fee = withContext(Dispatchers.IO) {
2121
val tokenId = assetId.tokenId!!
22-
val jetonAddress = jettonAddress(rpcClient, tokenId, destinationAddress)
23-
?: throw Exception("can't get jetton address")
24-
val state = rpcClient.addressState(jetonAddress).getOrNull()?.result == "active"
22+
val hexTokenId = uniffi.gemstone.tonBase64ToHexAddress(tokenId)
23+
val jetonAddress = rpcClient.getJettonWallets(destinationAddress)
24+
.jetton_wallets.firstOrNull { it.jetton == hexTokenId }?.address
25+
26+
val state = jetonAddress?.let { true } ?: false
2527
val tokenAccountFee = if (state) {
2628
if (memo.isNullOrEmpty()) {
2729
BigInteger.valueOf(100_000_000)

blockchain/src/main/kotlin/com/gemwallet/android/blockchain/clients/ton/TonRpcClient.kt

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.gemwallet.android.blockchain.clients.ton
22

3-
import com.gemwallet.android.blockchain.rpc.model.JSONRpcRequest
43
import com.google.gson.JsonDeserializationContext
54
import com.google.gson.JsonDeserializer
65
import com.google.gson.JsonElement
@@ -11,6 +10,7 @@ import com.wallet.core.blockchain.ton.TonMasterchainInfo
1110
import com.wallet.core.blockchain.ton.TonMessageTransactions
1211
import com.wallet.core.blockchain.ton.TonResult
1312
import com.wallet.core.blockchain.ton.TonWalletInfo
13+
import kotlinx.serialization.SerialName
1414
import retrofit2.Response
1515
import retrofit2.http.Body
1616
import retrofit2.http.GET
@@ -30,17 +30,14 @@ interface TonRpcClient {
3030
@POST("/api/v2/sendBocReturnHash")
3131
suspend fun broadcast(@Body boc: Boc): Result<TonResult<TonBroadcastTransaction>>
3232

33-
// @GET("/api/index/v1/getTransactionsByInMessageHash")
34-
// suspend fun transaction(@Query("msg_hash") hash: String): Result<List<TonTransactionMessage>>
35-
3633
@GET("/api/v3/transactionsByMessage")
3734
suspend fun transaction(@Query("msg_hash") hash: String): Result<TonMessageTransactions>
3835

3936
@GET("/api/v2/getTokenData")
4037
suspend fun tokenData(@Query("address") address: String): Result<TonResult<TonJettonToken>>
4138

42-
@POST("/api/v2/jsonRPC")
43-
suspend fun getJetonAddress(@Body request: JSONRpcRequest<Any>): Result<JetonAddress?>
39+
@GET("/api/v3/jetton/wallets?limit=100&offset=0")
40+
suspend fun getJettonWallets(@Query("owner_address") ownerAddress: String): JettonWalletsResponse
4441

4542
@GET("/api/v2/getTokenData")
4643
suspend fun tokenBalance(@Query("address") address: String): Result<TonResult<TonJettonBalance>>
@@ -60,6 +57,16 @@ interface TonRpcClient {
6057
val len: Long,
6158
)
6259

60+
data class JettonWalletsResponse(
61+
val jetton_wallets: List<JettonWallet>
62+
)
63+
64+
data class JettonWallet(
65+
val address: String,
66+
@SerialName("deserialize_biguint_from_str") val balance: String,
67+
val jetton: String,
68+
)
69+
6370
class JetonAddressSerializer : JsonDeserializer<JetonAddress?> {
6471

6572
override fun deserialize(

blockchain/src/main/kotlin/com/gemwallet/android/blockchain/clients/ton/TonSignerPreloader.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,20 @@ class TonSignerPreloader(
3232
}
3333

3434
override suspend fun preloadTokenTransfer(params: ConfirmParams.TransferParams.Token): SignerParams = withContext(Dispatchers.IO) {
35+
val hexTokenId = uniffi.gemstone.tonBase64ToHexAddress(params.assetId.tokenId ?: throw IllegalArgumentException("No token id"))
36+
val getJettonAddress = async { rpcClient.getJettonWallets(params.from.address) }
37+
38+
39+
//uniffi.gemstone.tonBase64ToHexAddress(params.assetId.tokenId!!)
40+
// async { jettonAddress(rpcClient, params.assetId.tokenId!!, params.from.address) }
3541
val getWalletInfo = async { rpcClient.walletInfo(params.from.address).getOrNull() }
36-
val getJettonAddress = async { jettonAddress(rpcClient, params.assetId.tokenId!!, params.from.address) }
3742
val getFee = async { feeCalculator.calculateToken(params.assetId, params.destination().address, params.memo()) }
3843

3944
val seqno = getWalletInfo.await()?.result?.seqno ?: 0
40-
val jettonAddress = getJettonAddress.await() ?: throw Exception("can't get jetton address. check internet.")
45+
val jettonWallets = getJettonAddress.await()
46+
val jettonAddress = jettonWallets.jetton_wallets.firstOrNull { it.jetton.lowercase() == hexTokenId }?.address
47+
?: throw IllegalArgumentException("Not load jetton wallet")
48+
4149
val fee = getFee.await()
4250

4351
SignerParams(

0 commit comments

Comments
 (0)