Skip to content

Commit

Permalink
Add conversion for remaining ton transaction types
Browse files Browse the repository at this point in the history
  • Loading branch information
abdrasulov committed Sep 27, 2024
1 parent bf634d6 commit f029407
Show file tree
Hide file tree
Showing 17 changed files with 364 additions and 173 deletions.
10 changes: 8 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,12 @@ android {
substitute module('com.tinder.scarlet:message-adapter-gson:0.1.12') using module('com.github.WalletConnect.Scarlet:message-adapter-gson:1.0.0')
substitute module('com.tinder.scarlet:lifecycle-android:0.1.12') using module('com.github.WalletConnect.Scarlet:lifecycle-android:1.0.0')
}

resolutionStrategy.eachDependency { details ->
if (details.requested.group == 'com.squareup.okhttp3') {
details.useVersion "4.12.0"
}
}
}

}
Expand Down Expand Up @@ -232,7 +238,7 @@ dependencies {
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.11.0'
implementation 'com.squareup.retrofit2:converter-gson:2.11.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.11.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.11.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.12.0'
implementation 'com.google.code.gson:gson:2.10.1'
implementation "androidx.biometric:biometric:$biometric_version"

Expand Down Expand Up @@ -269,7 +275,7 @@ dependencies {
debugImplementation leakCanary

// Wallet kits
implementation 'com.github.horizontalsystems:ton-kit-android:b632c02'
implementation 'com.github.horizontalsystems:ton-kit-android:e907480'
implementation 'com.github.horizontalsystems:bitcoin-kit-android:47db768'
implementation 'com.github.horizontalsystems:ethereum-kit-android:3d83900'
implementation 'com.github.horizontalsystems:blockchain-fee-rate-kit-android:1d3bd49'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ import io.horizontalsystems.tronkit.models.Address as TronAddress
interface IAdapterManager {
val adaptersReadyObservable: Flowable<Map<Wallet, IAdapter>>
fun startAdapterManager()
fun refresh()
suspend fun refresh()
fun getAdapterForWallet(wallet: Wallet): IAdapter?
fun getAdapterForToken(token: Token): IAdapter?
fun getBalanceAdapterForWallet(wallet: Wallet): IBalanceAdapter?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import io.horizontalsystems.bankwallet.core.IAdapter
import io.horizontalsystems.bankwallet.core.IBalanceAdapter
import io.horizontalsystems.bankwallet.core.IReceiveAdapter
import io.horizontalsystems.bankwallet.core.managers.TonKitWrapper
import io.horizontalsystems.bankwallet.core.managers.network
import io.horizontalsystems.bankwallet.core.managers.statusInfo
import io.horizontalsystems.tonkit.models.Network

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,11 @@ class TonTransactionRecord(
when (val type = action.type) {
is Action.Type.Receive -> type.value
is Action.Type.Send -> type.value
is Action.Type.Burn -> type.value
is Action.Type.Mint -> type.value
is Action.Type.ContractCall -> type.value
is Action.Type.ContractDeploy,
is Action.Type.Swap,
is Action.Type.Unsupported -> null
}
}
Expand All @@ -146,6 +151,25 @@ class TonTransactionRecord(
val comment: String?,
) : Type()

data class Burn(val value: TransactionValue) : Type()

data class Mint(val value: TransactionValue) : Type()

data class Swap(
val routerName: String?,
val routerAddress: String,
val valueIn: TransactionValue,
val valueOut: TransactionValue
) : Type()

data class ContractDeploy(val interfaces: List<String>) : Type()

data class ContractCall(
val address: String,
val value: TransactionValue,
val operation: String
) : Type()

data class Unsupported(val type: String) : Type()
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
package io.horizontalsystems.bankwallet.core.adapters

import io.horizontalsystems.bankwallet.core.ICoinManager
import io.horizontalsystems.bankwallet.core.managers.EvmLabelManager
import io.horizontalsystems.bankwallet.core.managers.TonKitWrapper
import io.horizontalsystems.bankwallet.entities.TransactionValue
import io.horizontalsystems.bankwallet.modules.transactions.TransactionSource
import io.horizontalsystems.bankwallet.modules.transactions.TransactionStatus
import io.horizontalsystems.marketkit.models.BlockchainType
import io.horizontalsystems.marketkit.models.Token
import io.horizontalsystems.marketkit.models.TokenQuery
import io.horizontalsystems.marketkit.models.TokenType
import io.horizontalsystems.tonkit.Address
import io.horizontalsystems.tonkit.models.AccountAddress
import io.horizontalsystems.tonkit.models.Action
import io.horizontalsystems.tonkit.models.Event
Expand All @@ -18,13 +17,11 @@ import java.math.BigDecimal
import java.math.BigInteger

class TonTransactionConverter(
private val address: Address,
private val coinManager: ICoinManager,
private val tonKitWrapper: TonKitWrapper,
private val source: TransactionSource,
private val baseToken: Token,
private val evmLabelManager: EvmLabelManager
private val baseToken: Token
) {
val address = tonKitWrapper.tonKit.receiveAddress

fun createTransactionRecord(event: Event): TonTransactionRecord {
val actions = event.actions.map { action ->
Expand Down Expand Up @@ -133,6 +130,45 @@ class TonTransactionConverter(
}
}

action.jettonBurn?.let { jettonBurn ->
return TonTransactionRecord.Action.Type.Burn(
value = jettonValue(jettonBurn.jetton, jettonBurn.amount, true)
)
}

action.jettonMint?.let { jettonMint ->
return TonTransactionRecord.Action.Type.Mint(
value = jettonValue(jettonMint.jetton, jettonMint.amount, false)
)
}

action.contractDeploy?.let { contractDeploy ->
return TonTransactionRecord.Action.Type.ContractDeploy(
interfaces = contractDeploy.interfaces
)
}

action.jettonSwap?.let { jettonSwap ->
return TonTransactionRecord.Action.Type.Swap(
routerName = jettonSwap.router.name,
routerAddress = format(jettonSwap.router),
valueIn = jettonSwap.jettonMasterIn?.let {
jettonValue(it, jettonSwap.amountIn, true)
} ?: tonValue(jettonSwap.tonIn ?: BigInteger.ZERO, true),
valueOut = jettonSwap.jettonMasterOut?.let {
jettonValue(it, jettonSwap.amountOut, false)
} ?: tonValue(jettonSwap.tonOut ?: BigInteger.ZERO, false),
)
}

action.smartContractExec?.let { smartContractExec ->
return TonTransactionRecord.Action.Type.ContractCall(
address = format(smartContractExec.contract),
value = tonValue(smartContractExec.tonAttached, true),
operation = smartContractExec.operation
)
}

return TonTransactionRecord.Action.Type.Unsupported(action.type.name)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,12 @@ class AdapterFactory(
fun tonTransactionsAdapter(source: TransactionSource): ITransactionsAdapter? {
val tonKitWrapper = tonKitManager.getTonKitWrapper(source.account)
val baseToken = coinManager.getToken(TokenQuery(BlockchainType.Ton, TokenType.Native)) ?: return null
val tonTransactionConverter = TonTransactionConverter(coinManager, tonKitWrapper, source, baseToken, evmLabelManager)
val tonTransactionConverter = TonTransactionConverter(
tonKitWrapper.tonKit.receiveAddress,
coinManager,
source,
baseToken
)

return TonTransactionsAdapter(tonKitWrapper, tonTransactionConverter)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ class AdapterManager(
initAdapters(walletManager.activeWallets)
}

override fun refresh() {
override suspend fun refresh() {
handler.post {
adaptersMap.values.forEach { it.refresh() }
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ object FaqManager {
val response = OkHttpClient().newCall(request).execute()

val listType = object : TypeToken<List<FaqMap>>() {}.type
val list: List<FaqMap> = gson.fromJson(response.body.charStream(), listType)
val list: List<FaqMap> = gson.fromJson(response.body?.charStream(), listType)
response.close()

list
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ object GuidesManager {
.build()

val response = OkHttpClient().newCall(request).execute()
val categories = gson.fromJson(response.body.charStream(), Array<GuideCategoryMultiLang>::class.java)
val categories = gson.fromJson(response.body?.charStream(), Array<GuideCategoryMultiLang>::class.java)
response.close()

categories
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch

class TonKitManager(
private val backgroundManager: BackgroundManager
private val backgroundManager: BackgroundManager,
) {
private val scope = CoroutineScope(Dispatchers.Default)
private var job: Job? = null
Expand Down Expand Up @@ -77,7 +77,7 @@ class TonKitManager(

private fun createKitInstance(
accountType: AccountType.Mnemonic,
account: Account
account: Account,
): TonKitWrapper {
val hdWallet = HDWallet(accountType.seed, 607, HDWallet.Purpose.BIP44, Curve.Ed25519)
val privateKey = hdWallet.privateKey(0)
Expand All @@ -94,7 +94,7 @@ class TonKitManager(

private fun createKitInstance(
accountType: AccountType.TonAddress,
account: Account
account: Account,
): TonKitWrapper {
val walletType = TonKit.WalletType.Watch(accountType.address)
val kit = TonKit.getInstance(walletType, Network.MainNet, App.instance, account.id)
Expand Down Expand Up @@ -137,24 +137,10 @@ class TonKitManager(

class TonKitWrapper(val tonKit: TonKit)

fun TonKit.refresh() {
}

private suspend fun TonKit.start() {
this.sync()
}

private fun TonKit.stop() {
}

val TonKit.network: Network
get() = Network.MainNet

fun TonKit.statusInfo(): Map<String, Any> {
return buildMap {
// put("Balance Sync State", balanceState)
// put("Transaction Sync State", transactionsState)
}
fun TonKit.statusInfo() = buildMap {
put("Sync State", syncStateFlow.value)
put("Event Sync State", eventSyncStateFlow.value)
put("Jetton Sync State", jettonSyncStateFlow.value)
}

val Jetton.tokenType
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ class BalanceAdapterRepository(
return null
}

fun refresh() {
suspend fun refresh() {
adapterManager.refresh()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ class BalanceService(
sortAndEmitItems()
}

fun refresh() {
suspend fun refresh() {
xRateRepository.refresh()
adapterRepository.refresh()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ class BalanceViewModel(

stat(page = StatPage.Balance, event = StatEvent.Refresh)

viewModelScope.launch {
viewModelScope.launch(Dispatchers.Default) {
isRefreshing = true
emitState()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,37 @@ class TransactionInfoService(
val coinUids = mutableListOf<String?>()

val txCoinTypes = when (val tx = transactionRecord) {
is TonTransactionRecord -> listOf(tx.mainValue?.coinUid, tx.fee.coinUid)
is TonTransactionRecord -> buildList {
add(tx.mainValue?.coinUid)
add(tx.fee.coinUid)

tx.actions.forEach { action ->
val actionType = action.type
when (actionType) {
is TonTransactionRecord.Action.Type.Burn -> {
add(actionType.value.coinUid)
}
is TonTransactionRecord.Action.Type.ContractCall -> {
add(actionType.value.coinUid)
}
is TonTransactionRecord.Action.Type.Mint -> {
add(actionType.value.coinUid)
}
is TonTransactionRecord.Action.Type.Receive -> {
add(actionType.value.coinUid)
}
is TonTransactionRecord.Action.Type.Send -> {
add(actionType.value.coinUid)
}
is TonTransactionRecord.Action.Type.Swap -> {
add(actionType.valueIn.coinUid)
add(actionType.valueOut.coinUid)
}
is TonTransactionRecord.Action.Type.ContractDeploy,
is TonTransactionRecord.Action.Type.Unsupported -> Unit
}
}
}
is EvmIncomingTransactionRecord -> listOf(tx.value.coinUid)
is EvmOutgoingTransactionRecord -> listOf(tx.fee?.coinUid, tx.value.coinUid)
is SwapTransactionRecord -> listOf(tx.fee, tx.valueIn, tx.valueOut).map { it?.coinUid }
Expand Down
Loading

0 comments on commit f029407

Please sign in to comment.